I: Pascal program pokladnica

Programovacie jazyky, rady, poradňa...
L0tr3
Novice
Novice
Príspevky: 7
Registrovaný: 18 okt 2010, 22:28

I: Pascal program pokladnica

Príspevok od používateľa L0tr3 »

Zdravím chcem sa vás poprosiť o pomoc. Jedna sa celkom jednoduchý program v pascale. Zadanie znie nasledovne :

:idea:
Zrealizujte rekurzívne aj nerekurzívne riešenie (ak sa dá) programu, ktorý zabezpečí pomocou rekurzívnej procedúry (funkcie) výpis najmenšieho počtu mincí koľko budeme potrebovať na vyplatenie určitej sumy, ak sa v krajine používajú tieto druhy mincí 2€,1€,50cent, 20cent, 10cent, 5cent, 2cent, 1cent.
Našiel som na nete pár programov ale všetko pracuje len s celými číslami. Aj na toto vám viem odpredať, áno viem že niekto si povie ved to vynásob 100 a je to.. Omyl dátový typ real ostal stále real akurát sa stým lepšie pracuje a teda možnosť použiť DIV alebo MOD nieje možné čo sa týka reálnych čísel. Program ako taký s par muchami mám ale bez použitia rekurzie.
A tu by som vás chcel poprosiť o pomoc :plus: mate niekto podobne vytvorený program? Ďakujem vopred

Kód: Vybrať všetko

program pokladna;

uses crt;

procedure kolkominci(hodnota:real);

var a,b:word;
    c,d,e:real;
    pom:integer;
    poc:real;
    cele:word;
    desatinne:real;
    des:integer;

begin
 a:=0;
 b:=0;
 c:=0;
 d:=0;
 e:=0;
 pom:=0;
 poc:=0;
 cele:=0;
 desatinne:=0;
 des:=0;


 poc:=hodnota;
 cele:=trunc(poc);
 writeln('Vhode suma : ',cele);
 desatinne:=frac(poc);
 writeln('Jej desatinna hodnota : ',desatinne:1:2);

 writeln;
 writeln;
 writeln;

 a:=cele;
 a:=a div 2;
 writeln('Pocet 2EUR minci: ',a);
 pom:=cele-(2*a);
 b:=pom;
 b:=b div 1;
 writeln('Pocet 1EUR minci: ',b);

  c:=desatinne;
  c:=c*100;
  c:=c-50;
  if c>0 then writeln('Pocet 50Cent minci: 1')
          else if c=0 then begin
                                writeln('Pocet 50Cent minci: 1');
                                writeln('Pocet 20Cent minci: 0');
                                writeln('Pocet 10Cent minci: 0');
                                writeln('Pocet  5Cent minci: 0');
                                writeln('Pocet  2Cent minci: 0');
                                writeln('Pocet  1Cent minci: 0');
                                exit;
                                end
                      else writeln('Pocet 50Cent minci: 0');

  if c<0 then begin                    {tento krok je kvoli kladnej hodnote c}
                  c:=desatinne*100;
                  d:=c;             {tento krok nam vypocita drobne pod 50}
                  end
         else d:=c;                {tu sa odpocita -50Cent a ide dalej zo zostatkom}


 if d>=40 then begin
                    writeln('Pocet 20Cent minci: 2');
                    d:=d-40;
                    writeln('Pocet 10Cent minci: 0');
                 end

          else if (d<40) and (d>=20) then begin
                      writeln('Pocet 20Cent minci: 1');
                      d:=d-20;
                      if d>=10 then begin writeln('Pocet 10Cent minci: 1');
                                          d:=d-10;
                                      end
                               else writeln('Pocet 10Cent minci: 0')
                               end

                        else begin
                                writeln('Pocet 20Cent minci: 0');
                                if d>=10 then begin
                                writeln ('Pocet 10Cent minci: 1');
                                d:=d-10;      {centi ako 5 2 1}
                                end
                                 else writeln('Pocet 10Cent minci: 0');
                             end;
 writeln(d:2:1);

 if d=9.0 then begin
      writeln('Pocet 5Cent minci: 1');
      writeln('Pocet 2Cent minci: 2');
      end
 else
 if d=8.0 then begin
      writeln('Pocet 5Cent minci: 1');
      writeln('Pocet 2Cent minci: 1');
      writeln('Pocet 1Cent minci: 1');
      end
 else
 if d=7.0 then begin
      writeln('Pocet 5Cent minci: 1');
      writeln('Pocet 2Cent minci: 1');
      end
 else
 if d=6.0 then begin
      writeln('Pocet 5Cent minci: 1');
      writeln('Pocet 1Cent minci: 1')
      end
 else
 if d=5.0 then writeln('Pocet 5Cent minci: 1')

 else
 if d=4.0 then writeln('Pocet 2Cent minci: 2')

 else
 if d=3.0 then begin
      writeln('Pocet 2Cent minci: 1');
      writeln('Pocet 1Cent minci: 1');
      end
 else
 if d=2.0 then writeln('Pocet 2Cent minci: 1')

 else
 if d=1.0 then writeln('Pocet 1Cent minci: 1')



