一家软件公司上机面试题目c++程序员

来源:互联网 发布:六扇门调查知乎 编辑:程序博客网 时间:2024/06/09 19:59

题目:

打开文本文件a.txt,文件中的每一行都有一个数学表达式,将他们运算出来,以后保存到b.txt中。

如:

a.txt

1+2/3*4=

2+1*5-6=

b.txt

1

1

以上是题目要求。

下面是主要代码。

是通过递归的方法实现的。

// diguisuanfa.cpp : Defines the entry point for the console application.
//


#include <iostream>
#include <string>
#include <fstream>
using namespace std;

inline int IsDigit(char c)
{
 return (c >= '0' && c <= '9') || c == '.';
}


string curr_token;

void NextToken(string& exp, int& curr)
{
    char result[64] ={0};
    int j = 0;
    result[j++] = exp[curr++];
    if (IsDigit(result[0])) while (IsDigit(exp[curr])) result[j++] += exp[curr++];
    curr_token = result;
}
double Evalue1(string& exp, int& curr);
double Evalue2(string& exp, int& curr);
double Evalue3(string& exp, int& curr);
double Evalue4(string& exp, int& curr);

double Evalue(string& exp)
{
    int curr = 0;
    NextToken(exp, curr);
    return Evalue1(exp, curr);
}

double Evalue1(string& exp, int& curr)
{
    double left_value = Evalue2(exp, curr);
    char ope;
    while ((ope = curr_token[0]) == '+' || ope == '-')
    {
        NextToken(exp, curr);
        double right_value = Evalue2(exp, curr);
        switch (ope)
        {
  case '+':left_value+=right_value;break;
  case '-':left_value-=right_value;break;
        }
    }
    return left_value;
}

double Evalue2(string& exp, int& curr)
{
    double left_value = Evalue3(exp, curr);
    char ope;
    while ((ope = curr_token[0]) == '*' || ope == '/')
    {
        NextToken(exp, curr);
        double right_value = Evalue3(exp, curr);
        switch (ope)
        {
  case '*':left_value*=right_value;break;
  case '/':left_value/=right_value;break;
        }
    }
    return left_value;
}

double Evalue3(string& exp, int& curr)
{
    char ope;
    double value;
    if ((ope = curr_token[0]) == '+' || ope == '-')
    {
        NextToken(exp, curr);
        value = Evalue4(exp, curr);
        if (ope == '-') value = -value;   
    }
    else
    {
        value = Evalue4(exp, curr);
    }
    return value;
}

double Evalue4(string& exp, int& curr)
{
    double value = 0;
    if (IsDigit(curr_token[0]))
    {
        value = atof(curr_token.c_str());
    }
    else if (curr_token[0] == '(')
    {
        NextToken(exp, curr);
        value = Evalue1(exp, curr);   
    }
    NextToken(exp, curr);
    return value;
}

int main(void)
{
 //=================================
    string exp = "12*(3+5)+4/(6-2)";

    cout << Evalue(exp) << endl;

   
 //==================================
 char szifile[256];
 char szofile[256];
   
 
 
    cout<<"请输要打开源文件名字:"<<endl;
 cin>>szifile;
 cout<<szifile<<endl;
 ifstream  i_file;
 i_file.open(szifile,ios::in);
 if (!i_file)
 {
  cout<<"源文件创建失败"<<endl;
  return 1;
 }
 
 
 
 cout<<"请输入存放文件的文件名字:"<<endl;
 cin>>szofile;
 cout<<szofile<<endl;
    ofstream  ofile;
 ofile.open(szofile,ios::out);
 if (!ofile)
 {
  cout<<"源文件打开失败!"<<endl;
  return 1;
 }


    char str[256];
 int i = 0;
 while (!i_file.eof())
 {
  i_file.getline(str,sizeof(str),'/n');
  cout<<str<<endl;
  
 
  string temp_exp = str;
     cout << Evalue(temp_exp)<<endl;
  int temp_i=Evalue(temp_exp);
  
  //===============store b.txt======
  ofile<<str<<temp_i<<endl;
  //===============store b.txt======
  cout<<i<<endl;
  i++;
 }


 i_file.close();
 ofile.close();
 //==================================


    return 0;
}

//程序下载地址:http://download.csdn.net/source/1462461

编译环境:VC++6.0   操作系统XP2