Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // -----------------------------------------------------------------------------
- #pragma hdrstop
- #include <vcl.h>
- #include <stdio.h>
- #include <math.h>
- #include <limits>
- #include <jpeg.hpp>
- #include <string.h>
- #include "Unit1.h"
- #include "Unit3.h"
- // -----------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- TForm1 *Form1;
- double a,b;
- int n;
- // -----------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
- Image1->Picture->LoadFromFile("integral.jpg");
- }
- // -----------------------------------------------------------------------------
- // функция, вовращающая значение, в зависимости от выбора в ComboBox1
- double InFunction(double x, int Item)
- {
- double ResFn;
- switch(Item)
- {
- case 0:
- {
- ResFn=sin(x);
- break;
- }
- case 1:
- {
- ResFn=cos(x);
- break;
- }
- case 2:
- {
- if (cos(x)==0) {
- ResFn=INT_MAX;
- break;
- }
- ResFn=sin(x)/cos(x);
- break;
- }
- case 3:
- {
- if (sin(x)==0) {
- ResFn=INT_MAX;
- break;
- }
- ResFn=cos(x)/sin(x);
- break;
- }
- }
- return (ResFn);
- }
- // -----------------------------------------------------------------------------
- // функция, выполняющая вычисление интеграла по исходым данным
- double CalcIntegral( int item) {
- // в переменную Result заносится результат вычисления
- // переменная SepSegment обозначает длину отрезка разбиения
- double Result, SepSegment;
- Result=0;
- SepSegment=(b-a)/n;
- // очистка серии, отрисовывающая мрямоугольники
- Form3->Series2->Clear();
- // цикл, выполняющий подсчёт интеграла методом прямоугольников и выполняющий
- // отрисовку прямоугольников
- for (int i = 0; i < n; i++) {
- Result += InFunction(a+SepSegment*(i+0.5), item);
- Form3 ->Series2->AddXY(a + (i+0.5)*SepSegment, InFunction(a+ SepSegment*(i+0.5), item));
- }
- Result*=SepSegment;
- return Result;
- }
- // -----------------------------------------------------------------------------
- // функция, выводящая сообщение об ошибке и делающая пункт меню "Построить
- // график" невидимым
- void ErrMsg() {
- ShowMessage("Ошибка при вводе данных! Проверьте введённые данные ещё раз.");
- Form1 -> MainMenu1->Items->operator [](0)->operator [](1)->Enabled = false;
- }
- // -----------------------------------------------------------------------------
- // функция, накладывающая ограничения, выполняющая считывание, и вывод результата
- void __fastcall TForm1::CalcClick(TObject *Sender)
- {
- double integral;
- // наложение ограничений перед считыванием
- if ((Edit1->Text=="") || (Edit2->Text=="") || (Edit3->Text=="") || (ComboBox1->ItemIndex==-1))
- {
- ErrMsg();
- return;
- }
- // считывание a,b и n
- b=StrToFloat(Edit1->Text);
- a=StrToFloat(Edit2->Text);
- n=StrToFloat(Edit3->Text);
- // наложение ограничений после считывания
- if ((a>=b) || (n==0))
- {
- ErrMsg();
- return;
- }
- // обращение к функции CalcIntegral и вывод результата
- integral = CalcIntegral(ComboBox1->ItemIndex);
- Edit4->Text = FloatToStr(integral);
- integral=0;
- // пункт меню "Построить график" становится видимым
- MainMenu1->Items->operator [](0)->operator [](1)->Enabled = true;
- }
- //-----------------------------------------------------------------------------
- // функция, отрисовывающая функцию, выбранную в ComboBox1, и задающая её основные параметры
- void __fastcall TForm1::GraphClick(TObject *Sender)
- {
- Form3 -> Visible = true;
- // задание видимости и границ для ScrollBar1
- if (n>30) {
- Form3->ScrollBar1->Min=0;
- Form3->ScrollBar1->Max=n-30;
- } else
- Form3->ScrollBar1->Visible=false;
- // очистка серии, на которой отрисовывается функция в ComboBox1, запрет
- // автонастройки области просмотра графика
- Form3->Series1->Clear();
- Form3->Chart1->Axes->Left->AutomaticMaximum = false;
- Form3->Chart1->Axes->Left->AutomaticMinimum = false;
- Form3->Chart1->Axes->Bottom->AutomaticMaximum = false;
- Form3->Chart1->Axes->Bottom->AutomaticMinimum = false;
- // задание ширины прямоугольников для отрисовки
- if (n>30)
- Form3->Series2->CustomBarWidth=23;
- else
- Form3->Series2->CustomBarWidth=690/n;
- Form3->Chart1->Axes->Bottom->Maximum = INT_MAX;
- Form3->Chart1->Axes->Bottom->Minimum = INT_MIN;
- // задание границы видимости графика
- if (n>30) {
- Form3->Chart1->BottomAxis->Maximum =a+(b-a)*30/n ;
- Form3->Chart1->BottomAxis->Minimum =a;
- } else {
- Form3->Chart1->BottomAxis->Maximum =a+(b-a);
- Form3->Chart1->BottomAxis->Minimum =a;
- }
- // задание границ видимости, отрисовка графика в зависимости от выбранного параметра в объекте ComboBox
- switch(ComboBox1->ItemIndex)
- {
- case 0:
- {
- Form3->Chart1->Axes->Left->Maximum = 1;
- Form3->Chart1->Axes->Left->Minimum = -1;
- Form3->Chart1->Title->Clear();
- Form3->Chart1->Title->Text->Add("Sin x");
- Form3->Series2->Title="Sin x";
- for (int i = 0; i<10000; i++)
- Form3 ->Series1->AddXY(a+(b-a)*i/10000,sin(a+(b-a)*i/10000));
- break;
- }
- case 1:
- {
- Form3->Chart1->Axes->Left->Maximum = 1;
- Form3->Chart1->Axes->Left->Minimum = -1;
- Form3->Chart1->Title->Clear();
- Form3->Chart1->Title->Text->Add("Cos x");
- Form3->Series2->Title="Cos x";
- for (int i = 0; i<10000; i++)
- Form3 ->Series1->AddXY(a+(b-a)*i/10000,cos(a+(b-a)*i/10000));
- break;
- }
- case 2:
- {
- Form3->Chart1->Axes->Left->Maximum = 20;
- Form3->Chart1->Axes->Left->Minimum = -20;
- Form3->Chart1->Title->Clear();
- Form3->Chart1->Title->Text->Add("Tg x");
- Form3->Series1->Title="Tg x";
- for (int i = 0; i<10000; i++)
- Form3 ->Series1->AddXY(a+(b-a)*i/10000,sin(a+(b-a)*i/10000)/cos(a+(b-a)*i/10000));
- break;
- }
- case 3:
- {
- Form3->Chart1->Axes->Left->Maximum =20 ;
- Form3->Chart1->Axes->Left->Minimum =-20;
- Form3->Chart1->Title->Clear();
- Form3->Chart1->Title->Text->Add("ctg x");
- Form3->Series2->Title="Ctg x";
- for (int i = 0; i<10000; i++)
- Form3 ->Series1->AddXY(a+(b-a)*i/10000,cos(a+(b-a)*i/10000)/sin(a+(b-a)*i/10000));
- break;
- }
- }
- }
- // -----------------------------------------------------------------------------
- // функция позволяет вводить только цифры и один разделитель (только точку или
- // запятую)
- void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
- {
- if (Edit1->Text==""&&Key=='-') {
- return;
- }
- bool dotExist=0;
- UnicodeString nStr=Edit1->Text;
- for(int i=1;i<=nStr.Length();i++){
- if(nStr[i]==',' || nStr[i]=='.')
- dotExist=true;
- }
- if((!isdigit(Key)&&(Key!=',')&&(Key!='.')&&(Key!=VK_BACK))||(((Key == ',')||(Key =='.'))&&(dotExist==true)))
- Key=0;
- if(((Key == ',')||(Key == '.'))&&(dotExist==false))
- Key=DecimalSeparator;
- }
- //---------------------------------------------------------------------------
- // функция позволяет вводить только цифры и один разделитель (только точку или
- // запятую)
- void __fastcall TForm1::Edit2KeyPress(TObject *Sender, wchar_t &Key)
- {
- if (Edit2->Text==""&&Key=='-') {
- return;
- }
- bool dotExist=0;
- UnicodeString nStr=Edit2->Text;
- for(int i=1;i<=nStr.Length();i++){
- if(nStr[i]==',' || nStr[i]=='.')
- dotExist=true;
- }
- if((!isdigit(Key)&&(Key!=',')&&(Key!='.')&&(Key!=VK_BACK))||(((Key == ',')||(Key =='.'))&&(dotExist==true)))
- Key=0;
- if(((Key == ',')||(Key == '.'))&&(dotExist==false))
- Key=DecimalSeparator;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::ProgAboutClick(TObject *Sender)
- {
- ShowMessage("Здесь написано об ограничениях и об авторе-дауне");
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::TaskClick(TObject *Sender)
- {
- ShowMessage("Тут задание написано");
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::ExitClick(TObject *Sender)
- {
- exit(0);
- }
- //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement