Převod jednotek v pascalu aneb jak by jste to udělali vy?

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Pavel.P.
Středně pokročilý
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?

Příspěvek 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.

...
Pavel.P.
Středně pokročilý
Středně pokročilý
Registrován: 28. lis 2005
Bydliště: UHB

Příspěvek od Pavel.P. »

NIKDO?

...
Ssnake
Začátečník
Začátečník
Registrován: 25. led 2005
Bydliště: chotebuz

Příspěvek 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...
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
LtK
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Bratislava

Příspěvek 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...
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
Začátečník
Registrován: 25. led 2005
Bydliště: chotebuz

Příspěvek 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
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
Pavel.P.
Středně pokročilý
Středně pokročilý
Registrován: 28. lis 2005
Bydliště: UHB

Příspěvek 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...

...
LtK
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Bratislava

Příspěvek 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.
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ý
Středně pokročilý
Registrován: 28. lis 2005
Bydliště: UHB

Příspěvek 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í... :)

...
Odpovědět

Zpět na „Programování a web“