piotrek10245 utworzono 22 czerwca 2010 utworzono 22 czerwca 2010 Napisałem sobie kalkulator w Pascalu. Po jakimś czasie dodałem do niego funkcję działania na ułamkach zwykłych(Nie dziesiętnych). Wszystko działa dobrze lecz gdy wykonuje się działania na dużych ułamkach np:56/78 + 34/45 wychodzi z tego wynik który aż prosi się o skrócenie. Proszę o podanie komend oraz podpowiedzi jak skracać te ułamki. Oto kod źródłowy: [code] Uses CRT; Const haslo='program'; Var numer:byte; Imie,nazwisko,telefon:array[1..30] of string; iloscosob:byte; t1:byte; liczba:byte; cos:byte; licz:byte; kupa:byte; plus:byte; minus:byte; c,c1,c2:char; mianownik:byte; licznik:byte; mian:byte; k:byte; m:byte; y:byte; tablica:array[1..10]of string; wprowadz:String; petla:byte; koniec:byte; plik:text; procedure mnoz; begin clrscr; repeat TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); TextColor(10); Writeln('Wynik:'); writeln(licznik*licz); writeln('----'); writeln(mianownik*mian); write('Aby wyj† wpisz 0, aby mnoľy† dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure dziel; begin clrscr; repeat TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); TextColor(10); Writeln('Wynik:'); writeln(licznik*mian); writeln('----'); writeln(licz*mianownik); write('Aby wyj† wpisz 0, aby dzieli† dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure a; begin TextColor(10); writeln('Wynik:'); writeln(licz+licznik); writeln('----'); writeln(mian); end; procedure b; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)+(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure cc; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)+(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure dod; begin clrscr; repeat; TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); if mianownik=mian then a; if mianownik<mian then b; if mianownik>mian then cc; write('Aby wyj† wpisz 0, alby dodawac dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure d; begin TextColor(10); writeln('Wynik:'); writeln(licznik-licz); writeln('----'); writeln(mian); end; procedure e; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)-(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure f; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)-(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure od; begin clrscr; repeat; TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); if mianownik=mian then d; if mianownik<mian then e; if mianownik>mian then f; write('Aby wyj† wpisz 0, aby odejmowa† dalej wpisz inna cyfre:'); read(k); until k=0; end; Procedure ul; Begin repeat Tablica[1]:=' Mnozenie '; Tablica[2]:=' Dzielenie '; Tablica[3]:=' Dodawanie '; Tablica[4]:=' Odejmowanie '; Tablica[5]:=' Wyjscie '; ClrScr; TextColor(15); For y:=1 to 5 do Begin TextColor(15); TextBackGround(0); GoToXY(32,11+y); Write(tablica[y]); End; y:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+y); Write(tablica[y]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+y); Write(tablica[y]); If c2='H' Then Dec(y); If c2='P' Then Inc(y); If y=0 Then y:=5; If y=6 Then y:=1; If c1=Chr(27) Then y:=5; Until (c1=chr(27)) or (c1=chr(13)); If y=1 Then mnoz; If y=2 Then dziel; If y=3 Then dod; If y=4 Then od; Until y=5; end; Procedure prowadz; Begin ClrScr; Iloscosob:=iloscosob+1; Write('Imie : '); ReadLn(Imie[iloscosob]); Write('Nazwisko : '); ReadLn(nazwisko[iloscosob]); Write('Telefon lub e-mail : '); ReadLn(telefon[iloscosob]); End; Procedure Wyswietl; Begin ClrScr; Write('Numer wpisu? (1..', iloscosob ,') :'); ReadLn(t1); WriteLn('Imie : ',imie[t1] ); WriteLn('Nazwisko: ',nazwisko[t1] ); WriteLn('Telefon lub e-mail : ',telefon[t1] ); WriteLn; Write('Wcisnij jakis klawisz...'); c2:=readkey; End; Procedure Zapisz; Begin Assign(plik,'BAZA.DAN'); ReWrite(plik); WriteLn(plik,iloscosob); t1:=0; Repeat t1:=t1+1; WriteLn(plik,imie[t1] ); WriteLn(plik,nazwisko[t1] ); WriteLn(plik,telefon[t1] ); Until t1=iloscosob; Close(plik); End; Procedure Czytaj; Begin Assign(plik,'BAZA.DAN'); Reset(plik); ReadLn(plik,iloscosob); t1:=0; Repeat t1:=t1+1; ReadLn(plik,imie[t1] ); ReadLn(plik,nazwisko[t1] ); ReadLn(plik,telefon[t1] ); Until t1=iloscosob; Close(plik); End; Procedure wpisy; Begin iloscosob:=0; Repeat ClrScr; WriteLn('1. Nowy wpis'); WriteLn('2. Wyswietlwnie wpisu'); WriteLn('3. Odczyt z pliku'); WriteLn('4. Zapis do pliku'); WriteLn('5. Wyjscie'); Repeat c:=readkey; Until (c>='1') AND (c<='5'); If c='1' Then prowadz; If c='2' Then Wyswietl; If c='3' Then Czytaj; If c='4' Then Zapisz; Until c='5'; End; Procedure tabela; Begin TextColor(6); ClrScr; GotoXY(32,12); WriteLn('Wpisz liczb© : '); Read(liczba); IF liczba<100 Then ClrScr; WriteLn('I------------------I'); WriteLn('I Napisales liczbe I'); WriteLn('I mniejsza od 100 I'); WriteLn('I I'); WriteLn('I------------------I'); Read(kupa); IF liczba>100 Then ClrScr; WriteLn('napisales liczbe wieksza od 100'); Read(kupa); End; Procedure info; Begin ClrScr; TextColor(2); WriteLn('Program stworzyl Piotrek Telka'); Write('Aby wyjsc wpisz cos : '); Read(c); End; Procedure potegowanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolna liczbe (0-wyjscie)'); Write(' : '); ReadLn(licz); TextColor(10); WriteLn('Potega liczby ',licz,' to ',licz*licz); WriteLn; Until licz=0; End; Procedure dodawanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Suma liczb ',minus,' oraz ',plus,' to ',plus+minus); Until plus=0; End; Procedure odejmowanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Roznica liczb ',minus,' oraz ',plus,' to ',plus-minus); Until plus=0; End; Procedure dzielenie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dzielnik'); Write(' : '); Read(plus); WriteLn('Wpisz dzielnĄ'); Write(' : '); Read(minus); TextColor(10); WriteLn('Iloraz liczb ',plus,' oraz ',minus,' to ',plus/minus); WriteLn('Aby wyj† wpisz 0'); ReadLn(kupa); Until kupa=0; End; Procedure mnozenie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Iloczyn liczb ',minus,' oraz ',plus,' to ',plus*minus); Until plus=0; End; Begin repeat Tablica[1]:=' Tabela '; Tablica[2]:=' Info '; Tablica[3]:=' Potegowanie '; Tablica[4]:=' Dodawanie '; Tablica[5]:=' Odejmowanie '; Tablica[6]:=' Dzielenie '; Tablica[7]:=' Mnozenie '; Tablica[8]:=' Wpisy '; Tablica[9]:='Dzialania na ulamkach'; Tablica[10]:=' Wyjscie '; ClrScr; TextColor(15); For y:=1 to 10 do Begin TextColor(15); TextBackGround(0); GoToXY(32,11+y); Write(tablica[y]); End; y:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+y); Write(tablica[y]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+y); Write(tablica[y]); If c2='H' Then Dec(y); If c2='P' Then Inc(y); If y=0 Then y:=10; If y=11 Then y:=1; If c1=Chr(27) Then y:=10; Until (c1=chr(27)) or (c1=chr(13)); If y=1 Then tabela; If y=2 Then info; If y=3 Then potegowanie; If y=4 Then dodawanie; If y=5 Then odejmowanie; If y=6 Then dzielenie; If y=7 Then mnozenie; If y=8 Then wpisy; If y=9 Then ul; Until y=10; Begin repeat TextColor(12); ClrScr; GotoXY(31,12); Write('Podaj Haslo : '); ReadLn(wprowadz); IF petla=4 Then Repeat TextColor(141); ClrScr; GotoXY(31,12); Write('Zle haslo!!!'); Sound(3160); Delay(500); Until 1=2; petla:=petla+1; Until wprowadz=haslo; End; End. [/code] Nie czepiajcie się tych paru błędów z tabelą.
rafalluz komentarz 22 czerwca 2010 komentarz 22 czerwca 2010 Znajdz największy wspólny dzielnik licznika i mianownika, i podziel je właśnie przez niego. Algorytm Euklidesa.
piotrek10245 komentarz 22 czerwca 2010 Autor komentarz 22 czerwca 2010 Niezbyt znam się na algorytmach możesz mi powiedzieć o co chodzi w tym?
rafalluz komentarz 22 czerwca 2010 komentarz 22 czerwca 2010 http://pl.wikipedia.org/wiki/Algorytm_Euklidesa
piotrek10245 komentarz 22 czerwca 2010 Autor komentarz 22 czerwca 2010 (edytowane) Ok zastosowałem ten algorytm (tylko w mnożeniu ułamków to jest procedura mnoz) i mi wychodzą dziwne rzeczy. Kod źródłowy: [code]program prg; Uses CRT; Const haslo='program'; Var numer:byte; Imie,nazwisko,telefon:array[1..30] of string; iloscosob:byte; t1:byte; liczba:byte; cos:byte; licz:integer; kupa:byte; plus:integer; minus:integer; c,c1,c2:char; mianownik:integer; licznik:integer; mian:integer; k:byte; m:byte; y:byte; tablica:array[1..10]of string; wprowadz:String; petla:byte; koniec:byte; plik:text; dkk:integer; dk:integer; procedure mnoz; begin clrscr; repeat TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); TextColor(10); dkk:=licznik*licz; dk:=mianownik*mian; While dkk<>dk do if dkk<dk then dk:=dk-dkk else dkk:=dkk-dk; Writeln('Wynik:'); writeln((licznik*licz)/dkk); writeln('----'); writeln((mianownik*mian)/dkk); write('Aby wyj† wpisz 0, aby mnoľy† dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure dziel; begin clrscr; repeat TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); TextColor(10); Writeln('Wynik:'); writeln(licznik*mian); writeln('----'); writeln(licz*mianownik); write('Aby wyj† wpisz 0, aby dzieli† dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure a; begin TextColor(10); writeln('Wynik:'); writeln(licz+licznik); writeln('----'); writeln(mian); end; procedure b; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)+(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure cc; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)+(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure dod; begin clrscr; repeat; TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); if mianownik=mian then a; if mianownik<mian then b; if mianownik>mian then cc; write('Aby wyj† wpisz 0, alby dodawac dalej wpisz inna cyfre:'); read(k); until k=0; end; procedure d; begin TextColor(10); writeln('Wynik:'); writeln(licznik-licz); writeln('----'); writeln(mian); end; procedure e; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)-(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure f; begin TextColor(10); writeln('Wynik:'); writeln((licznik*mian)-(licz*mianownik)); writeln('----'); writeln(mianownik*mian); end; procedure od; begin clrscr; repeat; TextColor(3); write('Wpisz licznik: '); readln(licznik); write('Wpisz mianownik: '); readln(mianownik); write('wpisz 2 licznik: '); readln(licz); write('Wpisz 2 mianownik: '); readln(mian); if mianownik=mian then d; if mianownik<mian then e; if mianownik>mian then f; write('Aby wyj† wpisz 0, aby odejmowa† dalej wpisz inna cyfre:'); read(k); until k=0; end; Procedure ul; Begin repeat Tablica[1]:=' Mnozenie '; Tablica[2]:=' Dzielenie '; Tablica[3]:=' Dodawanie '; Tablica[4]:=' Odejmowanie '; Tablica[5]:=' Wyjscie '; ClrScr; TextColor(15); For y:=1 to 5 do Begin TextColor(15); TextBackGround(0); GoToXY(32,11+y); Write(tablica[y]); End; y:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+y); Write(tablica[y]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+y); Write(tablica[y]); If c2='H' Then Dec(y); If c2='P' Then Inc(y); If y=0 Then y:=5; If y=6 Then y:=1; If c1=Chr(27) Then y:=5; Until (c1=chr(27)) or (c1=chr(13)); If y=1 Then mnoz; If y=2 Then dziel; If y=3 Then dod; If y=4 Then od; Until y=5; end; Procedure prowadz; Begin ClrScr; Iloscosob:=iloscosob+1; Write('Imie : '); ReadLn(Imie[iloscosob]); Write('Nazwisko : '); ReadLn(nazwisko[iloscosob]); Write('Telefon lub e-mail : '); ReadLn(telefon[iloscosob]); End; Procedure Wyswietl; Begin ClrScr; Write('Numer wpisu? (1..', iloscosob ,') :'); ReadLn(t1); WriteLn('Imie : ',imie[t1] ); WriteLn('Nazwisko: ',nazwisko[t1] ); WriteLn('Telefon lub e-mail : ',telefon[t1] ); WriteLn; Write('Wcisnij jakis klawisz...'); c2:=readkey; End; Procedure Zapisz; Begin Assign(plik,'BAZA.DAN'); ReWrite(plik); WriteLn(plik,iloscosob); t1:=0; Repeat t1:=t1+1; WriteLn(plik,imie[t1] ); WriteLn(plik,nazwisko[t1] ); WriteLn(plik,telefon[t1] ); Until t1=iloscosob; Close(plik); End; Procedure Czytaj; Begin Assign(plik,'BAZA.DAN'); Reset(plik); ReadLn(plik,iloscosob); t1:=0; Repeat t1:=t1+1; ReadLn(plik,imie[t1] ); ReadLn(plik,nazwisko[t1] ); ReadLn(plik,telefon[t1] ); Until t1=iloscosob; Close(plik); End; Procedure wpisy; Begin iloscosob:=0; Repeat ClrScr; WriteLn('1. Nowy wpis'); WriteLn('2. Wyswietlwnie wpisu'); WriteLn('3. Odczyt z pliku'); WriteLn('4. Zapis do pliku'); WriteLn('5. Wyjscie'); Repeat c:=readkey; Until (c>='1') AND (c<='5'); If c='1' Then prowadz; If c='2' Then Wyswietl; If c='3' Then Czytaj; If c='4' Then Zapisz; Until c='5'; End; Procedure tabela; Begin TextColor(6); ClrScr; GotoXY(32,12); WriteLn('Wpisz liczb© : '); Read(liczba); IF liczba<100 Then ClrScr; WriteLn('I------------------I'); WriteLn('I Napisales liczbe I'); WriteLn('I mniejsza od 100 I'); WriteLn('I I'); WriteLn('I------------------I'); Read(kupa); IF liczba>100 Then ClrScr; WriteLn('napisales liczbe wieksza od 100'); Read(kupa); End; Procedure info; Begin ClrScr; TextColor(2); WriteLn('Program stworzyl Piotrek Telka'); Write('Aby wyjsc wpisz cos : '); Read(c); End; Procedure potegowanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolna liczbe (0-wyjscie)'); Write(' : '); ReadLn(licz); TextColor(10); WriteLn('Potega liczby ',licz,' to ',licz*licz); WriteLn; Until licz=0; End; Procedure dodawanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Suma liczb ',minus,' oraz ',plus,' to ',plus+minus); Until plus=0; End; Procedure odejmowanie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Roznica liczb ',minus,' oraz ',plus,' to ',plus-minus); Until plus=0; End; Procedure dzielenie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dzielnik'); Write(' : '); Read(plus); WriteLn('Wpisz dzielnĄ'); Write(' : '); Read(minus); TextColor(10); WriteLn('Iloraz liczb ',plus,' oraz ',minus,' to ',plus/minus); WriteLn('Aby wyj† wpisz 0'); ReadLn(kupa); Until kupa=0; End; Procedure mnozenie; Begin ClrScr; REPEAT TextColor(3); WriteLn('Wpisz dowolnĄ liczbe (0-wyjscie)'); Write(' : '); Read(plus); WriteLn('Wpisz dowolnĄ liczbe '); Write(' : '); Read(minus); TextColor(10); WriteLn('Iloczyn liczb ',minus,' oraz ',plus,' to ',plus*minus); Until plus=0; End; Begin repeat Tablica[1]:=' Tabela '; Tablica[2]:=' Info '; Tablica[3]:=' Potegowanie '; Tablica[4]:=' Dodawanie '; Tablica[5]:=' Odejmowanie '; Tablica[6]:=' Dzielenie '; Tablica[7]:=' Mnozenie '; Tablica[8]:=' Wpisy '; Tablica[9]:='Dzialania na ulamkach'; Tablica[10]:=' Wyjscie '; ClrScr; TextColor(15); For y:=1 to 10 do Begin TextColor(15); TextBackGround(0); GoToXY(32,11+y); Write(tablica[y]); End; y:=1; Repeat TextColor(0); TextBackGround(15); GotoXY(32,11+y); Write(tablica[y]); c1:=ReadKey; c2:=' '; If c1=Chr(0) Then c2:=ReadKey; TextColor(15); TextBackGround(0); GotoXY(32,11+y); Write(tablica[y]); If c2='H' Then Dec(y); If c2='P' Then Inc(y); If y=0 Then y:=10; If y=11 Then y:=1; If c1=Chr(27) Then y:=10; Until (c1=chr(27)) or (c1=chr(13)); If y=1 Then tabela; If y=2 Then info; If y=3 Then potegowanie; If y=4 Then dodawanie; If y=5 Then odejmowanie; If y=6 Then dzielenie; If y=7 Then mnozenie; If y=8 Then wpisy; If y=9 Then ul; Until y=10; Begin repeat TextColor(12); ClrScr; GotoXY(31,12); Write('Podaj Haslo : '); ReadLn(wprowadz); IF petla=4 Then Repeat TextColor(141); ClrScr; GotoXY(31,12); Write('Zle haslo!!!'); Sound(3160); Delay(500); Until 1=2; petla:=petla+1; Until wprowadz=haslo; End; End. [/code] Musiałem popełnić jakiś błąd, możesz mi go wskazać?
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.