Jump to content

DELPHI/PASCAL: uzdevums...


d3wlin
 Share

Recommended Posts

Lieta tāda! Nepieciešams uzrakstīt programmu PASCAL valodā, kas atrisina uzdevumu.

 

Uzdevums

Sastādīt programmu, kas aprēķina n pēc kārtas ņemtu skaitļu summu. (Intervāla sākumu un n ievada lietotājs). Piemēram, ja intervāla sākums ir 3 un n=4, tad programma saskaita 3+4+5+6=18.

 

P.S. Cik saprotu, jālieto ir cikla operātors for...to...do. Tieši šī algoritma daļa man derēs, kā atbilde, jo ar visu pārējo es tikšu galā pats.

 

Paldies jau iepriekš par Jūsu interesi!

Link to comment
Share on other sites

Guest Raicap

atceros kadreiz kad macijos paskalu tas bija izi bet tagad jau viss aizmirsies, liekas man ar bija saads uzdevums un mos kautkur meetaajas kompii, ja nebus ko dariit pamekleshu.

Link to comment
Share on other sites

Kaatev skjiet.. kaadeelj te ir uzdots shis uzdevums? Un kaadeelj tu nespeej vinju atrisinaat?

 

Atbilde uz pirmo jautaajumu - Lai tu izgliitotos, kljuutu gudraaks, trenneetu smadzenes un pierastu pats domaat.

Atbilde uz otro jautaajumu - tu neesi apmekleejis stundas ja nejeedz pashus pamatus.

 

Secinaajums.. tev paliidzeet ir greeks... Ibo Ja cilveeks ir mulkjis tad tas ir uz ilgu laiku.. ja stulbs tad uz visu muuzhu.

Link to comment
Share on other sites

Kuuminsh šitā nav smuki, kamēr es rakos pa aforismu grāmatinju meklējot labākas frāzes Tu jau visu izdarīji :roll:

Link to comment
Share on other sites

Cik atceros šis jau bija gana triviāls uzdevums, bet tavs :)

 

Uzrakstīt programmu, kas ļauj izveidot binaaro meklēšanas koku, kuru mezglos ir naturaali skaitlli.

Skaitlis katraa mezglaa ir unikaals un kalpo par atsleegu. Uzrakstīt proceduuras, kas llauj pievienot mezglu kokam saskaita, cik kokaa ir lapu.

Link to comment
Share on other sites

d3vlin, ja nemaaki shaadu triviaalu uzd atrisinaat, tad labaak nemaacies sho priekshmetu.

 

te ir kods, ja es pareizi pascal sintaksi atceros

readln(int_sak);

readln(n);

s:=0;

for x := int_sak to int_sak+n-1 do s:=s+x;

Link to comment
Share on other sites

Mācos patstāvīgi, tāpēc pielec daudz lēnāk! Ņemu manuāļus un pa solītim, solītim buros cauri - esmu beginner programmēšanā, tāpēc NAV viegli!

 

Es jau neprasu visu smalki un sīki, bet tikai cikla realizēšanu!

Link to comment
Share on other sites

Tad nu lūk!

 

Programmas algoritms:

 

program uzd023;

uses wincrt;

var

a,n,i,sum:integer;

Begin

clrscr;

writeln('n pec kartas nemtu skaitlu summas aprekinasana');

writeln('n - pec kartas nemtu skaitlu daudzums');

       writeln('a - intervala sakuma vertiba');

writeln;

write('Ievadiet a: ');

readln(a);

write('Ievadiet n: ');

readln(n);

       sum:=0;

For i:=a to a+n-1 do

begin

 sum:=sum+i;

end;

writeln;

writeln('Atbilde');

writeln(n,' pec kartas nemtu skaitlu summa ir ',sum,', ja intervala sakums ir ',a,'.');

end.

 

Piesieties jau var vienmēr, bet uzdevuma nosacījumi ir izpildīti!

 

Paldies par palīdzību! Arī turpmāk par PASCAL kko iepostēšu!

Link to comment
Share on other sites

Guest bubu

bbad un d3vlin, kāpēc jūs dzīvi sarežģījat? kautkādus tur ciklus vēl veido... Atbildi, kuru var iegūt O(1) laikā, jūs iegūstat O(n) laikā:

var i, n: integer;

begin

 Write('Intervāla sākums = ');

 ReadLn(i);

 Write('n = ');

 ReadLn(n);

 WriteLn('Skaitļu summa no ', i, ' līdz ', i+n-1, ' ir ', n*(n+2*(i-1)+1) div 2);

end.

Link to comment
Share on other sites

bubu, paliidzi man atvieglot dziivi:

shaads uzdevums: c=2*a*b+a+b , c ir dots, jaaatrod a un b. (c ir 200 ciparu liels skaitlis, a un b vajadzeetu atrast sapraatiigaa laika periodaa)

Link to comment
Share on other sites

bbad un d3vlin, kāpēc jūs dzīvi sarežģījat? kautkādus tur ciklus vēl veido... Atbildi, kuru var iegūt O(1) laikā, jūs iegūstat O(n) laikā:

var i, n: integer;

begin

 Write('Intervāla sākums = ');

 ReadLn(i);

 Write('n = ');

 ReadLn(n);

 WriteLn('Skaitļu summa no ', i, ' līdz ', i+n-1, ' ir ', n*(n+2*(i-1)+1) div 2);

end.

 

Cerams, ka uzdevumu prasītājs spēj atšķirt, kas ir O(1) un kas ir O(n).

:D

Link to comment
Share on other sites

bbad un d3vlin, kāpēc jūs dzīvi sarežģījat? kautkādus tur ciklus vēl veido... Atbildi, kuru var iegūt O(1) laikā, jūs iegūstat O(n) laikā:

var i, n: integer;

begin

 Write('Intervāla sākums = ');

 ReadLn(i);

 Write('n = ');

 ReadLn(n);

 WriteLn('Skaitļu summa no ', i, ' līdz ', i+n-1, ' ir ', n*(n+2*(i-1)+1) div 2);

end.

 

man liekas ka writeln((i+n)*(n+1)div2); izskatās labāk :)

Link to comment
Share on other sites

kad man LU maaciija to pascalu ta vasaraa aiz totaala neko dariit tic-tac-toe(desas) uzchiniju :)

ar GUI! vairaakiem raundiem, un uzvareetaajam himnu ar to iebuuveeto PC tumbinju :)

 

bij jautri, saaku arii "snake" bet apriebaas... kad veelreiz meeginaaju kauko tad vairs no koda nekaa nesapratu :(

 

Tad nu lūk!

 

Programmas algoritms:

 

tas nav algoritms...

Link to comment
Share on other sites

bij jautri, saaku arii "snake" bet apriebaas... kad veelreiz meeginaaju kauko tad vairs no koda nekaa nesapratu :(

 

Tad nu lūk!

 

Programmas algoritms:

 

tas nav algoritms...

 

Tas ir algoritms, pierakstīts PASCAL valodā.

 

Jā, ar koda dokumentēšanu ir viltīgi. Lieliem projektiem top tehniskā dokumentācija, savukārt maziem ir tā, kā ir. Es pats izlīdzos ar komentāriem, bet laikam arī būs jāsāk taisīt pavadījums *.doc formātā, kurā aprakstīta programmas struktūra un stāvokļu pāreju diagramma.

Link to comment
Share on other sites

hmm - man visulaiku licies ka algoritms ir nezinu nu vairaak taakaa "sketch" ziimeejumam...

 

piemeeram shai gadiijumaa taa sheema ar jautaajumiem darbiibaam utml.. (nu trijstuuri, 4trstuuri, utml)

 

bet kods ir kods...

 

laigan jaa kaapeec gan kodu nevareetu nosaukt par algoritmu njaa..

Link to comment
Share on other sites

hmm - man visulaiku licies ka algoritms ir nezinu nu vairaak taakaa "sketch" ziimeejumam...

 

piemeeram shai gadiijumaa taa sheema ar jautaajumiem darbiibaam utml.. (nu trijstuuri, 4trstuuri, utml)

Tas ir algoritma pieraksts blokshēmas(diagrammas) veidā.

 

bet kods ir kods...

 

laigan jaa kaapeec gan kodu nevareetu nosaukt par algoritmu njaa..

Es reizēm šādos tādos žurnālos skatos algoritmus, pierakstītus VC++ valodā, un metu uz ObjectPascal.

Link to comment
Share on other sites

Pierakstiit algoritmo Pascal sintaksee ir eerti un paarskataami.

jebkursh cilveeks kursh pat neko dizhi nejeedz no programmeeshanas tachu kautko daudzmaz maak angliski visu ljoti labi saprot.

Link to comment
Share on other sites

emm

laigan jaa kaapeec gan kodu nevareetu nosaukt par algoritmu njaa..

tas nebija kritisks njaa, bet atzinja... :) es neesmu profesionaalis shajaa jomaa, un priecaajos no sirds par shaadaam atzinjaam :)

 

xml kaa pieraksta veids algoritmam? vareetu dabuut informaaciju laukaa visaados veidos, gan lasiit taapat. tikai spriedeleeju...

Link to comment
Share on other sites

xml kaa pieraksta veids algoritmam? vareetu dabuut informaaciju laukaa visaados veidos, gan lasiit taapat. tikai spriedeleeju...

XML nevar būt algoritma pieraksta veids, jo tas ir tikai datu glabāšanas formāts. Savukārt var izveidot DTD, kas apraksta struktūru, ar kādu xml failos var iekodēt algoritmu (izteikumu regulārā valodā).

 

P.S. Es 2000-šajā rakstīju kursa darbu pa pāris naktīm par xml tēmu. Tā kā vajadzēja kaut ko no sevis, mēģināju [sekmīgi] pierādīt, ka ar XML dokumentu var nokodēt:

a) tabulu

B) relāciju datu bāzi

c) UML diagrammas

d) ER modeļus

---------> no c un d izriet, ka var kodēt modelēšanas valodas un to meta modeļus.

e) [regulāru] programmēšanas valodu <=> algoritmu

 

Pamatdoma - ar xml var aprakstīt koku. Līdz ar to viss, kas ir aprakstāms ar koku, ir aprakstāms ar xml. Tabula jebšu saraksts ir koka speciālgadījums.

Link to comment
Share on other sites

XML nevar būt algoritma pieraksta veids, jo tas ir tikai datu glabāšanas formāts. Savukārt var izveidot DTD
- nepreciizi izteicos.

 

Pamatdoma - ar xml var aprakstīt koku. Līdz ar to viss, kas ir aprakstāms ar koku, ir aprakstāms ar xml. Tabula jebšu saraksts ir koka speciālgadījums.
- clear.
Link to comment
Share on other sites

Guest bubu
man liekas ka writeln((i+n)*(n+1)div2); izskatās labāk :)

 

Man ir n*(n+2*(i-1)+1)/2 = (n*n+2*n*i-2*n+n)/2

Tev ir (i+n)*(n+1)/2 = (i*n+i+n*n+n)/2

Vai tad sakrīt? Pasaki nu, kuram pareizāk, ja pie i=3 un n=5 atbildei jābūt 25!

Link to comment
Share on other sites

Vareetu dereet lineaaraaas progresijas summas formula, vai kaut kas no rindu teorijas augstaakajaa matemaatikaa. Cikls tomeer aiznjems ilgaaku laiku nekaa vienas formulas apreekjins. Kaadreiz piedaliijos programmeeshanas olimpiaadees, tad tur arii bija liidziigi uzdevumi. Vareeji uztaisiit ciriski, bet izpildes laiks tika njemts veeraa, liidz ar to pat ja rezultaati diviem buus vienaadi, uzvareetaajs taapat skaitiisies tas kura programma visu izdariis aatraak.

Link to comment
Share on other sites

Guest bubu

Nu bet loģiski, ka te jālieto aritmētiskās progresijas summas formula.

Ja mums jāsaskaita skaitļu 1+2+3+...+n summa, tad formulas Sn=n(n+1)/2

Bet tā kā mums katram skaitlim ir pieskaitīts skaitlis i-1, tb i+(i+1)+(i+2)+...(i-1+n), tad tam Sn jāpieskaita klāt n*(i-1), iegūstot:

n*(i-1)+(n*n+n)/2 = (n*n+n+2*n*i-2*n)/2 = n(n+2*(i-1)+1)/2, ko arī sākumā biju rakstījis :) Nekādas augstākās matemātikas rindu teorijas te nav vajadzīgas ;) Kādas 9/10 klases līmenī jau šito Sn formulu iemāca.

Link to comment
Share on other sites

Nu bet loģiski, ka te jālieto aritmētiskās progresijas summas formula.

Ja mums jāsaskaita skaitļu 1+2+3+...+n summa, tad formulas Sn=n(n+1)/2

Bet tā kā mums katram skaitlim ir pieskaitīts skaitlis i-1, tb i+(i+1)+(i+2)+...(i-1+n), tad tam Sn jāpieskaita klāt n*(i-1), iegūstot:

n*(i-1)+(n*n+n)/2 = (n*n+n+2*n*i-2*n)/2 = n(n+2*(i-1)+1)/2, ko arī sākumā biju rakstījis :) Nekādas augstākās matemātikas rindu teorijas te nav vajadzīgas ;) Kādas 9/10 klases līmenī jau šito Sn formulu iemāca.

 

Kaut arī efektīvākais risinājums ir summas formula, labāk izvēlēties alternatīvo risinājumu, citādi mums būs spēcīgs matemātiķis, kurš nemāk izmantot ciklus ;)

Link to comment
Share on other sites

c=2*a*b+a+b

atrast a un b no shaada vienadojuma ja zinaams ir tikai c vismaz pirmajaa acu uzmetienaa skjiet gruuti.. uzdevums neizskataas vieglaaks par c sadaliishanu reizinaataaajos.. protams var vienkarshi paarlasiit variantus un var pat atsijaat dalju no tiem, bet 200 ciparu skaitlja gadijumaa nezin vai tas buus risinaajums..

 

nezinu vai Diofanta vienaadojums, bet Eilers "reduceeja" sho probleemu kaa: 2c+1 ir divu kvadraatu starpiiba.

 

hmm 2c+1= 4ab+2a+2b+1 ja pienjem ka 2c+1 ir divu kvadratu starpiba tad arii 4ab+2a+2b+1 ir taada..

tikai kapec 2c+1 lai buutu 2 kvadraatu starpiiba?

shis neizskatas pec vienkarsha maajas darba.. saki kas tev aiz aadas;)

Link to comment
Share on other sites

Guest Puss
Nu bet loģiski, ka te jālieto aritmētiskās progresijas summas formula.

Ja mums jāsaskaita skaitļu 1+2+3+...+n summa, tad formulas Sn=n(n+1)/2

Bet tā kā mums katram skaitlim ir pieskaitīts skaitlis i-1, tb i+(i+1)+(i+2)+...(i-1+n), tad tam Sn jāpieskaita klāt n*(i-1), iegūstot:

n*(i-1)+(n*n+n)/2 = (n*n+n+2*n*i-2*n)/2 = n(n+2*(i-1)+1)/2, ko arī sākumā biju rakstījis :) Nekādas augstākās matemātikas rindu teorijas te nav vajadzīgas ;) Kādas 9/10 klases līmenī jau šito Sn formulu iemāca.

 

Kaut arī efektīvākais risinājums ir summas formula, labāk izvēlēties alternatīvo risinājumu, citādi mums būs spēcīgs matemātiķis, kurš nemāk izmantot ciklus ;)

 

ir nācies saskarties ar šādiem spēcīgiem matemātiķiem :)... bieži vien izdomā tādus algoritmus (idejiski protams pareizus un efektīvus)... kau tajā pat laikā programmēšanas vide jau lieliski piedāvā iebūvētus līdzekļus, kas izpilda uzdevumu lieliski

Link to comment
Share on other sites

Guest bubu
ir nācies saskarties ar šādiem spēcīgiem matemātiķiem :)... bieži vien izdomā tādus algoritmus (idejiski protams pareizus un efektīvus)... kau tajā pat laikā programmēšanas vide jau lieliski piedāvā iebūvētus līdzekļus, kas izpilda uzdevumu lieliski

 

Šis jau nu tieši nav tas gadījums, kad jālieto cikls! Padomā loģiski, ja tev n būs 1000000. Tad kā tu domā, kas strādās reālāk, for cikls vai tā viena formula? Atšķirību starp O(1) un O(n) zini?

Link to comment
Share on other sites

Guest bubu
bubu, paliidzi man atvieglot dziivi:

shaads uzdevums: c=2*a*b+a+b , c ir dots, jaaatrod a un b. (c ir 200 ciparu liels skaitlis, a un b vajadzeetu atrast sapraatiigaa laika periodaa)

Nelineārs Diofanta vienādojums. Uz sitiena neatceros, kā tādus pildīja.

Bet acīmredzami ir, ka (pieņemu, ka a,b,c ir nenegatīvi skaitļi):

"c mod b = a mod b" un arī "c mod a = b mod a"

tad laikam atrodi kurš no skaitļiem a vai b ir lielāks (pieņemsim ka a, ja būs b, tad apmaini tos vietām). Ja tas ir a, tad aprēķini c mod a = x. un pārbaudi vai x der b vietā (sākotnējā formulā). Ja der tad ok. Ja nē, tad x = x + a un pārbaudi atkal. Un tā ciklojies kamēr atrodi tādu x kurš der b vietā, vai arī ja x>c, tad atbildes nav.

 

Vo, reku atradu kā šitais īstenībā jārisina: http://www.alpertron.com.ar/METHODS.HTM#SHyperb

Link to comment
Share on other sites

Guest Puss
ir nācies saskarties ar šādiem spēcīgiem matemātiķiem :)... bieži vien izdomā tādus algoritmus (idejiski protams pareizus un efektīvus)... kau tajā pat laikā programmēšanas vide jau lieliski piedāvā iebūvētus līdzekļus, kas izpilda uzdevumu lieliski

 

Šis jau nu tieši nav tas gadījums, kad jālieto cikls! Padomā loģiski, ja tev n būs 1000000. Tad kā tu domā, kas strādās reālāk, for cikls vai tā viena formula? Atšķirību starp O(1) un O(n) zini?

 

protams ka šitais nav tas gadījums... :)

... es to biju domājis citām lietām... piemēram kombo bokša aizpildīšana .netā... ir cilvēki kas taisa tur n-tās funkcijas un kauko tur ciklo, sortē... un ir cilvēki kas vienkārši māk norādīt kombo boksim data sourci :)

... tas gan ir tīri primitīvs piemērs, bet es to saku tāpēc, ka ir tādi cilvēki, kas bieži vien gudro visādus algoritmus tā vietā lai atrisinātu uzdevumu izmantojot dažas koda rindiņas

..bet nu protams šitais gadījums jau nav tāds

Link to comment
Share on other sites

Nelineārs Diofanta vienādojums. Uz sitiena neatceros, kā tādus pildīja.  

Bet acīmredzami ir, ka (pieņemu, ka a,b,c ir nenegatīvi skaitļi):  

"c mod b = a mod b" un arī "c mod a = b mod a"

tad laikam atrodi kurš no skaitļiem a vai b ir lielāks (pieņemsim ka a, ja būs b, tad apmaini tos vietām).

liidz shitai vietia viss skaidrs

Ja tas ir a, tad aprēķini c mod a = x. un pārbaudi vai x der b vietā (sākotnējā formulā). Ja der tad ok. Ja nē, tad x = x + a un pārbaudi atkal. Un tā ciklojies kamēr atrodi tādu x kurš der b vietā, vai arī ja x>c, tad atbildes nav.

bet taalak gan nesaprotu kaa tu domaa apreekjinaat c mod a =x ja zinaams no a ,b un c tachu ir tikai c, vai kaut ko jaucu?

Link to comment
Share on other sites

Guest bubu

Āh, es muļķis. Sapratu. Uz fikso kautko gribēju izdomāt, bet labi nepārdomāju ... sasteidzos. Bet nu jāskatās tas links, tur uzrakstīts kas un kā ;)

Link to comment
Share on other sites

Guest bubu
taadas rindas visefektiivaak ir reekjinaat izmantojot konveijerizaaciju.

kas ir konveijerizācija?

Link to comment
Share on other sites

tas noziimee, ka pareeli tiek veiktas darbiiibas

te bij runa par piemeeru 3+4+5+6

ta skaidri redzams, ka pirmajaa solii var veikt divas darbiibas 3+4 un 5+6 un otrajaa solii saskaita ieguutos rezultaatus. pavisam divi solji.

 

ja parasti (tas ir seriaali) ir triis solji

pirmais 3+4

tad +5

tad +6

 

protams lielaaka efektivitaate tiek panaakta pie garaakaam rindaam

Link to comment
Share on other sites

Guest bubu

Ā, sapratu. Nja, doma pareiza. no O(n) tiekam līdz O(log n), bet vienalga līdz O(1) tāls ceļš ejams.

Link to comment
Share on other sites

konvejerizaacija ir jaaskataas no procesora puses tas ir O(1) taa ir viena komanda, bet sheit n*(n+2*(i-1)+1) div 2), kaa redzams ir saskaitiishana, atnjemshana, reizinaashana un daliishana, un sheit procesoors pats sadala prioritaates kaadaa kaartiibaa jamais apstraadaas doto rindu, bet ja to dara programmeetaajs, ir iespeejams panaakt daudz augstaaku efektivitaati. Nu bet tas taa, taa ir teorija no universitaates kursa jau :)))

Link to comment
Share on other sites

Guest bubu

Nē! Tas O ir atkarīgs no ievaddatu daudzuma, nevis operāciju skaita! Manā gadījumā 1 ir tikai tāpēc, ka tas ir konstants. Tiek izmantot tikai paši ievades mainīgie nevis kautkādi dati. Tajā for cikla gadījumā tiek izmantoi n-skaitļi, tāpēc arī O(n)! Tur jau arī tiek lietotas vairāk kā viena operācija ne tikai tā saskaitīšana, bet arī cikla mainīgā palielināšana, utt! Tavējais gadījums ir logN, tāpēc, ka katrā iterācijā samazinās uz pusi to skaitāmo skaitļu daudzums.

O-mērā pēc definīcijas O©=O(1) un O(n*c)=O(n), kru c ir konstante (neatkarīga no ievaddatu(n) lieluma/daudzuma).

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...