Консультация № 143292
07.09.2008, 19:22
0.00 руб.
0 3 3
Здравствуйте уважаемые эксперты, как начинающий программист я начал писать калькулятор. с простыми вычислениями справился.
Начал писать инженерный калькулятор, и столкнулся с массой проблем:
1.Как осуществить перевод из одной системы счисления в другую, (хочу сделать процедуру при нажатии RadioButton1,2,3) Как делать клавиши неактивными понял.
2.Сделал так же процедуры вычисления синуса, косинуса, тангенса. Вроде бы считает хорошо, да проблемка одна.. На те же самые вычисления калькулятор Windows выдает другие ответы.
3.Ну и вопрос таки не в тему)) Чем отличаются кнопки C и CE на калькуляторе?.. Ведь они обе очищают поле Edit1.Text..
4.Как осуществить процедуру нажатия на кнопку % что бы он вычислял так же как и Windows калькулятор.
5. Ну и ещё вопросик)) как осуществить процедуру нажатия кнопки Backspace что бы при нажатии кнопки удалялся последний символ.
6.Если это можно считать за вопрос)): как сделать так что бы при нажатии на клавиатуре чисел или мат. Действий происходило нажатие на кнопки)).
Спасибо.

Приложение:
Вот то что натворил я :
http://systempage.uzelok.net/calc.rar

Обсуждение

Неизвестный
07.09.2008, 20:14
общий
это ответ
Здравствуйте, Ильнур!
1 Перевод из одной системы в другую можно делать несколькими способами.
Проше всего переводить использую возможности делфи. Для перевода из десятичной IntToBin и IntToHex возвращают строку. А если к строке подставить "Н" или "0" то функция StrToInt вернет десятичное значение.
2 Скорее всего вы не перевели градусы в радианы. Перевод осуществляется так Rad=grad*PI/180 Где PI это число "пи".
3 "С" сбрасывает весь буфер памяти а "СЕ" только значение на экране
4 Не совсем понял вопрос, извините.
5 Копируете значение в переменную и удаляете del(s, LenGth(s), 1)
6 Необходимо перехватить нажати кнопок. Это события формы onKeyXXXXX В них можно отловить либо значение символа нажатой (onKeyPress) кнопки, либо его номер для нажатия или отпускания.

Надеюсь что достаточно ответил на Ваши вопросы и помог.
Неизвестный
07.09.2008, 20:16
общий
это ответ
Здравствуйте, Ильнур!
Вот ответ на некоторые из Ваших вопросов:

1) Сам таким не интересовался, но в Интернете достаточно много написано о переводе чисел с одной системы счисления в другую. Например, здесь - http://articles.org.ru/cn/showdetail.php?cid=5868

2) Процедуры Delphi вычисляют функции, предполагая, что аргумент представлен в радианах. Если Вам нужно делать вычисления в градусах, нужно аргумент умножить на число 2*pi/180 (около 0,0349). Например, для вычисление косинуса 180 градусов нужно записать cos(180*0.0349)

3) Кнопка С – удаляет все вычисления, СЕ – только последнее введенное число.
Например, если набрать «9», потом «/», «3», «С», «9», «=» , то в результате мы получим число «9». Если вместо «С» нажать «СЕ», то получим «1» (результат деления 9 на 9)

5-6) Создаем процедуру, и задаем ее в качестве обработчика события onKeyPress для формы, edit и всех кнопок.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
if Key='1' then Button1.Click;
if Key='2' then Button2.Click;
.....
if Key=’/’ then Button13.Click;
//и так для всех чисел и операций

//Следующий текст для обработчика нажатия Backspace
if Key=#8 then
begin
if Edit1.Text='0' then Exit;
if length(Edit1.Text)=1 then Edit1.Text:='0'
else begin
s:=Edit1.Text;
Delete(s,length(s)-1,1);
Edit1.Text:=s;
end;
end;

end;
Неизвестный
07.09.2008, 20:22
общий
это ответ
Здравствуйте, Ильнур!
1.
Вот Вам два алгоритма преобразования чисел - в из десятичной в двоичную сс, из двоичной в десятичную сс. Опитмально будет прописать использование этих функций в событии OnClick Ваших RadioButton-ов

Код:
 function ToBin(var x: integer): string; // Переход к двоичной системе
var rez: string; // результат декодирования будет, как известно, строкового типа
y: integer; // а здесь будем хранить число в исходном типе данных (десятичном)
begin
rez := ''; y := x;
// Опишу вкратце алгоритм преобразования десятичного числа в двоичную сс
// Перебираем число по цифре, начиная с конца, и смотрим: если цифра делится на 2 без остатка,
// в результат дописываем нуль, в противном случае - единичку. Реализация сего нехитрого алгоритма ниже.
Repeat
if (y mod 2 = 0) then rez := '0' + rez
else rez := '1' + rez;
y := y div 2;
Until y < 1;
ToBin := rez;
end;

function ToNormal(var x: string): integer; // переход к десятичной системе
var y: string; // исходное число в строковом типе
rez: real; // результат - вещественный тип (для удобства при вычислениях)
i,t: integer;
begin
y := x; rez := 0;
// Рассмотрим вариант перевода числа из десятичной системы счисления в двоичную.
// Перебираем побитово строку, выполняя следующее действие
// Преобразовываем символ в число функцией StrToInt()
// в результат записываем выражение: результат + число умноженное на двойку,
// возведённую в степень, равную порядковому номеру символа в строке (отсчёт ведём справа налево)
// например '1010' (10) = (0 * 2^1) + (1 * 2^2) + (0 * 2^3) + (1 * 2^4) = 0 + 2 + 0 + 8 = 10
for i:=0 to length(y)-1 do
begin
t := StrToInt(y[Length(y) - i]);
rez := rez + t * Exp(i * ln(2));
end;
ToNormal := Round(int(rez));
end;


5.
Это легко: помещаем содержимое строки ввода в отдельную переменную и процедурой Delete() удаляем 1 символ в конце строки. Если же в исходной строке всего лишь 1 символ, то запишем в неё нуль.

Код:
 if length(edit1.text) = 1 then edit1.text := '0' else begin
s := edit1.text;
delete(s,length(s),1);
edit1.text := s;
end;


6.
В свойствах формы найдите KeyPreview и установите ему значение true.
Теперь свободно можете отлавливать на форме нажимаемые клавиши клавиатуры:

Код:
 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case key of
'*' : {выполнять умножение};
'/' : {выполнять деление};
'-' : {вычитание};
'+' : {сложение};
chr(13) : {подсчитать результат (кнопка "=")};
'.' : {запятая (точка)};
end;
end;


Также можно отлавливать нажатие кнопок Escape и Backspace:

Код:
 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
vk_Escape: {делать что-нибудь};
vk_back: {и ещё что-то};
end;
end;


Аналогично можно перехватывать цифровые кнопки.
Форма ответа