Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Turbo Pascal] Kalkulator - uniknięcie błędów.

xumpyc 12 Lis 2010 14:41 2346 3
  • #1 12 Lis 2010 14:41
    xumpyc
    Poziom 2  

    Code:
    uses crt;
    
    VAR a,b,c:integer;
        {o ,d:string;}o, d: char; {!zmiana typu zmiennych}

    {poczatek funkcji}
    function dodawanie(a,b:integer):integer;

    begin
    dodawanie:=a+b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function odejmowanie(a,b:integer):integer;

    begin
    odejmowanie:=a-b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function mnozenie(a,b:integer):integer;

    begin
    mnozenie:=a*b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function dzielenie(a,b:real):real;

    begin
    dzielenie:=a/b;
    end;
    {koniec funkcji}


    {poczatek funkcji}
    function pierwiastkowanie(a:real):real;

    begin
    pierwiastkowanie:=sqrt(a);
    end;
    {koniec funkcji}


    begin
    REPEAT
    clrscr;
    writeln('Wybierz jakie dzialanie chcesz wykonac i wpisz liczbe odpowiadajaca ');
    writeln('(liczby musza byc od 1 do 5)');
    writeln('1.Dodawanie');
    writeln('2.Odejmowanie');
    writeln('3.Mnozenie');
    writeln('4.Dzielenie');
    writeln('5.Pierwiastkowanie');
    REPEAT
    readln(c);
    IF (c<>1) AND (c<>2) AND (c<>3) AND (c<>4) AND (c<>5)  THEN writeln('Blad, wpisz liczbe odpowiadajaca od 1 do 5 ');
    UNTIL  (c=1) OR (c=2) OR (c=3) OR (c=4) OR (c=5);
    IF c=1 THEN Begin
                writeln('podaj liczby ktore chcesz dodac');
                readln(a);
                readln(b);
                dodawanie(a,b);
                writeln('wynik z dodawania wynosi ',dodawanie(a,b));
                end;
    IF c=2 THEN Begin
                writeln('podaj liczby ktore chcesz odjac');
                readln(a);
                readln(b);
                odejmowanie(a,b);
                writeln('wynik z odejmowania wynosi ',odejmowanie(a,b));
                end;
    IF c=3 THEN Begin
                writeln('podaj liczby ktore chcesz pomnozyc');




                readln(a);
                readln(b);
                mnozenie(a,b);
                writeln('wynik z mnozenia wynosi ',mnozenie(a,b));
                end;
    IF c=4 THEN Begin
                writeln('podaj liczby ktore chcesz podzielic');
                readln(a);
                readln(b);
                dzielenie(a,b);
                writeln('wynik z dzielenia wynosi ',dzielenie(a,b):4:2);
                end;

    IF c=5 THEN Begin
                writeln('podaj liczbe z ktorej chcesz otrzymac pierwiastek kwadratowy');
                readln(a);
                pierwiastkowanie(a);
                writeln('wynik z pierwiastkowania kwadratowego wynosi ',pierwiastkowanie(a):4:2);
                end;


    writeln('czy chcesz jeszcze raz? T/N');
    readln(o);
    o:=UPCASE(o);

    REPEAT
    IF (o<>'T') AND (o<>'N') THEN Begin
                                  writeln('Blad, napisz T lub N');
                                  readln(o);
                                  o:=UPCASE(o);
                                  end;
    UNTIL (o='T') OR (o='N');
    UNTIL o='N';
    end.


    Mam problem (zapewne w większości spowodowany brakiem wiedzy w tym kierunku). Nie wiem kompletnie jak zrobić, by przy dzieleniu kalkulator sprawdzał dzielnik. Jeśli jest równy "0" wyświetlana jest informacja o błędzie danych i pytanie, czy chcemy je poprawić. W przypadku odpowiedzi twierdzącej – w pętli sprawdzającej poprawność danych następuje wczytanie nowego dzielnika. W przypadku odpowiedzi na nie – wracamy do menu programu. Próbuje już dobre parę godzin i słabo coś... Najlepiej jakby ktoś wrzucił tu już zmieniony kod bowiem porady typu "nie zrobiłeś tego" mało mi powiedzą z racji, że jestem początkujący.

    Z góry dziękuję!

    0 3
  • Pomocny post
    #2 12 Lis 2010 14:52
    arnoldziq
    Moderator Programowanie

    Po pierwsze, jeżeli stosujesz własne funkcje do dokonywania obliczeń, to możesz sprawdzać właśnie w tych funkcjach, czy ich argumenty "są odpowiednie".
    Zamiast :

    Code:
    function pierwiastkowanie(a:real):real;
    
    begin
    pierwiastkowanie:=sqrt(a);
    end;

    Zrób coś takiego :
    Code:
    function pierwiastkowanie(a:real):real;
    
    begin
    if a>=0 then pierwiastkowanie:=sqrt(a)
    else
     begin
      pierwiastkowanie:=0;
      writeln('Blad pierwiastka. Argument mniejszy od zero !!!');
     end;
    end;

    To samo możesz zrobić z dzieleniem.

    Sprawa druga :
    Nie rozumiem dlaczego, przy każdym obliczeniu, wywołujesz swoją funkcję dwa razy?
    Code:
    writeln('podaj liczby ktore chcesz odjac');
    
    readln(a);
    readln(b);
    odejmowanie(a,b); <----- pierwszy raz
    writeln('wynik z odejmowania wynosi ',odejmowanie(a,b)); <----- drugi raz

    I tak przy każdym obliczeniu.
    Spokojnie możesz zrezygnować z tego pierwszego wywołania.

    0
  • #3 12 Lis 2010 16:07
    xumpyc
    Poziom 2  

    Code:
    uses crt;
    
    VAR a,b,c:integer;
        {o ,d:string;}o, d: char; {!zmiana typu zmiennych}

    {poczatek funkcji}
    function dodawanie(a,b:integer):integer;

    begin
    dodawanie:=a+b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function odejmowanie(a,b:integer):integer;

    begin
    odejmowanie:=a-b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function mnozenie(a,b:integer):integer;

    begin
    mnozenie:=a*b;
    end;
    {koniec funkcji}

    {poczatek funkcji}
    function dzielenie(a,b:real):real;

    begin;
    dzielenie:=a/b
    end;
    {koniec funkcji}


    {poczatek funkcji}
    function pierwiastkowanie(a:real):real;
    begin
    if a>0 then pierwiastkowanie:=sqrt(a)
    else
     begin
      pierwiastkowanie:=0;
      writeln('Blad pierwiastka. Argument mniejszy od zero !!!');
     end;
    end;
    {koniec funkcji}


    begin
    REPEAT
    writeln('Wybierz jakie dzialanie chcesz wykonac i wpisz liczbe odpowiadajaca ');
    writeln('(liczby musza byc od 1 do 5)');
    writeln('1.Dodawanie');
    writeln('2.Odejmowanie');
    writeln('3.Mnozenie');
    writeln('4.Dzielenie');
    writeln('5.Pierwiastkowanie');
    REPEAT
    readln(c);
    IF (c<>1) AND (c<>2) AND (c<>3) AND (c<>4) AND (c<>5)  THEN writeln('Blad, wpisz liczbe odpowiadajaca od 1 do 5 ');
    UNTIL  (c=1) OR (c=2) OR (c=3) OR (c=4) OR (c=5);
    IF c=1 THEN Begin
                writeln('podaj liczby ktore chcesz dodac');
                readln(a);
                readln(b);
                writeln('wynik z dodawania wynosi ',dodawanie(a,b));
                end;
    IF c=2 THEN Begin
                writeln('podaj liczby ktore chcesz odjac');
                readln(a);
                readln(b);
                writeln('wynik z odejmowania wynosi ',odejmowanie(a,b));
                end;
    IF c=3 THEN Begin
                writeln('podaj liczby ktore chcesz pomnozyc');
                readln(a);
                readln(b);
                writeln('wynik z mnozenia wynosi ',mnozenie(a,b));
                end;
    IF c=4 THEN Begin
                writeln('podaj liczby ktore chcesz podzielic');
                readln(a);
                readln(b);
                writeln('wynik z dzielenia wynosi ',dzielenie(a,b):4:2);
                end;

    IF c=5 THEN Begin
                writeln('podaj liczbe z ktorej chcesz otrzymac pierwiastek kwadratowy');
                readln(a);
                writeln('wynik z pierwiastkowania kwadratowego wynosi ',pierwiastkowanie(a):4:2);
                end;


    writeln('czy chcesz jeszcze raz? T/N');
    readln(o);
    o:=UPCASE(o);

    REPEAT
    IF (o<>'T') AND (o<>'N') THEN Begin
                                  writeln('Blad, napisz T lub N');
                                  readln(o);
                                  o:=UPCASE(o);
                                  end;
    UNTIL (o='T') OR (o='N');
    UNTIL o='N';
    end.


    Teraz wygląda to tak: [Turbo Pascal] Kalkulator - uniknięcie błędów.

    Gdy pierwiastkuję przez zero to taki komunikat się pojawia, a raczej ten normalny (który ma być przy liczbach większych od zera) i ten dla a=0. Jestem kompletnym laikiem a to mój 1 program który i tak robię z książką i internetem.
    Polecenie do dzielenia mianowicie mam inne jak do pierwiastka i gdy b=0 to ma także pokazywać komunikat, lecz dodatkowo mam mieć wybór czy chcę poprawić dzielnik (jeśli tak to ponownie wpisuje SAM dzielnik), a jeśli nie chcę poprawiać to przekierowuje mnie do menu.
    Trochę to zagmatwane ale myślę, że rozumiesz o co mi chodzi.

    Dodano po 56 [minuty]:

    dobra rozkminiłem co i jak! Dzięki i pozdrawiam.

    0
  • #4 12 Lis 2010 16:20
    arnoldziq
    Moderator Programowanie

    Poprawiłem "odrobinkę" ten twój kod.

    Code:
    uses crt;
    
    VAR a,b,c : integer;
            o : char;

    function dodawanie(a,b:integer):integer;
    begin dodawanie:=a+b; end;
    function odejmowanie(a,b:integer):integer;
    begin odejmowanie:=a-b; end;
    function mnozenie(a,b:integer):integer;
    begin mnozenie:=a*b; end;
    function dzielenie(a,b:real):real;
    begin dzielenie:=a/b; end;
    function pierwiastkowanie(a:real):real;
    begin pierwiastkowanie:=sqrt(a); end;
    procedure menu;
    begin
      clrscr;
      writeln('Wybierz jakie dzialanie chcesz wykonac i wpisz odpowiednia cyfre.');
      writeln('1.Dodawanie');
      writeln('2.Odejmowanie');
      writeln('3.Mnozenie');
      writeln('4.Dzielenie');
      writeln('5.Pierwiastkowanie');
      Writeln;
      writeln('0.Koniec pracy');
      writeln;
    end;
    {**************************************}
    BEGIN

     REPEAT
      menu;
      read(o);
      c:=ord(o)-48;
      if (c>=1) and (c<=5) then
      begin

      case c of
      1 : Begin writeln('podaj liczby ktore chcesz dodac');
           readln(a); readln(b);
           writeln('wynik z dodawania wynosi ',dodawanie(a,b));
          end;
      2 : Begin writeln('podaj liczby ktore chcesz odjac');
           readln(a); readln(b);
           writeln('wynik z odejmowania wynosi ',odejmowanie(a,b));
          end;
      3 : Begin writeln('podaj liczby ktore chcesz pomnozyc');
           readln(a); readln(b);
           writeln('wynik z mnozenia wynosi ',mnozenie(a,b));
          end;
      4 : Begin writeln('podaj liczby ktore chcesz podzielic');
           readln(a); readln(b);
           if b=0 then begin
              writeln('Podany dzielnik jest rowny 0. Prosze podac go ponownie ');
              readln(b);
             end;
           if b<>0 then writeln('wynik z dzielenia wynosi ',dzielenie(a,b):10:5);
          end;
       5 : Begin writeln('podaj liczbe z ktorej chcesz otrzymac pierwiastek kwadratowy');
            readln(a);
            if a<0 then begin
              writeln('Nie mozna podac wyniku pierwiastka z liczby ujemnej. Prosze podac poprawna liczbe : ');
              readln(a);
             end;
            if a>=0 then writeln('wynik z pierwiastkowania kwadratowego wynosi ',pierwiastkowanie(a):4:2);
           end;
       end;
      end;
      writeln;
       if c<>0 then write(' Nacisnij dowolny klawisz aby kontynuowac.');
      readln;
    UNTIL c=0;
    end.

    Resztę, jeżeli jeszcze czegoś brakuje, musisz "dokombinować" samemu :)

    0