Stránka 1 z 1
Převod jednotek v pascalu aneb jak by jste to udělali vy?
Napsal: stř 14. kvě 2008, 21:31
od Pavel.P.
program pokus;
uses crt;
var
zad,vys:real;
jed,pre,z:string;
function preved:real;
var y:real;
begin
writeln('Napiste pocet');
readln(zad);
writeln('Napiste jednotky -> cm,dm,m');
readln(jed);
writeln('Na jake jednotky, chcete cislo prevest -> cm,dm,m?');
readln(pre);
//pocitam CM
if jed = 'cm' then begin
if pre='cm' then
y:=1;
if pre='dm' then
y:=0.1;
if pre='m' then
y:=0.01;
end;
//pocitam dm
if jed = 'dm' then begin
if pre='dm' then
y:=1;
if pre='m' then
y:=0.1;
if pre='cm' then
y:=10;
end;
//pocitam m
if jed='m' then begin
if pre='m' then
y:=1;
if pre='dm' then
y:=10;
if pre='cm' then
y:=100;
end;
//pocita jednotky
vys:=zad*y;
writeln('Prevod je ',vys:4:4,' ',pre);
end;
begin
clrscr;
repeat
preved;
writeln('Chcete pokracovat? a/n');
readln(z);
until
z='n';
end.
Tak co, jak by jste to řešili vy? Přidám tam malou úpravu pomocí typu char a hodnoty case, takže tam nebude tolik podmínek a bude to jednodušší, ale zároveň bych chtěl vědět, jak by jste podobný příklad udělali vy.
Napsal: čtv 15. kvě 2008, 15:36
od Pavel.P.
NIKDO?
Napsal: pát 16. kvě 2008, 22:22
od Ssnake
case :
jed = mm
nas := 0.001;
jed = cm
nas := 0.01;
...
...
end;
druhy case co zjisti vysledne jednotky, a pak vemu tu hodnotu a vynasobim prvnim a vydelim druhym (nebo naopak

)
sry ale syntax pascalu uz si moc napamatuju, snad jde pochopit jak to myslim...
Napsal: úte 20. kvě 2008, 13:38
od LtK
No minimálne Ti tam chýba test, či zadal číslo pri počte jednotiek a keď nezadal ani jednu správnu jednotku (m, dm, cm) tak to spadne s chybou.
A ja by som to asi riesil cez array.
prevod : array[1..*,1..*] of integer := [ [1,0.1,0.01], [0.1,1,10], [1,10,100] ]; {vzdy by to malo byt rovnake poradie t.j. m, dm, cm}
A jednotkam by sa priradilo ciselne hodnoty v nejakej funkcii, napr. m:= 1, dm:= 2, cm:= 3
Z inputu by sa hodnota poslala do funkcie a vratila ako ciselna pre "jed", druha hodnota takym istym postupom ako "pre" a vysledok by sa vyratal ako vys := zad * prevod[jed, pre]
Tymto padom to bude jednoducho rozsirovatelne na viac prevodov - keby si nahodou pridal este mile, stopy, palce, km, ... A rozhodovacia funkcia bude len raz...
Napsal: úte 20. kvě 2008, 14:36
od Ssnake
LtK píše:No minimálne Ti tam chýba test, či zadal číslo pri počte jednotiek a keď nezadal ani jednu správnu jednotku (m, dm, cm) tak to spadne s chybou.
A ja by som to asi riesil cez array.
prevod : array[1..*,1..*] of integer := [ [1,0.1,0.01], [0.1,1,10], [1,10,100] ]; {vzdy by to malo byt rovnake poradie t.j. m, dm, cm}
A jednotkam by sa priradilo ciselne hodnoty v nejakej funkcii, napr. m:= 1, dm:= 2, cm:= 3
Z inputu by sa hodnota poslala do funkcie a vratila ako ciselna pre "jed", druha hodnota takym istym postupom ako "pre" a vysledok by sa vyratal ako vys := zad * prevod[jed, pre]
Tymto padom to bude jednoducho rozsirovatelne na viac prevodov - keby si nahodou pridal este mile, stopy, palce, km, ... A rozhodovacia funkcia bude len raz...
osetreni chyb je snad zamozrejmost...slo mi o ten princip jak to prevest, zjistim 2 koeficienty vstupni a vystupni jednotky a pak jen vynasobim/vydelim a je to
Napsal: úte 20. kvě 2008, 19:43
od Pavel.P.
Něco takového ale škaredého:
program prevody;
uses crt;
var
co,dal:string;
pre,jed:char;
hod,vy:real;
p:real;
procedure nacist;
begin
writeln('Zadejte hodnotu:');
readln(hod);
if co = 'd' then begin
writeln('Napiste jednotku pocitani: cm(c), dm(d), m(m)');
readln(jed);
end;
if co = 'o' then begin
writeln('Napiste jednotku pocitani: cm3(c), dcm3(d), m3(m)');
readln(jed);
end;
if co = 'v' then begin
writeln('Napiste jednotku pocitani: gr(g), dkg(d), kg(k)');
readln(jed);
end;
end;
function prevod_delku:real;
begin
nacist;
writeln('Napiste na jakou jednotku chcete prevest: cm(c), dm(d), m(m)');
readln(pre);
case jed of
'c': case pre of
'c': p:=1;
'd': p:=0.1;
'm': p:=0.01;
end;
'd': case pre of
'c': p:=0.1;
'd': p:=1;
'm': p:=0.1;
end;
'm': case pre of
'c': p:=0.01;
'd': p:=0.1;
'm': p:=1;
end;
end;
vy:=hod*p;
writeln('Prevod na vybranou jednotku je ', vy:6:6);
end;
function prevod_objem:real;
begin
nacist;
writeln('Napiste na jakou jednotku chcete prevest: cm3(c), dm3(d), m3(m)');
readln(pre);
case jed of
'c': case pre of
'c': p:=1;
'd': p:=0.001;
'm': p:=0.000001;
end;
'd': case pre of
'c': p:=0.001;
'd': p:=1;
'm': p:=0.001;
end;
'm': case pre of
'c': p:=0.000001;
'd': p:=0.0001;
'm': p:=1;
end;
end;
vy:=hod*p;
writeln('Prevod na vybranou jednotku je ', vy:6:6);
end;
function prevod_vahy:real;
begin
nacist;
writeln('Napiste na jakou jednotku chcete prevest: gr(g), dkg(d), kg(k)');
readln(pre);
case jed of
'g': case pre of
'g': p:=1;
'd': p:=0.1;
'k': p:=0.001;
end;
'd': case pre of
'g': p:=0.1;
'd': p:=1;
'k': p:=0.01;
end;
'k': case pre of
'g': p:=0.001;
'd': p:=0.01;
'k': p:=1;
end;
end;
vy:=hod*p;
writeln('Prevod na vybranou jednotku je ', vy:6:6);
end;
procedure co_pocitat;
begin
writeln('Napiste co chcete pocitat: delku (d), objem (o) nebo vahu(v)');
readln(co);
if co = 'd' then
prevod_delku;
if co = 'o' then
prevod_objem;
if co = 'v' then
prevod_vahy;
end;
begin
clrscr;
repeat
co_pocitat;
writeln('Chcete pokracovat yes(y), no(n) ?');
readln(dal);
until dal = 'n';
end.
//Díky za ten nápad pro pole, tu zkusím...
Napsal: stř 21. kvě 2008, 12:31
od LtK
2 Ssnake: S tym testom inputu som myslel na Pavla.P.
BTW, osetrenie chyb je samozrejmost, ale v oboch pripadoch, ak nezada to, co mu podmienka if alebo case vyhodnoti ako true, tak bude mat premenne, ktore su neinicializovane a program padne...
2 Pavel.P. : ten druhy priklad je hodne skaredy. Pozrel som si ho len zbezne, ale hned som objavil niekolko chyb.
1. function nema nikde navratovu hodnotu
2. naco pouzivat globalnu premennu do nacist, ked sa da zavolat funkcia s parametrami.
Napsal: stř 21. kvě 2008, 13:58
od Pavel.P.
LtK píše:2 Pavel.P. : ten druhy priklad je hodne skaredy. Pozrel som si ho len zbezne, ale hned som objavil niekolko chyb.
jo, to vím, že je to škaredé...

Ale sem to narychlo uplácal... Musel sem vymyslet 3x jiný přiklad na stejné zadání...