end;

var suma:real;


 begin
 clrscr;
 writeln('=========================================================');
 writeln('          A U T O M A T   N A   P E N I A Z E            ');
 writeln;
 write('Zadajte penaznu hodnotu = ');
 readln(suma);
  if suma>0 then begin
                  kolkominci(suma);
                  writeln;
                  write('Vydavam peniaze pockajte prosim');
                  delay(450);
                  write('... ');
                  delay(800);
                  write(' ..');
                  delay(1150);
                  write(' .');
                  delay(1500);
                  writeln('  Dovidenia');
                  end
            else writeln('Zadali ste zapornu alebo nulovu hodnotu! Opakujte tento krok');
  writeln('=========================================================');
 readln;
 end.

PS : Prepáčte keď som sa netrafil do témy fóra.
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: I: Pascal program pokladnica

Príspevok od používateľa javatar »

do temy fora si sa trafil a ten program som si preletel a tiez by mal fungovat

mala otazka - s record -ami v pascale ste uz robili? (jedno elegantne riesenie by som ti v takom pripade spravil... ak si s recordami este nerobil tak v zasade to iste len bude menej elegantne)
L0tr3
Novice
Novice
Príspevky: 7
Registrovaný: 18 okt 2010, 22:28

Re: I: Pascal program pokladnica

Príspevok od používateľa L0tr3 »

Áno robili sme s record ale tu skôr sa uz jedna o tu rekurziu však? A taka drobnosť teraz neviem kde je chyba keď si ten program hodíš do pascalu tvári sa že pekne ide ale pozri sa na hodnoty

Kód: Vybrať všetko

80.30 a potom 20.30
V prvom prípade nám krásne ukazuje hodnoty minci správne ale v druhom úplne zle. Pričom celočíselná hodnota 80E nemá nič spoločne s výpočtom drobných minci teda 30cent... A tu vôbec nechápem prečo sa to deje.

Jasne ja si veľmi rad nechám poradiť nakoľko neviem stým pohnúť ďalej.
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: I: Pascal program pokladnica

Príspevok od používateľa javatar »

pozri pascal uz nemam takze ti neposlem hotovy kod, ale skusim to napisat po pamati.. syntakticke chyby si velmi lahko opravis uz sam, hlavne pochop princip
L0tr3
Novice
Novice
Príspevky: 7
Registrovaný: 18 okt 2010, 22:28

Re: I: Pascal program pokladnica

Príspevok od používateľa L0tr3 »

ďakujem moc hádam ta to moc neotravuje :? jasne také chyby v pohode a pravdaže veľmi rad by som tomu chcel chápať. Aby sme sa pochopili ideš skúsiť napísať to rekurzívne ?
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: I: Pascal program pokladnica

Príspevok od používateľa javatar »

takze vytvoris si spominany record

Kód: Vybrať všetko

