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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 10:51   #1
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию Кальк, удаление БАГов

Написал калькулятор без чьей-либо помощи, без помощи инета, всё сам основываясь только на школьных знаниях. В целом не сложно, сложно правда защиту от дураков ставить (чтобы две запятые нельзя было ставить и т.д.). Но до сих пор не могу исправить одну ошибку. Если я делаю сложное выражение (состоящее более чем из одной операции, например 1+1+1) то оно считает только последнюю операцию (т.е. ответ будет 2). Почему так получается я знаю (просто все данные у меня считываются с поля ЭДИТ), но я не знаю как это исправить. Уже много вариантов перебрал. Помогите пожалуйста, очень хочется сделать полноценный кальк. Если найдёте ещё какой-нибудь баг - скажите, я его исправлю. Да и вообще скажите ваше мнение, по поводу моей работы. В следующем посте отправлю полностью код программы, а тут ссылку на картинку вида калькулятора, чтобы вы знали сколько там у меня кнопок, и где они расположены и т.д.
http://www.photoshare.ru/photo7013895.html
Заранее благодарен.
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 10:53   #2
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Label2: TLabel;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    Button19: TButton;
    Edit1: TEdit;
    procedure Button14Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure Button19Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a,b,c:real;
  d:char;

implementation

{$R *.dfm}

procedure zpt();
var t:string; i:integer;

begin
t:=form1.edit1.Text;
for i:=1 to length(t) do
if t[i]=','
then
form1.button16.Enabled:=false;



end;

procedure TForm1.Button14Click(Sender: TObject);
begin
form1.close;
end;

procedure TForm1.Button11Click(Sender: TObject);
begin
edit1.text:='';
a:=0;
b:=0;
c:=0;
form1.button16.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text:=edit1.text+'1';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text:=edit1.text+'2';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
edit1.text:=edit1.text+'3';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
edit1.text:=edit1.text+'4';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
edit1.text:=edit1.text+'5';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
edit1.text:=edit1.text+'6';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
edit1.text:=edit1.text+'7';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
edit1.text:=edit1.text+'8';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
edit1.text:=edit1.text+'9';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
edit1.text:=edit1.text+'0';
button13.enabled:=true;
button15.enabled:=true;
button17.enabled:=true;
button18.enabled:=true;
zpt();
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
d:='+';
edit1.text:='';
if edit1.text=''
then
button13.enabled:=false;
form1.button16.Enabled:=true;

end;

procedure TForm1.Button12Click(Sender: TObject);
begin
b:=strtofloat(edit1.text);
case d of
'+':c:=a+b;
'-':c:=a-b;
'*':c:=a*b;
'/':c:=a/b;
end;
edit1.text:=floattostr(c);
end;

procedure TForm1.Button15Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
d:='-';
edit1.text:='';
if edit1.text=''
then
button15.enabled:=false;
form1.button16.Enabled:=true;
end;

procedure TForm1.Button16Click(Sender: TObject);
var t:string; i:integer;
begin
edit1.text:=edit1.text+',';
zpt();
end;

___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 28.03.2011 в 11:20.
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 10:53   #3
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию

Код:
procedure TForm1.Button17Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
d:='*';
edit1.text:='';
if edit1.text=''
then
button17.enabled:=false;
form1.button16.Enabled:=true;
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
a:=strtofloat(edit1.text);
d:='/';
edit1.text:='';
if edit1.text=''
then
button18.enabled:=false;
form1.button16.Enabled:=true;
end;

procedure TForm1.Button19Click(Sender: TObject);
begin
edit1.text:=edit1.text+'00';
end;

end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 28.03.2011 в 11:20.
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 11:33   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а проект в архиве выложить не проще было?!

1) вместо:
procedure TForm1.Button1Click(Sender: TObject);
...
procedure TForm1.Button2Click(Sender: TObject);
..
procedure TForm1.Button10Click(Sender: TObject);

я бы рекомендовал сделать так:
сначала в Дизайнере, в диспетчере объектов для каждой кнопки задать свойство TAG (для кнопки Button1 - Tag: 1, для второй - 2 и т.д. для Button10.Tag := 0;

потом сделать ОДНУ процедуру и назначить её всем кнопкам:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.text:=edit1.text+IntToStr(TButton(sender).Tag);
  button13.enabled:=true;
  button15.enabled:=true;
  button17.enabled:=true;
  button18.enabled:=true;
  zpt();
end;
это не принципиально, просто красивее (код меньше и нагляднее)!

2) теперь по сути вопроса.
если хотите, можете воcпользоваться моими исходниками парсера арифметических выражений. взять можно тут
если же не хотите - тогда надо Вам самостоятельно писать такой парсер.
Вводите допускаемые операции, допускаются ли скобки, будет ли соблюдаться правильный приоритет математических действий и пишите парсер. В принципе, это не очень сложно. Да и литературы/примеров полно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.03.2011, 12:37   #5
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а проект в архиве выложить не проще было?!

1) вместо:
procedure TForm1.Button1Click(Sender: TObject);
...
procedure TForm1.Button2Click(Sender: TObject);
..
procedure TForm1.Button10Click(Sender: TObject);

я бы рекомендовал сделать так:
сначала в Дизайнере, в диспетчере объектов для каждой кнопки задать свойство TAG (для кнопки Button1 - Tag: 1, для второй - 2 и т.д. для Button10.Tag := 0;

потом сделать ОДНУ процедуру и назначить её всем кнопкам:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.text:=edit1.text+IntToStr(TButton(sender).Tag);
  button13.enabled:=true;
  button15.enabled:=true;
  button17.enabled:=true;
  button18.enabled:=true;
  zpt();
end;
это не принципиально, просто красивее (код меньше и нагляднее)!

2) теперь по сути вопроса.
если хотите, можете воcпользоваться моими исходниками парсера арифметических выражений. взять можно тут
если же не хотите - тогда надо Вам самостоятельно писать такой парсер.
Вводите допускаемые операции, допускаются ли скобки, будет ли соблюдаться правильный приоритет математических действий и пишите парсер. В принципе, это не очень сложно. Да и литературы/примеров полно...
Не хочу показаться уж очень тупым, но слова из вашего сообщения, которые я понял, наверное, можно пересчитать по пальцам. Я не особо умён в программировании, моя жизнь с этим не связана. Это скорее хобби и лишь в будущем возможно род деятельности. Сейчас я не знаю очень много, и то что там было написано про сокращение кода - мне не нужно, т.к. мой мозг и так кипит, я и это долго писал, а забивать мой мозг лишними командами сейчас - рискованно. Большое спасибо за помощь, но она мне уже не пригодилась. Я посидел - подумал ещё с пол часика и нашёл выход, он выглядит так (выставляю только знак +, остальные не буду, принцип один и тот же)

Код:
procedure TForm1.Button13Click(Sender: TObject);
begin
if a<>0 then
begin
b:=strtofloat(edit1.text);
c:=a+b;
a:=c;
end
else
begin
a:=strtofloat(edit1.text);

d:='+';
end;
edit1.text:='';
if edit1.text=''
then
button13.enabled:=false;
form1.button16.Enabled:=true;
Так теперь выглядит знак +, просто сделать ветвление, которое распознаёт первый или второй раз используется знак +, и если второй, то бывшей сумме присвоить начальную переменную и дальше делать также, т.е. создать упрощённый цикл (без команд цикла, а просто присвоить переменные, чтобы получился какбэ замкнутый круг)
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 12:56   #6
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию

Всё-таки ещё один вопросец у меня появился, думаю по этой теме. Хочу сделать кнопку DEL в калькуляторе. Команды либо не знаю либо не помню. Знаю что команда связана с обработкой текста, в моём случае с обработкой едит1.текст. Подскажите плз команду удаления последнего символа в строке СТРИНГ.
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 13:06   #7
novichok1
Пользователь
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

Можно брать строку без послденего символа

copy(s,0,length(s)-1 )
novichok1 вне форума Ответить с цитированием
Старый 28.03.2011, 13:22   #8
Aспирин
Пользователь
 
Аватар для Aспирин
 
Регистрация: 28.03.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от novichok1 Посмотреть сообщение
Можно брать строку без послденего символа

copy(s,0,length(s)-1 )
А расписать переменные можешь? Что они обозначают и т.д.
Aспирин вне форума Ответить с цитированием
Старый 28.03.2011, 13:31   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Что они обозначают и т.д.
Справку еще никто не отменял. Смотри в справке функцию Copy
psycho-coder вне форума Ответить с цитированием
Старый 28.03.2011, 13:42   #10
novichok1
Пользователь
 
Регистрация: 22.01.2011
Сообщений: 25
По умолчанию

s это строка с которой рабоатем, length функция которая возвращет длину строки, copy функция которая копирует подстроку начиная со второго аргумента в нашем случае с нуля, и копиремая подстрока содержит символы число которых равно третьему аругменту, в нашем случае на один символ меньше чем s
novichok1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных(Pascal). Отлов багов. inviter Помощь студентам 0 09.01.2011 17:15
Ограничение возможностей C++ для уменьшения багов Kn793 Общие вопросы C/C++ 5 15.12.2010 15:11