|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.04.2012, 13:47 | #1 |
Регистрация: 01.04.2012
Сообщений: 6
|
Вычислить значение выражения( Delphi).
Дана строка символов, представляющая собой запись алгебраического выражения, содержащего целые числа и знаки арифметических действий. Вычислить значение этого выражения.
Выражение можно взять любое,чтобы в нем были все операции (+,-,*,/). |
01.04.2012, 14:28 | #2 |
Пользователь
Регистрация: 31.03.2012
Сообщений: 67
|
не это?
Код:
|
01.04.2012, 14:58 | #3 |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
эх... ну поиск юзаем!
хоть бы вот http://www.kansoftware.ru/?tid=5109 статья достаточно простая о синт. разборе выражений.. если кратко, то: 1) делим строку на лексемы т.е. на числа, операции, функции (типа синуса и др.), имена переменных (проще с функциями объединить) 2) полученные лексемы записываем в стек по их приоритетам и "уровню" 3) достаём со стека команды и выполняем их.... допустим, достали "+" => достаём 2 след. элемента, суммируем их (если выражение верное, то это будут 2 числа уже), а ответ кладём в стек... повторяем это пока не останется 1 элемент в стеке это если очень грубо говоря |
19.04.2012, 18:31 | #4 |
Регистрация: 01.04.2012
Сообщений: 6
|
Код HTML:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; BitBtn1: TBitBtn; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const znaki=['-','+','*','/']; // описание константы содержащая мат.знаки var str:string; //обьявление переменной для хранения строки с уравнением schet, //счетчик для хранения количества уже записанных элементов в массиве NachaloChisla, //переменная для хранения номера буквы в строке соответствующая //месту где стоит мат знак и от него уже начинается число i:integer; //счетчик для цикла sum:real; //высчитываемая сумма masschisla: array [1..1000] of string; //массив со всемии найденными числами в строке massznak: array [1..1000] of char;//массив со всемии найденными мат.знаками в строке begin str:=Edit1.Text; //считывание строки с уравнением schet:=1; // установка счетчика массива в значение 1 (т.е. будет указывать на первый элемент массива) NachaloChisla:=1; //установка начала числа на первый символ строки str:=str+'='; //прибавление к строке с уравнением символа "=" для обозначения его конца for i:=1 to Length(str) do //цикл нахождение всех чисел if (str[i] in znaki) or (str[i]='=') then {если текущий символ строки str под номером i равен одному из описанных в константе или символ равен символу "="(т.е. если это он и есть), то...} begin masschisla[schet]:=copy(str,NachaloChisla,i-NachaloChisla);//в ячейку под номером schet массива чисел скопировать // из строки str(содержащую введенное уравнение) начиная с символа NachaloChisla, количество символов равное i-NachaloChislа} NachaloChisla:=i+1; {установка положения начала следующего числа на следующий после текущего символа в строке (потому что текущий это мат.знак) } schet:=schet+1;//увеличение указателя на следующую ячейку массива на единицу end; schet:=1; for i:=1 to Length(str) do //нахождение всех знаков if (str[i] in znaki) then {если текущий символ строки str под номером i равен одному из описанных в константе то..} begin massznak[schet]:=str[i];//скопировать этот знак в массив знаков schet:=schet+1;//увеличение указателя на следующую ячейку массива на единицу end; for i:=1 to schet-1 do // произвдение всех числе в массиве чисел между которыми стоит знак умножения и уравнивание их if massznak[i]='*' then begin masschisla[i]:=FloatToStr(strTOfloat(masschisla[i])*strTOfloat(masschisla[i+1])); masschisla[i+1]:=masschisla[i]; end; for i:=schet-1 downto 1 do //затем сравнивание всех чисел по обе стороны от знака произведения if massznak[i]='*' then masschisla[i]:=masschisla[i+1]; for i:=1 to schet-1 do // деление всех числе в массиве чисел между которыми стоит знак деления и уравнивание их if massznak[i]='/' then begin masschisla[i]:=FloatToStr(strTOfloat(masschisla[i])/strTOfloat(masschisla[i+1])); masschisla[i+1]:=masschisla[i]; end; for i:=schet-1 downto 1 do //затем сравнивание всех чисел по обе стороны от знака деления if massznak[i]='/' then masschisla[i]:=masschisla[i+1]; sum:=StrToFloat(masschisla[1]); //присвоение переменной содержащей сумму первого числа в массиве чисел for i:=1 to schet-1 do //от первого до последнего знака в массиве если он плюс или минус то производить // арифмет. действие и запись в переменную общей суммы begin case massznak[i] of '-': sum:=sum-StrToFloat(masschisla[i+1]); '+': sum:=sum+StrToFloat(masschisla[i+1]); end; end; Edit2.Text:=floatTostr(sum); //вывод результата end; end. for i:=1 to schet-1 do // произвдение всех числе в массиве чисел между которыми стоит знак умножения и уравнивание их if massznak[i]='*' then begin masschisla[i]:=FloatToStr(strTOfloat(masschisla[i])*strTOfloat(masschisla[i+1])); masschisla[i+1]:=masschisla[i]; end; for i:=schet-1 downto 1 do //затем сравнивание всех чисел по обе стороны от знака произведения if massznak[i]='*' then masschisla[i]:=masschisla[i+1]; for i:=1 to schet-1 do // деление всех числе в массиве чисел между которыми стоит знак деления и уравнивание их if massznak[i]='/' then begin masschisla[i]:=FloatToStr(strTOfloat(masschisla[i])/strTOfloat(masschisla[i+1])); masschisla[i+1]:=masschisla[i]; end;........ |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вычислить значение выражения | ulechka128 | Помощь студентам | 0 | 25.12.2011 13:35 |
Вычислить значение выражения | Genius94 | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 02.12.2011 00:05 |
Вычислить значение выражения | Nevezet | Помощь студентам | 4 | 30.01.2010 01:10 |
Вычислить значение выражения | WhiteKuz | Помощь студентам | 0 | 15.12.2009 22:27 |