25 ноября 2010

Создаем программу калькулятор

С помощью этого калькулятора мы научимся:
Использовать функции ввода-вывода числовых данных.
Немного поработаем с объектами 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();
И так мы завершили копипастить и получили на самом деле работающий калькулятор! Даже больше, плюс к этому калькулятору и его ограниченному набору функций прилагается огромное количество багов!! Таких как:
При вводе слишком большое число - ошибка.
Когда ввели вместо числа другой символа и выполним какое то действие (умножим) - ошибка.
К тому же наш калькулятор не умеет работать с числами с плавающей точкой.

Но все же это наш калькулятор!
И со временем мы избавимся от багов.

13 комментариев:

  1. Я вот это не понял "Остальные операции выполняются только над первым числом."

    ОтветитьУдалить
  2. Имеется введу что корень, синус, косинус и квадрат возводятся от первого числа (Edit1->Text)

    ОтветитьУдалить
  3. почему у меня ошибка?
    Edit3->Text = IntToStr(sqrt(StrToInt(Edit1->Text)));
    ему не нравится sqrt, почему?

    ОтветитьУдалить
  4. лан, с предыдущем вопросом разобрался, но возник еще, более важный!
    вот что я пишу: 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')
    че такое?

    ОтветитьУдалить
  5. Кстати вовсе забыл написать, что бы работали функции sin,cos,sqrt ...
    Нужно подключить библиотеку
    #include <Math.h>
    после
    #include <vcl.h>

    Насчет второй ошибки попробуй так:
    Edit3->Text = FloatToStr(sqrt(StrToFloat(Edit1->Text)));

    ОтветитьУдалить
  6. Что бы работала программа, нужно еще библиотека #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 целые и дробные.

    ОтветитьУдалить
  7. я Влад.ошибка:Edit3->Text = IntToStr(StrToInt(Edit1->Text) - StrToInt(Edit2->Text));

    ОтветитьУдалить
  8. Я Влад.Правильно написал?//---------------------------------------------------------------------------
    #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();
    }
    //---------------------------------------------------------------------------

    ОтветитьУдалить
  9. Ребят, помогите такие вот ошибки [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 *)

    ОтветитьУдалить

Темы