Advertisement
ismaeil

Calculator

Oct 13th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.27 KB | None | 0 0
  1. import 'dart:io';
  2.  
  3. bool isOp(String c)
  4. {
  5.     return (c == '*' || c == '/' || c == '-' || c == '+');
  6. }
  7.  
  8. num _pow(num __n , num __p){
  9.     if( __p == 0 ) return 1;
  10.     if( __p % 2 == 1 ) return __n * _pow( __n ,__p - 1);
  11.     num R = _pow( __n , __p / 2);
  12.     return R * R;
  13. }
  14.  
  15. num stringConverter(String s){
  16.     num res = 0;
  17.     for(num i = s.length - 1 ,j = 0 ; i >= 0 ; i-- , j++)
  18.         res += _pow(10 ,j) * num.parse(s[i]);
  19.     return res;
  20. }
  21.  
  22. class Calculator
  23. {
  24.     num _result;
  25.  
  26.     Calculator()
  27.     {
  28.         this._result = 0.0;
  29.     }
  30.  
  31.     num Calc(String op ,num a ,num b)
  32.     {
  33.         num Res = 0;
  34.  
  35.         switch( op )
  36.         {
  37.             case '+':
  38.                 Res = a + b;
  39.                 break;
  40.  
  41.             case '-':
  42.                 Res = a - b;
  43.                 break;
  44.  
  45.             case '*':
  46.                 Res = a * b;
  47.                 break;
  48.  
  49.             case '/':
  50.                 Res = a / b;
  51.                 break;
  52.         }
  53.  
  54.         return Res;
  55.     }
  56.  
  57.     num longOperation(String s ,num Size)
  58.     {
  59.         bool LastType = isOp( s[0] ) ? true : false;
  60.         /// --- 1 Operation - 0 Numbers --- ///
  61.  
  62.         List< String > input = [ s[0] ];
  63.         num idx = 1;
  64.  
  65.         if( isOp( s[0] ) )
  66.         {
  67.             idx += 1;
  68.             input = [ s[1] ];
  69.         }
  70.  
  71.         for(; idx < Size ; idx++)
  72.         {
  73.             bool CurType = isOp( s[idx] ) ? true : false;
  74.  
  75.             if( LastType == CurType ) input[ input.length - 1 ] += s[ idx ];
  76.             else input.add( s[ idx ] );
  77.  
  78.             LastType = CurType;
  79.         }
  80.  
  81.         num lastIdx = 0;
  82.         num res   = 0.0;
  83.         String resOperator = '+';
  84.  
  85.         for(num i = 0 ; i < input.length ; i++)
  86.         {
  87.             if( input[i] == "+" || input[i] == "-" )
  88.             {
  89.                 num cur = stringConverter( input[lastIdx] );
  90.  
  91.                 for(num j = lastIdx + 1 ; j < i ; j += 2)
  92.                     cur = Calc(input[j][0] ,cur ,stringConverter( input[j + 1] ) );
  93.  
  94.                 res = Calc(resOperator ,res ,cur);
  95.                 resOperator = input[i][0];
  96.                 lastIdx = i + 1;
  97.             }
  98.             else if( i == input.length - 1 )
  99.             {
  100.                 num cur = stringConverter( input[lastIdx] );
  101.  
  102.                 for(num j = lastIdx + 1 ; j <= i ; j += 2)
  103.                     cur = Calc(input[j][0] ,cur ,stringConverter( input[j + 1] ) );
  104.  
  105.                 res = Calc(resOperator ,res ,cur);
  106.             }
  107.         }
  108.  
  109.         return res;
  110.     }
  111.  
  112.     bool isValidOperations(String s ,num size)
  113.     {
  114.         bool flag2 = false;
  115.         bool flag1 = true;
  116.  
  117.         for(num i = 0 ; i < size && flag1 ; i++)
  118.         {
  119.             flag2 = true;
  120.  
  121.             if( !( s[i] is num ) && !isOp( s[i] ) )
  122.                 flag1 = false;
  123.  
  124.             if( i > 0 && isOp( s[i] ) )
  125.                 if( isOp( s[i - 1] ) )
  126.                     flag1 = false;
  127.         }
  128.  
  129.         return (flag1 && flag2);
  130.     }
  131.  
  132.     void editRes(num x ,String op)
  133.     {
  134.         switch( op )
  135.         {
  136.             case '+':
  137.                 _result += x;
  138.                 break;
  139.  
  140.             case '-':
  141.                 _result -= x;
  142.                 break;
  143.  
  144.             case '*':
  145.                 _result *= x;
  146.                 break;
  147.  
  148.             case '/':
  149.                 _result /= x;
  150.                 break;
  151.  
  152.             case '=':
  153.                 _result = x;
  154.                 break;
  155.         }
  156.     }
  157.  
  158.     num getRes()
  159.     {
  160.         var result = _result;
  161.         return result;
  162.     }
  163. }
  164.  
  165. void main()
  166. {
  167.     String ch;
  168.  
  169.     do
  170.     {
  171.         print('1 - (Enter Operation) : ');
  172.         print('0 - (Exit !!) : ');
  173.         print('Enter Choice : ');
  174.         ch = stdin.readLineSync();
  175.  
  176.         switch( ch )
  177.         {
  178.             case '1':
  179.             {
  180.                 String buffer;
  181.  
  182.                 Calculator C;
  183.  
  184.                 print('\nPress "End" To End ..\n\n');
  185.  
  186.                 do  /// --- Loop Of Input --- ///
  187.                 {
  188.                     print('Cur Res = ${C.getRes()} | New Operations (Without Spaces): ');
  189.                     buffer = stdin.readLineSync();
  190.  
  191.                     num size = buffer.length;
  192.                     if( isOp( buffer[size - 1] ) )
  193.                     {
  194.                         /// --- Ignore The Last Operation If It Alone --- ///
  195.                         size -= 1;
  196.                     }
  197.  
  198.                     bool flag = C.isValidOperations(buffer ,size);
  199.  
  200.                     if( flag ) /// --- The Operations Are Right --- ///
  201.                     {
  202.                         num res = C.longOperation(buffer ,size);
  203.                         C.editRes(res ,isOp( buffer[0] ) ? buffer[0] : '=');
  204.                     }
  205.                     else
  206.                     {
  207.                         print('Wrong Operation In The Input !!\n\n');
  208.                         break;
  209.                     }
  210.  
  211.                 } while( buffer != "End" );
  212.  
  213.                 print('Last Ans = ${C.getRes()}\n\n');
  214.             } break;
  215.  
  216.             case '0':
  217.                 print('\nThanks.\n_______________\n');
  218.                 break;
  219.  
  220.             default:
  221.                 print('Error !! UnValid Operation !!');
  222.                 break;
  223.         }
  224.     } while( ch != '0' );
  225. }
  226.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement