Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 60764
Invision Power ... 58649
Организация зап... 58615
Модуль Forms 57076
Приложение «Про... 56862
Оператор выбора... 56299
Создание отчето... 56025
Подключение Mic... 55891
ТЕХНОЛОГИИ ДОСТ... 52226
Программируемая... 49543
Пример работы с... 48069
Имитационное мо... 47770
21 ошибка прогр... 42736
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,022
новичок: igra87
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Обработка задач на ЭВМ на GPSS + Пояснительная записка
Движение шарика в эллиптическои параболоиде на Delphi [OpenGL] + Блок схемы
Выбор наилучших альтернатив с использованием методов оптимизации на Delp...

Реклама

Приложение «Простейший калькулятор»


Создадим программу, которая представляет собой арифметический калькулятор,
производящий четыре действия над действительными числами. Проектируемый калькулятор
должен функционировать следующим образом: пользователь вводит первый операнд,
выбирает операцию, затем вводит второй операнд и нажимает «равно». При этом
происходит вычисление результата соответствующей операции и его отображение в строке
данных калькулятора. Ввод операндов и операций осуществляется путем нажатия кнопки на
самом калькуляторе.
Создание новой программы на Delphi начинается с выбора опции File/ New Application. Это
означает, что начинается работа над новым приложением для Windows.
Сохраните созданный проект в папке Калькулятор, назвав файл проекта - Calc, а файл модуля
формы - CalcUnit.
В окне инспектора объектов изменим свойства элементов формы в соответствии со
следующим описанием:
form1
Создайте поле ввода-вывода информации Edit1 и кнопки Button1- Button17 (для кнопок с цифрами,
десятичной точкой и действиями). Разместите компоненты на форме в соответствии с рисунком:
Приложение «Простейший калькулятор»
Рис. Внешний вид формы проектируемого калькулятора.
В окне инспектора объектов изменить свойства элементов формы в соответствии с таблицей:

Перед созданием обработчиков введем несколько соглашений:
1. Пусть некоторый признак (флаг f) f=1, если над двумя введенными числами произведена операция
сложения; f=2, если над двумя введенными числами произведена операция вычитания; f=3, если
над двумя введенными числами произведена операция умножения; f=4, если над двумя
введенными числами произведена операция деления и f=5, если была нажата клавиша равно.
2. Необходимо учесть, что арифметические операции вводится циклически (например, после
выполнения операции, когда на индикаторе результат). Поэтому введем переменную zifra, которая
будет отвечать за ввод следующего числа. Переменная zifra будет иметь значение false, если не
введена цифра нового числа, а true, если введена первая цифра нового числа.
3. В программе потребуется использование переменных. Опишем их в разделе var следующим
образом:

Здесь переменная a хранит первое число, b – второе число, c – результат.
4. При запуске приложения Калькулятор, входящего в состав ОС Windows, в строке ввода
данных отображается «0», реализуем такую возможность в нашем приложении, также
установим предварительное значение признака (флага), которое будет уму присвоено после
открытия формы, а также признака того, что число не вводилось. Это делается следующей
процедурой:

5. При нажатии на любой кнопке с числом (при вводе операндов), введенный символ должен
отображаться в текстовом поле edInput (исключение составляет случай, когда ноль
вводится как первый символ числа). При этом необходимо различать первая ли цифра в
числе, или нет. Также необходимо менять значение признака zifra при вводе первой цифры
числа. Это делается следующими процедурами:

6. Аналогично запишутся обработчики для компонентов bt_3, bt_4, … bt_9, bt_0.
7. Необходимо учесть, что в действительном числе может быть только одна запятая, отделяющая
целую часть от дробной, т.е. повторное нажатие на кнопку с изображением запятой игнорируется.
Запрограммируем кнопку «,» (компонент btPoint):

8. Если нажимается кнопка «Сброс», надо обнулить значение a,b и f, очистить поле edInput и
параметру zifra задать значение false. Т.о. обработчик нажатия на кнопке, т.е. на событие
Click следующий:

9. Если же нажимается кнопка для совершения действия (/, *, -, +), то флагу надо дать
соответствующее значение, чтобы после ввода второго операнда и нажатия на кнопке
равно, знать какое действие совершать между первым a и вторым b операндом. Но надо
учесть, что если перед нажатием на кнопке с операцией была нажата кнопка равно (f=5), то
предыдущие вычисления продолжаются, и полученный результат должен теперь выступать
в роли первого операнда, т.е. надо выполнить команду a:=c. Т.о. обработчики нажатий
кнопок с действиями (/, *, -, +), т.е. на событие Click следующие:

10. Если же нажимается кнопка равно, то в зависимости от значения флага f надо произвести
одно из четырех действий: 1-«+», 2-«-», 3-«*», 4-«/» и после этого флагу дать значение f=5.
Т.о. обработчик нажатия на кнопке равно, т.е. на событие Click следующий:

11. Известное Вам приложение Калькулятор, входящего в состав ОС Windows, предполагает
ввод операндов с клавиатуры. Запрограммируем это событие компонента edInput, но
учтем, что в поле можно вводить только цифры и одну запятую:

12. Запустите созданное приложение, исправьте (если они появятся) ошибки. После
тестирования откомпилируйте проект и запустите готовое приложение.

P.S. Для того что бы калькулятор считал подряд, т.е. выдавал результат при нажатие операции, необходимо дописать к обработчику кнопки каждой операции код:
SpeedButton17Click(Sender);



Полностью обработчик нажатия на кнопку:
procedure TForm1.SpeedButton11Click(Sender: TObject);
begin
SpeedButton17Click(Sender); //если была операция то вычисляем
if f=5
then a:=c
else a:=strtofloat(edit1.Text);
f:=3;
zifra:=false;
end;


Опубликовал Kest March 16 2010 19:01:13 · 19 Комментариев · 56862 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Андрей May 12 2010 14:55:44
Отличный урок!
Alex May 17 2010 00:01:21
если после нажатия клавиши равно сразу без очистки ввести первый операнд потом действие потом второй операнд потом равно то считает неправильно...тоесть например вводим 5+5=10 и сразу без сброса 5+5=то уже будет равно 15...как поправить?
Kest May 17 2010 09:11:24

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='1';
oper:=true;
end
else edit1.Text:= edit1.Text+'1';


end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='2';
oper:=true;
end
else edit1.Text:= edit1.Text+'2';
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='3';
oper:=true;
end
else edit1.Text:= edit1.Text+'3';
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='4';
oper:=true;
end
else edit1.Text:= edit1.Text+'4';
end;

procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='5';
oper:=true;
end
else edit1.Text:= edit1.Text+'5';
end;

procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='6';
oper:=true;
end
else edit1.Text:= edit1.Text+'6';
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='7';
oper:=true;
end
else edit1.Text:= edit1.Text+'7';
end;

procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='8';
oper:=true;
end
else edit1.Text:= edit1.Text+'8';
end;
procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;

procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='9';
oper:=true;
end
else edit1.Text:= edit1.Text+'9';
end;

procedure TForm1.SpeedButton14Click(Sender: TObject);
begin
if (edit1.Text='0') or not (oper) then
begin
edit1.Text:='0';
oper:=true;
end
else edit1.Text:= edit1.Text+'0';
end;

procedure TForm1.SpeedButton18Click(Sender: TObject);
begin
if pos(',',edit1.Text)=0 then
Edit1.Text:=Edit1.Text+',';
end;

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

procedure TForm1.SpeedButton15Click(Sender: TObject);
begin
if strtofloat(edit1.Text)>=0 then
edit1.Text:=floattostr(sqrt(strtofloat(edit1.Text)))
else
begin
Edit1.Text:='Извлечение корня невозможно.';
delay(1500);
SpeedButton21Click(Sender);
end
end;

procedure TForm1.SpeedButton16Click(Sender: TObject);
begin
if strtofloat(edit1.Text)=0 then
begin
Edit1.Text:='Деление на нуль невозможно.';
delay(1500);
SpeedButton21Click(Sender);
exit;
end;
if not (edit1.text='0') then
edit1.Text:=floattostr(1/(strtofloat(edit1.Text)));
end;

