|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Добавление переменных по требованию программы
Доброго времени суток, уважаемые форумчани!
Вот интересует такой вопрос: пишу калькулятор ( не смейтесь сразу над бедным студентом ) и при обработке кнопки, при которой будет происходить сумирование чисел, тоесть кнопки "+" ( при нажатии кнопки берется значение с поля Edit и вносится в переменную) возник вопрос: Так вот может ли быть обьявлена переменная в момент нажатия кнопки? В обшем чтобы можна было сумировать несколько переменных, тобиш ввожу число, жму "+", создается переменная, которой присваивается значения Edit-а, очищаем поле. И так много раз. P.S. Ну я еще не програмист, только изучаю его. Легких путей типа найти в инете готовый калькулятор и не парится не ищу, да и то что находил в инете - калькулятор с банальным додаванием двух чисел, тоесть то что меня интересует - не используется. P.S.S. Дико извиняюсь за мой "русский", с ним у меня трудновато, ибо хохол я |
#2
|
|||
|
|||
Не совсем понял что надо. Можно реализовать стековый калькулятор, например (там каждое число помещается в стек и потом уже над ячейками стека выполняются операции. стек реализуется, например, на основе массива или списка, т.е. ты заранее создаешь список переменных любой длинны). С другой стороны, описанный алгорим не является прозрачным. Т.е. ну нажал кнопку "+", допустим запомнилось текущее значение в какой-то переменной. И что дальше-то? Когда надо выполнять операцию?
|
#3
|
|||
|
|||
Цитата:
Меня просто интересует как организовать то, чтобы при нажатии кнопки "+" создавалась переменная и ей присваивалось значение из Edit. |
#4
|
||||
|
||||
Цитата:
|
#5
|
||||
|
||||
Цитата:
Вот ты создал переменную. Как ты будешь ее использовать в коде? Ведь ее надо не только создать, ее надо использовать. А это значит, что код должен знать заранее обо всех этих переменных (ведь код динамически не изменяется). Получается, либо все эти переменные должны быть созданы заранее, либо программа изначально знает, что существует массив переменных, и знает количество его элементов, которое может меняться. В любом случае, переменная не может быть просто "создана", т.к. будет невозможно ее обрабатывать. Может быть только добавлена новая в какой-то существующий контейнер (массив, список, ...). Если это не понятно, стоит сначала поиграть с более простыми вещами. Чтобы разобраться, как вообще это железо работает. Для твоей архитектуры калькулятора решение может быть таким - при нажатии каждой операции мы читаем значение, сохраняем операцию, и добавляем структуру вида Код:
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
|
|||
|
|||
Цитата:
Ну ничего, будем учится . Всем спасибо за ответы! |
#7
|
|||
|
|||
Цитата:
Например имеем массив 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
|
|||
|
|||
Цитата:
Тогда стековый калькулятор. Ты заносишь все в стек, при нажатии кнопки выполняешь вычисления. Стек можно сделать на списке (самое простое, меньше всего писать кода). Код:
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; Ну а в процедуре вычисления идешь по набранному стеку и выполняешь вычисления. |