Advertisement
helos3

Untitled

Dec 5th, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.03 KB | None | 0 0
  1. // -----------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include <vcl.h>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <limits>
  7. #include <jpeg.hpp>
  8. #include <string.h>
  9.  
  10. #include "Unit1.h"
  11. #include "Unit3.h"
  12.  
  13. // -----------------------------------------------------------------------------
  14. #pragma package(smart_init)
  15. #pragma resource "*.dfm"
  16. TForm1 *Form1;
  17.  
  18. double a,b;
  19. int n;
  20.  
  21. // -----------------------------------------------------------------------------
  22. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
  23. Image1->Picture->LoadFromFile("integral.jpg");
  24. }
  25.  
  26.  
  27. // -----------------------------------------------------------------------------
  28. // функция, вовращающая значение, в зависимости от выбора в ComboBox1
  29.  
  30. double InFunction(double x, int Item)
  31. {
  32. double ResFn;
  33. switch(Item)
  34. {
  35. case 0:
  36. {
  37. ResFn=sin(x);
  38. break;
  39. }
  40. case 1:
  41. {
  42. ResFn=cos(x);
  43. break;
  44. }
  45. case 2:
  46. {
  47. if (cos(x)==0) {
  48. ResFn=INT_MAX;
  49. break;
  50. }
  51. ResFn=sin(x)/cos(x);
  52. break;
  53. }
  54. case 3:
  55. {
  56. if (sin(x)==0) {
  57. ResFn=INT_MAX;
  58. break;
  59. }
  60. ResFn=cos(x)/sin(x);
  61. break;
  62. }
  63. }
  64. return (ResFn);
  65. }
  66.  
  67. // -----------------------------------------------------------------------------
  68. // функция, выполняющая вычисление интеграла по исходым данным
  69.  
  70. double CalcIntegral( int item) {
  71. // в переменную Result заносится результат вычисления
  72. // переменная SepSegment обозначает длину отрезка разбиения
  73. double Result, SepSegment;
  74. Result=0;
  75. SepSegment=(b-a)/n;
  76.  
  77. // очистка серии, отрисовывающая мрямоугольники
  78. Form3->Series2->Clear();
  79.  
  80. // цикл, выполняющий подсчёт интеграла методом прямоугольников и выполняющий
  81. // отрисовку прямоугольников
  82. for (int i = 0; i < n; i++) {
  83. Result += InFunction(a+SepSegment*(i+0.5), item);
  84. Form3 ->Series2->AddXY(a + (i+0.5)*SepSegment, InFunction(a+ SepSegment*(i+0.5), item));
  85. }
  86. Result*=SepSegment;
  87. return Result;
  88. }
  89.  
  90. // -----------------------------------------------------------------------------
  91. // функция, выводящая сообщение об ошибке и делающая пункт меню "Построить
  92. // график" невидимым
  93.  
  94. void ErrMsg() {
  95. ShowMessage("Ошибка при вводе данных! Проверьте введённые данные ещё раз.");
  96. Form1 -> MainMenu1->Items->operator [](0)->operator [](1)->Enabled = false;
  97. }
  98.  
  99. // -----------------------------------------------------------------------------
  100. // функция, накладывающая ограничения, выполняющая считывание, и вывод результата
  101.  
  102. void __fastcall TForm1::CalcClick(TObject *Sender)
  103. {
  104. double integral;
  105.  
  106. // наложение ограничений перед считыванием
  107. if ((Edit1->Text=="") || (Edit2->Text=="") || (Edit3->Text=="") || (ComboBox1->ItemIndex==-1))
  108. {
  109. ErrMsg();
  110. return;
  111. }
  112.  
  113. // считывание a,b и n
  114. b=StrToFloat(Edit1->Text);
  115. a=StrToFloat(Edit2->Text);
  116. n=StrToFloat(Edit3->Text);
  117.  
  118. // наложение ограничений после считывания
  119. if ((a>=b) || (n==0))
  120. {
  121. ErrMsg();
  122. return;
  123. }
  124.  
  125. // обращение к функции CalcIntegral и вывод результата
  126. integral = CalcIntegral(ComboBox1->ItemIndex);
  127. Edit4->Text = FloatToStr(integral);
  128. integral=0;
  129.  
  130. // пункт меню "Построить график" становится видимым
  131. MainMenu1->Items->operator [](0)->operator [](1)->Enabled = true;
  132. }
  133.  
  134. //-----------------------------------------------------------------------------
  135. // функция, отрисовывающая функцию, выбранную в ComboBox1, и задающая её основные параметры
  136.  
  137. void __fastcall TForm1::GraphClick(TObject *Sender)
  138. {
  139. Form3 -> Visible = true;
  140.  
  141. // задание видимости и границ для ScrollBar1
  142. if (n>30) {
  143. Form3->ScrollBar1->Min=0;
  144. Form3->ScrollBar1->Max=n-30;
  145. } else
  146. Form3->ScrollBar1->Visible=false;
  147.  
  148. // очистка серии, на которой отрисовывается функция в ComboBox1, запрет
  149. // автонастройки области просмотра графика
  150. Form3->Series1->Clear();
  151. Form3->Chart1->Axes->Left->AutomaticMaximum = false;
  152. Form3->Chart1->Axes->Left->AutomaticMinimum = false;
  153. Form3->Chart1->Axes->Bottom->AutomaticMaximum = false;
  154. Form3->Chart1->Axes->Bottom->AutomaticMinimum = false;
  155.  
  156. // задание ширины прямоугольников для отрисовки
  157. if (n>30)
  158. Form3->Series2->CustomBarWidth=23;
  159. else
  160. Form3->Series2->CustomBarWidth=690/n;
  161.  
  162. Form3->Chart1->Axes->Bottom->Maximum = INT_MAX;
  163. Form3->Chart1->Axes->Bottom->Minimum = INT_MIN;
  164.  
  165. // задание границы видимости графика
  166. if (n>30) {
  167. Form3->Chart1->BottomAxis->Maximum =a+(b-a)*30/n ;
  168. Form3->Chart1->BottomAxis->Minimum =a;
  169. } else {
  170. Form3->Chart1->BottomAxis->Maximum =a+(b-a);
  171. Form3->Chart1->BottomAxis->Minimum =a;
  172. }
  173.  
  174.  
  175. // задание границ видимости, отрисовка графика в зависимости от выбранного параметра в объекте ComboBox
  176. switch(ComboBox1->ItemIndex)
  177. {
  178. case 0:
  179. {
  180. Form3->Chart1->Axes->Left->Maximum = 1;
  181. Form3->Chart1->Axes->Left->Minimum = -1;
  182. Form3->Chart1->Title->Clear();
  183. Form3->Chart1->Title->Text->Add("Sin x");
  184. Form3->Series2->Title="Sin x";
  185. for (int i = 0; i<10000; i++)
  186. Form3 ->Series1->AddXY(a+(b-a)*i/10000,sin(a+(b-a)*i/10000));
  187. break;
  188. }
  189. case 1:
  190. {
  191. Form3->Chart1->Axes->Left->Maximum = 1;
  192. Form3->Chart1->Axes->Left->Minimum = -1;
  193. Form3->Chart1->Title->Clear();
  194. Form3->Chart1->Title->Text->Add("Cos x");
  195. Form3->Series2->Title="Cos x";
  196. for (int i = 0; i<10000; i++)
  197. Form3 ->Series1->AddXY(a+(b-a)*i/10000,cos(a+(b-a)*i/10000));
  198. break;
  199. }
  200. case 2:
  201. {
  202. Form3->Chart1->Axes->Left->Maximum = 20;
  203. Form3->Chart1->Axes->Left->Minimum = -20;
  204. Form3->Chart1->Title->Clear();
  205. Form3->Chart1->Title->Text->Add("Tg x");
  206. Form3->Series1->Title="Tg x";
  207. for (int i = 0; i<10000; i++)
  208. Form3 ->Series1->AddXY(a+(b-a)*i/10000,sin(a+(b-a)*i/10000)/cos(a+(b-a)*i/10000));
  209. break;
  210. }
  211. case 3:
  212. {
  213. Form3->Chart1->Axes->Left->Maximum =20 ;
  214. Form3->Chart1->Axes->Left->Minimum =-20;
  215. Form3->Chart1->Title->Clear();
  216. Form3->Chart1->Title->Text->Add("ctg x");
  217. Form3->Series2->Title="Ctg x";
  218. for (int i = 0; i<10000; i++)
  219. Form3 ->Series1->AddXY(a+(b-a)*i/10000,cos(a+(b-a)*i/10000)/sin(a+(b-a)*i/10000));
  220. break;
  221. }
  222. }
  223. }
  224.  
  225.  
  226. // -----------------------------------------------------------------------------
  227. // функция позволяет вводить только цифры и один разделитель (только точку или
  228. // запятую)
  229.  
  230. void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
  231. {
  232. if (Edit1->Text==""&&Key=='-') {
  233. return;
  234. }
  235. bool dotExist=0;
  236. UnicodeString nStr=Edit1->Text;
  237. for(int i=1;i<=nStr.Length();i++){
  238. if(nStr[i]==',' || nStr[i]=='.')
  239. dotExist=true;
  240. }
  241. if((!isdigit(Key)&&(Key!=',')&&(Key!='.')&&(Key!=VK_BACK))||(((Key == ',')||(Key =='.'))&&(dotExist==true)))
  242. Key=0;
  243. if(((Key == ',')||(Key == '.'))&&(dotExist==false))
  244. Key=DecimalSeparator;
  245. }
  246.  
  247.  
  248. //---------------------------------------------------------------------------
  249. // функция позволяет вводить только цифры и один разделитель (только точку или
  250. // запятую)
  251.  
  252. void __fastcall TForm1::Edit2KeyPress(TObject *Sender, wchar_t &Key)
  253. {
  254. if (Edit2->Text==""&&Key=='-') {
  255. return;
  256. }
  257. bool dotExist=0;
  258. UnicodeString nStr=Edit2->Text;
  259. for(int i=1;i<=nStr.Length();i++){
  260. if(nStr[i]==',' || nStr[i]=='.')
  261. dotExist=true;
  262. }
  263. if((!isdigit(Key)&&(Key!=',')&&(Key!='.')&&(Key!=VK_BACK))||(((Key == ',')||(Key =='.'))&&(dotExist==true)))
  264. Key=0;
  265. if(((Key == ',')||(Key == '.'))&&(dotExist==false))
  266. Key=DecimalSeparator;
  267. }
  268. //---------------------------------------------------------------------------
  269.  
  270.  
  271.  
  272. void __fastcall TForm1::ProgAboutClick(TObject *Sender)
  273. {
  274. ShowMessage("Здесь написано об ограничениях и об авторе-дауне");
  275. }
  276. //---------------------------------------------------------------------------
  277.  
  278. void __fastcall TForm1::TaskClick(TObject *Sender)
  279. {
  280. ShowMessage("Тут задание написано");
  281. }
  282. //---------------------------------------------------------------------------
  283.  
  284. void __fastcall TForm1::ExitClick(TObject *Sender)
  285. {
  286. exit(0);
  287. }
  288. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement