Pascal algoritmusok nem mennek
2010-06-21T22:08:18+02:00
2010-06-22T11:46:45+02:00
2022-06-29T10:15:38+02:00
  • Köszön a segítséget.
    Próbáltam én Turbo Pascalban megírni de már az elején olyan hibákat jelzett amiket nem értettem.

    A probléma az volt hogy nem működött és a Pascal is hibásnak látta.
    Mutasd a teljes hozzászólást!
  • Nem tudtad volna valahol egy Pascal (TP) fordítóba berakni a kódot? Nem lehet fejből programozni. Ha meg megpróbálod lefordítani, akkor a fordító rögtön közli, hogy mi a gond, pl. lemaradt valahol egy kettőspont.

    Itt egy javított változat, ez legalább lefordul. Hogy azt csinálja e amit kell, azt nem tudom. A "csere" eljárást kikommenteztem a főprogramban, mert hírtelen nem tudom mi lett volna a feladata, de így ebben a formában hibás.
    A "két tömbbe válogatást" is megoldottam úgy, hogy csak a filmek sorszámát gyűjti ki, mert annyi memóriád nem biztos hogy lenne, hogy még két ekkora tömböt tárolj.

    Ajánlom, hogy "szerezd be" a Turbo Pascal-t és azzal írd, mert ez így nem munka. Egy picit jobb kód:

    Program filmes; Uses crt; const N=214; type Tmozi=record evszam:integer; opnev:string[61]; end; var mozi:array[1..N] of Tmozi; o2000:array[1..N] of integer; tomb1:array[1..N] of integer; tomb2:array[1..N] of integer; atlag: real; i,j,max,min,db,dbb,dbc,dbk: integer; Procedure Beolvas; begin for i:=1 to N do begin writeln(i,'film evszama:'); readln(mozi[i].evszam); writeln('operator neve: (maximum 60 karakter)'); readln(mozi[i].opnev); end; end; Procedure filmkor; begin atlag:=0; for i:= 1 to N do atlag:=atlag+(2010-mozi[i].evszam); atlag:=round(atlag/N); writeln('Filmek atlag kora: ',atlag); end; Procedure keres; begin db:=0; for i:=1 to N do begin if (db=0) then begin if (mozi[i].opnev='Zsigmond Vilmos') then begin db:=1; writeln('Zsigmond Vilmos filmet keszitett a kovetkezo evben: ',mozi[i].evszam); end; end; end; if (db=0) then writeln ('Nincs olyan film ami Zsigmond Vilmos keszitett'); end; Procedure Megszamol; begin db:=0; for i:=1 to N do if (mozi[i].evszam)>2007 then inc(db); Writeln(db,' darab film keszult 2007 utan'); end; Procedure minkiv; Begin min:=1; for i:=2 to N do if (mozi[i].evszam) < (mozi[min].evszam) then min:=i; writeln(mozi[min].opnev); end; Procedure kigyujttombe; begin dbk:=0; for i:=1 to N do begin if (mozi[i].evszam)=2000 then inc(dbk); o2000[dbk]:=i; writeln(mozi[i].opnev); end; end; Procedure szetvalogat2tombbe; Begin dbb:=0; dbc:=0; for i:=1 to N do begin tomb1[i]:=0; tomb2[i]:=0; end; for i:=1 to N do if (mozi[i].evszam)<2000 then begin dbb:=dbb+1; tomb1[dbb]:=i; end else begin dbc:=dbc+1; tomb2[dbc]:=i; end; end; Procedure csere (var a,b:Tmozi); var sv:Tmozi; begin sv.evszam:=a.evszam; a.evszam:=b.evszam; b.evszam:=sv.evszam; sv.opnev:=a.opnev; a.opnev:=b.opnev; b.opnev:=sv.opnev; end; Procedure rendez1; Begin for i:=1 to N-1 do for j:=i+1 to N do if (mozi[i].evszam)<(mozi[j].evszam) then csere (mozi[i],mozi[j]); end; Procedure rendez2; Begin for i:=1 to N-1 do begin min:=i; for j:=i+1 to N do if (mozi[j].opnev)>(mozi[min].opnev) then min:=j; csere (mozi[j],mozi[max]); end; end; Begin clrscr; beolvas; clrscr; filmkor; keres; megszamol; minkiv; kigyujttombe; szetvalogat2tombbe; {csere;} rendez1; readln; rendez2; readln; end.
    Mutasd a teljes hozzászólást!
  • Üdv!

    Ha ciklust szeretnél használni és a ciklusban több műveletet, akkor tedd ki a "begin - end" részt, mert különben, csak a ciklus utáni első sort hajtja végre, és úgy lép át a következő sorra...

    Noss
    Mutasd a teljes hozzászólást!
  • Mi a problémád? Nem működik megfelelően? Van valami hiba? Vagy ki sem tudod próbálni? Vagy csak érdekel, hogy nem lehetne valamit jobban, okosabban megcsinálni? Vagy hogy megfelel e a kiírásnak?

    Ez Turbo Pascalban készült?
    Én első olvasatra az "operatőr neve" változó méretét csökkenteném, mert így a program közel 60Kbyte-nyi változót használ (nem számoltam telejsen össze). Mondjuk legyen egy korlát, hogy az operatőr neve max. 60 karakter legyen, vagy 80 (karakteres képernyőn ez is faltól-falig ér), és így kevesebb mint fele memóriát igényel.
    Szóval:
    type Tmozi:=record; evszam:integer; opnev:string[80];

    Kicsit gyilkos dolog 214 évszámot és operatőrt beírni, de ha ezt várják, hát legyen.

    Amikor kiszámolod és kiíratod a filmek átlagos korát, ott a számolás jónak tűnik (A "mai datum" söveg helyére még írsz valamit? mondjuk 2010?), de kiírás előtt lehet kerekíteni kellene (round vagy trunc), de lehet nem elvárás.

    A "Megszamol" eljárásban a "db:=db+1;" kifejezés helyére írhatsz "inc(db);"-t is. Meg máshová is ha valahol egyel növelsz egy változót. Ez csak "okosság", de a tanár örülhet neki, hogy ezt is tudod.

    Úgylátom a "minkiv" eljárást már fejből írtad, kicsit nem stimmelnek a begin-end párosok. Következő eljárásban sem. Ezen a részen már gondolm nem tudtad fordítani a kódot, így kicsit nehéz programozni.
    Mutasd a teljes hozzászólást!
  • 1 nagy kérdésem/kérésem lenne.
    Írtam egy programot suliba adott feladat alapján és nagyon jó lenne ha valaki átnézné és kijavítgatná mert én nem vagyok egy nagy tudó ebben a témában. Aki otthon van a témában annak tuti nem bonyolult.
    Aki megtenné nekem azzal felveszem a kapcsolatot és megbeszéljük.
    Pascalos programozás algoritmikusan és kódolva.
    csatoltam a szöveget.
    Algoritmikusan

    Uses Crt Const N=214 Tipus Tmozi=rekord evszam: egész szám opnev: szöveg Változók mozi: tomb (1..214):Tmozi atlag: valós i,j,max,min: egész szám Elj. Beolvas ciklus i:=1-től 214-ig ki i.&#8217; film évszáma&#8217; be mozi(i).evszam ki &#8217;operatőr neve:&#8217; be mozi(i).opnev c.v Elj. vége Eljárás filmkor atlag:=0 ciklus i= 1 től 214-ig atlag:=atlag+(mai datum-mozi(i)) c.v Atlag=atlag/214 Ki:atlag, Elj vége Eljárás keres i:=1 ciklus amíg (i<=214) és mozi(i).opnev=&#8217;Zsigmond Vilmos&#8217; i=i+1 c.v ha (i<=214 akkor ki (&#8217;Az&#8217; i &#8217; dátumú az.&#8217;) különben ki (&#8217;Nincs olyan film ami Zsigmond Vilmos készített&#8217;) Elágazás vége. Eljárás vége Eljárás Megszámol db:=0 ciklus i:=1-től 214-ig ha mozi(i).evszam>2007 akkor db:=db+1 c.v Ki:db,&#8217; darab film készült 2007 után&#8217; Eljárás vége Eljárás minkiv min=1 ciklus i=2-től 214-ig ha mozi(i).evszam < mozi(min).evszam akkor min=i c.v ki: mozi(min).opnev Eljárás vége Eljárás kigyujttombe dbk:=0 ciklus i:=1-től 214-ig ha mozi(i).evszam=2000 akkor dbk=dbk+1 o2000(dbk):=i ki:mozi(i).opnev elág vége c.v elj vége Eljárás szétválogat2tombbe dbb:=0 dbc:=0 Ciklus i:=1 to N do Ha mozi(i).evszam<2000 akkor dbb:=dbb+1, xx[dbb]:=mozi(i) különben dbc:=dbc+1, XXI[dbc]:=mozi(i) Ciklus vége Eljárás vége Procedure csere (var a,b:Tmozi) var sv:Tmozi begin sv.evszam:=a.evszam; a.evszam:=b.evszam; b.evszam:=sv.evszam; sv.opnev:=a.opnev; a.opnev:=b.opnev; b.opnev:=sv.opnev; end; Eljárás rendez1 ciklus i:=1-től 214-1-ig cilklus j:=i+1-től 214-ig Ha mozi(i).evszam<mozi(j).evszam akkor csere (mozi(i);mozi(j)) c.v c.v Elj vége. Eljárás rendez2 ciklus i:=1-től 214-1-ig min:=i cilklus j:=i+1-től 214-ig ha mozi(j).opnev>mozi(min).opnev akkor min:=j c.v csere(mozi(j);mozi(min)) c.v elj vége.


    Kódolva:
    Program filmes Uses crt const N:=214 type Tmozi:=record; evszam:integer; opnev:string var mozi:array[1..N] of Tmozi; atlag: real; i,j,max,min: integer; Procedure Beolvas; begin for i:=1 to N do writeln(i,&#8217; film évszáma&#8217;); readln(mozi[i].evszam); writeln(&#8217;operatőr neve:&#8217;); readln(be mozi[i].opnev); end; Procedure filmkor begin atlag:=0; for i:= 1 to N do begin atlag:=atlag+(mai datum-mozi[i].evszam) end; Atlag:=atlag/N; writeln(atlag); end; Procedure keres; begin i:=1; while (i<=N) and (mozi[i].opnev=&#8217;Zsigmond Vilmos&#8217;) do i:=i+1; end; if (i<=N) then writeln (&#8217;Az&#8217; ,i, &#8217; dátumú az.&#8217;) else writeln (&#8217;Nincs olyan film ami Zsigmond Vilmos készített&#8217;); end; Procedure Megszamol; begin db:=0; for i:=1 to N do if (mozi[i].evszam)>2007 then db:=db+1; Writeln(db,&#8217; darab film készült 2007 után&#8217;); end; Procedure minkiv; Begin min:=1; for i:=2 to N do if (mozi[i].evszam) < (mozi[min].evszam) then min:=i; end begin writeln(mozi[min].opnev); end; Procedure kigyujttombe; begin dbk:=0; for i:=1 to N do if (mozi[i].evszam)=2000 then dbk=dbk+1; o2000[dbk]:=i; writeln(mozi[i].opnev); end; end; Procedure szetvalogat2tombbe; Begin dbb:=0; dbc:=0; for i:=1 to N do if (mozi[i].evszam)<2000 then begin dbb:=dbb+1; xx[dbb]:=mozi[i]; end else begin dbc:=dbc+1; XXI[dbc]:=mozi[i]; end; end; Procedure csere (var a,b:Tmozi); var sv:Tmozi begin sv.evszam:=a.evszam; a.evszam:=b.evszam; b.evszam:=sv.evszam; sv.opnev:=a.opnev; a.opnev:=b.opnev; b.opnev:=sv.opnev; end; Procedure rendez1; Begin for i:=1 to N-1 do for j:=i+1 to N do if (mozi[i].evszam)<(mozi[j].evszam) then csere (mozi[i];mozi[j]); end; Procedure rendez2; Begin for i:=1 to N-1 do begin min:=i; for j:=i+1 to N do if (mozi[j].opnev)>(mozi[min].opnev) then min:=j; csere (mozi[j];mozi[max]); end; end; Begin clrscr; beolvas; clrscr; filmkor; keres; megszamol; minkiv; kigyujttombbe; szetvalogat2tombbe; csere; rendez1; readln; rendez2; readln; end.
    Mutasd a teljes hozzászólást!
abcd