fork download
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #pragma hdrstop
  5.  
  6. #include "Unit1.h"
  7. #include <cmath>
  8.  
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma resource "*.dfm"
  12. TCalculator *Calculator;
  13. //---------------------------------------------------------------------------
  14. long double fact(double N)
  15. {
  16. if(N < 0)
  17. return 0;
  18. if (N == 0)
  19. return 1;
  20. else
  21. return N * fact(N - 1);
  22. }
  23. //---------------------------------------------------------------------------
  24. double toRadians(double a, char units)
  25. {
  26. switch(units){
  27. case 'd': return (a * M_PI) / 180;
  28. case 'g': return (a * M_PI) / 200;
  29. default: return a;
  30. }
  31. }
  32.  
  33. double toDegrees(double a, char units)
  34. {
  35. switch(units) {
  36. case 'r':return (a * 180) / M_PI; break;
  37. case 'g': return a * 9 / 10; break;
  38. default : return a;
  39. }
  40.  
  41. }
  42.  
  43. double toGrads(double a)
  44. {
  45. return (a * 200) / M_PI;
  46. }
  47. //---------------------------------------------------------------------------
  48. __fastcall TCalculator::TCalculator(TComponent* Owner)
  49. : TForm(Owner)
  50. {
  51. rpn_text= "";
  52. a = 0;
  53. b = 0;
  54. countBrackets = 0;
  55. d = ' ';
  56. units = 'd';
  57. checker = false;
  58. error = false;
  59. brackets = false;
  60. invPress = true;
  61. checkStatusFunction = true;
  62. rpn = new RPN(rpn_text.c_str());
  63.  
  64. sqrtButton->Caption = L"\u221A";
  65. deleteButton->Caption = L"\u2190";
  66. PiButton->Caption = L"\u03C0";
  67. }
  68. //---------------------------------------------------------------------------
  69. void __fastcall TCalculator::zeroButtonClick(TObject *Sender)
  70. {
  71. if(!error){
  72. AnsiString l;
  73. if(checker) {
  74. checker = false;
  75. l = '0';
  76. } else {
  77. if(checkStatusFunction){
  78. l = Edit->Text;
  79. } else {
  80. Edit->Text = 0;
  81. AnsiString h = History->Text;
  82. h.Delete(funcPos,h.Length()-funcPos + 1);
  83. History->Text = h;
  84. checkStatusFunction = true;
  85. }
  86. }
  87.  
  88. if(l == '0'){
  89. l = '0';
  90. } else {
  91. l += '0';
  92. }
  93.  
  94. Edit->Text = l;
  95. }
  96. }
  97. //---------------------------------------------------------------------------
  98. void __fastcall TCalculator::oneButtonClick(TObject *Sender)
  99. {
  100. if(!error){
  101. AnsiString l;
  102. if(checker) {
  103. checker = false;
  104. l = '0';
  105. } else {
  106. if(checkStatusFunction){
  107. l = Edit->Text;
  108. } else {
  109. Edit->Text = 0;
  110. AnsiString h = History->Text;
  111. h.Delete(funcPos,h.Length()-funcPos + 1);
  112. History->Text = h;
  113. checkStatusFunction = true;
  114. }
  115. }
  116.  
  117. if(l == '0'){
  118. l = '1';
  119. } else {
  120. l += '1';
  121. }
  122. Edit->Text = l;
  123. }
  124. }
  125. //---------------------------------------------------------------------------
  126. void __fastcall TCalculator::twoButtonClick(TObject *Sender)
  127. {
  128. if(!error){
  129. AnsiString l;
  130. if(checker) {
  131. checker = false;
  132. l = '0';
  133. } else {
  134. if(checkStatusFunction){
  135. l = Edit->Text;
  136. } else {
  137. Edit->Text = 0;
  138. AnsiString h = History->Text;
  139. h.Delete(funcPos,h.Length()-funcPos + 1);
  140. History->Text = h;
  141. checkStatusFunction = true;
  142. }
  143. }
  144.  
  145. if(l == '0'){
  146. l = '2';
  147. } else {
  148. l += '2';
  149. }
  150. Edit->Text = l;
  151. }
  152. }
  153. //---------------------------------------------------------------------------
  154. void __fastcall TCalculator::threeButtonClick(TObject *Sender)
  155. {
  156. if(!error){
  157. AnsiString l;
  158. if(checker) {
  159. checker = false;
  160. l = '0';
  161. } else {
  162. if(checkStatusFunction){
  163. l = Edit->Text;
  164. } else {
  165. Edit->Text = 0;
  166. AnsiString h = History->Text;
  167. h.Delete(funcPos,h.Length()-funcPos + 1);
  168. History->Text = h;
  169. checkStatusFunction = true;
  170. }
  171. }
  172.  
  173. if(l == '0'){
  174. l = '3';
  175. } else {
  176. l += '3';
  177. }
  178. Edit->Text = l;
  179. }
  180. }
  181. //---------------------------------------------------------------------------
  182. void __fastcall TCalculator::fourButtonClick(TObject *Sender)
  183. {
  184. if(!error){
  185. AnsiString l;
  186. if(checker) {
  187. checker = false;
  188. l = '0';
  189. } else {
  190. if(checkStatusFunction){
  191. l = Edit->Text;
  192. } else {
  193. Edit->Text = 0;
  194. AnsiString h = History->Text;
  195. h.Delete(funcPos,h.Length()-funcPos + 1);
  196. History->Text = h;
  197. checkStatusFunction = true;
  198. }
  199. }
  200.  
  201. if(l == '0'){
  202. l = '4';
  203. } else {
  204. l += '4';
  205. }
  206. Edit->Text = l;
  207. }
  208. }
  209. //---------------------------------------------------------------------------
  210. void __fastcall TCalculator::fiveButtonClick(TObject *Sender)
  211. {
  212. if(!error){
  213. AnsiString l;
  214. if(checker) {
  215. checker = false;
  216. l = '0';
  217. } else {
  218. if(checkStatusFunction){
  219. l = Edit->Text;
  220. } else {
  221. Edit->Text = 0;
  222. AnsiString h = History->Text;
  223. h.Delete(funcPos,h.Length()-funcPos + 1);
  224. History->Text = h;
  225. checkStatusFunction = true;
  226. }
  227. }
  228. if(l == '0'){
  229. l = '5';
  230. } else {
  231. l += '5';
  232. }
  233. Edit->Text = l;
  234. }
  235. }
  236. //---------------------------------------------------------------------------
  237. void __fastcall TCalculator::sixButtonClick(TObject *Sender)
  238. {
  239. if(!error){
  240. AnsiString l;
  241. if(checker) {
  242. checker = false;
  243. l = '0';
  244. } else {
  245. if(checkStatusFunction){
  246. l = Edit->Text;
  247. } else {
  248. Edit->Text = 0;
  249. AnsiString h = History->Text;
  250. h.Delete(funcPos,h.Length()-funcPos + 1);
  251. History->Text = h;
  252. checkStatusFunction = true;
  253. }
  254. }
  255.  
  256. if(l == '0'){
  257. l = '6';
  258. } else {
  259. l += '6';
  260. }
  261. Edit->Text = l;
  262. }
  263. }
  264. //---------------------------------------------------------------------------
  265. void __fastcall TCalculator::sevenButtonClick(TObject *Sender)
  266. {
  267. if(!error){
  268. AnsiString l;
  269. if(checker) {
  270. checker = false;
  271. l = '0';
  272. } else {
  273. if(checkStatusFunction){
  274. l = Edit->Text;
  275. } else {
  276. Edit->Text = 0;
  277. AnsiString h = History->Text;
  278. h.Delete(funcPos,h.Length()-funcPos + 1);
  279. History->Text = h;
  280. checkStatusFunction = true;
  281. }
  282. }
  283.  
  284. if(l == '0'){
  285. l = '7';
  286. } else {
  287. l += '7';
  288. }
  289. Edit->Text = l;
  290. }
  291. }
  292. //---------------------------------------------------------------------------
  293. void __fastcall TCalculator::eightButtonClick(TObject *Sender)
  294. {
  295. if(!error){
  296. AnsiString l;
  297. if(checker) {
  298. checker = false;
  299. l = '0';
  300. } else {
  301. if(checkStatusFunction){
  302. l = Edit->Text;
  303. } else {
  304. Edit->Text = 0;
  305. AnsiString h = History->Text;
  306. h.Delete(funcPos,h.Length()-funcPos + 1);
  307. History->Text = h;
  308. checkStatusFunction = true;
  309. }
  310. }
  311.  
  312. if(l == '0'){
  313. l = '8';
  314. } else {
  315. l += '8';
  316. }
  317. Edit->Text = l;
  318. }
  319. }
  320. //---------------------------------------------------------------------------
  321. void __fastcall TCalculator::nineButtonClick(TObject *Sender)
  322. {
  323. if(!error){
  324. AnsiString l;
  325. if(checker) {
  326. checker = false;
  327. l = '0';
  328. } else {
  329. if(checkStatusFunction){
  330. l = Edit->Text;
  331. } else {
  332. Edit->Text = 0;
  333. AnsiString h = History->Text;
  334. h.Delete(funcPos,h.Length()-funcPos + 1);
  335. History->Text = h;
  336. checkStatusFunction = true;
  337. }
  338. }
  339. if(l == '0'){
  340. l = '9';
  341. } else {
  342. l += '9';
  343. }
  344. Edit->Text = l;
  345. }
  346. }
  347. //---------------------------------------------------------------------------
  348. void __fastcall TCalculator::pointButtonClick(TObject *Sender)
  349. {
  350. if(!error){
  351. AnsiString l;
  352. bool checkPoint = true;
  353. if(checker) {
  354. checker = false;
  355. l = '0';
  356. } else {
  357. if(checkStatusFunction){
  358. l = Edit->Text;
  359. } else {
  360. Edit->Text = 0;
  361. AnsiString h = History->Text;
  362. h.Delete(funcPos,h.Length()-funcPos + 1);
  363. History->Text = h;
  364. checkStatusFunction = true;
  365. }
  366. }
  367.  
  368. for(int i=1;i<=l.Length();i++){
  369. if(l[i] == '.'){
  370. checkPoint = false;
  371. break;
  372. }
  373. }
  374.  
  375. if(checkPoint) {
  376. l += '.';
  377. Edit->Text = l;
  378. }
  379. }
  380. }
  381. //---------------------------------------------------------------------------
  382. void __fastcall TCalculator::plusButtonClick(TObject *Sender)
  383. {
  384. if(!error){
  385. AnsiString l = Edit->Text;
  386. AnsiString h = History->Text;
  387.  
  388. a=StrToFloat(l);
  389. if(a < 0) {
  390. l = '(';
  391. l += FloatToStr(a);
  392. l += ')';
  393. } else {
  394. l = FloatToStr(a);
  395. }
  396.  
  397. if(checker) {
  398. if(brackets) {
  399. rpn_text += l;
  400. rpn_text += '+';
  401. rpn_text += '0';
  402. brackets = false;
  403. } else {
  404. rpn_text[rpn_text.Length() - 1] = '+';
  405. rpn_text[rpn_text.Length()] = '0';
  406. switch(d){
  407. case '+': case '-': case '/': case '*': h[h.Length() - 1] = '+'; break;
  408. case 'm': h.Delete(h.Length()-2,2); h[h.Length() - 1] = '+'; break;
  409. case 'r': h.Delete(h.Length() - 5,6), h += "+ "; break;
  410. }
  411. }
  412. }else {
  413. firstD = '+';
  414. if(brackets) {
  415. brackets = false;
  416. } else {
  417. rpn_text.Delete(rpn_text.Length(), 1);
  418. }
  419. if(checkStatusFunction) {
  420. rpn_text += l;
  421. h += FloatToStr(a);
  422. h += " + ";
  423. rpn_text += '+';
  424. rpn_text += '0';
  425. checker = true;
  426. } else {
  427. h += " + ";
  428. rpn_text += l;
  429. rpn_text += '+';
  430. rpn_text += '0';
  431. checker = true;
  432. checkStatusFunction = true;
  433. }
  434. }
  435.  
  436. d = '+';
  437. if(countBrackets == 0){
  438. rpn->setRPN(rpn_text.c_str());
  439. rpn->calculate();
  440. }
  441.  
  442. History->Text = h;
  443. Edit->Text = FloatToStr(rpn->getResult());
  444. }
  445. }
  446. //---------------------------------------------------------------------------
  447. void __fastcall TCalculator::minusButtonClick(TObject *Sender)
  448. {
  449. if(!error){
  450. AnsiString l = Edit->Text;
  451. AnsiString h = History->Text;
  452.  
  453. a=StrToFloat(l);
  454. if(a < 0) {
  455. l = '(';
  456. l += FloatToStr(a);
  457. l += ')';
  458. } else {
  459. l = FloatToStr(a);
  460. }
  461.  
  462. if(checker) {
  463. if(brackets) {
  464. rpn_text += l;
  465. rpn_text += '-';
  466. rpn_text += '0';
  467. brackets = false;
  468. } else {
  469. rpn_text[rpn_text.Length() - 1] = '-';
  470. rpn_text[rpn_text.Length()] = '0';
  471. switch(d){
  472. case '+': case '-': case '/': case '*': h[h.Length() - 1] = '-'; break;
  473. case 'm': h.Delete(h.Length()-2,2); h[h.Length() - 1] = '-'; break;
  474. case 'r': h.Delete(h.Length() - 5,6), h += "- "; break;
  475. }
  476. }
  477. }else {
  478. firstD = '-';
  479. if(brackets) {
  480. brackets = false;
  481. } else {
  482. rpn_text.Delete(rpn_text.Length(), 1);
  483. }
  484. if(checkStatusFunction) {
  485. rpn_text += l;
  486. h += FloatToStr(a);
  487. h += " - ";
  488. rpn_text += '-';
  489. rpn_text += '0';
  490. checker = true;
  491. } else {
  492. h += " - ";
  493. rpn_text += l;
  494. rpn_text += '-';
  495. rpn_text += '0';
  496. checker = true;
  497. checkStatusFunction = true;
  498. }
  499. }
  500.  
  501. d = '-';
  502. if(countBrackets == 0){
  503. rpn->setRPN(rpn_text.c_str());
  504. rpn->calculate();
  505. }
  506.  
  507. History->Text = h;
  508. Edit->Text = FloatToStr(rpn->getResult());
  509. }
  510. }
  511. //---------------------------------------------------------------------------
  512. void __fastcall TCalculator::factButtonClick(TObject *Sender)
  513. {
  514. if(!error) {
  515. AnsiString l;
  516. AnsiString h = History->Text;
  517. l = Edit->Text;
  518. a = StrToFloat(l);
  519.  
  520. if (checkStatusFunction) {
  521. funcPos = h.Length() + 1;
  522. h += "fact(" + FloatToStr(a) + ")";
  523. History->Text = h;
  524. checkStatusFunction = false;
  525. checker = false;
  526. } else {
  527. l = "";
  528. for (int i=1; i<=h.Length();i++){
  529. if(i == funcPos){
  530. l+= "fact(";
  531. }
  532. l += h[i];
  533. }
  534. l += ")";
  535. History->Text = l;
  536. }
  537.  
  538. if(a >= 0) {
  539. b = fact(a);
  540. Edit->Text = FloatToStr(b);
  541. } else {
  542. Edit->Text = "Недопустимый ввод";
  543. error = true;
  544. }
  545. }
  546. }
  547. //---------------------------------------------------------------------------
  548. void __fastcall TCalculator::multiplyButtonClick(TObject *Sender)
  549. {
  550. if(!error) {
  551. AnsiString l = Edit->Text;
  552. AnsiString h = History->Text;
  553.  
  554. a=StrToFloat(l);
  555. if(a < 0) {
  556. l = '(';
  557. l += FloatToStr(a);
  558. l += ')';
  559. } else {
  560. l = FloatToStr(a);
  561. }
  562.  
  563. if(checker) {
  564. if((firstD != '*') && (firstD != '/') && (firstD != '^') && (firstD != 'r') && (firstD != 'm')){
  565. AnsiString buffRPN = '(';
  566. AnsiString buffHistory = '(';
  567. int countOp = 0;
  568. for(int i = 1; i < rpn_text.Length()-1; i++){
  569. buffRPN += rpn_text[i];
  570. switch(rpn_text[i]){
  571. case '+': case '-': case '*': case '/':case 'm': case '^' :case 'r': countOp++; break;
  572. }
  573. }
  574.  
  575. for(int i = 1; i < h.Length() - 2; i++){
  576. buffHistory += h[i];
  577. }
  578.  
  579. if(countOp >= 1) {
  580. buffRPN += ')'; buffRPN += rpn_text[rpn_text.Length()-1]; buffRPN += rpn_text[rpn_text.Length()];
  581. rpn_text = buffRPN;
  582. h = buffHistory;
  583. h += ") * ";
  584. }
  585. firstD = '*';
  586. }
  587. rpn_text[rpn_text.Length() - 1] = '*';
  588. rpn_text[rpn_text.Length()] = '1';
  589. switch(d){
  590. case '+': case '-': case '/': case '*': h[h.Length() - 1] = '*'; break;
  591. case 'm': h.Delete(h.Length()-2,2); h[h.Length() - 1] = '*'; break;
  592. case 'r': h.Delete(h.Length() - 5,6), h += "* "; break;
  593. }
  594. }else {
  595. firstD = '*';
  596. if(brackets) {
  597. brackets = false;
  598. } else {
  599. rpn_text.Delete(rpn_text.Length(), 1);
  600. }
  601. if(checkStatusFunction) {
  602. rpn_text += l;
  603. h += l;
  604. h += " * ";
  605. rpn_text += '*';
  606. rpn_text += '1';
  607. checker = true;
  608. } else {
  609. h += " * ";
  610. rpn_text += l;
  611. rpn_text += '*';
  612. rpn_text += '1';
  613. checker = true;
  614. checkStatusFunction = true;
  615. }
  616. }
  617.  
  618. d = '*';
  619. if(countBrackets == 0){
  620. rpn->setRPN(rpn_text.c_str());
  621. rpn->calculate();
  622. }
  623.  
  624. History->Text = h;
  625. Edit->Text = FloatToStr(rpn->getResult());
  626. }
  627. }
  628. //---------------------------------------------------------------------------
  629. void __fastcall TCalculator::divideButtonClick(TObject *Sender)
  630. {
  631. if(!error){
  632. AnsiString l = Edit->Text;
  633. AnsiString h = History->Text;
  634.  
  635. a=StrToFloat(l);
  636. if(a < 0) {
  637. l = '(';
  638. l += FloatToStr(a);
  639. l += ')';
  640. } else {
  641. l = FloatToStr(a);
  642. }
  643.  
  644.  
  645. if(checker) {
  646. if((firstD != '*') && (firstD != '/') && (firstD != '^') && (firstD != 'r') && (firstD != 'm')){
  647. AnsiString buffRPN = '(';
  648. AnsiString buffHistory = '(';
  649. int countOp = 0;
  650. for(int i = 1; i < rpn_text.Length()-1; i++){
  651. buffRPN += rpn_text[i];
  652. switch(rpn_text[i]){
  653. case '+': case '-': case '*': case '/':case 'm': case '^' :case 'r': countOp++; break;
  654. }
  655. }
  656.  
  657. if(countOp >= 1) {
  658. for(int i = 1; i < h.Length() - 2; i++){
  659. buffHistory += h[i];
  660. }
  661. buffRPN += ')'; buffRPN += rpn_text[rpn_text.Length()-1]; buffRPN += rpn_text[rpn_text.Length()];
  662. rpn_text = buffRPN;
  663. h = buffHistory;
  664. h += ") / ";
  665. }
  666. firstD = '/';
  667. }
  668. rpn_text[rpn_text.Length() - 1] = '/';
  669. rpn_text[rpn_text.Length()] = '1';
  670. switch(d){
  671. case '+': case '-': case '/': case '*': h[h.Length() - 1] = '/'; break;
  672. case 'm': h.Delete(h.Length()-2,2); h[h.Length() - 1] = '/'; break;
  673. case 'r': h.Delete(h.Length() - 5,6), h += "/ "; break;
  674. }
  675. }else {
  676. firstD = '/';
  677. if(brackets) {
  678. brackets = false;
  679. } else {
  680. rpn_text.Delete(rpn_text.Length(), 1);
  681. }
  682. if(checkStatusFunction) {
  683. rpn_text += l;
  684. h += l;
  685. h += " / ";
  686. rpn_text += '/';
  687. rpn_text += '1';
  688. checker = true;
  689. } else {
  690. h += " / ";
  691. rpn_text += l;
  692. rpn_text += '/';
  693. rpn_text += '1';
  694. checker = true;
  695. checkStatusFunction = true;
  696. }
  697. }
  698.  
  699. if(a != 0) {
  700. d = '/';
  701. if(countBrackets == 0){
  702. rpn->setRPN(rpn_text.c_str());
  703. rpn->calculate();
  704. }
  705. History->Text = h;
  706. Edit->Text = FloatToStr(rpn->getResult());
  707. } else {
  708. History->Text = h;
  709. Edit->Text = "Недопустимый ввод";
  710. error = true;
  711. }
  712. }
  713. }
  714. //---------------------------------------------------------------------------
  715. void __fastcall TCalculator::procButtonClick(TObject *Sender)
  716. {
  717. if(!error) {
  718. AnsiString l;
  719. AnsiString h = History->Text;
  720. l = Edit->Text;
  721. a = StrToFloat(l);
  722.  
  723. b = a / 100;
  724.  
  725. if (checkStatusFunction) {
  726. funcPos = h.Length() + 1;
  727. h += "proc(" + FloatToStr(a) + ")";
  728. History->Text = h;
  729. checkStatusFunction = false;
  730. checker = false;
  731. } else {
  732. l = "";
  733. for (int i=1; i<=h.Length();i++){
  734. if(i == funcPos){
  735. l+= "proc(";
  736. }
  737. l += h[i];
  738. }
  739. l += ")";
  740. History->Text = l;
  741. }
  742. Edit->Text = FloatToStr(b);
  743. }
  744. }
  745. //---------------------------------------------------------------------------
  746. void __fastcall TCalculator::reciprocButtonClick(TObject *Sender)
  747. {
  748. if(!error) {
  749. AnsiString l;
  750. AnsiString h = History->Text;
  751. l = Edit->Text;
  752. a = StrToFloat(l);
  753.  
  754. if (checkStatusFunction) {
  755. funcPos = h.Length() + 1;
  756. h += "reciproc(" + FloatToStr(a) + ")";
  757. History->Text = h;
  758. checkStatusFunction = false;
  759. checker = false;
  760. } else {
  761. l = "";
  762. for (int i=1; i<=h.Length();i++){
  763. if(i == funcPos){
  764. l+= "reciproc(";
  765. }
  766. l += h[i];
  767. }
  768. l += ")";
  769. History->Text = l;
  770. }
  771.  
  772. if(a != 0) {
  773. b = 1 / a;
  774. Edit->Text = FloatToStr(b);
  775. } else {
  776. Edit->Text = "Недопустимый ввод";
  777. error = true;
  778. }
  779.  
  780.  
  781. }
  782. }
  783. //---------------------------------------------------------------------------
  784. void __fastcall TCalculator::negateButtonClick(TObject *Sender)
  785. {
  786. if(!error) {
  787. AnsiString l = Edit->Text;
  788. a = StrToFloat(l);
  789.  
  790. if (!checkStatusFunction) {
  791. l = "";
  792. AnsiString h = History->Text;
  793. for (int i=1; i<=h.Length();i++){
  794. if(i == funcPos){
  795. l+= "negate(";
  796. }
  797. l += h[i];
  798. }
  799. l += ")";
  800. History->Text = l;
  801. }
  802.  
  803. checker = false;
  804. b = -1 * a;
  805. Edit->Text = FloatToStr(b);
  806. }
  807.  
  808. }
  809. //---------------------------------------------------------------------------
  810. void __fastcall TCalculator::sqrtButtonClick(TObject *Sender)
  811. {
  812. if(!error){
  813. AnsiString l;
  814. AnsiString h = History->Text;
  815. l = Edit->Text;
  816. a = StrToFloat(l);
  817.  
  818. if (checkStatusFunction) {
  819. funcPos = h.Length() + 1;
  820. h += "sqrt(" + FloatToStr(a) + ")";
  821. History->Text = h;
  822. checkStatusFunction = false;
  823. checker = false;
  824. } else {
  825. l = "";
  826. for (int i=1; i<=h.Length();i++){
  827. if(i == funcPos){
  828. l+= "sqrt(";
  829. }
  830. l += h[i];
  831. }
  832. l += ")";
  833. History->Text = l;
  834. }
  835.  
  836. if(a >= 0) {
  837. b = sqrt(a);
  838. Edit->Text = FloatToStr(b);
  839. } else {
  840. Edit->Text = "Недопустимый ввод";
  841. error = true;
  842. }
  843. }
  844. }
  845. //---------------------------------------------------------------------------
  846. void __fastcall TCalculator::lnButtonClick(TObject *Sender)
  847. {
  848. if(!error) {
  849. AnsiString l;
  850. AnsiString h = History->Text;
  851. l = Edit->Text;
  852. a = StrToFloat(l);
  853.  
  854. if (checkStatusFunction) {
  855. funcPos = h.Length() + 1;
  856. if(invPress) {
  857. h += "ln(" + FloatToStr(a) + ")";
  858. } else {
  859. h += "powe(" + FloatToStr(a) + ")";
  860. }
  861. History->Text = h;
  862. checkStatusFunction = false;
  863. checker = false;
  864. } else {
  865. l = "";
  866. for (int i=1; i<=h.Length();i++){
  867. if(i == funcPos){
  868. if(invPress) {
  869. l+= "ln(";
  870. } else {
  871. l+= "powe(";
  872. }
  873. }
  874. l += h[i];
  875. }
  876. l += ")";
  877. History->Text = l;
  878. }
  879.  
  880. if(invPress) {
  881. if(a > 0) {
  882. b = log(a);
  883. Edit->Text = FloatToStr(b);
  884. } else {
  885. Edit->Text = "Недопустимый ввод";
  886. error = true;
  887. }
  888. } else {
  889. b = exp(log(M_E) * a);
  890. Edit->Text = FloatToStr(b);
  891. }
  892. }
  893. }
  894. //---------------------------------------------------------------------------
  895. void __fastcall TCalculator::sinButtonClick(TObject *Sender)
  896. {
  897. if(!error){
  898. AnsiString l;
  899. AnsiString h = History->Text;
  900. l = Edit->Text;
  901. a = StrToFloat(l);
  902.  
  903. if (checkStatusFunction) {
  904. funcPos = h.Length() + 1;
  905. if(!invPress) {h += 'a';}
  906. switch(units){
  907. case 'd': h += "sind(" + l + ")"; break;
  908. case 'r': h += "sinr(" + l + ")"; break;
  909. case 'g': h += "sing(" + l + ")"; break;
  910. }
  911. History->Text = h;
  912. checkStatusFunction = false;
  913. checker = false;
  914. } else {
  915. l = "";
  916. for (int i=1; i<=h.Length();i++){
  917. if(i == funcPos){
  918. if(!invPress) {l += 'a';}
  919. switch(units){
  920. case 'd': l += "sind("; break;
  921. case 'r': l += "sinr("; break;
  922. case 'g': l += "sing("; break;
  923. }
  924. }
  925. l += h[i];
  926. }
  927. l += ")";
  928. History->Text = l;
  929. }
  930.  
  931. if(invPress){
  932. a = toRadians(a, units);
  933. b = sin(a);
  934. Edit->Text = FloatToStr(b);
  935. }else {
  936. if((a >= -1) && (a <= 1)){
  937. b = asin(a);
  938. switch(units) {
  939. case 'd': b = toDegrees(b,'r'); break;
  940. case 'g': b = toGrads(b); break;
  941. }
  942. Edit->Text = FloatToStr(b);
  943. } else {
  944. Edit->Text = "Недопустимый ввод";
  945. error = true;
  946. }
  947. }
  948.  
  949. }
  950. }
  951. //---------------------------------------------------------------------------
  952. void __fastcall TCalculator::sinhButtonClick(TObject *Sender)
  953. {
  954. if(!error){
  955. AnsiString l;
  956. AnsiString h = History->Text;
  957. l = Edit->Text;
  958. a = StrToFloat(l);
  959.  
  960. if (checkStatusFunction) {
  961. funcPos = h.Length() + 1;
  962. if(!invPress) {h += 'a';}
  963. h += "sinh(" + l + ")";
  964. History->Text = h;
  965. checkStatusFunction = false;
  966. checker = false;
  967. } else {
  968. l = "";
  969. for (int i=1; i<=h.Length();i++){
  970. if(i == funcPos){
  971. if(!invPress) {l += 'a';}
  972. h += "sinh(" + l + ")";
  973. }
  974. l += h[i];
  975. }
  976. l += ")";
  977. History->Text = l;
  978. }
  979.  
  980. if(invPress){
  981. b = sinh(a);
  982. }else {
  983. b = log(a + sqrt(pow(a,2) + 1));
  984. }
  985.  
  986. Edit->Text = FloatToStr(b);
  987. }
  988. }
  989. //---------------------------------------------------------------------------
  990. void __fastcall TCalculator::cosButtonClick(TObject *Sender)
  991. {
  992. if(!error){
  993. AnsiString l;
  994. AnsiString h = History->Text;
  995. l = Edit->Text;
  996. a = StrToFloat(l);
  997.  
  998. if (checkStatusFunction) {
  999. funcPos = h.Length() + 1;
  1000. if(!invPress) {h += 'a';}
  1001. switch(units){
  1002. case 'd': h += "cosd(" + l + ")"; break;
  1003. case 'r': h += "cosr(" + l + ")"; break;
  1004. case 'g': h += "cosg(" + l + ")"; break;
  1005. }
  1006. History->Text = h;
  1007. checkStatusFunction = false;
  1008. checker = false;
  1009. } else {
  1010. l = "";
  1011. for (int i=1; i<=h.Length();i++){
  1012. if(i == funcPos){
  1013. if(!invPress) {l += 'a';}
  1014. switch(units){
  1015. case 'd': l += "cosd("; break;
  1016. case 'r': l += "cosr("; break;
  1017. case 'g': l += "cosg("; break;
  1018. }
  1019. }
  1020. l += h[i];
  1021. }
  1022. l += ")";
  1023. History->Text = l;
  1024. }
  1025.  
  1026. if(invPress){
  1027. a = toRadians(a, units);
  1028. b = cos(a);
  1029. Edit->Text = FloatToStr(b);
  1030. }else {
  1031. if((a >= -1) && (a <= 1)){
  1032. b = acos(a);
  1033. switch(units) {
  1034. case 'd': b = toDegrees(b,'r'); break;
  1035. case 'g': b = toGrads(b); break;
  1036. }
  1037. Edit->Text = FloatToStr(b);
  1038. } else {
  1039. Edit->Text = "Недопустимый ввод";
  1040. error = true;
  1041. }
  1042. }
  1043.  
  1044. }
  1045. }
  1046. //---------------------------------------------------------------------------
  1047. void __fastcall TCalculator::coshButtonClick(TObject *Sender)
  1048. {
  1049. if(!error){
  1050. AnsiString l;
  1051. AnsiString h = History->Text;
  1052. l = Edit->Text;
  1053. a = StrToFloat(l);
  1054.  
  1055. if (checkStatusFunction) {
  1056. funcPos = h.Length() + 1;
  1057. if(!invPress) {h += 'a';}
  1058. h += "cosh(" + l + ")";
  1059. History->Text = h;
  1060. checkStatusFunction = false;
  1061. checker = false;
  1062. } else {
  1063. l = "";
  1064. for (int i=1; i<=h.Length();i++){
  1065. if(i == funcPos){
  1066. if(!invPress) {l += 'a';}
  1067. l += "cosh(";
  1068. }
  1069. l += h[i];
  1070. }
  1071. l += ")";
  1072. History->Text = l;
  1073. }
  1074.  
  1075. if(invPress){
  1076. b = cosh(a);
  1077. Edit->Text = FloatToStr(b);
  1078. }else {
  1079. if(a >= 1){
  1080. b = log(a + sqrt(pow(a,2) - 1));
  1081. Edit->Text = FloatToStr(b);
  1082. } else {
  1083. Edit->Text = "Недопустимый ввод";
  1084. error = true;
  1085. }
  1086. }
  1087.  
  1088. }
  1089. }
  1090. //---------------------------------------------------------------------------
  1091. void __fastcall TCalculator::tanButtonClick(TObject *Sender)
  1092. {
  1093. if(!error){
  1094. AnsiString l;
  1095. AnsiString h = History->Text;
  1096. l = Edit->Text;
  1097. a = StrToFloat(l);
  1098.  
  1099. if (checkStatusFunction) {
  1100. funcPos = h.Length() + 1;
  1101. if(!invPress) {h += 'a';}
  1102. switch(units){
  1103. case 'd': h += "tand(" + l + ")"; break;
  1104. case 'r': h += "tanr(" + l + ")"; break;
  1105. case 'g': h += "tang(" + l + ")"; break;
  1106. }
  1107. History->Text = h;
  1108. checkStatusFunction = false;
  1109. checker = false;
  1110. } else {
  1111. l = "";
  1112. for (int i=1; i<=h.Length();i++){
  1113. if(i == funcPos){
  1114. if(!invPress) {l += 'a';}
  1115. switch(units){
  1116. case 'd': l += "tand("; break;
  1117. case 'r': l += "tanr("; break;
  1118. case 'g': l += "tang("; break;
  1119. }
  1120. }
  1121. l += h[i];
  1122. }
  1123. l += ")";
  1124. History->Text = l;
  1125. }
  1126.  
  1127. if(invPress){
  1128. a = toDegrees(a, units);
  1129. if(((int)a == 90) || ((int)a == 270)) {
  1130. Edit->Text = "Недопустимый ввод";
  1131. error = true;
  1132. } else {
  1133. a = toRadians(a, units);
  1134. b = tan(a);
  1135. Edit->Text = FloatToStr(b);
  1136. }
  1137. }else {
  1138. a = toDegrees(a, units);
  1139. if(((int)a == 0) || ((int)a == 180) || ((int)a == 360)) {
  1140. Edit->Text = "Недопустимый ввод";
  1141. error = true;
  1142. } else {
  1143. a = toRadians(a, units);
  1144. b = atan(a);
  1145. Edit->Text = FloatToStr(b);
  1146. }
  1147. }
  1148. }
  1149. }
  1150. //---------------------------------------------------------------------------
  1151. void __fastcall TCalculator::tanhButtonClick(TObject *Sender)
  1152. {
  1153. if(!error){
  1154. AnsiString l;
  1155. AnsiString h = History->Text;
  1156. l = Edit->Text;
  1157. a = StrToFloat(l);
  1158.  
  1159. if (checkStatusFunction) {
  1160. funcPos = h.Length() + 1;
  1161. if(!invPress) {h += 'a';}
  1162. h += "tanh(" + l + ")";
  1163. History->Text = h;
  1164. checkStatusFunction = false;
  1165. checker = false;
  1166. } else {
  1167. l = "";
  1168. for (int i=1; i<=h.Length();i++){
  1169. if(i == funcPos){
  1170. if(!invPress) {l += 'a';}
  1171. l += "tanh(";
  1172. }
  1173. l += h[i];
  1174. }
  1175. l += ")";
  1176. History->Text = l;
  1177. }
  1178.  
  1179. if(invPress){
  1180. b = tanh(a);
  1181. Edit->Text = FloatToStr(b);
  1182. }else {
  1183. if(a == 1) {
  1184. Edit->Text = "Деление на ноль невозможно";
  1185. error = true;
  1186. }else {
  1187. if((a > -1) &&(a < 1)) {
  1188. b = 0.5 * log((1 + a)/(1 - a));
  1189. Edit->Text = FloatToStr(b);
  1190. }else {
  1191. Edit->Text = "Недопустимый ввод";
  1192. error = true;
  1193. }
  1194. }
  1195. }
  1196.  
  1197. }
  1198. }
  1199. //---------------------------------------------------------------------------
  1200. void __fastcall TCalculator::equallyButtonClick(TObject *Sender)
  1201. {
  1202. if(!error){
  1203. if((!checker) || (!checkStatusFunction) || (checker)){
  1204. a = StrToFloat(Edit->Text);
  1205. rpn_text.Delete(rpn_text.Length(),1);
  1206. rpn_text += FloatToStr(a);
  1207. }
  1208.  
  1209. for(int i=1; i<= countBrackets;i++){
  1210. rpn_text += ')';
  1211. }
  1212.  
  1213. rpn->setRPN(rpn_text.c_str());
  1214. rpn->calculate();
  1215. History->Clear();
  1216. Edit->Text = FloatToStr(rpn->getResult());
  1217.  
  1218. rpn_text= "";
  1219. a = 0;
  1220. b = 0;
  1221. countBrackets = 0;
  1222. d = ' ';
  1223. checker = false;
  1224. error = false;
  1225. brackets = false;
  1226. checkStatusFunction = true;
  1227. countBracketsButton->Caption = "";
  1228. }
  1229. }
  1230. //---------------------------------------------------------------------------
  1231. void __fastcall TCalculator::clearButtonClick(TObject *Sender)
  1232. {
  1233. rpn_text= "";
  1234. a = 0;
  1235. b = 0;
  1236. countBrackets = 0;
  1237. d = ' ';
  1238. checker = false;
  1239. error = false;
  1240. brackets = false;
  1241. checkStatusFunction = true;
  1242. countBracketsButton->Caption = "";
  1243. Edit->Text = 0;
  1244. History->Clear();
  1245.  
  1246. }
  1247. //---------------------------------------------------------------------------
  1248. void __fastcall TCalculator::deleteButtonClick(TObject *Sender)
  1249. {
  1250. if(!error){
  1251. AnsiString l = Edit->Text;
  1252.  
  1253. if(l.Length() > 1) {
  1254. l.Delete0(l.Length()-1,1);
  1255. Edit->Text = l;
  1256. } else {
  1257. Edit->Text = 0;
  1258. }
  1259. }
  1260. }
  1261. //---------------------------------------------------------------------------
  1262.  
  1263. void __fastcall TCalculator::degreesRadioButtonClick(TObject *Sender)
  1264. {
  1265. units = 'd';
  1266. }
  1267. //---------------------------------------------------------------------------
  1268.  
  1269. void __fastcall TCalculator::radiansRadioButtonClick(TObject *Sender)
  1270. {
  1271. units = 'r';
  1272. }
  1273. //---------------------------------------------------------------------------
  1274.  
  1275. void __fastcall TCalculator::gradsRadioButtonClick(TObject *Sender)
  1276. {
  1277. units = 'g';
  1278. }
  1279. //---------------------------------------------------------------------------
  1280.  
  1281. void __fastcall TCalculator::PiButtonClick(TObject *Sender)
  1282. {
  1283. if(invPress){
  1284. Edit->Text = FloatToStr(M_PI);
  1285. } else {
  1286. Edit->Text = FloatToStr(2 * M_PI);
  1287. }
  1288. }
  1289. //---------------------------------------------------------------------------
  1290.  
  1291. void __fastcall TCalculator::CEButtonClick(TObject *Sender)
  1292. {
  1293. if(error){
  1294. rpn_text= "";
  1295. a = 0;
  1296. b = 0;
  1297. d = ' ';
  1298. checker = false;
  1299. error = false;
  1300. checkStatusFunction = true;
  1301. History->Clear();
  1302. } else if(!checkStatusFunction){
  1303. AnsiString h = History->Text;
  1304. h.Delete(funcPos,h.Length()-funcPos + 1);
  1305. History->Text = h;
  1306. checkStatusFunction = true;
  1307. }
  1308. Edit->Text = '0';
  1309. }
  1310. //---------------------------------------------------------------------------
  1311.  
  1312. void __fastcall TCalculator::powTenButtonClick(TObject *Sender)
  1313. {
  1314. if(!error) {
  1315. AnsiString l;
  1316. AnsiString h = History->Text;
  1317. l = Edit->Text;
  1318. a = StrToFloat(l);
  1319.  
  1320. if(a == 0){
  1321. b = 1;
  1322. } else {
  1323. if(a < 0) {
  1324. b = (1/(exp(log(10.0) * (abs(a)))));
  1325. } else {
  1326. b = (exp(log(10.0) * a));
  1327. }
  1328. }
  1329.  
  1330. if (checkStatusFunction) {
  1331. funcPos = h.Length() + 1;
  1332. h += "powten(" + FloatToStr(a) + ")";
  1333. History->Text = h;
  1334. checkStatusFunction = false;
  1335. checker = false;
  1336. } else {
  1337. l = "";
  1338. for (int i=1; i<=h.Length();i++){
  1339. if(i == funcPos){
  1340. l+= "powten(";
  1341. }
  1342. l += h[i];
  1343. }
  1344. l += ")";
  1345. History->Text = l;
  1346. }
  1347. Edit->Text = FloatToStr(b);
  1348. }
  1349. }
  1350. //---------------------------------------------------------------------------
  1351.  
  1352. void __fastcall TCalculator::cuberootButtonClick(TObject *Sender)
  1353. {
  1354. if(!error){
  1355. AnsiString l;
  1356. AnsiString h = History->Text;
  1357. l = Edit->Text;
  1358. a = StrToFloat(l);
  1359.  
  1360. if (a == 0) {
  1361. b = 0;
  1362. }else if (a > 0) {
  1363. b = (exp(log(a) * 1/3));
  1364. }else {
  1365. b = -(exp(log(abs(a)) * 1/3));
  1366. }
  1367.  
  1368. if (checkStatusFunction) {
  1369. funcPos = h.Length() + 1;
  1370. h += "cuberoot(" + FloatToStr(a) + ")";
  1371. History->Text = h;
  1372. checkStatusFunction = false;
  1373. checker = false;
  1374. } else {
  1375. l = "";
  1376. for (int i=1; i<=h.Length();i++){
  1377. if(i == funcPos){
  1378. l+= "cuberoot(";
  1379. }
  1380. l += h[i];
  1381. }
  1382. l += ")";
  1383. History->Text = l;
  1384. }
  1385. Edit->Text = FloatToStr(b);
  1386. }
  1387. }
  1388. //---------------------------------------------------------------------------
  1389.  
  1390. void __fastcall TCalculator::cubeButtonClick(TObject *Sender)
  1391. {
  1392. if(!error){
  1393. AnsiString l;
  1394. AnsiString h = History->Text;
  1395. l = Edit->Text;
  1396. a = StrToFloat(l);
  1397.  
  1398. if (a == 0) {
  1399. b = 0;
  1400. }else if (a > 0) {
  1401. b = (exp(log(a) * 3));
  1402. }else {
  1403. b = -(exp(log(abs(a)) * 3));
  1404. }
  1405.  
  1406. if (checkStatusFunction) {
  1407. funcPos = h.Length() + 1;
  1408. h += "cube(" + FloatToStr(a) + ")";
  1409. History->Text = h;
  1410. checkStatusFunction = false;
  1411. checker = false;
  1412. } else {
  1413. l = "";
  1414. for (int i=1; i<=h.Length();i++){
  1415. if(i == funcPos){
  1416. l+= "cube(";
  1417. }
  1418. l += h[i];
  1419. }
  1420. l += ")";
  1421. History->Text = l;
  1422. }
  1423. Edit->Text = FloatToStr(b);
  1424. }
  1425. }
  1426. //---------------------------------------------------------------------------
  1427.  
  1428. void __fastcall TCalculator::sqrButtonClick(TObject *Sender)
  1429. {
  1430. if(!error){
  1431. AnsiString l;
  1432. AnsiString h = History->Text;
  1433. l = Edit->Text;
  1434. a = StrToFloat(l);
  1435.  
  1436. if (a == 0) {
  1437. b = 0;
  1438. }else {
  1439. b = (exp(log(abs(a)) * 2));
  1440. }
  1441.  
  1442. if (checkStatusFunction) {
  1443. funcPos = h.Length() + 1;
  1444. h += "sqr(" + FloatToStr(a) + ")";
  1445. History->Text = h;
  1446. checkStatusFunction = false;
  1447. checker = false;
  1448. } else {
  1449. l = "";
  1450. for (int i=1; i<=h.Length();i++){
  1451. if(i == funcPos){
  1452. l+= "sqr(";
  1453. }
  1454. l += h[i];
  1455. }
  1456. l += ")";
  1457. History->Text = l;
  1458. }
  1459. Edit->Text = FloatToStr(b);
  1460. }
  1461. }
  1462. //---------------------------------------------------------------------------
  1463.  
  1464.  
  1465. void __fastcall TCalculator::logButtonClick(TObject *Sender)
  1466. {
  1467. if(!error) {
  1468. AnsiString l;
  1469. AnsiString h = History->Text;
  1470. l = Edit->Text;
  1471. a = StrToFloat(l);
  1472.  
  1473. if (checkStatusFunction) {
  1474. funcPos = h.Length() + 1;
  1475. h += "log(" + FloatToStr(a) + ")";
  1476. History->Text = h;
  1477. checkStatusFunction = false;
  1478. checker = false;
  1479. } else {
  1480. l = "";
  1481. for (int i=1; i<=h.Length();i++){
  1482. if(i == funcPos){
  1483. l+= "log(";
  1484. }
  1485. l += h[i];
  1486. }
  1487. l += ")";
  1488. History->Text = l;
  1489. }
  1490.  
  1491. if(a > 0) {
  1492. b = log10(a);
  1493. Edit->Text = FloatToStr(b);
  1494. } else {
  1495. Edit->Text = "Недопустимый ввод";
  1496. error = true;
  1497. }
  1498. }
  1499. }
  1500. //---------------------------------------------------------------------------
  1501.  
  1502.  
  1503. void __fastcall TCalculator::invButtonClick(TObject *Sender)
  1504. {
  1505. if(!error) {
  1506. if(invPress) {
  1507. sinButton->Caption = "asin";
  1508. cosButton->Caption = "acos";
  1509. tanButton->Caption = "atan";
  1510. sinhButton->Caption = "asinh";
  1511. coshButton->Caption = "acosh";
  1512. tanhButton->Caption = "atanh";
  1513. lnButton->Caption = "e^x";
  1514. intButton->Caption = "Frac";
  1515. dmsButton->Caption = "deg";
  1516. PiButton->Caption = "2*п";
  1517. invPress = false;
  1518. } else {
  1519. sinButton->Caption = "sin";
  1520. cosButton->Caption = "cos";
  1521. tanButton->Caption = "tan";
  1522. sinhButton->Caption = "sinh";
  1523. coshButton->Caption = "cosh";
  1524. tanhButton->Caption = "tanh";
  1525. lnButton->Caption = "ln";
  1526. intButton->Caption = "Int";
  1527. dmsButton->Caption = "dms";
  1528. PiButton->Caption = "п";
  1529. invPress = true;
  1530. }
  1531. }
  1532. }
  1533. //---------------------------------------------------------------------------
  1534.  
  1535.  
  1536. void __fastcall TCalculator::yPowButtonClick(TObject *Sender)
  1537. {
  1538. if(!error) {
  1539. AnsiString l = Edit->Text;
  1540. AnsiString h = History->Text;
  1541.  
  1542. a=StrToFloat(l);
  1543. if(a < 0) {
  1544. l = '(';
  1545. l += FloatToStr(a);
  1546. l += ')';
  1547. } else {
  1548. l = FloatToStr(a);
  1549. }
  1550.  
  1551. if(checker) {
  1552. if((firstD != '*') && (firstD != '/') && (firstD != '^') && (firstD != 'r') && (firstD != 'm')){
  1553. AnsiString buffRPN = '(';
  1554. AnsiString buffHistory = '(';
  1555. int countOp = 0;
  1556. for(int i = 1; i < rpn_text.Length()-1; i++){
  1557. buffRPN += rpn_text[i];
  1558. switch(rpn_text[i]){
  1559. case '+': case '-': case '*': case '/':case 'm': case '^' :case 'r': countOp++; break;
  1560. }
  1561. }
  1562.  
  1563. for(int i = 1; i < h.Length() - 2; i++){
  1564. buffHistory += h[i];
  1565. }
  1566.  
  1567. if(countOp >= 1) {
  1568. buffRPN += ')'; buffRPN += rpn_text[rpn_text.Length()-1]; buffRPN += rpn_text[rpn_text.Length()];
  1569. rpn_text = buffRPN;
  1570. h = buffHistory;
  1571. h += ") ^ ";
  1572. }
  1573. firstD = '^';
  1574. }
  1575. rpn_text[rpn_text.Length() - 1] = '^';
  1576. rpn_text[rpn_text.Length()] = '1';
  1577. switch(d){
  1578. case '+': case '-': case '/': case '*': h[h.Length() - 1] = '^'; break;
  1579. case 'm': h.Delete(h.Length()-2,2); h[h.Length() - 1] = '^'; break;
  1580. }
  1581. }else {
  1582. firstD = '^';
  1583. if(brackets) {
  1584. brackets = false;
  1585. } else {
  1586. rpn_text.Delete(rpn_text.Length(), 1);
  1587. }
  1588. if(checkStatusFunction) {
  1589. rpn_text += l;
  1590. h += l;
  1591. h += " ^ ";
  1592. rpn_text += '^';
  1593. rpn_text += '1';
  1594. checker = true;
  1595. } else {
  1596. h += " ^ ";
  1597. rpn_text += l;
  1598. rpn_text += '^';
  1599. rpn_text += '1';
  1600. checker = true;
  1601. checkStatusFunction = true;
  1602. }
  1603. }
  1604.  
  1605. d = '^';
  1606. if(countBrackets == 0){
  1607. rpn->setRPN(rpn_text.c_str());
  1608. rpn->calculate();
  1609. }
  1610.  
  1611. History->Text = h;
  1612. Edit->Text = FloatToStr(rpn->getResult());
  1613. }
  1614. }
  1615. //---------------------------------------------------------------------------
  1616.  
  1617.  
  1618.  
  1619. void __fastcall TCalculator::yrootButtonClick(TObject *Sender)
  1620. {
  1621. if(!error) {
  1622. AnsiString l = Edit->Text;
  1623. AnsiString h = History->Text;
  1624.  
  1625. a=StrToFloat(l);
  1626. if(a < 0) {
  1627. l = '(';
  1628. l += FloatToStr(a);
  1629. l += ')';
  1630. } else {
  1631. l = FloatToStr(a);
  1632. }
  1633.  
  1634. if(checker) {
  1635. if((firstD != '*') && (firstD != '/') && (firstD != '^') && (firstD != 'r') && (firstD != 'm')){
  1636. AnsiString buffRPN = '(';
  1637. AnsiString buffHistory = '(';
  1638. int countOp = 0;
  1639. for(int i = 1; i < rpn_text.Length()-1; i++){
  1640. buffRPN += rpn_text[i];
  1641. switch(rpn_text[i]){
  1642. case '+': case '-': case '*': case '/':case 'm': case '^' :case 'r': countOp++; break;
  1643. }
  1644. }
  1645.  
  1646. for(int i = 1; i < h.Length() - 2; i++){
  1647. buffHistory += h[i];
  1648. }
  1649.  
  1650. if(countOp >= 1) {
  1651. buffRPN += ')'; buffRPN += rpn_text[rpn_text.Length()-1]; buffRPN += rpn_text[rpn_text.Length()];
  1652. rpn_text = buffRPN;
  1653. h = buffHistory;
  1654. h += ") yroot ";
  1655. d = 'r';
  1656. }
  1657. firstD = 'r';
  1658. }
  1659. rpn_text[rpn_text.Length() - 1] = 'r';
  1660. rpn_text[rpn_text.Length()] = '1';
  1661. switch(d){
  1662. case '+': case '-': case '/': case '*': h.Delete(h.Length() - 1,2), h += "yroot "; break;
  1663. case 'm': h.Delete(h.Length()-3,4); h += "yroot "; break;
  1664. }
  1665. }else {
  1666. firstD = 'r';
  1667. if(brackets) {
  1668. brackets = false;
  1669. } else {
  1670. rpn_text.Delete(rpn_text.Length(), 1);
  1671. }
  1672. if(checkStatusFunction) {
  1673. rpn_text += l;
  1674. h += l;
  1675. h += " yroot ";
  1676. rpn_text += 'r';
  1677. rpn_text += '1';
  1678. checker = true;
  1679. } else {
  1680. h += " yroot ";
  1681. rpn_text += l;
  1682. rpn_text += 'r';
  1683. rpn_text += '1';
  1684. checker = true;
  1685. checkStatusFunction = true;
  1686. }
  1687. }
  1688.  
  1689. d = 'r';
  1690. if(countBrackets == 0){
  1691. rpn->setRPN(rpn_text.c_str());
  1692. rpn->calculate();
  1693. }
  1694.  
  1695. History->Text = h;
  1696. Edit->Text = FloatToStr(rpn->getResult());
  1697. }
  1698. }
  1699. //---------------------------------------------------------------------------
  1700.  
  1701. void __fastcall TCalculator::modButtonClick(TObject *Sender)
  1702. {
  1703. if(!error) {
  1704. AnsiString l = Edit->Text;
  1705. AnsiString h = History->Text;
  1706.  
  1707. a=StrToFloat(l);
  1708. if(a < 0) {
  1709. l = '(';
  1710. l += FloatToStr(a);
  1711. l += ')';
  1712. } else {
  1713. l = FloatToStr(a);
  1714. }
  1715.  
  1716. if(checker) {
  1717. if((firstD != '*') && (firstD != '/') && (firstD != '^') && (firstD != 'r') && (firstD != 'm')){
  1718. AnsiString buffRPN = '(';
  1719. AnsiString buffHistory = '(';
  1720. int countOp = 0;
  1721. for(int i = 1; i < rpn_text.Length()-1; i++){
  1722. buffRPN += rpn_text[i];
  1723. switch(rpn_text[i]){
  1724. case '+': case '-': case '*': case '/':case 'm': case '^' :case 'r': countOp++; break;
  1725. }
  1726. }
  1727.  
  1728. for(int i = 1; i < h.Length() - 2; i++){
  1729. buffHistory += h[i];
  1730. }
  1731.  
  1732. if(countOp >= 1) {
  1733. buffRPN += ')'; buffRPN += rpn_text[rpn_text.Length()-1]; buffRPN += rpn_text[rpn_text.Length()];
  1734. rpn_text = buffRPN;
  1735. h = buffHistory;
  1736. h += ") Mod ";
  1737. d = 'm';
  1738. }
  1739. firstD = 'm';
  1740. }
  1741. rpn_text[rpn_text.Length() - 1] = 'm';
  1742. rpn_text[rpn_text.Length()] = '1';
  1743. switch(d){
  1744. case '+': case '-': case '/': case '*': case '^': h.Delete(h.Length() - 1,2), h += "Mod "; break;
  1745. case 'r': h.Delete(h.Length() - 5,6), h += "Mod "; break;
  1746. }
  1747. }else {
  1748. firstD = 'm';
  1749. if(brackets) {
  1750. brackets = false;
  1751. } else {
  1752. rpn_text.Delete(rpn_text.Length(), 1);
  1753. }
  1754. if(checkStatusFunction) {
  1755. rpn_text += l;
  1756. h += l;
  1757. h += " Mod ";
  1758. rpn_text += 'm';
  1759. rpn_text += '1';
  1760. checker = true;
  1761. } else {
  1762. h += " Mod ";
  1763. rpn_text += l;
  1764. rpn_text += 'm';
  1765. rpn_text += '1';
  1766. checker = true;
  1767. checkStatusFunction = true;
  1768. }
  1769. }
  1770.  
  1771. d = 'm';
  1772. if(countBrackets == 0){
  1773. rpn->setRPN(rpn_text.c_str());
  1774. rpn->calculate();
  1775. }
  1776.  
  1777. History->Text = h;
  1778. Edit->Text = FloatToStr(rpn->getResult());
  1779. }
  1780. }
  1781. //---------------------------------------------------------------------------
  1782.  
  1783. void __fastcall TCalculator::intButtonClick(TObject *Sender)
  1784. {
  1785. if(!error){
  1786. AnsiString l;
  1787. AnsiString h = History->Text;
  1788. l = Edit->Text;
  1789. a = StrToFloat(l);
  1790.  
  1791.  
  1792.  
  1793. if (checkStatusFunction) {
  1794. funcPos = h.Length() + 1;
  1795. if(invPress){
  1796. h += "Int(" + FloatToStr(a) + ")";
  1797. } else {
  1798. h += "frac(" + FloatToStr(a) + ")";
  1799. }
  1800. History->Text = h;
  1801. checkStatusFunction = false;
  1802. checker = false;
  1803. } else {
  1804. l = "";
  1805. for (int i=1; i<=h.Length();i++){
  1806. if(i == funcPos){
  1807. if(invPress) {
  1808. l+= "Int(";
  1809. } else {
  1810. l+= "frac(";
  1811. }
  1812. }
  1813. l += h[i];
  1814. }
  1815. l += ")";
  1816. History->Text = l;
  1817. }
  1818.  
  1819. if(invPress){
  1820. b = (int)a;
  1821. }else {
  1822. b = a - (int)a;
  1823. }
  1824.  
  1825. Edit->Text = FloatToStr(b);
  1826. }
  1827. }
  1828. //---------------------------------------------------------------------------
  1829.  
  1830. void __fastcall TCalculator::mPlusButtonClick(TObject *Sender)
  1831. {
  1832. if(!error) {
  1833. mBuff += StrToFloat(Edit->Text);
  1834. }
  1835. }
  1836. //---------------------------------------------------------------------------
  1837.  
  1838. void __fastcall TCalculator::mMinusButtonClick(TObject *Sender)
  1839. {
  1840. if(!error) {
  1841. mBuff -= StrToFloat(Edit->Text);
  1842. }
  1843. }
  1844. //---------------------------------------------------------------------------
  1845.  
  1846. void __fastcall TCalculator::mRepeatButtonClick(TObject *Sender)
  1847. {
  1848. if(!error) {
  1849. mBuff = StrToFloat(Edit->Text);
  1850. }
  1851. }
  1852. //---------------------------------------------------------------------------
  1853.  
  1854. void __fastcall TCalculator::mWriteButtonClick(TObject *Sender)
  1855. {
  1856. if(!error){
  1857. AnsiString l = FloatToStr(mBuff);
  1858. if(checker) {
  1859. checker = false;
  1860. } else {
  1861. if(!checkStatusFunction){
  1862. rpn_text= "";
  1863. a = 0;
  1864. b = 0;
  1865. d = ' ';
  1866. checker = false;
  1867. checkStatusFunction = true;
  1868. Edit->Text = FloatToStr(mBuff);
  1869. History->Clear();
  1870. }
  1871. }
  1872. Edit->Text = l;
  1873. }
  1874. }
  1875. //---------------------------------------------------------------------------
  1876.  
  1877. void __fastcall TCalculator::mCEButtonClick(TObject *Sender)
  1878. {
  1879. mBuff = 0;
  1880. }
  1881. //---------------------------------------------------------------------------
  1882. void __fastcall TCalculator::leftBracketsButtonClick(TObject *Sender)
  1883. {
  1884. if(!error){
  1885. AnsiString l;
  1886. AnsiString h = History->Text;
  1887. countBrackets++;
  1888. countBracketsButton->Caption = "(=" + IntToStr(countBrackets);
  1889.  
  1890. if(checker) {
  1891. if((rpn_text[rpn_text.Length()] == '0') || (rpn_text[rpn_text.Length()] == '1')) {
  1892. rpn_text.Delete(rpn_text.Length(),1);
  1893. h.Delete(h.Length(),1);
  1894. }
  1895. rpn_text += '(';
  1896. h += '(';
  1897. } else {
  1898. if(checkStatusFunction){
  1899. if(rpn_text.Length() > 0){
  1900. if((rpn_text[rpn_text.Length()] == '0') || (rpn_text[rpn_text.Length()] == '1')) {
  1901. rpn_text.Delete(rpn_text.Length(),1);
  1902. h.Delete(h.Length(),1);
  1903. }
  1904. rpn_text += '(';
  1905. h+='(';
  1906. } else {
  1907. rpn_text += '(';
  1908. h+='(';
  1909. }
  1910. } else {
  1911. rpn_text.Delete(rpn_text.Length(),1);
  1912. rpn_text += '(';
  1913. h+='(';
  1914. }
  1915. }
  1916. brackets = true;
  1917. History->Text = h;
  1918. }
  1919. }
  1920. //---------------------------------------------------------------------------
  1921.  
  1922. void __fastcall TCalculator::rightBracketsButtonClick(TObject *Sender)
  1923. {
  1924. if(!error){
  1925. if(countBrackets>0){
  1926. AnsiString l;
  1927. countBrackets--;
  1928. if(countBrackets == 0) {
  1929. countBracketsButton->Caption = "";
  1930. } else {
  1931. countBracketsButton->Caption = "(=" + IntToStr(countBrackets);
  1932. }
  1933. AnsiString h = History->Text;
  1934.  
  1935. if(checker) {
  1936. if(rpn_text[rpn_text.Length()] == '('){
  1937. rpn_text[rpn_text.Length()] = '0';
  1938. } else {
  1939. rpn_text[rpn_text.Length() - 1] = ')';
  1940. rpn_text.Delete(rpn_text.Length(),1);
  1941. h[h.Length() - 1] = ')';
  1942. h+= " ";
  1943. }
  1944. } else {
  1945. if(checkStatusFunction){
  1946. if(rpn_text.Length() > 1){
  1947. rpn_text.Delete(rpn_text.Length(), 1);
  1948. rpn_text += Edit->Text;
  1949. rpn_text += ')';
  1950. h += Edit->Text;
  1951. h += ')';
  1952. } else {
  1953. if(rpn_text[rpn_text.Length()] == '('){
  1954. rpn_text[rpn_text.Length()] = '0';
  1955. h[h.Length()] = '0';
  1956. } else {
  1957. rpn_text += ')';
  1958. h += ')';
  1959. }
  1960. }
  1961. } else {
  1962. rpn_text += Edit->Text;
  1963. rpn_text += ')';
  1964. h += Edit->Text;
  1965. h += ')';
  1966. }
  1967. }
  1968. rpn_text += "*1";
  1969. d = '*';
  1970. firstD = '*';
  1971. brackets = false;
  1972. checker = true;
  1973. History->Text = h;
  1974. }
  1975. }
  1976. }
  1977. //---------------------------------------------------------------------------
  1978.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c:3:17: fatal error: vcl.h: No such file or directory
compilation terminated.
stdout
Standard output is empty