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

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

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

Восстановить пароль

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

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

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

Код 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 вне форума Ответить с цитированием
Старый 20.04.2012, 22:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для себя или контрольная?
Если для себя то предлагаю задействовать тяжелую артилерию: http://www.programmersforum.ru/showthread.php?t=100279
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.04.2012, 23:22   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, ещё, со своей стороны, могу порекомендовать ознакомится с моим антикварным произведением (делал для себя, использовал в своих проектах на TurboPascal...)

вот мессадж
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить значение выражения( Delphi). tralala Помощь студентам 3 19.04.2012 18:31
вычислить значение выражения (на C++) laychan Помощь студентам 2 05.03.2012 11:32
вычислить значение выражения _Иван_ Помощь студентам 2 20.04.2011 18:58
Вычислить значение выражения (3*a+2)/c Solnze2 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.10.2010 16:42
Вычислить значение выражения WhiteKuz Помощь студентам 0 15.12.2009 22:27