
c语言求解表达式问题,等待大师耐心解答,万分感谢。等待中,运算优先级问题先不说,暂定加乘优先于减除谢
#include<stdio.h>#include<stdlib.h>#include<math.h>#defineN500#defineM10#defineK10dou...
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 500
#define M 10
#define K 10
double wonder(char[]);
double caculate(int[],int[]);
void reform(int,int[],int[]);
int main()
{
double reasult;
char str[N];
//printf("程序旨在解决带有括号的整数算术表达式的计算,
//包括加减乘除运算,请输入表达式,\n以等号结尾:
//注:输入的表达式以字符串的形式交付系统,长度限定为%d字符,
//\n自定义每阶即每个括号里 %d目以内每目不超过%d位的运算.
//如不符合要求,请修改代码宏定义部分。",N,M,K);
gets(str); //读入表达式字符串
reasult = wonder(str);
printf("the reasult is %f\n",reasult);
}
//函数功能分类将数字和符号
double wonder(char str[])
{
int nums[M] = {0, 0 }, nums_t = 0; //nums 存储操作数 nums_t用于下标。
int numbits[K], i = 0 , numb_t = 0 , flag; //numbits 存储某个数各个数位 numb_t作下标
char str2[N / 2 + 1]; //flag用作标志,显示是否有数存进nums,并辅助运算
int sign[M - 1], sign_t = 0, str2_t = 0; //记录运算符号后下标,str2用存括号内的内容递归给wonder处理
while(str[i])
{ printf(" %c",str[i]);
if(str[i] <= '9'&&str[i] >= '0')
{ numbits[numb_t++] = str[i] - '0';
flag = numb_t; //分位采数
}
else
{ for( ;numb_t >= 1;numb_t--)
nums[nums_t] += (numbits[numb_t-1])*(int)pow(10,flag-numb_t); //数据采集合成
if(flag)
nums_t++,flag=0,numb_t=0;
switch(str[i])
{ case '(': printf("进入了这个case语句..."); //调试时用的语句发现进不去
while (str[++i]!=')')
str2[str2_t++]=str[i];
str2[str2_t] = '=';
nums[nums_t] = (int)wonder(str2);
nums_t++;
break;
case'+': sign[sign_t]=3;sign_t++;break; //数字用于运算优先级
case'-': sign[sign_t]=4;sign_t++;break;
case'*': sign[sign_t]=1;sign_t++;break;
case'/': sign[sign_t]=2;sign_t++;break;
case'=': return caculate( nums, sign); break;
default: printf("errorm %c",str[i]);exit(1);
}
}
i++;
}
}
double caculate( int nums[],int sign[]) //函数用于计算 n个数,n-1个运算符号,没有括号的情况
{
int i=0,j=0,k=1,n;
while(sign[i])
i++;
n=i;
for(j=1;j<=n+4;j++) //for(j=1;j<=4;j++)
{ i=0;
while(sign[i])
{
if(sign[i]==k)
switch(k) { case 1:nums[i]=nums[i]*nums[i+1];reform(i,nums,sign); break;
case 2:nums[i]=nums[i]/nums[i+1];reform(i,nums,sign); break;
case 3:nums[i]=nums[i]+nums[i+1];reform(i,nums,sign);break;
case 4:nums[i]=nums[i]-nums[i+1];reform(i,nums,sign);break;
default: printf("%d ERROR...",k);exit(1);
}
i++;
}
if((!sign[i])&&k<=4)
k++;
if(k>4)
return nums[0];
j++;
}
}
void reform(int i,int nums[],int sign[])
{
while(nums[i+2])
{
nums[i+1]=nums[i+2];
sign[i]=sign[i+1];
i++;
}
nums[i+1]='\0';
sign[i]='\0';
}
查错!
字数实在受限,故一些注释给去掉了,为置顶每过一会我就加20分,请高手耐心看,可能很麻烦,运行错误表现在多个数运算时,没括号的时候也不对了,原来还对,让我给修改的。。右括号连
case ‘(' :都进不去实在是纳闷。 展开
#include<stdlib.h>
#include<math.h>
#define N 500
#define M 10
#define K 10
double wonder(char[]);
double caculate(int[],int[]);
void reform(int,int[],int[]);
int main()
{
double reasult;
char str[N];
//printf("程序旨在解决带有括号的整数算术表达式的计算,
//包括加减乘除运算,请输入表达式,\n以等号结尾:
//注:输入的表达式以字符串的形式交付系统,长度限定为%d字符,
//\n自定义每阶即每个括号里 %d目以内每目不超过%d位的运算.
//如不符合要求,请修改代码宏定义部分。",N,M,K);
gets(str); //读入表达式字符串
reasult = wonder(str);
printf("the reasult is %f\n",reasult);
}
//函数功能分类将数字和符号
double wonder(char str[])
{
int nums[M] = {0, 0 }, nums_t = 0; //nums 存储操作数 nums_t用于下标。
int numbits[K], i = 0 , numb_t = 0 , flag; //numbits 存储某个数各个数位 numb_t作下标
char str2[N / 2 + 1]; //flag用作标志,显示是否有数存进nums,并辅助运算
int sign[M - 1], sign_t = 0, str2_t = 0; //记录运算符号后下标,str2用存括号内的内容递归给wonder处理
while(str[i])
{ printf(" %c",str[i]);
if(str[i] <= '9'&&str[i] >= '0')
{ numbits[numb_t++] = str[i] - '0';
flag = numb_t; //分位采数
}
else
{ for( ;numb_t >= 1;numb_t--)
nums[nums_t] += (numbits[numb_t-1])*(int)pow(10,flag-numb_t); //数据采集合成
if(flag)
nums_t++,flag=0,numb_t=0;
switch(str[i])
{ case '(': printf("进入了这个case语句..."); //调试时用的语句发现进不去
while (str[++i]!=')')
str2[str2_t++]=str[i];
str2[str2_t] = '=';
nums[nums_t] = (int)wonder(str2);
nums_t++;
break;
case'+': sign[sign_t]=3;sign_t++;break; //数字用于运算优先级
case'-': sign[sign_t]=4;sign_t++;break;
case'*': sign[sign_t]=1;sign_t++;break;
case'/': sign[sign_t]=2;sign_t++;break;
case'=': return caculate( nums, sign); break;
default: printf("errorm %c",str[i]);exit(1);
}
}
i++;
}
}
double caculate( int nums[],int sign[]) //函数用于计算 n个数,n-1个运算符号,没有括号的情况
{
int i=0,j=0,k=1,n;
while(sign[i])
i++;
n=i;
for(j=1;j<=n+4;j++) //for(j=1;j<=4;j++)
{ i=0;
while(sign[i])
{
if(sign[i]==k)
switch(k) { case 1:nums[i]=nums[i]*nums[i+1];reform(i,nums,sign); break;
case 2:nums[i]=nums[i]/nums[i+1];reform(i,nums,sign); break;
case 3:nums[i]=nums[i]+nums[i+1];reform(i,nums,sign);break;
case 4:nums[i]=nums[i]-nums[i+1];reform(i,nums,sign);break;
default: printf("%d ERROR...",k);exit(1);
}
i++;
}
if((!sign[i])&&k<=4)
k++;
if(k>4)
return nums[0];
j++;
}
}
void reform(int i,int nums[],int sign[])
{
while(nums[i+2])
{
nums[i+1]=nums[i+2];
sign[i]=sign[i+1];
i++;
}
nums[i+1]='\0';
sign[i]='\0';
}
查错!
字数实在受限,故一些注释给去掉了,为置顶每过一会我就加20分,请高手耐心看,可能很麻烦,运行错误表现在多个数运算时,没括号的时候也不对了,原来还对,让我给修改的。。右括号连
case ‘(' :都进不去实在是纳闷。 展开
2个回答
展开全部
就这块代码出了问题,帮你调好了,你试试吧,记着输入测试数据时,必须要以等号尾!
如:
1+2+3+4=
10
double caculate( int nums[],int sign[]) //函数用于计算 n个数,n-1个运算符号,没有括号的情况
{
int k=1;
for(k=1;k<=4;k++) //循环四次,每次处理一个运算级别
{
int i=0;
while(sign[i])
{
if(sign[i]==k)
{
switch(k)
{
case 1:nums[i]=nums[i]*nums[i+1];reform(i,nums,sign); break;
case 2:nums[i]=nums[i]/nums[i+1];reform(i,nums,sign); break;
case 3:nums[i]=nums[i]+nums[i+1];reform(i,nums,sign);break;
case 4:nums[i]=nums[i]-nums[i+1];reform(i,nums,sign);break;
default: printf("%d ERROR...",k);exit(1);
}
}
else
i++;
}
}
return nums[0];
}
如:
1+2+3+4=
10
double caculate( int nums[],int sign[]) //函数用于计算 n个数,n-1个运算符号,没有括号的情况
{
int k=1;
for(k=1;k<=4;k++) //循环四次,每次处理一个运算级别
{
int i=0;
while(sign[i])
{
if(sign[i]==k)
{
switch(k)
{
case 1:nums[i]=nums[i]*nums[i+1];reform(i,nums,sign); break;
case 2:nums[i]=nums[i]/nums[i+1];reform(i,nums,sign); break;
case 3:nums[i]=nums[i]+nums[i+1];reform(i,nums,sign);break;
case 4:nums[i]=nums[i]-nums[i+1];reform(i,nums,sign);break;
default: printf("%d ERROR...",k);exit(1);
}
}
else
i++;
}
}
return nums[0];
}
更多追问追答
追问
有括号的时候行吗,为啥就进不了那个case '(':呢
追答
我测试的可以啊:
12+(5-6)*4=
1 2 + (进入了这个case语句... 5 - 6 = * 4 =the reasult is 8.000000
这个函数我也略动了一些,不和你的比较了,你再按这个调一下试试
double wonder(char str[])
{
int nums[M] = {0}, nums_t = 0; //nums 存储操作数 nums_t用于下标。
int numbits[K]={0}, i = 0 , numb_t = 0 , flag=0; //numbits 存储某个数各个数位 numb_t作下标
char str2[N / 2 + 1]={0}; //flag用作标志,显示是否有数存进nums,并辅助运算
int sign[M - 1]={0}, sign_t = 0, str2_t = 0; //记录运算符号后下标,str2用存括号内的内容递归给wonder处理
while(str[i])
{
if(str[i] = '0')
{
numbits[numb_t++] = str[i] - '0';
flag = numb_t; //分位采数
}
else
{
for(;numb_t >= 1;numb_t--)
nums[nums_t] += (numbits[numb_t-1])*(int)pow(10,flag-numb_t); //数据采集合成
if(flag)
nums_t++,flag=0,numb_t=0;
switch(str[i])
{
case '(':
printf("进入了这个case语句..."); //调试时用的语句发现进不去
str2_t=0; //这里str2_t要赋值为0,每次str2应该是个新串!!!!!!
while (str[++i]!=')')
str2[str2_t++]=str[i];
str2[str2_t] = '=';str2[str2_t+1] = '\0'; //增加一个结束符
nums[nums_t] = (int)wonder(str2);
nums_t++;
break;
case'+': sign[sign_t]=3;sign_t++;break; //数字用于运算优先级
case'-': sign[sign_t]=4;sign_t++;break;
case'*': sign[sign_t]=1;sign_t++;break;
case'/': sign[sign_t]=2;sign_t++;break;
case'=':
return caculate( nums, sign); break;
default: printf("errorm %c",str[i]);exit(1);
}
}
i++;
}
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询