DZIAúANIA NA UúAMKACH

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.


Baner reklamowy: