Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:io';
- bool isOp(String c)
- {
- return (c == '*' || c == '/' || c == '-' || c == '+');
- }
- num _pow(num __n , num __p){
- if( __p == 0 ) return 1;
- if( __p % 2 == 1 ) return __n * _pow( __n ,__p - 1);
- num R = _pow( __n , __p / 2);
- return R * R;
- }
- num stringConverter(String s){
- num res = 0;
- for(num i = s.length - 1 ,j = 0 ; i >= 0 ; i-- , j++)
- res += _pow(10 ,j) * num.parse(s[i]);
- return res;
- }
- class Calculator
- {
- num _result;
- Calculator()
- {
- this._result = 0.0;
- }
- num Calc(String op ,num a ,num b)
- {
- num Res = 0;
- switch( op )
- {
- case '+':
- Res = a + b;
- break;
- case '-':
- Res = a - b;
- break;
- case '*':
- Res = a * b;
- break;
- case '/':
- Res = a / b;
- break;
- }
- return Res;
- }
- num longOperation(String s ,num Size)
- {
- bool LastType = isOp( s[0] ) ? true : false;
- /// --- 1 Operation - 0 Numbers --- ///
- List< String > input = [ s[0] ];
- num idx = 1;
- if( isOp( s[0] ) )
- {
- idx += 1;
- input = [ s[1] ];
- }
- for(; idx < Size ; idx++)
- {
- bool CurType = isOp( s[idx] ) ? true : false;
- if( LastType == CurType ) input[ input.length - 1 ] += s[ idx ];
- else input.add( s[ idx ] );
- LastType = CurType;
- }
- num lastIdx = 0;
- num res = 0.0;
- String resOperator = '+';
- for(num i = 0 ; i < input.length ; i++)
- {
- if( input[i] == "+" || input[i] == "-" )
- {
- num cur = stringConverter( input[lastIdx] );
- for(num j = lastIdx + 1 ; j < i ; j += 2)
- cur = Calc(input[j][0] ,cur ,stringConverter( input[j + 1] ) );
- res = Calc(resOperator ,res ,cur);
- resOperator = input[i][0];
- lastIdx = i + 1;
- }
- else if( i == input.length - 1 )
- {
- num cur = stringConverter( input[lastIdx] );
- for(num j = lastIdx + 1 ; j <= i ; j += 2)
- cur = Calc(input[j][0] ,cur ,stringConverter( input[j + 1] ) );
- res = Calc(resOperator ,res ,cur);
- }
- }
- return res;
- }
- bool isValidOperations(String s ,num size)
- {
- bool flag2 = false;
- bool flag1 = true;
- for(num i = 0 ; i < size && flag1 ; i++)
- {
- flag2 = true;
- if( !( s[i] is num ) && !isOp( s[i] ) )
- flag1 = false;
- if( i > 0 && isOp( s[i] ) )
- if( isOp( s[i - 1] ) )
- flag1 = false;
- }
- return (flag1 && flag2);
- }
- void editRes(num x ,String op)
- {
- switch( op )
- {
- case '+':
- _result += x;
- break;
- case '-':
- _result -= x;
- break;
- case '*':
- _result *= x;
- break;
- case '/':
- _result /= x;
- break;
- case '=':
- _result = x;
- break;
- }
- }
- num getRes()
- {
- var result = _result;
- return result;
- }
- }
- void main()
- {
- String ch;
- do
- {
- print('1 - (Enter Operation) : ');
- print('0 - (Exit !!) : ');
- print('Enter Choice : ');
- ch = stdin.readLineSync();
- switch( ch )
- {
- case '1':
- {
- String buffer;
- Calculator C;
- print('\nPress "End" To End ..\n\n');
- do /// --- Loop Of Input --- ///
- {
- print('Cur Res = ${C.getRes()} | New Operations (Without Spaces): ');
- buffer = stdin.readLineSync();
- num size = buffer.length;
- if( isOp( buffer[size - 1] ) )
- {
- /// --- Ignore The Last Operation If It Alone --- ///
- size -= 1;
- }
- bool flag = C.isValidOperations(buffer ,size);
- if( flag ) /// --- The Operations Are Right --- ///
- {
- num res = C.longOperation(buffer ,size);
- C.editRes(res ,isOp( buffer[0] ) ? buffer[0] : '=');
- }
- else
- {
- print('Wrong Operation In The Input !!\n\n');
- break;
- }
- } while( buffer != "End" );
- print('Last Ans = ${C.getRes()}\n\n');
- } break;
- case '0':
- print('\nThanks.\n_______________\n');
- break;
- default:
- print('Error !! UnValid Operation !!');
- break;
- }
- } while( ch != '0' );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement