Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.01.2014, 02:52
H3@DHuNT3R H3@DHuNT3R вне форума
Прохожий
 
Регистрация: 11.01.2014
Адрес: Львів
Сообщения: 3
Версия Delphi: Delphi 7, XE5
Репутация: 10
Радость Добавление переменных по требованию программы

Доброго времени суток, уважаемые форумчани!
Вот интересует такой вопрос: пишу калькулятор ( не смейтесь сразу над бедным студентом ) и при обработке кнопки, при которой будет происходить сумирование чисел, тоесть кнопки "+" ( при нажатии кнопки берется значение с поля Edit и вносится в переменную) возник вопрос: Так вот может ли быть обьявлена переменная в момент нажатия кнопки?
В обшем чтобы можна было сумировать несколько переменных, тобиш ввожу число, жму "+", создается переменная, которой присваивается значения Edit-а, очищаем поле. И так много раз.
P.S. Ну я еще не програмист, только изучаю его. Легких путей типа найти в инете готовый калькулятор и не парится не ищу, да и то что находил в инете - калькулятор с банальным додаванием двух чисел, тоесть то что меня интересует - не используется.
P.S.S. Дико извиняюсь за мой "русский", с ним у меня трудновато, ибо хохол я
Ответить с цитированием
  #2  
Старый 11.01.2014, 08:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,040
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не совсем понял что надо. Можно реализовать стековый калькулятор, например (там каждое число помещается в стек и потом уже над ячейками стека выполняются операции. стек реализуется, например, на основе массива или списка, т.е. ты заранее создаешь список переменных любой длинны). С другой стороны, описанный алгорим не является прозрачным. Т.е. ну нажал кнопку "+", допустим запомнилось текущее значение в какой-то переменной. И что дальше-то? Когда надо выполнять операцию?
Ответить с цитированием
  #3  
Старый 11.01.2014, 16:34
H3@DHuNT3R H3@DHuNT3R вне форума
Прохожий
 
Регистрация: 11.01.2014
Адрес: Львів
Сообщения: 3
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Не совсем понял что надо. Можно реализовать стековый калькулятор, например (там каждое число помещается в стек и потом уже над ячейками стека выполняются операции. стек реализуется, например, на основе массива или списка, т.е. ты заранее создаешь список переменных любой длинны). С другой стороны, описанный алгорим не является прозрачным. Т.е. ну нажал кнопку "+", допустим запомнилось текущее значение в какой-то переменной. И что дальше-то? Когда надо выполнять операцию?
Операция должна выполнятся при нажатии кнопки "="(поставить условие что делать с переменными, в зависимости какая кнопка была нажата при их создании("+" или "-")) и выводить на экран результат(в Edit).
Меня просто интересует как организовать то, чтобы при нажатии кнопки "+" создавалась переменная и ей присваивалось значение из Edit.
Ответить с цитированием
  #4  
Старый 11.01.2014, 16:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от H3@DHuNT3R
Меня просто интересует как организовать то, чтобы при нажатии кнопки "+" создавалась переменная и ей присваивалось значение из Edit.
Всё же не понятно, что подразумевается под термином "создавалась переменная". Можешь привести пример когда переменные "создаются"?
Ответить с цитированием
  #5  
Старый 11.01.2014, 17:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
создавалась переменная
Компьютер - машина. Процессор - кусок кремния.
Вот ты создал переменную. Как ты будешь ее использовать в коде? Ведь ее надо не только создать, ее надо использовать. А это значит, что код должен знать заранее обо всех этих переменных (ведь код динамически не изменяется). Получается, либо все эти переменные должны быть созданы заранее, либо программа изначально знает, что существует массив переменных, и знает количество его элементов, которое может меняться. В любом случае, переменная не может быть просто "создана", т.к. будет невозможно ее обрабатывать. Может быть только добавлена новая в какой-то существующий контейнер (массив, список, ...).
Если это не понятно, стоит сначала поиграть с более простыми вещами. Чтобы разобраться, как вообще это железо работает.
Для твоей архитектуры калькулятора решение может быть таким - при нажатии каждой операции мы читаем значение, сохраняем операцию, и добавляем структуру вида
Код:
record
 value: real;
 operation: int;
end;
в список таких структур. Когда нажали "=" - перебираем все элементы списка и производим операции.
Но сразу виден недостаток: все операции выполняются "в лоб", даже если приоритет второй выше первой (к примеру 1 + 3 * 4). Получается, что если мы добавили операцию, то все, что было нажато раньше уже может быть посчитано, т.к. более никогда не будет изменено и порядок всегда одинаков. А если так - зачем вообще городить списки и структуры, когда можно при нажатии на любую операцию сразу ее производить? К примеру (пишу ввод юзера и что делает при этом прога):
стартовые значения: результат - 0, операция - "+", временная переменная - 0.
Ввод:
- - в этот момент "-" в текущую операцию
1 - сохраняем во временную переменную
+ - в этот момент 1 вычитается из результата (т.к. текущая операция - "-"), а + - в текущую операцию.
2 - сохраняем во временную переменную
- - в этот момент 2 добавляется к результату (т.к. текущая операция - +), а "-" кладем в текущую операцию.
5 - сохраняем во временную переменную
= - в этот момент 5 вычитается из результата (т.к. текущая операция - "-"), а т.к. нажато =, завершаем вычисления.
Получили: -1+2-5=, что равносильно 0-1+2-5=.
Однако для калькулятора лучше сразу почитать хотя бы про "обратную польскую запись" - позволяет и сложные арифметические выражения записать (не только +/-), и относительно удобно рассчитывать.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 11.01.2014 в 17:17.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
H3@DHuNT3R (11.01.2014)
  #6  
Старый 11.01.2014, 17:20
H3@DHuNT3R H3@DHuNT3R вне форума
Прохожий
 
Регистрация: 11.01.2014
Адрес: Львів
Сообщения: 3
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Компьютер - машина. Процессор - кусок кремния.
Вот ты создал переменную. Как ты будешь ее использовать в коде? Ведь ее надо не только создать, ее надо использовать. А это значит, что код должен знать заранее обо всех этих переменных (ведь код динамически не изменяется). Получается, либо все эти переменные должны быть созданы заранее, либо программа изначально знает, что существует массив переменных, и знает количество его элементов, которое может меняться. В любом случае, переменная не может быть просто "создана", т.к. будет невозможно ее обрабатывать. Может быть только добавлена новая в какой-то существующий контейнер (массив, список, ...).
Если это не понятно, стоит сначала поиграть с более простыми вещами. Чтобы разобраться, как вообще это железо работает.
Для твоей архитектуры калькулятора решение может быть таким - при нажатии каждой операции мы читаем значение, сохраняем операцию, и добавляем структуру вида
Код:
record
 value: real;
 operation: int;
end;
в список таких структур. Когда нажали "=" - перебираем все элементы списка и производим операции.
Но сразу виден недостаток: все операции выполняются "в лоб", даже если приоритет второй выше первой (к примеру 1 + 3 * 4). Получается, что если мы добавили операцию, то все, что было нажато раньше уже может быть посчитано, т.к. более никогда не будет изменено и порядок всегда одинаков. А если так - зачем вообще городить списки и структуры, когда можно при нажатии на любую операцию сразу ее производить? К примеру (пишу ввод юзера и что делает при этом прога):
стартовые значения: результат - 0, операция - "+", временная переменная - 0.
Ввод:
- - в этот момент "-" в текущую операцию
1 - сохраняем во временную переменную
+ - в этот момент 1 вычитается из результата (т.к. текущая операция - "-", а + - в текущую операцию.
2 - сохраняем во временную переменную
- - в этот момент 2 добавляется к результату (т.к. текущая операция - +), а "-" кладем в текущую операцию.
5 - сохраняем во временную переменную
= - в этот момент 5 вычитается из результата (т.к. текущая операция - "-"), а т.к. нажато =, завершаем вычисления.
Получили: -1+2-5=, что равносильно 0-1+2-5=.
Однако для калькулятора лучше сразу почитать хотя бы про "обратную польскую запись" - позволяет и сложные арифметические выражения записать (не только +/-), и относительно удобно рассчитывать.
Спасибо за ответ. Он то меня и надоумил, что рано мне еще с такими вещами работать
Ну ничего, будем учится .
Всем спасибо за ответы!
Ответить с цитированием
  #7  
Старый 11.01.2014, 17:20
aquatell aquatell вне форума
Прохожий
 
Регистрация: 21.04.2011
Сообщения: 31
Репутация: 10
По умолчанию

Цитата:
Сообщение от H3@DHuNT3R
Вот интересует такой вопрос: пишу калькулятор
Если заранее неизвестно количество переменных, я бы использовал динамический массив. Сколько раз будем брать значения из Едита, столько раз будем на единицу увеличивать размер массива, в результате будем иметь массив со значениями. Устанавливается размер массива так SetLength("Имя массива","числовое значение - размер массива")
Например имеем массив A: array of integer;
Имеем 5 переменных, значит делаем так SetLength(A,5);

Код:
//Присвоим массиву значения так 
A[0]:=5;
A[1]:=10;
A[2]:=20;
A[3]:=50;
A[3]:=100;

//Суммировать можно к примеру так 
Var
R:integer; { здесь будем хранить результат, если будем использовать деление то лучше переменную делать типа Real, затем функцией Format форматировать так как нам надо результат}
// high(A);  получаем размер массива
for i:=0 to high(A)-1 do
inc(R, A(i));
ShowMessage('Результат = '+IntToStr(R));
Ответить с цитированием
  #8  
Старый 11.01.2014, 21:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,040
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от H3@DHuNT3R
Спасибо за ответ. Он то меня и надоумил, что рано мне еще с такими вещами работать
Ну ничего, будем учится .
Всем спасибо за ответы!

Тогда стековый калькулятор.
Ты заносишь все в стек, при нажатии кнопки выполняешь вычисления. Стек можно сделать на списке (самое простое, меньше всего писать кода).

Код:
type
  TStackItemType = (sitValue, sitOperation);
  TOperation = (oPlus, oMinus, oMul, oDiv);
  TStackItem = record
    ItemType : TStackItemType;
    Value : Variant;
  end;
  POperation = ^TOperation;

var
  FStack : TList; // Создать в OnCreate, удалить в OnDestroy

procedure TForm1.AddValue(Sender : TObject);
var
  FItem : PStackItem;
begin
  New(FItem);
  FItem.ItemType := sitValue;
  FItem.Value := StrToInt(Edit1.Text);
  FStack.Add(FItem);
end;

// Сложение, остальные операции аналогично
procedure TForm1.Plus(Sender : TObject);
var
  FItem : PStackItem;
begin
  New(FItem);
  FItem.ItemType := sitOperation;
  FItem.Value := oPlus;
  FStack.Add(FItem);
end;

Ну а в процедуре вычисления идешь по набранному стеку и выполняешь вычисления.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter