Převod jednotek v pascalu aneb jak by jste to udělali vy?
- Pavel.P.
- Středně pokročilý

-
- Registrován: 28. lis 2005
- Bydliště: UHB
Převod jednotek v pascalu aneb jak by jste to udělali vy?
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.
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.
...
- Ssnake
- Začátečník

-
- Registrován: 25. led 2005
- Bydliště: chotebuz
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...
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...
FD node 202, ST45SF, Z97i, i7-4980HQ CB20:1718,CB24:254 NH-L9i, 2x8, R9NANO , 5100MAX
x850xtPE, x1950xtx, hd2900gt, hd3870, hd4890, hd5870 - - 6800ultra, 7900gtx, 8800gtx, 9800gtx+, gtx285
x850xtPE, x1950xtx, hd2900gt, hd3870, hd4890, hd5870 - - 6800ultra, 7900gtx, 8800gtx, 9800gtx+, gtx285
- LtK
- Začátečník

- Registrován: 03. čer 2003
- Bydliště: Bratislava
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...
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...
i5 3570K, Asus Maximus V Gene Z, 16GB DDR3 1600 Corsair Vengeance, NVidia GTX980, Samsung 850Pro 256GB + 7TB HDD, Creative Inspire T5400, Enermax Pro82+ 620W, LCD Philips 240PW, watercooled
- Ssnake
- Začátečník

-
- Registrován: 25. led 2005
- Bydliště: chotebuz
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 toLtK 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...
FD node 202, ST45SF, Z97i, i7-4980HQ CB20:1718,CB24:254 NH-L9i, 2x8, R9NANO , 5100MAX
x850xtPE, x1950xtx, hd2900gt, hd3870, hd4890, hd5870 - - 6800ultra, 7900gtx, 8800gtx, 9800gtx+, gtx285
x850xtPE, x1950xtx, hd2900gt, hd3870, hd4890, hd5870 - - 6800ultra, 7900gtx, 8800gtx, 9800gtx+, gtx285
- Pavel.P.
- Středně pokročilý

-
- Registrován: 28. lis 2005
- Bydliště: UHB
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...
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...
...
- LtK
- Začátečník

- Registrován: 03. čer 2003
- Bydliště: Bratislava
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.
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.
i5 3570K, Asus Maximus V Gene Z, 16GB DDR3 1600 Corsair Vengeance, NVidia GTX980, Samsung 850Pro 256GB + 7TB HDD, Creative Inspire T5400, Enermax Pro82+ 620W, LCD Philips 240PW, watercooled
- Pavel.P.
- Středně pokročilý

-
- Registrován: 28. lis 2005
- Bydliště: UHB