Использовать функции ввода-вывода числовых данных.
Немного поработаем с объектами Label, Edit.
И самое главное, выполнять математические вычисления в программе!! (представим что мы этого не умели).
Ввод и вывод числовых данных
Когда мы в программе ссылаемся на свойство определенного объекта, то эта ссылка должна состоять из двух частей: имени объекта (Label1) и названия свойства (Caption). Между этими двумя названиями ставится "->". Изменение свойства происходит путем присваивания ему нового значение. Для этого используют оператор присваивания. Если присваивается текст, то берем его в двойные кавычки.
В C++ Builder мы все данные будем вводить в текстовое поле, поэтому все данные интерпретируются системой, как текст, даже когда они являются числами. Поэтому мы будем использовать функции для перевода текста в числовые данные.
Например:
X = StrToInt(t); //Превращает текстовую величину t в числовую X = StrToInt(Edit1->Text); //В программе аргументом выступает свойство объекта, например свойство текста объекта Edit1.Когда введенные пользователем данные будут преобразованы в числовые и над ними будут выполнены все операции, возникает проблема вывода результата, то есть обратная задача перевести числовую информацию в текстовую для последующего вывода ее на экран. Для этого используются вторая стандартная функция IntToStr.
Label1->Caption = IntToStr(t); //Выводить результат в текстовое поле Caption Edit1->Text = IntToStr(t); // Выводить результат в текстовое поле EditПереходим к написанию программы
Открываем нами полюбивший C++ Builder и приступаем к написанию нашего калькулятора.
1. Сначала набросаем на нашу форму несколько компонентов, 3 - Label'a, 3 - Edit'a, и аж 10 - Button's.
2. Красиво разместим наши компоненты и переименуем их (в свойстве Caption в инспекторе объектов).
Когда все оформлено, научим наш калькулятор считать.
В первые два Edit'a мы будем вводить числа.
Хочу заметить что когда мы будем выводить: корень, квадрат, sin, cos. Нам второе Edit вообще не понадобиться.
3. Выбираем кнопку "+" и в событие OnClick прописываем такой код:
Edit3->Text = IntToStr(StrToInt(Edit1->Text) + StrToInt(Edit2->Text));Где мы с начало преобразовываем введенные данные в поля Edit1->Text и Edit2->Text из текстового в числовой тип данных (Функцыей StrToInt). Когда данные находятся в числовом типе, над ними можно выполнять математические действия (В данном случае мы их суммируем). После суммирования полученные данные переводим в текстовый тип (Функцыей IntToStr).
4. Для остальных кнопок создаем такие же события:
Отнимаем:
Edit3->Text = IntToStr(StrToInt(Edit1->Text) - StrToInt(Edit2->Text));Умножаем:
Edit3->Text = IntToStr(StrToInt(Edit1->Text) * StrToInt(Edit2->Text));Делим:
Edit3->Text = IntToStr(StrToInt(Edit1->Text) / StrToInt(Edit2->Text));Остальные операции выполняются только над первым числом.
Корень:
Edit3->Text = IntToStr(sqrt(StrToInt(Edit1->Text)));Квадрат:
Edit3->Text = IntToStr(StrToInt(Edit1->Text) * StrToInt(Edit1->Text));Косинус:
Edit3->Text = IntToStr(cos(StrToInt(Edit1->Text)));Синус:
Edit3->Text = IntToStr(sin(StrToInt(Edit1->Text)));А также запрограммируем вспомогательные кнопки:
Очистить:
Edit1->Text = "0"; Edit2->Text = IntToStr(0); //Желательно такого не делатьЗакрыть:
Form1->Close();И так мы завершили копипастить и получили на самом деле работающий калькулятор! Даже больше, плюс к этому калькулятору и его ограниченному набору функций прилагается огромное количество багов!! Таких как:
При вводе слишком большое число - ошибка.
Когда ввели вместо числа другой символа и выполним какое то действие (умножим) - ошибка.
К тому же наш калькулятор не умеет работать с числами с плавающей точкой.
Но все же это наш калькулятор!
И со временем мы избавимся от багов.
Я вот это не понял "Остальные операции выполняются только над первым числом."
ОтветитьУдалитьИмеется введу что корень, синус, косинус и квадрат возводятся от первого числа (Edit1->Text)
ОтветитьУдалитьпочему у меня ошибка?
ОтветитьУдалитьEdit3->Text = IntToStr(sqrt(StrToInt(Edit1->Text)));
ему не нравится sqrt, почему?
лан, с предыдущем вопросом разобрался, но возник еще, более важный!
ОтветитьУдалитьвот что я пишу: Edit3->Text = IntToStr(sqrt(StrToInt(Edit1->Text)));
ошибки: [C++ Error] Unit1.cpp(52): E2034 Cannot convert 'AnsiString' to 'double'
[C++ Error] Unit1.cpp(52): E2342 Type mismatch in parameter '__x' (wanted 'double', got 'AnsiString')
че такое?
Кстати вовсе забыл написать, что бы работали функции sin,cos,sqrt ...
ОтветитьУдалитьНужно подключить библиотеку
#include <Math.h>
после
#include <vcl.h>
Насчет второй ошибки попробуй так:
Edit3->Text = FloatToStr(sqrt(StrToFloat(Edit1->Text)));
спс, все работает!
ОтветитьУдалитьЧто бы работала программа, нужно еще библиотека #include это в верх программы
ОтветитьУдалить---------------
Еще надо исправить:
Деление:
Edit3->Text =IntToStr(sqrt(StrToInt(Edit1->Text)));
На это:
Edit3->Text=FloatToStr(sqrt(StrToFloat(Edit1->Text)));
----
Синуc на это:
Edit3->Text=FloatToStr(sin(StrToFloat(Edit1->Text)));
---
Косинус на это:
Edit3->Text=FloatToStr(cos(StrToFloat(Edit1->Text)));
---
Потому что Int даёт только целое число в ответе, а Float целые и дробные.
вкыепфу
Удалитьpowel nahuy dolbaeb
Удалитья Влад.ошибка:Edit3->Text = IntToStr(StrToInt(Edit1->Text) - StrToInt(Edit2->Text));
ОтветитьУдалитьЯ Влад.Правильно написал?//---------------------------------------------------------------------------
ОтветитьУдалить#include
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{Edit3->Text = IntToStr(StrToInt(Edit1->Text) + StrToInt(Edit2->Text);
StrToIn Edit1->Text+Edit2->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{Edit3->Text = IntToStr(StrToInt(Edit1->Text) - StrToInt(Edit2->Text);
StrToIn Edit1->Text Edit2->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{Edit3->Text = IntToStr(StrToInt(Edit1->Text) * StrToInt(Edit2->Text);
StrToIn Edit1->Text Edit2->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{Edit3->Text=FloatToStr(sqrt(StrToFloat(Edit1->Text)));
StrToIn Edit1->Text Edit2->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{Edit1->Text = "0";
Edit2->Text = IntToStr(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{Form1->Close();
}
//---------------------------------------------------------------------------
неправильно
УдалитьРебят, помогите такие вот ошибки [bcc32 Error] Unit2.cpp(46): E2015 Ambiguity between 'std::sqrt(long double)' and 'std::sqrt(float)'
ОтветитьУдалитьFull parser context
Unit2.cpp(45): parsing: void _fastcall TForm2::Button5Click(System::TObject *)
[bcc32 Error] Unit2.cpp(46): E2121 Function call missing )
Full parser context
Unit2.cpp(45): parsing: void _fastcall TForm2::Button5Click(TObject *)
[bcc32 Error] Unit2.cpp(52): E2015 Ambiguity between '_fastcall System::Sysutils::IntToStr(int) at d:\cbuilder\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3182' and '_fastcall System::Sysutils::IntToStr(__int64) at d:\cbuilder\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3183'
Full parser context
Unit2.cpp(51): parsing: void _fastcall TForm2::Button6Click(System::TObject *)