Wcześniej pisałem programik, w którym podawałem 2 liczby oraz znak działania z klawiatury. Teraz pomyślałem, że napiszę program, w którym od razu będę podawał całe działanie, np. "23 + 34", a program sam wyciągnie ze stringa dwie liczby i znak działania, wykona obliczenie i wyrzuci wynik.
Problem jest przy konwersji Stringa na Int. Nie wazne czy robię to funkcją StrToInt czy Val to wynik wygląda identycznie. PIerwszą liczbę jakaby nie była konwertuje na 0, natomiast drugą tak jak powinien. Nie rozumiem dlaczego tak robi.
a2, b2 - stringi z liczbami
a, b - integery z liczbami
Najpierw robiłem tak, że String 'a2' konwertowałem na integer 'a', a 'b2' na 'b'. 'a' wychodziło 0, a 'b' dobrze. Pomyślałem, że może coś jest nie tak z 'a2', a więc zamieniłem zmienne. Do 'b' przypisałem 'a2' a do 'a' 'b2'. Ku mojemu zdziwieniu, znów to 'a' stało się 0, a 'b' zostało przekonwertowane dobrze. Jakbym nie ustawił kolejności zmiennych to zawsze źle konwertuje pierwszą z nich a reszte dobrze.
Kod programu:
program dzialania;
{$mode objfpc}
uses sysutils, crt;
var lancuch,a1,a2,b1,b2:string; a,b,dlugosc:integer; wynik:real; znak:char; i:byte;
begin
ClrScr;
writeln('Podaj dzialanie:');
readln(lancuch);
dlugosc := length(lancuch);
i:=0;
a2 := lancuch[i];
i:=i+1;
repeat
a1 := lancuch[i];
if a1 <> ' ' then a2 := concat(a2 + a1);
i := i+1;
until a1=' ';
znak := lancuch[i];
i := i+1;
b2 := '';
i := i+1;
repeat
b1 := lancuch[i];
if b1 <> ' ' then b2 := concat(b2 + b1);
i := i+1;
until i=dlugosc+1;
writeln();
writeln(a2);
writeln(znak);
writeln(b2);
writeln();
a := StrToInt(a2);
b := StrToInt(b2);
//Val(a2, a);
//Val(b2, b);
writeln(a);
writeln(b);
wynik:=a+b; // zczytywanie znaku jeszcze nie dodane, aktualnie program zawsze dodaje liczby.
writeln(wynik:1:2);
readln;
end.
Wynik programu:
Podaj dzialanie:
23 + 34 // podajemy działanie23 // wypisanie stringa a2
// wypisanie znaku
34 // wypianie stringa b2
0 // wypisanie inta a (po konversji z a2)
34 // wypisanie inta b (po konversji z b2)
34.00 // wynik (a + b)
Może ktoś z Was ma pojęcie czemu tak to działa :)