补:四则运算代码

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#include<math.h>
#define MAX_LINE 1024
struct shuzi{
int fenzi;
int fenmu;
};
int numi=0,stacki=0,result;

struct shuzi num[1000];
char stack[100],s[MAX_LINE],s1[MAX_LINE],s2[MAX_LINE],*q,*p,*P;
int gcd(int a, int b)
{
if(!b) return a;
else return gcd(b, a%b );
}
int chnum(char c)
{
switch (c)
{
case '0':return -1;
case '(':return 0;
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/':return 2;
case '^':return 3;
default:exit(1);
}
}
void change()
{
q=s1;
p=s;
stack[0]='0';
while (*p!='')
{
while ((*p>='0'&&*p<='9') || *p=='|')
*q++=*p++;
*q++=' ';
while (*p==' ')
p++;
if (*p=='')
break;
if (*p==')')
{
while (stack[stacki]!='(')
{
*q=stack[stacki--];
q++;
*q=' ';
q++;
}
stacki--;
p++;
}
else if (*p=='(')
{
p++;
stack[++stacki]='(';
q--;
}
else
{
if (chnum(*p)>=chnum(stack[stacki])) stack[++stacki]=*p;
else
{
while (chnum(*p)<=chnum(stack[stacki]))
{
*q=stack[stacki--];
q++;
*q=' ';
q++;
}
stack[++stacki]=*p;
}
p++;
}
}
while (stacki>0)
{
*q=stack[stacki--];
q++;
*q=' ';
q++;
}
while (*p==' ')
p++;
}
int readnum()
{
int s=0;
while (*q>='0'&&*q<='9')
{
s=s*10+*q-'0';
q++;
}
return s;
}
void cal()
{
q=s1;
char c;
int i;
double s;
int gongyueshu;
num[numi].fenzi=readnum();
//q++;
if(*q=='|'){
q++;
num[numi].fenmu=readnum();
}
else
num[numi].fenmu=1;
q++;
while (*q!='')
{
if(*q==' ')
q++;
while (*q=='+'||*q=='-'||*q=='*'||*q=='/'||*q=='^')
{
c=*q;
q++;
switch(c)
{
case '+':
num[numi-1].fenzi = num[numi-1].fenzi * num[numi].fenmu;
num[numi].fenzi = num[numi].fenzi * num[numi-1].fenmu;
num[numi-1].fenmu = num[numi-1].fenmu * num[numi].fenmu;
num[numi-1].fenzi = num[numi-1].fenzi + num[numi].fenzi;
gongyueshu=gcd(num[numi-1].fenzi,num[numi-1].fenmu);
num[numi-1].fenzi=num[numi-1].fenzi/gongyueshu;
num[numi-1].fenmu=num[numi-1].fenmu/gongyueshu;
numi--;
break;
case '-':
num[numi-1].fenzi = num[numi-1].fenzi * num[numi].fenmu;
num[numi].fenzi = num[numi].fenzi * num[numi-1].fenmu;
num[numi-1].fenmu = num[numi-1].fenmu * num[numi].fenmu;
num[numi-1].fenzi = num[numi-1].fenzi - num[numi].fenzi;
gongyueshu=abs(gcd(num[numi-1].fenzi,num[numi-1].fenmu));
num[numi-1].fenzi=num[numi-1].fenzi/gongyueshu;
num[numi-1].fenmu=num[numi-1].fenmu/gongyueshu;
numi--;
break;
case '*':
num[numi-1].fenzi = num[numi-1].fenzi * num[numi].fenzi;
num[numi-1].fenmu = num[numi-1].fenmu * num[numi].fenmu;
gongyueshu=gcd(num[numi-1].fenzi,num[numi-1].fenmu);
num[numi-1].fenzi=num[numi-1].fenzi/gongyueshu;
num[numi-1].fenmu=num[numi-1].fenmu/gongyueshu;
numi--;
break;
case '/':
num[numi-1].fenzi = num[numi-1].fenzi * num[numi].fenmu;
num[numi-1].fenmu = num[numi-1].fenmu * num[numi].fenzi;
gongyueshu=gcd(num[numi-1].fenzi,num[numi-1].fenmu);
num[numi-1].fenzi=num[numi-1].fenzi/gongyueshu;
num[numi-1].fenmu=num[numi-1].fenmu/gongyueshu;
numi--;
break;
}
}
while (*q>='0'&&*q<='9')
{
num[++numi].fenzi=readnum();
if(*q=='|'){
q++;
num[numi].fenmu=readnum();
}
else
num[numi].fenmu=1;
q++;
}
}
}
int panduan(){
struct shuzi answer;
memset(s2, 0, sizeof(s2)-1);
printf("请输入答案:");
gets(s2);
q=s2;
if(*q=='-'){
q++;
answer.fenzi=-readnum();
if(*q=='|'){
q++;
answer.fenmu=readnum();
}
else
answer.fenmu=1;
}
else{
answer.fenzi=readnum();
if(*q=='|'){
q++;
answer.fenmu=readnum();
}
else
answer.fenmu=1;
}
if(answer.fenzi==num[0].fenzi && answer.fenmu==num[0].fenmu){
printf("回答正确! ");
return 1;
}
else{
printf("回答错误! ");
if(num[0].fenmu == 1){
printf("正确答案:%d ",num[0].fenzi);
}
else{
printf("正确答案:%d|%d ",num[0].fenzi,num[0].fenmu);
}
return 0;
}
}

void main(){
int right=0;
int N=0;
FILE *fp;
int len;
if((fp = fopen("test.txt","r")) == NULL)
{
perror("fail to read");
exit (1) ;
}
while(fgets(s,MAX_LINE,fp) != NULL)
{
N++;
len = strlen(s);
s[len-1] = '';
printf("第%d道:",N);
puts(s);
change();
cal();
right = right +panduan();
printf("回答正确%d道. ",right);
printf("回答错误%d道. ",N-right);
printf("************************** ");
memset(s, 0, len-1);
memset(s1, 0, sizeof(s1)-1);
}
}

原文地址:https://www.cnblogs.com/13070037Yu/p/5295397.html