Solved programming problem

Infix(alphabetic) Calculation using file in C++.

Source code

#include <bits/stdc++.h>

using namespace std;

string prefix;

int op=0,eql=0,brkt=0;

int ok=0;

vector<int> dataSaved;

vector<string> charSaved;

string  ans;

string convertToint(string data)

{

    ans.clear();

    map<int,string>num1;

    num1[1] = "one";

    num1[2] = "two";

    num1[3] = "three";

    num1[4] = "four";

    num1[5] = "five";

    num1[6] = "six";

    num1[7] = "seven";

    num1[8] = "eight";

    num1[9] = "nine";

    num1[10] = "ten";

    int div=0;

    string a;

    for(int i=0; i<data.size(); i++)

    {

        if(data[i]>='a' && data[i]<='z')

        {

            div=1;

            if(div==1)

            {

                a +=data[i];

            }

        }

        else

        {

            div=0;

            if(a.size()>0)

            {

                for(int j=1; j<11; j++)

                {

                    if(a==num1[j])

                    {

                        stringstream ss;

                        ss << j;

                        string  n;

                        ss>>n;

                        ans += n;

                        a.clear();

                        break;

                    }

                }

            }

            ans+=data[i];

        }

    }

    if(a.size()>0)

    {

        for(int j=1; j<11; j++)

        {

            if(a==num1[j])

            {

                stringstream ss;

                ss << j;

                string  n;

                ss>>n;

                ans += n;

                a.clear();

                break;

            }

        }

    }

  //  cout<<"Ans writer fun: "<<ans<<endl;

    a.clear();

    return ans;

}

string writeAns(string str)

{

    map<int,string> num1;

    num1[1] = "one";

    num1[2] = "two";

    num1[3] = "three";

    num1[4] = "four";

    num1[5] = "five";

    num1[6] = "six";

    num1[7] = "seven";

    num1[8] = "eight";

    num1[9] = "nine";

    num1[10] = "ten";

    num1[11] = "eleven";

    num1[12] = "twelve";

    num1[13] = "thirteen";

    num1[14] = "fourteen";

    num1[15] = "quarter";

    num1[16] = "sixteen";

    num1[17] = "seventeen";

    num1[18] = "eighteen";

    num1[19] = "nineteen";

    num1[20] = "twenty";

    num1[30] = "thirty";

    num1[40] = "fourty";

    num1[50] = "fifty";

    num1[60] = "sixty";

    num1[70] = "seventy";

    num1[80] = "eighty";

    num1[90] = "ninety";

   stringstream ss;

   ss << str;

   int a ;

   ss>>a;

   if(a<20)

   {

     return num1[a];

   }

   else

   {

       if(a==20) return num1[20];

       else if(a==30) return num1[30];

       else if(a==40) return num1[40];

       else if(a==50) return num1[50];

       else if(a==60) return num1[60];

       else if(a==70) return num1[70];

       else if(a==80) return num1[80];

       else if(a==90) return num1[90];

       else if(a>20 && a<30)

       {

           int m = a%10;

           return num1[20]+num1[m];

       }

       else if(a>30 && a<40)

       {

           int m = a%10;

           return num1[30]+num1[m];

       }

       else if(a>40 && a<50)

       {

           int m = a%10;

           return num1[40]+num1[m];

       }

       else if(a>50 && a<60)

       {

           int m = a%10;

           return num1[50]+num1[m];

       }

       else if(a>60 && a<70)

       {

           int m = a%10;

           return num1[60]+num1[m];

       }

       else if(a>70 && a<80)

       {

           int m = a%10;

           return num1[70]+num1[m];

       }

       else if(a>80 && a<90)

       {

           int m = a%10;

           return num1[80]+num1[m];

       }

      else if(a>90 && a<100)

       {

           int m = a%10;

           return num1[90]+num1[m];

       }

   }

}

int priority(char c)

{

    if(c =='+' || c=='-')

    {

        return 1;

    }

    else if(c=='*' || c=='/')

    {

        return 2;

    }

    else if( c=='^')

    {

        return 3;

    }

    else return 0;

}

void countAll(string str)

{

    for(int i=0; i<str.size(); i++)

    {

        if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/')

        {

            op++;

        }

        if(str[i]=='=')

        {

            eql++;

        }

        if(str[i]=='(' || str[i]==')')

        {

            brkt++;

        }

    }

}

int calculate(int a, int b, char oprt)

{

    if(oprt=='+') return a+b;

    else if(oprt=='-') return a-b;

    else if(oprt=='*') return a*b;

    else if(oprt=='/') return a/b;

    else if(oprt=='^') return pow(a,b);

}

int  eveluate(string str)

