Pagini recente » Statistici lol lol (lol1) | Clasament blat5 | Istoria paginii utilizator/cnpr_slincu_lazar_manghiuc | Clasament prega_18.09 | Cod sursa (job #362714)
Cod sursa(job #362714)
//#include <iostream>
//#include <fstream>
//#include <string>
//#include <stack>
//
//using namespace std;
//bool cifra(string& s,unsigned long int& i){
// return (s[i]>='0' and s[i]<='9');
//}
//long int numar(string& s,unsigned long int&i){
// long int rez=0;
// while(cifra(s,i)){
// rez*=10;rez+=s[i]-'0';
// i++;
// }
// return rez;
//}
//
//
//int main(){
// ifstream in("evaluare.in");
// ofstream out("evaluare.out");
// string s;
// in>>s;
// stack<long int> operanzi;
//
//
// stack<char> operatori;
// unsigned long int i=0;
// while(i<s.length()){
// if(cifra(s,i)){
// operanzi.push(numar(s,i));
// }else if(s[i]=='+'){
// i++;
// if(operatori.empty()) operatori.push('+');
// else{
// if(operatori.top()=='+'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b+a);
// operatori.pop();
// }else if(operatori.top()=='-'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b-a);
// operatori.pop();
// }else if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// operatori.push('+');
// }
// }else if(s[i]=='-'){
// i++;
// if(operatori.empty()) operatori.push('-');
// else{
// if(operatori.top()=='+'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b+a);
// operatori.pop();
// }else if(operatori.top()=='-'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b-a);
// operatori.pop();
// }else if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// operatori.push('-');
// }
// }else if(s[i]=='*'){
// i++;
// if(operatori.empty()) operatori.push('*');
// else{
// if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// operatori.push('*');
// }
// }else if(s[i]=='/'){
// i++;
// if(operatori.empty()) operatori.push('/');
// else{
// if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// operatori.push('/');
// }
// }else if(s[i]=='('){
// i++;
// operatori.push('(');
// }else if(s[i]==')'){
// i++;
// while(operatori.top()!='('){
// if(operatori.top()=='+'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b+a);
// operatori.pop();
// }else if(operatori.top()=='-'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b-a);
// operatori.pop();
// }else if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// }
// operatori.pop();
// }
// }
//
// while(!operatori.empty()){
// if(operatori.top()=='+'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b+a);
// operatori.pop();
// }else if(operatori.top()=='-'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b-a);
// operatori.pop();
// }else if(operatori.top()=='*'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b*a);
// operatori.pop();
// }else if(operatori.top()=='/'){
// long int a,b;
// a=operanzi.top();operanzi.pop();
// b=operanzi.top();operanzi.pop();
// operanzi.push(b/a);
// operatori.pop();
// }
// }
// out<<operanzi.top();
//}
//
//
/*
* Se va folosi recursivitatea indirecta in rezolvarea problemei.
* Vom observa ca orice expresie este "impartita" in urmatoarele componente:
* 1) termeni ai unei adunari, separati de '+' sau '-'
* 2) factori ai unui produs, separati de '*' sau '/'
* 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
* Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
* si implicit a necesitatii recursivitatii indirecte.
*/
#include <cstdio>
const long MAX = 100010;
char S[MAX], *p=S;
long termen();
long factor();
/*
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
*/
long eval() {
long r = termen();
while ( *p=='+' || *p=='-' ) {
switch ( *p ) {
case '+':
++p; // trecem peste semnul "+"
r += termen();
break;
case '-':
++p; // trecem peste semnul "-"
r -= termen();
break;
}
}
return r;
}
/*
* Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
* lui din factori inmultiti.
*/
long termen() {
long r = factor();
while ( *p=='*' || *p=='/' ) {
switch ( *p ) {
case '*' :
++p;
r *= factor();
break;
case '/':
++p;
r /= factor();
break;
}
}
return r;
}
/*
* Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
* sau un numar natural
*/
long factor() {
long r=0;
if ( *p == '(' ) { // avem o subexpresie
++p; // trecem peste '('
r = eval();
++p; // trecem peste ')'
} else {
while ( *p>='0' && *p<='9' ) { // avem un numar
r = r*10 + *p - '0';
++p;
}
}
return r;
}
int main() {
fgets(S, MAX, fopen("evaluare.in", "r"));
fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());
return 0;
}