Advertisement
helos3

Kursach.f1

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