读书人

C写个四则运算代码,该怎么处理

发布时间: 2012-04-02 19:58:59 作者: rapoo

C写个四则运算代码
一个简单的四则运算代码大概需要多少行啊?就是进行+-*/()运算的,我竟然写了将近300行...还不能删除错误输入...
#include <stdio.h>
#include <string.h>
#include <math.h>
void count(int n,char arr[],int *a)
{
int i=0,j,k=0,m;

while(arr[i])
{

if(arr[i]=='*')
{
a[n-strlen(arr)]=a[n-strlen(arr)]*a[n-strlen(arr)+1];
/*整型数组向前缩进一个*/
for(j=n-strlen(arr)+1;j<4;j++)
a[j]=a[j+1];
n--;/*算式减少一个*/
/*算式向前缩进*/
while(arr[i+k])
{
arr[i+k]=arr[i+k+1];
k++;
}
k=0;
i=0;
continue;
}
if(arr[i]=='/')
{
if(!a[n-strlen(arr)+1]) {printf("INPUT ERROR!");getch();return;}
m=a[n-strlen(arr)]/a[n-strlen(arr)+1];
if(a[n-strlen(arr)]!=m*a[n-strlen(arr)+1]){printf("INPUT

ERROR!");getch();return;}
a[n-strlen(arr)]=m;
for(j=n-strlen(arr)+1;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k])
{
arr[i+k]=arr[i+k+1];
k++;
}
k=0;
i=0;
continue;
}
if(arr[i]=='+')
{
if(arr[i+1]=='*')
{
a[n-strlen(arr)+1]=a[n-strlen(arr)+1]*a[n-strlen(arr)+2];
for(j=n-strlen(arr)+2;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k+1])
{
arr[i+k+1]=arr[i+k+2];
k++;
}
k=0;
i=0;
continue;
}
else if(arr[i+1]=='/')
{
if(!a[n-strlen(arr)+2]) {printf("INPUT ERROR!");getch();return;}
m=a[n-strlen(arr)+1]/a[n-strlen(arr)+2];
if(a[n-strlen(arr)+1]!=m*a[n-strlen(arr)+2]){printf("INPUT

ERROR!");getch();return;}
a[n-strlen(arr)+1]=m;
for(j=n-strlen(arr)+2;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k+1])
{
arr[i+k+1]=arr[i+k+2];
k++;
}
k=0;
i=0;
continue;
}
else
{
a[n-strlen(arr)]=a[n-strlen(arr)]+a[n-strlen(arr)+1];
for(j=n-strlen(arr)+1;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k])
{
arr[i+k]=arr[i+k+1];
k++;
}
k=0;
i=0;
continue;
}
}
if(arr[i]=='-')
{
if(arr[i+1]=='*')
{
a[n-strlen(arr)+1]=a[n-strlen(arr)+1]*a[n-strlen(arr)+2];
for(j=n-strlen(arr)+2;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k+1])
{
arr[i+k+1]=arr[i+k+2];
k++;
}
k=0;
i=0;
continue;
}
else if(arr[i+1]=='/')
{if(!a[n-strlen(arr)+2]) {printf("INPUT ERROR!");getch();return;}
m=a[n-strlen(arr)+1]/a[n-strlen(arr)+2];
if(a[n-strlen(arr)+1]!=m*a[n-strlen(arr)+2]){printf("INPUT

ERROR!");getch();return;}
a[n-strlen(arr)+1]=m;
for(j=n-strlen(arr)+2;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k+1])
{
arr[i+k+1]=arr[i+k+2];
k++;
}
k=0;
i=0;
continue;
}
else
{
a[n-strlen(arr)]=a[n-strlen(arr)]-a[n-strlen(arr)+1];
for(j=n-strlen(arr)+1;j<4;j++)
a[j]=a[j+1];
n--;
while(arr[i+k])
{
arr[i+k]=arr[i+k+1];
k++;
}
k=0;
i=0;
continue;
}
}
i++;
}
}
void main()
{
char arr1[20],arr2[5];
int a[5]={0,0,0,0,0};
char c;
int i=0,l=0,r=0,n=0,j=0,k=0,m=0;
system("CLS");
while(1)
{
c=getch();

if(c=='('||c==')'||(c>='0'&&c<='9')

||c=='+'||c=='-'||c=='*'||c=='/'||c=='\r');
else continue;/*限制只输入指定字符*/
if(i==0)/*第一次输入单列*/
{
if(c=='\r') {printf("ERROR:PLEASE INPUT\n");continue;}
if(c=='+'||c=='-'||c=='*'||c=='/'||c==')') continue;
if(c=='(') l++;
arr1[i++]=c;
printf("%c",c);
}
else {
if(c=='+'||c=='-'||c=='*'||c=='/')/*这些符号前不能为运算符和左括号

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

=='/'||arr1[i-1]=='(') continue;
if(c=='('&&((arr1[i-1]>='0'&arr1[i-1]<='9')||arr1[i-1]==')'))

continue;/*左括号前部为右括号和数字*/
if(c>='0'&&c<='9'&arr1[i-1]==')') continue;/*数字前不为右括号*/


if(c==')')
{
if(arr1[i-1]=='+'||arr1[i-1]=='-'||arr1[i-1]=='*'||arr1[i-1]

=='/'||arr1[i-1]=='(') continue;/*右括号前不为运算符和左括号*/
n=i-1;
while(arr1[n]!='(')/*括号里不能只有一个数字*/
{
if(arr1[n]<'0'||arr1[n]>'9') break;
n--;
}
if(arr1[n]=='(') continue;
if(r>=l) continue;
}
if(c=='\r') break;
if(c=='(') l++;
if(c==')') r++;
arr1[i++]=c;
printf("%c",c);
}}
arr1[i]='\0';
if(arr1[i-1]=='+'||arr1[i-1]=='-'||arr1[i-1]=='*'||arr1[i-1]

=='/'||l!=r){ printf("ERROR:INPUT WRONG!ENTER AGAIN!");l=0;r=0;}/*

最后一个不为运算符和左右括号不相等*/
else printf("\n%s=",arr1);
getch();
i=0;l=0;r=0;n=i;
while(arr1[i]!='\0')/*转换成整数*/
{
if(arr1[i]>='0'&arr1[i]<='9')
{
arr2[l++]=arr1[i];/*提取数字并在arr1中删除*/
while(arr1[n+1]!='\0')
{arr1[n]=arr1[n+1];n++;}
arr1[n]='\0';
n=i;/*这里应注意n应该等于i*/
continue;
}
arr2[l]='\0';
if(strlen(arr2)>0)
{
for(k=0;k<strlen(arr2);k++)
{a[m]+=(int)((arr2[k]-'0')*pow(10,strlen(arr2)-1-k));}/*pow返回的

是double类型,应该强制转换一下*/
m++;
arr2[0]='\0';/*防止重复转换*/
}
if(m==4) break;
i++;l=0;n=i;
}
if(strlen(arr2)>0)/*最后一个会提前跳出循环,所以在这里对最后一个进

行转换*/
{
for(k=0;k<strlen(arr2);k++)
{a[m]+=(int)((arr2[k]-'0')*pow(10,strlen(arr2)-1-k));}
m++;
}
if(m!=4) printf("Input Error!");
i=0;n=0;k=0;j=0;
while(arr1[i])
{
if(arr1[i]=='(')
{
l=i;k=0;
}
if(arr1[i]=='+'||arr1[i]=='-'||arr1[i]=='*'||arr1[i]=='/')
{
arr2[k++]=arr1[i];n++;
}
if(arr1[i]==')')
{
arr2[k]='\0';r=i;
count(n,arr2,a);
k=0;
while(arr1[r+j])
{
arr1[l+j]=arr1[r+j+1];
j++;
}
i=0;
n=0;j=0;
continue;
}
i++;
}
arr2[k]='\0';
count(n,arr2,a);
printf("%d\n",a[0]);
getch();
}

