关于c语言计算器的问题
这是一段一个简单功能计算器我的问题是为什么它能做到只看左括号不用检查右括号也能运算比如(1+1)能算出结果但是程序中并没有检查右括号另一个问题是((((1+1)^2)这样...
这是一段一个简单功能计算器 我的问题是 为什么它能做到只看左括号不用检查右括号也能运算
比如 (1+1)能算出结果 但是程序中并没有检查右括号
另一个问题是 ((((1+1)^2)这样的 不规范的写法也能输出答案 但是 我想能检查左括号与右括号的数量是否一致 请问如何在源程序上修改呢
额(⊙o⊙)…用知道很少这个所以没有分 真是不好意思 但是真的希望大家帮帮忙 ...这个问题挺重要的 谢谢了!
#include "stdio.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
double fun_1();
double fun_2();
double fun_3();
double fun_4();
double fun_5();
int n=0;
char calc[64];
double fun_1()
{
double t;
t=fun_2();
while((calc[n]=='+')||(calc[n]=='-'))
{
switch(calc[n])
{
case '+':n++,t=t+fun_2();break;
case '-':n++,t=t-fun_2();break;
}
}
return(t);
}
double fun_2()
{
double t;
t=fun_3();
while((calc[n]=='*')||(calc[n]=='/')||(calc[n]=='%'))
{
switch(calc[n])
{
case '*':n++,t=t*fun_2();break;
case '/':n++,t=t/fun_2();break;
case '%':n++,t=(int)t%(int)fun_2();break;
}
}
return(t);
}
double fun_3()
{
double t;
t=fun_4();
while(calc[n]=='^')
{
t=pow(t,fun_4());
n++;
}
return(t);
}
double fun_4()
{
double t;
char num[16];
int i=0;
if(calc[n]=='(')
{
n++;
t=fun_1();
n++;
}
else if(fun_5())
{
while(fun_5())
{
num[i++]=calc[n++];
}
num[i]='\0';
t=atof(num);
}
return(t);
}
double fun_5()
{
if(((calc[n]>='0')&&(calc[n]<='9'))||(calc[n]=='.'))
{
return(1);
}
else
{
return(0);
}
}
int main(void)
{
top:
n=0;
printf("Attention: if use REMAINDER,the type of number will change to INT,\n"
"that might cause data lose.\n");
printf("Please enter a mod like:");
printf("2+2*3+2^2\n");
gets(calc);
printf("%Result=%g\n",fun_1());
printf("Continue?(y/n)");
switch(getch())
{
case 'y':system("cls");goto top;
case 'n':exit(0);break;
default:exit(0);break;
}
return(0);
} 展开
比如 (1+1)能算出结果 但是程序中并没有检查右括号
另一个问题是 ((((1+1)^2)这样的 不规范的写法也能输出答案 但是 我想能检查左括号与右括号的数量是否一致 请问如何在源程序上修改呢
额(⊙o⊙)…用知道很少这个所以没有分 真是不好意思 但是真的希望大家帮帮忙 ...这个问题挺重要的 谢谢了!
#include "stdio.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
double fun_1();
double fun_2();
double fun_3();
double fun_4();
double fun_5();
int n=0;
char calc[64];
double fun_1()
{
double t;
t=fun_2();
while((calc[n]=='+')||(calc[n]=='-'))
{
switch(calc[n])
{
case '+':n++,t=t+fun_2();break;
case '-':n++,t=t-fun_2();break;
}
}
return(t);
}
double fun_2()
{
double t;
t=fun_3();
while((calc[n]=='*')||(calc[n]=='/')||(calc[n]=='%'))
{
switch(calc[n])
{
case '*':n++,t=t*fun_2();break;
case '/':n++,t=t/fun_2();break;
case '%':n++,t=(int)t%(int)fun_2();break;
}
}
return(t);
}
double fun_3()
{
double t;
t=fun_4();
while(calc[n]=='^')
{
t=pow(t,fun_4());
n++;
}
return(t);
}
double fun_4()
{
double t;
char num[16];
int i=0;
if(calc[n]=='(')
{
n++;
t=fun_1();
n++;
}
else if(fun_5())
{
while(fun_5())
{
num[i++]=calc[n++];
}
num[i]='\0';
t=atof(num);
}
return(t);
}
double fun_5()
{
if(((calc[n]>='0')&&(calc[n]<='9'))||(calc[n]=='.'))
{
return(1);
}
else
{
return(0);
}
}
int main(void)
{
top:
n=0;
printf("Attention: if use REMAINDER,the type of number will change to INT,\n"
"that might cause data lose.\n");
printf("Please enter a mod like:");
printf("2+2*3+2^2\n");
gets(calc);
printf("%Result=%g\n",fun_1());
printf("Continue?(y/n)");
switch(getch())
{
case 'y':system("cls");goto top;
case 'n':exit(0);break;
default:exit(0);break;
}
return(0);
} 展开
1个回答
展开全部
其实这段程序不仅没有检查右括号,而是其它字符也宽亏颤都没有检查。
只是检查左空态右括号数量一致很简单,统计各自出现的次数,比较是否相等就行了,当然还要任何时候右括号都不能比左括号多。
int check0( int ch )
{
char accept[] = "0123456789.+-*/^()";
int len = sizeof( accept );
int i;
for ( i = 0; i < len; i++ )
{
if ( ch == accept[i] )
return 1;
}
return 0;
}
int check()
{
return 1;
int left = 0;
int right = 0;
int ch;
int i;
for ( i = 0; ; i++ )
{
ch = calc[i];
if ( ch == '\0' )
break;
if ( !check0( ch ) )
return 0;
if ( ch == '(' )
left++;
else if ( ch == ')' )
{
right++;
if ( right > left )
return 0;
}
}
return left == right;
}
int main(void)
{
top:
n=0;
printf("Attention: if use REMAINDER,the type of number will change to INT,\n"
"that might cause data lose.\n");
printf("Please enter a mod like:");
printf("2+2*3+2^2\n");
gets(calc);
if ( check() )
printf("%Result=%g\n",fun_1());
else
printf( "Invalid input!\n" );
printf("Continue?(y/n)"慎败);
switch(getch())
{
case 'y':system("cls");goto top;
case 'n':exit(0);break;
default:exit(0);break;
}
return(0);
}
要实现一个计算器不是这么简单的。现在有括号的情况下计算结果可能是错误的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询