Wydawania reszty - program nie działa prawidłowo

0

Witam napisałem program do wydawania reszty tak wiem ma on kilka niedoskonałości, które poprawie jednak najpierw prosiłbym was o pomoc, co z tym zrobić by to jako tako działało, program się kompiluje, jednak gdy wprowadzam jakas wartosc to cały sie sypie. Jedyna wartoscia ktora wprowadzilem bylo 2 na dodatek wynik z oczywistych dla mnie powodów był nieprawidłowy. Czy wgl mozna w ten sposób uzywac funkcji div, dziękuje za pomoc.

program wydawanie_reszty;
uses
crt;
var
R: longword;
a, b, c, d, e, f: longword;
i: integer;
z, y, w, v, u, t: longword;
begin
repeat
writeln ('Podaj nominal z ktorego ma byc obliczona reszta: ');
{$I-}
readln(R);
{$I+}
i:=ioresult;
        if i<>0 then
writeln(' Podana przez Ciebie kwota chyba nie jest podana prawidowa!');
        until i=0;
writeln('Podae kwote: ',R);
        if R=0 then writeln('Nie mozna obliczyc reszty z nieczego');
        if R<0 then writeln ('Nie oszukuj, jeste mi winien pieniadze!' ,R);
                //G˘wna cze†
                if R>=50 then  //zalozenie, ze podana liczba jest wieksza badz rowna 50
                a:=R div 50;
                z:=R-a*50;
                b:=z div 20;
                y:=z-b*20;
                c:=y div 10;
                w:=y-c*10;
                d:=w div 5;
                v:=w-d*5;
                e:=v div 2;
                u:=v-e*2;
                f:=u div 1;
                t:=u-f*1;

                 if R<50  then
                 a:=0;
                 b:=R div 20;
                 y:=R-b*20;
                 c:=y div 10;
                 w:=y-c*10;
                 d:=w div 5;
                 v:=w-d*5;
                 e:=v div 2;
                 u:=v-e*2;
                 f:=u div 1;
                 t:=u-f*1;

                        if R<20 then
                         a:=0;
                         b:=0;
                         c:=R div 10;
                         w:=R-c*10;
                         d:=w div 5;
                         v:=w-d*5;
                         e:=v div 2;
                         u:=v-e*2;
                         f:=u div 1;
                         t:=u-f*1;
                                if R<10 then
                                  a:=0;
                                  b:=0;
                                  c:=0;
                                  d:=R div 5;
                                  v:=R-d*5;
                                  e:=v div 2;
                                  u:=v-e*2;
                                  f:=u div 1;
                                  t:=u-f*1;
                                        if R=2 then e:=2;
                                             if R<5 then
                                              a:=0;
                                              b:=0;
                                              c:=0;
                                              d:=0;
                                              e:=R div 2;
                                              u:=R-e*2;
                                              f:=u div 1;
                                              t:=u-f*1;
                                              if R<2 then
                                                        a:=0;
                                                        b:=0;
                                                        c:=0;
                                                        d:=0;
                                                        e:=0;
                                                        f:=R div 1;
                                                        t:=R-f*1;




writeln('50z ' ,a);
writeln('20z ' ,b);
writeln('10z ' ,c);
writeln('5z ' ,d);
writeln('2z ' ,e);
writeln('1z ' ,f);
writeln;
readln;


end.
2

tak wiem ma on kilka niedoskonałości

Kilka?
Ten program to dokładnie 103 linijki niedoskonałości.

Weźże go usuń i napisz od nowa, tym razem z głową.
Podejdź do tego matematycznie.

0

Dzięki, tylko własnie o to chodzi, ze to jest moje drugie rozwiązanie. Pierwsze które przyszło mi do głowy bylo bardzo podobne do gotowca z neta. Chociaż program sam wymysliłem, nauczyciel zarzucił mi, że jest to kopia i kazal mi to napisać od nowa, z tym, ze ja o programowaniu mam bardzo małe pojęcie. W sumie wygladalo to tak no poznaliscie juz algorytmy to teraz siadać i szukac w internecie polecen które pomoga wam napisać program z algorytmu.

0

on kilka niedoskonałości o RLY? A wprowadź tam teraz malutką zmianę gdzie potencjalnych nominałów może być np. 1< K < 1000000. Nadal napisałbyś ten kod tak samo?

0

Tak wiem, jest to "troche" glupie jednak ja tak naprawde nie wiem od czego zacząc, jestem jak na razie 0 jesli chodzi o te dziedzine informatyki, próbowałem z tablica, jednak mój nauczyciel powiedział, ze jest to przykład prosto z internetu. :x.

0

Ten kod jest do bani, a wcięcia mylnie sugerują, że instrukcje po warunkach są grupowane; Jeżeli słupki poniżej warunków faktycznie chciałeś pogrupować w bloki to powinieneś je obejmować w Begin i End;

Poza tym kod jest bardzo długi i brzydki; W sieci można znaleźć przykładowe algorytmy, o wiele krótsze i szybsze - nimi powinieneś się sugerować, aby Twój kod był prawidłowo działający, ładny i sformatowany;

PS: IOResult to jest funkcja; Używasz jej tylko raz, więc zmienna do przechowania jej rezultatu nie jest w ogóle potrzebna:

if IOResult() <> 0 then

PPS: Zacznij intensywnie używać klawisza Shift, bo kod bez PascalCase jest kompletnie nieczytelny.

0

Ten kod powinien trafić do perełek.

0
Haskell napisał(a):

Ten kod powinien trafić do perełek.

Nie powiem ubawiłęś mnie XDD. Szczerze to tworzyłem to coś na slepo, moje pojecie o programowaniu jest rowne=

1 użytkowników online, w tym zalogowanych: 0, gości: 1