Weryfikacja wprowadzonych danych

0

Użytkownik wprowadza dane z klawiatury, które są przypisane do zmiennej typu int. Mam problem, a mianowicie, chciałbym zrobić takie coś, aby można było wprowadzić tylko liczby, łącznie z ujemnymi. Chodzi o to, aby program wyświetlał błąd gdy użytkownik wpiszę literę lub jakiś inny znak zamiast liczby i poprosił go o to, aby wpisał tą liczbę jeszcze raz.

Ma ktoś pomysł jak to zrobić w języku C?

0

Ostatnio pisałem coś takiego w TP, tyle, że dla liczb rzeczywistych. Ogólnie zastada jest taka: wczytujesz tekst/liczbę z klawiatury do zmiennej typu string i później sprawdzasz, czy znajdują się w nim dozwolone znaki. Tak to wyglądało w TP:

         {funkcja sprawdza czy lancuch znakow jest liczba}
         function is_real(tekst : string) : boolean;
         var i : integer;
             znak : integer;
             minus : integer;
         begin
              {zapisujemy do zmiennej 'minus' pierwszy znak tekstu}
              {i pobieramy jego kod ASCII}
              minus := ord(tekst[1]);
              {jesli kod ASCII w zmiennej minus odpowiada znakowi -}
              {to ucinamy tekst od drugiego znaku do konca}
              if(minus = 45) then
              begin
                   {uciecie tekstu}
                   tekst := Copy(tekst, 2, (Length(tekst) - 1) );
              end;

              {przechodzimy przez kolejne litery tekstu i sprawdzamy}
              {czy znaki sa cyframi lub kropka}
              for i := 1 to Length(tekst) do
              begin
                   {za kazdym razem nalezy pobrac kod ASCII znaku}
                   {aby sprawdzic czy spelnia on ponizszy warunek}
                   znak  := ord(tekst[i]);
                   if ( not ( ( (znak >= 48) and (znak <= 57) ) or (znak = 46) ) ) then
                       begin
                            is_real := false;
                            break;
                       end
                   else
                       begin
                            is_real := true;
                       end;
              end;
         end;

Nie mam czasu tego przerabiać na C++, ale wystarczy przeanalizować żeby zrozumieć o co biega.

EDIT:
Aha zapomniałem, że trzeba później jeszcze przerobić taki string na liczbę real czy integer. Oto funkcja napisana w TP, przerabiająca string na liczbę real.

         {funkcja zamienia lancuch znakow na liczbe real}
         function ator(tekst : string) : real;
         var poz_przec, i : integer;
             str_calosci, str_ulamek : string;
             calosci, ulamek : real;
             dziesiatki : real;
             minus : integer;
             wynik : real;
         begin
              {zapisujemy do zmiennej 'minus' pierwszy znak tekstu}
              {i pobieramy jego kod ASCII}
              minus := ord(tekst[1]);
              if(minus = 45) then
              begin
                   tekst := Copy(tekst, 2, (Length(tekst) - 1));
              end;

              {zapisujemy do zmiennej poz_przec pozycje przecinka}
              {dzieki czemu bedziemy mogli rozdzielic tekst na dwie czesci}
              {calosci i ulamek}
              poz_przec := Pos('.', tekst);
              if(poz_przec = 0) {jesli nie ma przecinka to wstawiamy na koncu .0}
              {wstawienie na koncu .0 jest wymagane aby rozdzielic tekst na}
              {dwie czesci bez tego funkcja by nie dzialala}
              then
              begin
                   {dodajemy do tekstu na koncu '.0'}
                   tekst := Concat(tekst, '.0');
                   {i ponownie pobieramy pozycje przecinka}
                   {gdyz przy tekscie bez przecinka byla ona rowna 0}
                   poz_przec := Pos('.', tekst);
              end;

              {zapisujemy do odpowiednich zmiennych czesc ulamkowa i calkowita}
              str_calosci := Copy(tekst, 1, (poz_przec - 1));
              str_ulamek  := Copy(tekst, (poz_przec + 1), Length(tekst));

              {zerujemy zmienne real przechowujace czesci calkowita i mnoznik}
              calosci := 0;
              dziesiatki := 0;
              {przechodzimy przez kolejne cyfry/znaki czesci calkowitej}
              {i zamieniamy je na odpowiednie liczby}
              for i := 1 to Length(str_calosci) do
              begin
                   {obliczamy 'mnoznik' czyli 10 do potegi 'pozycja cyfry'}
                   {funkcja potega poteguje 10, jej deklaracja jest dalej w pliku}
                   dziesiatki := potega(Length(str_calosci) - i);
                   calosci := calosci + (dziesiatki * ctoi(str_calosci[i]));
              end;

              {podobnie jak powyzej postepujemy z czesciami ulamkowymi}
              {jednak tym razem mnoznik bedzie ulamkiem}
              ulamek := 0;
              dziesiatki := 0;
              for i := 1 to Length(str_ulamek) do
              begin
                   dziesiatki := potega(i * -1);
                   ulamek := ulamek + (dziesiatki * ctoi(str_ulamek[i]));
              end;

              {zapisujemy do zmiennej wynik sume czesci calkowitej i ulamkowej}
              wynik := calosci + ulamek;

              {sprawdzamy jeszcze raz czy byl na poczatku minus jesli tak}
              {to mnozymy wynik przez -1}
              if(minus = 45) then
              begin
                   wynik := wynik * -1;
              end;

              ator := wynik;
         end;

Funkcja 'potega' podnosi liczbę 10 do wybranej potęgi. Oraz funkcja 'ctoi' która zamienia zmienna typu char na integer :). Sporo tego ale jeśli chodzi o liczby całkowite to sprawa jest prostsza :).

         {funkcja podnosi 10 do wybranej potegi}
         function potega(wykladnik : integer) : real;
         var i : integer;
         var wynik : real;
         begin
              wynik := 1;
              if(wykladnik > 0) then
              begin
                   for i := 1 to wykladnik do
                   begin
                        wynik := wynik * 10;
                   end;
                   potega := wynik;
              end
              else if(wykladnik = 0) then
              begin
                   potega := 1;
              end
              else if(wykladnik < 0) then
              begin
                   for i := wykladnik to -1 do
                   begin
                        wynik := wynik / 10;
                   end;
                   potega := wynik;
              end;
         end;

         {funkcja zwraca wartosc integer znaku, ktory jest cyfra}
         function ctoi(znak : char) : integer;
         begin
              ctoi := (ord(znak) - 48);
         end;
0

Nawet do google nie zajrzysz. Nie wspominajac ze ten temat byl juz na forum

1 użytkowników online, w tym zalogowanych: 0, gości: 1