Witam, w podanym programie problem polega na tym, że składnia jest dobra ale nie rozumiem dla czego, otrzymuje błędne wyniki. Podaje poniżej kod sformatowany i mam nadzieję, że w końcu dojdziemy do porozumienia z pozdrowieniami dla -123oho. Napisałem komentarze z objaśnieniem, mam nadzieję, że do zrozumienia, z góry dziękuje.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,dlugosc_lancucha,c_mnoznik,a_wynik_tymczasowy,s_wynik_koncowy,p,r:integer;
var jedynka,vpiec,dziesiec:char;
var t:array[1..20]of string; //tablica przechowywujaca cyfry rzymskie
begin
c_mnoznik:=1;
r:=1;
dlugosc_lancucha:=length(edit1.text);
for i:=dlugosc_lancucha downto 1 do t[i]:=copy(edit1.Text,dlugosc_lancucha-(i-1),1);
//Powyżej wypelnianie tablicy tak, aby byly ustawione od konca
for p:=1 to dlugosc_lancucha do
begin
//zmienne p, i oraz r są po to, aby pomijac niektore kroi w tym forze
i:=p;
if(i=r)then
begin // warunek, ktory pomija dzialania w razie koniecznosci ich pominiecia
{ponizej sprawdzanie wielkosci mnoznika. Jest on potrzebny do poprawnego dzialania programu.
Program dziala tak:
1. c_mnoznik=1 czyli sprawdzamy czy ostatna liczba jest jednostka, podana tutaj zmienna jest
odpowiedzialna za przyrownanie bierzacego elementu do odpowiedniego zestawu znakow i pod
koniec pomnozeniu a_wynik_tymczasowy przez nia. (np c_mnoznik=2, for bierze drugi zestaw
znakow, t[i]='L' then a_wynik_tymczasowy:=5 i pod koniec a_wynik_koncowy:=a_wynik_koncowy
*c_mnoznik przez co otrzymujemy wynik 50)
2. Jesli ostatnia liczba to jednostka to warunki w ponizszym forze sprawdzaja jaka
3. Jesli ostatnie liczba nie zgadza sie z zestawem znakow jedosci wtedy idziemy na koniec,
powiekszamy c_mnoznik*10 co oznacza, ze w kolejnym kroku petli wezmiemy zestaw znakow dla
dziesiatek i sprawdzimy czy liczba jest dziesiatka
4. Jesli powyzszy pkt nie wykaze, ze liczba jest jednoscia, dziesiatka czy setka itd to znaczy,
ze dane sa zle podane i nic nie zostanie podane
5. Jesli wszystkie liczby zostaly rozpoznane to otzymujemy wynik za ktory odpowiedzialna jest
zmienna s_wynik_kancowy
}
if(c_mnoznik=1)then
begin
jedynka:='I';
vpiec:='V';
dziesiec:='X';
end;
if(c_mnoznik=10)then
begin
jedynka:='X';
vpiec:='L';
dziesiec:='C';
end;
if(c_mnoznik=100)then
begin
jedynka:='C';
vpiec:='D';
dziesiec:='M';
end;
if(t[i]=jedynka)then
begin //jesli ostatni symbol zgadza sie z jednostka jednosci to...
a_wynik_tymczasowy:=1; // a_wynik_tymczasowy:=1 a tymczasowy bo...
if(t[i+1]=jedynka)then
begin // jesli jest I i przed nia jest kolejna I to jest to nadal cyfra jednosci
a_wynik_tymczasowy:=2; // a jesli I wystepuje po poprzenim znaku to a_wynik_tymczasowy powinien byc =2
if(t[i+2]=jedynka)then
begin // ale jelsi znow przed powyzsza bedzie I to ...
a_wynik_tymczasowy:=3; //a_wynik_tymczasowy bedzie musial wynosci 3
if(t[i+3]=vpiec)then
begin //ale jesli przed powyzszym symbolem bedzie V to ...
a_wynik_tymczasowy:=8; //a_wynik_tymczasowy bedzie musial byc rowny 8 bo wyjdzie na to, ze wyglada on tak: VIII
i:=i+1; //zwiekszam indeks po kazdym takim spelnionym warunku, poniewaz jesli wystepowala 8(VIII}
end; //to kolejnym sprawdzanym elementem nie moze byc t[2], my juz jednosci otrzymalismy wiec
i:=i+1; //kolejny elementy to musi byc cos wiekszego np dziesiatka, czyli kolejny sprawdzany
end; //element to t[5] w tym przypadku. Po tych dzialaniach konczy sie pierwszy krok w petli
if(t[i+2]=vpiec)then
begin // wiec c_mnoznik (jak uwyzej opisalem) jest zwiekszony o x10 co sprawia, ze kolejny zestaw
a_wynik_tymczasowy:=7; //znakow bedzie dla dziesiatek - czyli tak jak powinno byc
i:=i+1;
end;
i:=i+1;
end;
if(t[i+1]=vpiec)then
begin
a_wynik_tymczasowy:=6;
i:=i+1;
end;
end;
if(t[i]=vpiec)then
begin
a_wynik_tymczasowy:=5;
if(t[i+1]=jedynka)then
begin
a_wynik_tymczasowy:=4;
i:=i+1;
end;
end;
if(t[i]=dziesiec)then
begin
if(t[i+1]=jedynka)then
begin
a_wynik_tymczasowy:=9;
i:=i+1;
end;
end; //tytaj do konca tych warunkow byly sprawdzane wszystkie mozliwe wystepowanie liczb
a_wynik_tymczasowy:=a_wynik_tymczasowy*c_mnoznik; //a_wynik_tymczasowy*c_mnoznik dla liczb wiekszych lub rownych 10
s_wynik_koncowy:=s_wynik_koncowy+a_wynik_tymczasowy; //koncowy wynik laczacy a_wynik_tymczasowy z wszystkich korkow petli
edit2.Text:=inttostr(s_wynik_koncowy); //wypisanie rezultatow
c_mnoznik:=c_mnoznik*10; //zwiekszenie c_mnoznik x10 powyzej wytlumaczone why
r:=p; //mnienna pozwalajaca na pomijanie krokow fora
end;
end;
end;
end.