{

    char c;

    int v=0,lastbrkt=0;

    stack <int> value;

    stack<char> oprt;

    cout<<"Do you want to save the data: "<<str<<" (y/n)"<<endl;

    cin>>c;

    ofstream file;

    file.open("outs.txt",ios_base::app);

    countAll(str);

    if(c=='y')

    {

        if(op==0 || (op==0 && eql==1))

        {

            str=writeAns(str);

            cout<<str<<endl;

            file<<str<<endl;

            file.close();

            return 0;

        }

    }

    else if(c=='n')

    {

        file<<"No Data Saved"<<endl;

        file.close();

    }

    string str1;

    string var;

    if(eql==1)

    {

        int i=0;

        for(i=0; str[i]!='='; i++)

        {

            var +=str[i];

        }

        for(i++; i<str.size(); i++)

        {

            str1 += str[i];

        }

    }

    else

    {

        str1=str;

    }

    while(!value.empty())

    {

        value.pop();

    }

    while(!oprt.empty())

    {

        oprt.pop();

    }

    for(int i = 0; i < str1.length(); i++)

    {

        if(str1[i] == ' ')

        {

            continue;

        }

        else if(str1[i] == '(')

        {

            oprt.push(str1[i]);

        }

        else if(isdigit(str1[i]))

        {

            int val = 0;

            while(i < str1.length() && (isdigit(str1[i])==1))

            {

                val = (val*10) + (str1[i]-'0');

                i++;

                if(str1[i]=='+' || str1[i]=='-'|| str1[i]=='*' || str1[i]=='/' || str1[i]=='^' || str1[i]==')' )

                {

                    i--;

                    break;

                }

            }

            value.push(val);

        }

        else if(str1[i]>='a' && str1[i]<='z')

        {

            string s;

            v++;

            s +=str1[i];

            for(i++;i<str1.size();i++)

            {

                if((str1[i]>='a' && str1[i]<='z'))

                {

                   s+=str1[i];

                }

                else

                {

                    i--;

                    break;

                }

            }

            int  a;// = searchVar(s);

            if(a==-1)

            {

                return 0;

            }

            else

            {

                str1[i]= (char)a;

                value.push(a);

            }

        }

        else if(str1[i] == ')')

        {

            lastbrkt=i;

            while(!oprt.empty() && oprt.top() != '(')

            {

                int val2 = value.top();

                value.pop();

                int val1 = value.top();

                value.pop();

                char op = oprt.top();

                oprt.pop();

                value.push(calculate(val1, val2, op));

            }

            oprt.pop();

        }

        else

        {

            while(!oprt.empty() && priority(oprt.top())>= priority(str1[i]))

            {

                int val2 = value.top();

                value.pop();

                int val1 = value.top();

                value.pop();

                char op = oprt.top();

                oprt.pop();

                value.push(calculate(val1, val2, op));

            }

            oprt.push(str1[i]);

        }

    }

    if(v>1)

    {

      while(!oprt.empty())

      {

        char op = oprt.top();

        oprt.pop();

      }

    }

    if(brkt<1)

    {

        while(!oprt.empty())

        {

            int val2 = value.top();

            value.pop();

            int val1=value.top();

            value.pop();

            char op = oprt.top();

            oprt.pop();

            value.push(calculate(val1, val2, op));

        }

    }

   if(lastbrkt!=str1.size()-2)

   {

     while(!oprt.empty())

        {

            int val2 = value.top();

            value.pop();

            int val1=value.top();

            value.pop();

            char op = oprt.top();

            oprt.pop();

            value.push(calculate(val1, val2, op));

        }

   }

    int ans = value.top();

   // cout<<"Ans: "<<ans<<endl;

    if(c=='y')

    {

         //   cout<<ans<<endl;

            stringstream ss;

            ss<<ans;

            string s;

            ss>>s;

            s=writeAns(s);

            file<<s<<endl;

        file.close();

        return 0;

    }

    else if(c=='n')

    {

        file<<"No Data Saved"<<endl;

        file.close();

    }

}

int  findError(string str)

{

    if(str[str.size()-1] !=';')

    {

        cout<<"Messing ';' For: "<<str<<endl;

        return 0;

    }

    for(int i=0; i<str.size(); i++)

    {

        if((str[i]=='+' || str[i]=='-'|| str[i]=='*' || str[i]=='/')    && (str[i-1]=='+' || str[i-1]=='-'|| str[i-1]=='*' || str[i-1]=='/') )

        {

            cout<<"Double Operator For: "<<str<<endl;

            return 0;

        }

        if(str[i]==')')

        {

            if(str[i+1]!=';')

            {

                if(str[i+1]=='+' || str[i+1]=='-' || str[i+1]=='*' || str[i+1]=='/')

                {

                    continue;

                }

                else

                {

                    cout<<"Wrong input formate For: "<<str[i+1]<<endl;

                    return 0;

                }

            }

            if(str[i-1]=='+' || str[i-1]=='-' || str[i-1]=='*' || str[i-1]=='/')

            {

                cout<<"Wrong input formate For: "<<str<<endl;

                return 0;

            }

        }

        if(str[i]=='(')

        {

            if(i!=0)

            {

                if(str[i-1]=='+' || str[i-1]=='-' || str[i-1]=='*' || str[i-1]=='/')

                {

                    continue;

                }

                else

                {

                    cout<<"Wrong input formate For: "<<str<<endl;

                    return 0;

                }

            }

           if(str[i+1]=='+' || str[i+1]=='-' || str[i+1]=='*' || str[i+1]=='/')

            {

                cout<<"Wrong input formate For: "<<str<<endl;

                return 0;

            }

        }

    }

    if(str[str.size()-2]=='+' || str[str.size()-2]=='-'  || str[str.size()-2]=='*' || str[str.size()-2]=='/' || str[0]=='+' || str[0]=='-'  || str[0]=='*' || str[0]=='/')

    {

        cout<<"Wrong input formate For: "<<str<<endl;

        return 0;

    }

    ok=1;

}

int main()

{

    ifstream file;

    file.open("ins.txt");

//   writeAns("74") ;

    while(!file.eof())

    {

        string data;

        getline(file, data);

       //  cout<<"Data111: "<<data<<endl;

        string d=convertToint(data);

      //  cout<<"Data: "<<d<<endl;

        findError(d);

       // cout<<"Data: "<<data<<endl;

        if(ok==1)

        {

            data[data.size()-1]='';

            op=0,eql=0,brkt=0,ok=0;

            eveluate(d);

            ok=0;

        }

         data.clear();

    }

    file.close();

    return 0;

}

Output

input file:

three*(two+one)

two

three*(one-one)

Do you want to save the data 3*(2+1): (y/n)

y

Do you want to save the data2: (y/n)

y

two

missing ; for 3*(1-1)

output file:

nine

two

Join the discussion

Add your comment