type 
  pocet_minci = record
    p2e: integer;
    p1e: integer;
    p50c: integer;
    p20c: integer;
    p10c: integer;
    p5c: integer;
    p2c: integer;
    p1c: integer;
end;
sluzi v podstate len na to aby si nemal vela parametrov vo funkcii

nerekurzivna verzia (procedura aj funkcia)

Kód: Vybrať všetko

procedure urciPocet(suma:real; var vysledok:pocet_minci)
begin
  while(suma>2)
  begin
    suma := suma -2;
    inc(vysledok.p2e);
  end;
{ obdobne urobis tento cyklus pre 1,0.5,0.2,0.1,0.05,0.02 a 0.01 
   je to dost primitivne riesenie - tu pokojne mozes pouzit aj tvoje trunc a div, ale myslim si ze to bude pomalsie}
end;

function urciPocet(suma:real): pocet_minci;
var vysledok:pocet_minci;
begin
  while(suma>2)
  begin
    suma := suma -2;
    inc(vysledok.p2e);
  end;
{ obdobne urobis tento cyklus pre 1,0.5,0.2,0.1,0.05,0.02 a 0.01 
   je to dost primitivne riesenie - tu pokojne mozes pouzit aj tvoje trunc a div, ale myslim si ze to bude pomalsie}
urciPocet := vysledok;
end;
no a co sa tyka rekurzie tak sa mi toto riesenie vobec nepaci, je rekurzivne nasilu a ma zbytocne vysoku reziu, ale je to to najjednoduchsie co mi napadlo

Kód: Vybrať všetko

procedure urciPocet(suma:real; var vysledok:pocet_minci)
begin
  if(suma>2)
  begin
    suma := suma -2;
    inc(vysledok.p2e);
    urciPocet(suma,vysledok);
  end;
{ obdobne urobis tento if pre 1,0.5,0.2,0.1,0.05,0.02 a 0.01}
end;
//autoeditácia príspevku (19 Okt 2010, 15:58)
L0tr3 napísal:ďakujem moc hádam ta to moc neotravuje :? jasne také chyby v pohode a pravdaže veľmi rad by som tomu chcel chápať. Aby sme sa pochopili ideš skúsiť napísať to rekurzívne ?
mas tam cele riesenie -> ak nieco nechapes.. pytaj sa
L0tr3
Novice
Novice
Príspevky: 7
Registrovaný: 18 okt 2010, 22:28

Re: I: Pascal program pokladnica

Príspevok od používateľa L0tr3 »

skúsim to dat dokopy zatiaľ to nerekurzívne riešenie. Myslím že tomu zatiaľ chápem akurát jedna vec ma napáda nemá tam pri tej podmienke while miesto > skôr >= ?

//autoeditácia príspevku (19 Okt 2010, 16:34)
jeden veľký problém sa vyriešil moje povodne zadanie je správne s jednou dosť podstatnou chybou ktorá by ma v živote nenapadla. Pri zadaní hodnoty 80.30 pri použitý funkcie frac(premenna) nám tato funkcia zle zaokrúhli hodnotu a to na 0.29999999... a preto to nešlo. A teda nasledujúce riešenie :

Kód: Vybrať všetko

Riadok 31 :
desatinne := round(100*frac(poc))/100;
Pre všetkých ktorý toto budu v budúcnu použivať užitočná rada si toto skontrolovať. Opravil mi to J.K

Ďakujem všetkým za pomoc hlavne javatar rekurzívne napísaný program skompletizujem a použijem ďakujem ešte raz. Zatim
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: I: Pascal program pokladnica

Príspevok od používateľa javatar »

L0tr3 napísal:...nemá tam pri tej podmienke while miesto > skôr >= ?...
veru ma :oops:
L0tr3
Novice
Novice
Príspevky: 7
Registrovaný: 18 okt 2010, 22:28

Re: I: Pascal program pokladnica

Príspevok od používateľa L0tr3 »

ďakujem ma to všetko hotové aj rekurzívne aj bez. :)
Napísať odpoveď