JustPaste.it

Słowna kwota z niesłownej liczby

Ten nietrudny problem daję na pierwszych zajeciach, ale swego czasu polskie firmy miały kłopoty z implementacją tej funkcji w programach fakturujących. Tu wpleciony w opowiadanko.

Ten nietrudny problem daję na pierwszych zajeciach, ale swego czasu polskie firmy miały kłopoty z implementacją tej funkcji w programach fakturujących. Tu wpleciony w opowiadanko.

 

f7744349b71a043553ef8c2677dc6ce0.jpg– Wujku! Przyjmiesz mnie na lato do pracy w twoim biurze?
– A co ty potrafisz robic z prac biurowych, Tomku?
– Bezbłednie licze: w głowie, na kalkulatorze i w arkuszu kalkulacyjnym.
– A potrafisz programowac komputery w Pascalu?
– Przeciez tego sie uczyłem na informatyce.
– Mamy tu taki program, który wystawia rachunki, napisany własnie
w Pascalu, ale on nie jest skonczony. Brakuje mu czesci drukujacej
słownie kwote rachunku. Potrafiłbys to zaprogramowac?
– Spróbuje. Jesli na przykład wystawiacie rachunki od jednego złotego
do tysiaca złotych, to musiałbym wpisac całe tysiac mozliwych kwot –
głosno mysli Tomek.
– Nie bój sie. Nie jest tak zle. Nasze rachunki nie przekraczaja
dwudziestu złotych. Ale za to na koncu trzeba dodawac w odpowiednim
przypadku: złoty, złote lub złotych.
– Zaraz nad tym pomysle – powiedział Tomek, piszac swój program:
procedure SlownaKwota1(zlotych: integer);
begin
case zlotych of
0: write(’zero ’);
1: write(’jeden ’);
{... i tak dalej ... }
20: write(’dwadziescia ’);
end;
if zlotych = 1 then write(’złoty ’) {ost. cyfra 1}
else if (zlotych >=2) AND (zlotych <= 4) then write(’złote ’) {2,3,4}
else if (zlotych = 0) OR (zlotych >= 5) then write(’złotych ’){0,5,6,7,8,9}
end;
– Teraz bedzie dobrze. Mozesz połaczyc swój kod z naszym programem
do wystawiania rachunków.
Jakis czas potem wujek znowu zwraca sie do Tomka:
– Wiesz, nasz program obsługuje teraz równiez inne rodzaje zlecen, wiec
czy mógłbys rozszerzyc mozliwosci programu, by mógł drukowac rachunki
o wartosci do tysiaca złotych?
– Oj, to bedzie dla mnie nudna robota. Chociaz? – Tomek zastanawia
sie chwile. – Przeciez suma do tysiaca złotych składa sie z trzech
niezaleznych czesci: setki, dziesiatki i jednosci. I mój program tez tak
musze skonstruowac.
Jak powiedział, tak zrobił.
Drzwi mieszkania otworzyły sie szeroko i pojawił sie w nich Tomek:
– Wiesz mamo! Wujek mnie bardzo pochwalił, ze tak mu udoskonaliłem
jego program wystawiajacy rachunki.
– No to brawo! Twoja pierwsza praca i od razu sukces. To moze teraz
zjesz obiad?
– Nie, jeszcze szybko rozwine ten program, by liczył dla nawet bardzo
duzych kwot. Zaczne od zrobienia z programu dla wujka procedury, która
zaleznie od parametrów bedzie po kazdych trzech cyfrach odmieniac:
złote, tysiace, miliony, a nawet miliardy.

procedure NaSlowa(Liczba: integer; Pojedyncza,Od2do4,Od5do9: string);
var setki, dziesiatki, jednosci: integer;
begin
setki := Liczba div 100;
case setki of
0:;
1: write(’sto ’);
2: write(’dwiescie ’);
{... i tak dalej ... }
9: write(’dziewiecset ’);
end;
dziesiatki := (Liczba - 100*setki) div 10;
case dziesiatki of
0:;
1: write(’dziesiec’);
2: write(’dwadziescia ’);
{... i tak dalej ... }
9: write(’dziewiecdziesiat ’);
end;
jednosci:= Liczba - 100*setki - 10*dziesiatki;
case jednosci of
0:;
1: write(’jeden ’);
{... i tak dalej ... }
9: write(’dziewiec ’);
end
if (Liczba <> 0) then
if (Liczba = 1) then write(Pojedyncza);
else if (jednosci >= 2) AND (jednosci <= 4) then
write(Od2do4) {ost. cyfra 2,3,4}
else write(Od5do9); {0,1,5,6,7,8,9}
end
end;
– Teraz moja główna procedura bedzie wygladała nastepujaco:
procedure SlownaKwota2(zlotych: integer);
begin
NaSlowa(zlotych div 1000000000, ’miliard ’, ’miliardy ’, ’miliardów ’);
NaSlowa((zlotych div 1000000) mod 1000, ’milion ’, ’miliony ’, ’milionów ’);
NaSlowa((zlotych div 1000) mod 1000, ’tysiac ’, ’tysiace ’, ’tysiecy ’);
NaSlowa(zlotych mod 1000, ’złotych ’, ’złote ’, ’złotych ’);
end.
Po jakims czasie okazało sie, ze program Tomka ma jeszcze pewne
mankamenty: na przykład kwote 215 zł wypisuje jako „dwiescie dziesiec
piec złotych”. Czy pomozesz Tomkowi w odszukaniu i naprawieniu
wszystkich niedociagniec? Upewnij sie, ze poprawiajac nowo odkryte
błedy, nie zepsujesz tego, co dotychczas działało!

 

Źródło: http://www.mimuw.edu.pl/delta/artykuly/delta0308/kwota.pdf