Kezdőoldal » Számítástechnika » Programozás » Pascal programkód. Valaki...

Pascal programkód. Valaki rátudna nézni, hogy lehet-e rövidebben megoldani a feladatot?

Figyelt kérdés

A feladat az volt, hogy egy szöveges állományból olvassunk be egy-vagy két számjegyű számokat, amelyeket szóközök választanak el egymástól.


Az én megoldásom:


program project12345;

const c=100;

type

q=record

ho:integer;

hp:integer;

hmp:integer;

bo:integer;

bp:integer;

bmp:integer;

t:integer;

end;

tomb=array[1..c] of q;

var

r,i,j,d:integer;

f:text;

k:tomb;

s:string;

begin

assign(f,'hivasok.txt');

reset(f);


i:=1;


while not eof(f) do begin

readln(f,s);

d:=0;

r:=1;

val(COPY(S,d,r), (k[i].ho),j);

if ord(s[r+1])<>32 then begin

r:=2;

val(COPY(S,d,r), (k[i].ho),j);

inc(d);

end;



val(COPY(S,3+d,r), (k[i].hp),j);

if j<>0 then begin


r:=1;

val(COPY(S,3+d,r), (k[i].hp),j);

end;

if ord(s[3+d+1])<>32 then begin

r:=2;

val(COPY(S,3+d,r), (k[i].hp),j);

inc(d);

end;



val(COPY(S,5+d,r), (k[i].hmp),j);

if j<>0 then begin

r:=1;

val(COPY(S,5+d,r), (k[i].hmp),j);

end;

if ord(s[5+d+1])<>32 then begin

r:=2;

val(COPY(S,5+d,r), (k[i].hmp),j);

inc(d);

end;



val(COPY(S,7+d,r), (k[i].bo),j);

if j<>0 then begin

r:=1;

val(COPY(S,7+d,r), (k[i].bo),j);

end;

if ord(s[7+d+1])<>32 then begin

r:=2;

val(COPY(S,7+d,r), (k[i].bo),j);

inc(d);

end;



val(COPY(S,9+d,r), (k[i].bp),j);

if j<>0 then begin

r:=1;

val(COPY(S,9+d,r), (k[i].bp),j);

end;


if ord(s[9+d+1])<>32 then begin

r:=2;

val(COPY(S,9+d,r), (k[i].bp),j);

inc(d);

end;



val(COPY(S,11+d,r), (k[i].bmp),j);

if j<>0 then begin

r:=1;

val(COPY(S,11+d,r), (k[i].bmp),j);

end;


if ord(s[11+d+1])<>32 then begin

r:=2;

val(COPY(S,11+d,r), (k[i].bmp),j);

inc(d);

end;

readln(f, k[i].t);


inc(i);

end;


close(f);

readln;

end.


Nem lehetne valami ciklussal lerövidíteni?



2015. ápr. 6. 15:17
1 2 3 4
 11/33 ejbenjaro ***** válasza:

A program, amit írtam nem foglalkozik vele, hogy egy vagy kétjegyű a beolvasott adat. A fájlból beolvas egy sort, amit a szóközök mentén felbont, majd az így szétbontott adatokat beleteszi a a tömbbe. Ha a beolvasott adatról ki kell deríteni, hogy hány jegyű, akkor a legegyszerűbb ha stringként olvasod be, majd a length függvénnyel megkapod, hogy hány karakter hosszú, azaz hány jegyű. Ha ez nem járható út, akkor marad az osztás. Osztod 10-el a számot, ha nagyobb mint 1, akkor kétjegyű, ha kisebb, akkor egyjegyű.

Az érettségi feladatot megtekintve amúgy erre semmi szükség nincsen.

2015. ápr. 6. 19:04
Hasznos számodra ez a válasz?
 12/33 tabaki ***** válasza:

Nem tudom megnézni ejbenjaro megoldását, mert nekem nem jön be a Pastie :(


Sok minden érthetetlen a számomra a kódodban, de a leginkább ez a heroikus égvívás talányos az egy-és kétkarakteres számokkal. Nem értem: szóköztől szóközig olvasol, kapsz egy szám-stringet, amelynek a hosszát egyértelműen megmondja a Length() függvény vagy a string 0. eleme. Ez is csak akkor fontos, ha vannak számon tartandó kezdő nullák, mert egyébként a Val() függvény a karakterek számától függetlenül számértékké alakítja, és ha ez kisebb 10-nél, nyilván egy jegyű, egyébként kétjegyű (ha feltételezzük, hogy nincs hiba a fájl adataiban).

Én nem bánnám, ha linkelnéd azt a bizonyos hivasok.txt fájlt is, hátha az megérteti velem a próbálkozásodnak legalább a többi furcsaságát.

2015. ápr. 6. 19:22
Hasznos számodra ez a válasz?
 13/33 tabaki ***** válasza:
Aha, végre bejött a Pastie, mindjárt megnézem. Közben látom, hogy ejbenjaro elmondta előttem a lényeget, bocs.
2015. ápr. 6. 19:25
Hasznos számodra ez a válasz?
 14/33 tabaki ***** válasza:
Oké, közben megtaláltam a hívasok.txt fájlt is, az iménti óhajom tárgytalan.
2015. ápr. 6. 19:36
Hasznos számodra ez a válasz?
 15/33 A kérdező kommentje:

Sajnos még nem értem.

Van egy alábbi sorunk:

26 1 45 89 5

Csak stringbe tudjuk beolvasni, mert csak egész sort tudunk olvasni és vannak benne szóközök. Azt nem értem, hogyan másképp lehetne meghatározni, hogy az első szám egy vagy két számjegyű, minthogy feltételezzük, hogy egy számjegyű, aztán leellenőrizzük, hogy a következő karakter szóköz-e. Ha nem akkor tudjuk, hogy kettő. És eddigi tanulmányaim alapján ezt minden számmal el kell játszani. Ugyanakkor valóban csúnya a kód és ha pl. ezer szám lenne a sorban akkor kissé nehezen alkalmazható. Ezért szerettem volna ciklusba tenni, de akárhogy törtem a fejemet nem tudtam kiküszöbölni, hogy minden szám hosszát vizsgálnom kell.

2015. ápr. 6. 19:52
 16/33 A kérdező kommentje:
Ja és az eredeti feladat nem igazán érdekel, mert meg tudtam csinálni (habár időből kifutottam)
2015. ápr. 6. 19:54
 17/33 anonim ***** válasza:

Nem néztem a megoldást, de klasszikus módszer, hogy beolvasunk egy sort, majd feltördeljük szóközök mentén.

Ilyenkor általában alapból egy tömböt kapunk vissza és ilyen fölösleges típusokra sincs szükség.

Nem kell mindent ennyire alacsony szinten lekódolni, a programozás nagy részében mások által már megírt kódot használunk újra.

2015. ápr. 6. 19:58
Hasznos számodra ez a válasz?
 18/33 SimkoL ***** válasza:

Teljesen felesleges azon gyötrődni hány számjegyű a szám. Mivel tudjuk, hogy csak számokat tartalmaz a file, adott 'mennyiségben és elrendezésben' ezért tökéletes a Read:


program szamla;


type

THivas = record

ho, hp, hmp, bo, bp, bmp, t : integer;

end;


var tomb : array[1..200] of THivas;

f : text;

i : byte = 0;

k : byte;


begin

Assign(f,'c:\hivasok.txt');

Reset(f);

while not Eof(f) do

begin

Inc(i);

Read(f, tomb[i].ho, tomb[i].hp, tomb[i].hmp, tomb[i].bo, tomb[i].bp, tomb[i].bmp, tomb[i].t);

end;

for k := 1 to i do

begin

WriteLn(tomb[k].ho);

WriteLn(tomb[k].hp);

WriteLn(tomb[k].hmp);

WriteLn(tomb[k].bo);

WriteLn(tomb[k].bp);

WriteLn(tomb[k].bmp);

WriteLn(tomb[k].t);

end;

Close(f);

ReadLn;

end.


Hibakezelést a file létezésére illik beiktatni azért :)

2015. ápr. 6. 19:59
Hasznos számodra ez a válasz?
 19/33 ejbenjaro ***** válasza:

„Sajnos még nem értem.

Van egy alábbi sorunk:

26 1 45 89 5

Csak stringbe tudjuk beolvasni, mert csak egész sort tudunk olvasni és vannak benne szóközök. Azt nem értem, hogyan másképp lehetne meghatározni, hogy az első szám egy vagy két számjegyű, minthogy feltételezzük, hogy egy számjegyű, aztán leellenőrizzük, hogy a következő karakter szóköz-e. ”


Mivel tudjuk, hogy 6 elemet kell beolvasni és mind a 6 szám, simán be lehet olvasni számonként is mindenféle stringművelet nélkül.

pl így:

program project12345;


{$mode objfpc}{$H+}


uses Classes,SysUtils;


type

THivas=record

ho:integer;

hp:integer;

hmp:integer;

bo:integer;

bp:integer;

bmp:integer;

t:integer;

end;


var

Hivasok: array of THivas;

i: integer;

f: text;


begin

Assign(f,'hivasok.txt');

reset(f);

i:=1;

While not eof(f) do

begin

Setlength(Hivasok,i);

readln(f,Hivasok[i-1].ho,Hivasok[i-1].hp,Hivasok[i-1].hmp,Hivasok[i-1].bo,Hivasok[i-1].bp,Hivasok[i-1].bmp);

writeln(Hivasok[i-1].ho,' ',Hivasok[i-1].hp,' ',Hivasok[i-1].hmp,' ',Hivasok[i-1].bo,' ',Hivasok[i-1].bp,' ',Hivasok[i-1].bmp);

Inc(i);

end;

SetLength(Hivasok,0);

close(f);

end.

Innen már csak egy lépés megnézni, hogy a beolvasott szám nagyobb e mint 10, hogy eldöntsd, hogy egy, vagy kétjegyű.

2015. ápr. 6. 20:09
Hasznos számodra ez a válasz?
 20/33 tabaki ***** válasza:

SimkoL, a tied jobban tetszik, mert csak az alaprendszert használja (érettségi feladat, ugyebár -- mellesleg ejbenjaro programja nekem „An unhandled exception occurred at $0806F400 : EStringListError : List index (1) out of bounds $0806F400” hibaüzenettel le is áll), mindazonáltal érdemes az adatfájlba is belepillantani:

[link]

Az eredeti forrás mellett ott a teljes feladat megoldása, azért nem azt linkeltem. Ha kérdező eddig esetleg nem találta volna meg, hadd gondolkozzon tovább...

2015. ápr. 6. 20:20
Hasznos számodra ez a válasz?
1 2 3 4

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!