2015-10-18 38 views
-2

!!!!严格无指针或数组!从文件中读取行并将它们分成两个数字并执行计算并将它们写入文件C++

文件中的示例内容。

33 + 20

最大的17和53

14减去-5

4次10

44 - 9

4×10

8/3

33 + 20

敏的67和83

分我写了下面的代码来识别关键字,但我无法获取数字

“# includeiostream”

“#includefstream”

“#includestring”

using namespace std;

INT主要(){

ifstream op; 
int s; 
string line; 
op.open("t.txt"); 
string f[10] = { "+", "plus", "-", "minus", "/", "divided", "Min", "Max", "*", "times" }; 

while (!op.eof()) { 

    getline(op, line); 
    cout << line << endl; 
    for (int i = 0; i < 3; i++) { 
     s = line.find(f[i]); 
     if (s!=-1) { 
      if (f[i] == "+" || f[i] == "plus") 
       cout << "perform addition" << endl; 
      else if (f[i] == "-" || f[i] == "minus") 
       cout << "Perform subtraction"<<endl; 
      else if (f[i] == "*" || f[i] == "times") 
       cout << "Perform multiplication" << endl; 
      else if (f[i] == "/" || f[i] == "divided") 
       cout << "Perform division" << endl; 
      else if (f[i] == "Max") 
       cout << "Max" << endl; 
      else if (f[i] == "Min") 
       cout << "Min" << endl; 

     } 
    } 
} 
op.close(); 
system("pause"); 

}

+0

!!!!严格无指针或数组! –

+1

字符串*是*字符数组... –

回答

1

好了,你有一个良好的开端,但你仍然有一些工作要做。你的循环将(大部分)找到每行执行的操作(注意这个一元减号)。找到操作的操作数会有点棘手,除非你被允许使用正则表达式,否则会涉及到一些字符操作。

基本的想法会像这样。从行首开始搜索,直到找到第一个数字。这是可以做到的任何数量的方式,包括使用库函数等ISDIGIT像更蛮力方法:

如果(行[I]> =“0” & &线[I] < =“9”)

一旦你在一个数字上,继续积累字符,直到你不再找到一个数字。您找到的数字可以通过多种方式转换为实际数字。您可以使用像atoi将库函数,你可以使用字符串流类,你可以使用scanf函数,或者你可以通过10以前的数乘以和加上当前数字建立自己的号:

int sum = 0; 
while (isdigit(line[i])) 
{ 
    sum = sum * 10 + line[i] - '0'; 
    i++; 
} 

一旦你停止查找数字,继续查看行中的字符,直到找到第二个数字。重复上述过程来创建第二个操作数。如前所述,您会想要处理一元减号出现的情况。此时,您应该有两个操作数和您的操作符,您可以执行表达式并输出结果。

+0

'strtol(const char * nptr,char ** endptr,int base)'可以为您做转换,并给出一个指向数字后第一个字符的指针。使用'strtol'库函数要比编写自己的函数好得多,因为它会是防弹的。我认为你的循环中已经有了一个bug:它应该是'sum = ... - '0'',而不是''a''。当扫描一个数字的开始时使用'isdigit'将会覆盖任何与区域相关的角落案例。 –

+0

@PeterCordes啊,你说得对,当然。在自动驾驶仪上的手指。我做了改变。 –

相关问题