Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 13:47   #1
tralala
 
Регистрация: 01.04.2012
Сообщений: 6
Восклицание Вычислить значение выражения( Delphi).

Дана строка символов, представляющая собой запись алгебраического выражения, содержащего целые числа и знаки арифметических действий. Вычислить значение этого выражения.

Выражение можно взять любое,чтобы в нем были все операции (+,-,*,/).
tralala вне форума Ответить с цитированием
Старый 01.04.2012, 14:28   #2
qpuTuJlb
Пользователь
 
Аватар для qpuTuJlb
 
Регистрация: 31.03.2012
Сообщений: 67
По умолчанию

не это?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit3: TEdit;
     procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
Var
a,b,c:integer;
begin
a:=Strtoint(Edit1.Text);
b:=Strtoint(Edit2.Text);
c:=a+b;
Edit3.Text:=Floattostr(c)
end;

procedure TForm1.Button3Click(Sender: TObject);
Var
a,b,c:integer;
begin
a:=Strtoint(Edit1.Text);
b:=Strtoint(Edit2.Text);
c:=a*b;
Edit3.Text:=Floattostr(c)
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
a,b:integer;
c:double;
begin
a:=Strtoint(Edit1.Text);
b:=Strtoint(Edit2.Text);
c:=a/b;
Edit3.Text:=Floattostr(c)
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
a,b,c:integer;
begin
a:=Strtoint(Edit1.Text);
b:=Strtoint(Edit2.Text);
c:=a-b;
Edit3.Text:=Floattostr(c)
end;

end.
qpuTuJlb вне форума Ответить с цитированием
Старый 01.04.2012, 14:58   #3
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

эх... ну поиск юзаем!
хоть бы вот http://www.kansoftware.ru/?tid=5109
статья достаточно простая о синт. разборе выражений..
если кратко, то:
1) делим строку на лексемы т.е. на числа, операции, функции (типа синуса и др.), имена переменных (проще с функциями объединить)
2) полученные лексемы записываем в стек по их приоритетам и "уровню"
3) достаём со стека команды и выполняем их.... допустим, достали "+" => достаём 2 след. элемента, суммируем их (если выражение верное, то это будут 2 числа уже), а ответ кладём в стек... повторяем это пока не останется 1 элемент в стеке
это если очень грубо говоря
GreenWizard вне форума Ответить с цитированием
Старый 19.04.2012, 18:31   #4
tralala
 
Регистрация: 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;........
tralala вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычислить значение выражения 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