[解决办法]
帮顶..
[解决办法]
LZ用栈

我写过一个计算四则运算表达式的程序,100来行……

代码我已经没有了,找本数据结构的书,上面都有的。
[解决办法]
我这个比较短,但只能运算一次,不能和前面的累加运算。

C/C++ code
#include <stdio.h>#include <stdlib.h>int _my_add(int,int);int _my_sub(int,int);int _my_mul(int,int);int _my_div(int,int);int _my_mod(int,int);unsigned long (*_my_function(void))[2];int main(void){int number_one;int number_two;int number_control;int result;unsigned long (*temp_buffer)[2];temp_buffer = _my_function();while(1)    {        printf("这是一个简单的计算器,主要有下面的功能!\n");        printf("    1:加\n     2:减\n     3:乘\n     4:除\n     5:求模\n");        printf("请输入第一操作数  第二操作数  相关运算\n");        scanf("%d %d %d",&number_one,&number_two,&number_control);        if(((number_control == 4) && (!(number_two | 0x0)))|| number_control > 5)            {                printf("input is err\n");                continue;            }        result = ((int (*) (int,int))(*(*(temp_buffer + number_control - 1) + 0)))(number_one,number_two);        printf("\n%d %c %d = %d\n\n",number_one,*(*(temp_buffer + number_control - 1) + 1),number_two,result);    }return 0;} unsigned long (*_my_function(void))[2]{unsigned long (*function_buffer)[2];function_buffer = (unsigned long(*)[2])malloc(5);*(*(function_buffer + 0) + 0) = (unsigned long) _my_add;*(*(function_buffer + 0) + 1) = '+';*(*(function_buffer + 1) + 0) = (unsigned long) _my_sub;*(*(function_buffer + 1) + 1) = '-';*(*(function_buffer + 2) + 0) = (unsigned long) _my_mul;*(*(function_buffer + 2) + 1) = '*';*(*(function_buffer + 3) + 0) = (unsigned long) _my_div;*(*(function_buffer + 3) + 1) = '/';*(*(function_buffer + 4) + 0) = (unsigned long) _my_mod;*(*(function_buffer + 4) + 1) = '%';return function_buffer;} int _my_add(int number_one,int number_two){return number_one + number_two;} int _my_sub(int number_one,int number_two){return number_one - number_two;} int _my_mul(int number_one,int number_two){return number_one * number_two;} int _my_div(int number_one,int number_two){return number_one / number_two;} int _my_mod(int number_one,int number_two){return number_one % number_two;} 


[解决办法]
呵呵,看到了 以前的自己加油哈。

读书人网 >C语言

热点推荐