emat jest stary jak ╢wiat i prosty, ale mimo to wiele os≤b poszukuje program≤w wykonuj▒cych dzia│ania na u│amkach zwyk│ych. Z tego powodu umieszczam tu sw≤j program ze ╝r≤d│em w pascalu, w kt≤rym mo┐na wykonywaµ proste operacje na u│amkach. Mo┐e Ci siΩ przydaµ na jakie╢ zaliczonka.
Program ma typ "ulamek", kt≤ry s│u┐y do zapamiΩtywania liczby w postaci w│a╢nie u│amka zwyk│ego. S▒ te┐ dwie zmienne: "u1", "u2" typu u│amek do pamiΩtania danych wej╢ciowych (argument≤w dzia│a±) i zmienna "wynik" do pamiΩtania wyniku. Funkcja "czytaj_dane" wczytuje "u1", "u2" oraz operator dzia│ania (pamiΩtany w zmiennej "znak"). W funkcji tej zawarta jest kontrola b│Ωd≤w typu mianownik=0. Procedura "wypisz_wynik" drukuje na ekranie wyniki dzia│ania programu po zamianie u│amk≤w na niew│a╢ciwe, wrzuceniu minus≤w do licznika, skr≤ceniu wyniku. Procedura "nwd" zwraca, jak mo┐na siΩ domy╢liµ, najwiΩkszy wsp≤lny dzielnik dw≤ch liczb. Jest to potrzebne przy wypisywaniu wynik≤w. PamiΩtaj, ┐e argumenty tej procedury musz▒ byµ dodatnie. Procedury "dodaj", "odejmij", "pomnoz", "podziel" s▒ oczywiste - dokonuj▒ one w│a╢ciwych oblicze±. Najbardziej z│o┐one s▒ procedury "odejmij" i "dodaj", gdy┐ trzeba w nich wykonaµ sprowadzanie do wsp≤lnego mianownika. Ich dzia│anie jest "sercem" programu. My╢lΩ, ┐e to na tyle wyja╢nie± - zachΩcam do analizy i wykorzystania progarmu.
program ulamki; uses crt; type ulamek = record licznik, mianownik: integer; end; var u1,u2,wynik: ulamek; znak,czy_koniec: char; stan_wejscia: boolean; function nwd(a,b:integer):integer; begin while a<>b do if a>b then a:=a-b else b:=b-a; nwd:=a; end; function czytaj_dane:boolean; {Zwraca TRUE gdy OK} begin clrscr; write('Podaj licznik pierwszego u│amka: '); readln(u1.licznik); write('Podaj mianownik pierwszego u│amka: '); readln(u1.mianownik); if u1.mianownik=0 then begin writeln('B│▒d! Mianownik=0!'); czytaj_dane:=false; exit; end; write('Podaj znak dzia│ania (+ - / *): '); repeat znak:=readkey; until znak in ['+','-','*','/']; writeln(znak); write('Podaj licznik drugiego u│amka: '); readln(u2.licznik); write('Podaj mianownik drugiego u│amka: '); readln(u2.mianownik); if u2.mianownik=0 then begin writeln('B│▒d! Mianownik=0!'); czytaj_dane:=false; exit; end; with u1 do begin if (licznik<0) and (mianownik<0) then begin licznik:=abs(licznik); mianownik:=abs(mianownik); end; if (licznik>0) and (mianownik<0) then begin licznik:=-licznik; mianownik:=abs(mianownik); end; end; with u2 do begin if (licznik<0) and (mianownik<0) then begin licznik:=abs(licznik); mianownik:=abs(mianownik); end; if (licznik>0) and (mianownik<0) then begin licznik:=-licznik; mianownik:=abs(mianownik); end; end; czytaj_dane:=true; end; procedure wypisz_wynik; var n: integer; begin with wynik do begin if (licznik<0) and (mianownik<0) then begin licznik:=abs(licznik); mianownik:=abs(mianownik); end; if (licznik>0) and (mianownik<0) then begin licznik:=-licznik; mianownik:=abs(mianownik); end; end; if (wynik.licznik<>0) then n:=nwd(abs(wynik.licznik),wynik.mianownik); wynik.licznik:=wynik.licznik div n; wynik.mianownik:=wynik.mianownik div n; writeln(u1.licznik:6,' ', u2.licznik:6,' ',wynik.licznik:6); writeln('------ ',znak,' ------ = ------'); writeln(u1.mianownik:6,' ', u2.mianownik:6,' ',wynik.mianownik:6); end; procedure pomnoz; begin wynik.licznik:=u1.licznik*u2.licznik; wynik.mianownik:=u1.mianownik*u2.mianownik; end; procedure podziel; begin if u2.licznik=0 then begin writeln('B│▒d! Pr≤ba dzielenia przez zero!'); exit; end; wynik.licznik:=u1.licznik*u2.mianownik; wynik.mianownik:=u1.mianownik*u2.licznik; end; procedure dodaj; var wsp_mian: integer; begin if (u1.licznik=0) then begin wynik.licznik:=u2.licznik; wynik.mianownik:=u2.mianownik; end; if (u2.licznik=0) then begin wynik.licznik:=u1.licznik; wynik.mianownik:=u1.mianownik; end; begin {Do wsp. mian} wsp_mian:=u1.mianownik*u2.mianownik; u1.licznik:= (wsp_mian div u1.mianownik)*u1.licznik; u2.licznik:= (wsp_mian div u2.mianownik)*u2.licznik; u1.mianownik:=wsp_mian; u2.mianownik:=wsp_mian; end; wynik.licznik:=u1.licznik+u2.licznik; wynik.mianownik:=wsp_mian; end; procedure odejmij; begin u2.licznik:=-u2.licznik; dodaj; end; begin repeat stan_wejscia:=czytaj_dane; if stan_wejscia then begin case znak of '+': dodaj; '-': odejmij; '*': pomnoz; '/': podziel; end; wypisz_wynik; end; writeln('Czy zako±czyµ program? (T/N)'); czy_koniec:=upcase(readkey); until czy_koniec='T'; end.
Mo┐esz ╢ci▒gn▒µ ╝r≤d│o i gotowy program.