|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Прошу помочь с написанием кода
Сама задача: Дан текст, в котором встречаются арифметические выражения вида a \ b, где \ - один из знаков +, -, *, /. Выписать все арифметические выражения и вычислить их значения.
На форме присутствуют компоненты Memo, Button, Label. Алгоритм: Текст из Memo посимвольно проверяется на совпадение с одним из этих знаков. При совпадении производится определение чисел слева и справа от знака, после они преобразовываются из текстовых значений в числовые и выполняется арифметическая операция, соответствующая знаку. Так же с остальными тремя знаками до конца текста. После результаты выводятся в компоненте Label. В общем, не могу правильно все это оформить в виде кода |
#2
|
|||
|
|||
А ты попробуй, а мы поправим.
|
#3
|
|||
|
|||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,n,c,d,e,f: integer; s: string; begin with Memo1 do begin For n:=0 to lines.count-1 do begin s:=lines[n]; For i:=1 to length(s) do If s[i]='+' then {здесь не знаю как написать цикл определения чисел} lmikle: Пользуемся тегами!!! Added: Просто дальше ничего кроме end'ов и нет =) Последний раз редактировалось Disticomb, 30.12.2008 в 15:41. |
#4
|
|||
|
|||
ЧЕ-то не все попало...
|
#5
|
|||
|
|||
Вот держи код, думаю все понятно...
Код:
function ReplaseString(InStr,FindStr,ReplaseStr: String) : string; var id : integer; str : string; begin Result := InStr; id := pos(LowerCase(FindStr), LowerCase(InStr)); str := InStr; Delete(str,id,length(FindStr)); Insert(ReplaseStr,str,id); Result := str; end; function ReplaseAllString(Line, Prefix, Return: String) : String; var tmp : string; begin tmp := Line; while pos(Prefix,tmp) > 0 do tmp := ReplaseString(tmp,prefix,return); Result := tmp; end; procedure GetWordsList(Line: String; List : TStrings); var tmp : String; begin tmp := Line; tmp := ReplaseAllString(tmp,' ',#13#10); List.Text := tmp; end; function CalculateExpression(Expression: String) : integer; const Minus = '-'; Plus = '+'; Divider = '\'; Mplying = '*'; var Temp : String; sList : TStringList; sResult : integer; sCalc : integer; i : integer; begin sResult := 0; sList := TStringList.Create; try {} Temp := ''; for i := 1 to Length(Expression) do if (Expression[i] = Minus) or (Expression[i] = Plus) or (Expression[i] = Divider) or (Expression[i] = Mplying) then begin sList.Add(Temp); sList.Add(Expression[i]); Temp := ''; end else Temp := Temp + Expression[i]; sList.Add(Temp); {} sCalc := 0; sResult := 0; i := 0; while i < sList.Count-1 do begin if (sList[i] <> Minus) and (sList[i] <> Plus) and (sList[i] <> Divider) and (sList[i] <> Mplying) then begin sCalc := strtoint(sList[i]); end else begin if sList[i] = Minus then sCalc := (sCalc - strtoint(sList[i+1])); if sList[i] = Plus then sCalc := (sCalc + strtoint(sList[i+1])); if sList[i] = Divider then sCalc := (sCalc div strtoint(sList[i+1])); if sList[i] = Mplying then sCalc := (sCalc * strtoint(sList[i+1])); sResult := sCalc; inc(i); end; inc(i); end; {} finally Result := sResult; sList.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; l : TStringList; begin ListBox1.Clear; l := TStringList.Create; GetWordsList(Memo1.Text,l); {} for i := 0 to l.Count-1 do if (pos('-',l[i])<>0) or (pos('+',l[i])<>0) or (pos('*',l[i])<>0) or (pos('\',l[i])<>0) then begin try ListBox1.Items.Add(l[i]+'='+inttostr(CalculateExpression(l[i]))); except end; end; {} l.Free; end; |
#6
|
|||
|
|||
Спасибо большое
|