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;