procedure TForm1.SpeedButton2Click2(Sender: TObject);
begin
edit1.Text:=floattostr(sin(strtofloat(edit1.Text)));
end;

procedure TForm1.SpeedButton20Click(Sender: TObject);
begin
edit1.Text:=floattostr(cos(strtofloat(edit1.Text)));
end;

procedure TForm1.SpeedButton21Click(Sender: TObject);
begin
a:=0;
b:=0;
c:=0;
cod:=0;
edit1.Text:='0';
oper:=false;
end;

procedure TForm1.Create_(Sender: TObject);
begin
a:=0;
b:=0;
c:=0;
cod:=0;
oper:=false;
end;

procedure TForm1.SpeedButton13Click(Sender: TObject);
begin

SpeedButton17Click(Sender);
{if cod=5
then a:=c
else} a:=strtofloat(edit1.Text);
cod:=1;
oper:=false;
end;

procedure TForm1.SpeedButton12Click(Sender: TObject);
begin


SpeedButton17Click(Sender);

{if cod=5
then a:=c
else} a:=strtofloat(edit1.Text);
cod:=2;
oper:=false;
end;

procedure TForm1.SpeedButton11Click(Sender: TObject);
begin

SpeedButton17Click(Sender);
{if cod=5
then a:=c
else} a:=strtofloat(edit1.Text);
cod:=3;
oper:=false;
end;

procedure TForm1.SpeedButton10Click(Sender: TObject);
begin

SpeedButton17Click(Sender);
{if cod=5
then a:=c
else} a:=strtofloat(edit1.Text);
cod:=4;
oper:=false;
end;



procedure TForm1.SpeedButton17Click(Sender: TObject);
begin
case cod of
1: begin
c:=(a+strtofloat(edit1.Text));
edit1.Text:=floattostr(c);
end;
2: begin
c:=(a-strtofloat(edit1.Text));
edit1.Text:=floattostr(c);
end;
3: begin
c:=(a*strtofloat(edit1.Text));
edit1.Text:=floattostr(c);
end;
4: begin
if strtofloat(edit1.Text)=0 then
begin
Edit1.Text:='Деление на нуль невозможно.';
delay(1500);
SpeedButton21Click(Sender);
end
else
c:=(a/strtofloat(edit1.Text));
edit1.Text:=floattostr(c);
end;
end;
cod:=5;
oper:=false;
end;

procedure TForm1.SpeedButton23Click(Sender: TObject);
begin
edit1.Text:=floattostr(cos(strtofloat(edit1.Text))/sin(strtofloat(edit1.Text)));
end;

procedure TForm1.SpeedButton22Click(Sender: TObject);
begin
edit1.Text:=floattostr(strtofloat(edit1.Text)*strtofloat(edit1.Text));
end;

procedure TForm1.Key_press(Sender: TObject; var Key: Char);
begin
case key of
'0'..'9',#8:;
'.',',':begin
if key='.' then key:=',';
end
else key:=#0
end;
end;

procedure TForm1.SpeedButton24Click(Sender: TObject);
var
otv:string;
ost,chislo:integer;
begin
chislo:=strToint(Edit1.Text);
otv:=' ' ;
repeat
ost:=chislo mod 8;
case ost of
0:otv:='0'+otv;
1:otv:='1'+otv;
2:otv:='2'+otv;
3:otv:='3'+otv;
4:otv:='4'+otv;
5:otv:='5'+otv;
6:otv:='6'+otv;
7:otv:='7'+otv;
end;
chislo:=chislo div 8;
until chislo = 0;
Edit1.Text:=otv;
f:=5;
//Zifra:=false;

end;

end.


ierecumi July 24 2011 02:52:28
После
begin
edit1.Text:='1';
Впиши
edit1.Clear;
Кажется так!
ierecumi July 24 2011 02:55:50
ой Мля не в 1 а в = писать надо
Короче:
b:=STRtofloat(Edit1.text);
Edit1.Clear;
Case s of
smiley Сорь за предыдущий ляп smiley
Андрей October 16 2011 16:13:09
Как в этом калькуляторе сделать так, чтобы знаки действий вводить с клавиатуры?smiley
Kest October 17 2011 12:58:31
Андрей, нужно обработать нажатия на клавиатуре
Андрей October 18 2011 09:58:02
Kest а по подробней, если можно. Я вообще первый сталкиваюсь с Delphi. smiley
Kest October 21 2011 00:58:40
Андрей, ты хочешь что бы калькулятор считал такие записи - 2+2*3 ??
kostya November 27 2011 23:48:09
У меня выскакивает ошибка на первой кнопке на слове then помогите непойму что делать
Kest November 28 2011 00:08:56
kostya, где
kostya November 28 2011 23:52:38
procedure TfmCalc.bt1Click(Sender: TObject);
begin
If (edInput.Text='0' or not (zifra)
then ----здесь выдаёт ОШИБКУ
begin
edInput.Text:='1';
zifra:=true
end
else edInput.Text:=edInput.Text+'1'
end;
Kest November 29 2011 23:29:15
скобки одной не хватает просто тут

(edInput.Text='0' or not (zifra)




так должно быть

(edInput.Text='0' or not (zifra))


kostya November 29 2011 23:42:41
Поставил скобку которой не хватало!Теперь он на этой строке выдаёт ошибку
Kest December 08 2011 21:10:35
какую
deymos December 20 2011 18:55:51
все-таки что-то не выходит, ошибка после знака равно не исчезла.
deymos December 20 2011 19:13:34
вроде как в самом условии для арифметических действий сидит ошибка. вводим первое число-знак действия-второе число-равно. до сих пор нормально. далее - вводим третье число-знак-четвертое число-равно...а выполняется - присваивание результата прошлой операции первому числу а затем операция с четвертым числом...оно так и будет, так как не срабатывает почему-то индикатор нажатия первой кнопки нового числа
julija December 24 2011 18:46:07
а сложно сделать программу простого калькулятора с использованием компонентов ActionList,MainMenu,PopupMenu...выбор операций(+,-,*,/) осуществлять через Memo,результат выводить в Memo
Павел January 17 2012 19:51:03
Одиннадцатым Шагом Вы программируете ввод кнопок, для того, что бы их можно было вводить с клавиатуры, а где тот самый объект, к которому пишется эта процедура. Его, что надо самому прописывать?
Тогда интерпретатор его не понимает и считает как ошибку.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Х. М. Дейтел, П. ...
SODA [Исходник на...
Доступа к БД Fire...
Популярные загрузки
Синтаксический ан...
Delphi 2005 Секре...
MiniChat
Borland C++Builde...
Pirc
ShadelLabel
Последние загруж...
Краснов М. - Open...
C++ Builder: Книг...
mmmJlabel
Error mod
Меню проводника в...
Еext Editor
PCXReader. Програ...
GPSS World Studen...
Фильтры изображений

Топ загрузок
Приложение Клие... 100307
Delphi 7 Enterp... 77963
Converter AMR<-... 20021
Borland C++Buil... 10679
GPSS World Stud... 9277
Borland Delphi ... 7669
Turbo Pascal fo... 6884
Visual Studio 2... 4906
Калькулятор [Ис... 3997
FreeSMS v1.3.1 3486
Случайные статьи
Рис. 10.2. Разреже...
Логическая функция
Наследование
Подготовка модуля ...
ПОСТРОЕНИЕ ЭКСПЕРТ...
Обмен данными межд...
Обращение к файлу ...
Локхид
Поток с использова...
Чем отличается руб...
Оператор Repeat; W...
Принципы библиотек...
Безопасный и удобн...
Процессоры XSLT
Как отлично провес...
Форматирование вво...
Функция ядра
Числовые SQL-функц...
Специальные функци...
Локальные сети с ш...
RMULT (УСТАНОВИТЬ ...
Обзор истории язык...
Хорошие советы для...
Хранение данных в ...
распределенной сети
Статистика



Друзья сайта
Программы, игры
Оперативная фрезеровка материалов - фрезеровка чпу.

Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?