本文目录一览:
- 1、用简单的C语言实现带括号的四则运算
- 2、C语言程序设计:实现带有括号的四则运算
- 3、用简单的C语言实现带括号的四则运算?
- 4、如何运用大一C语言基础编写简单带括号的四则运算?
- 5、C语言实现带有括号的四则运算
用简单的C语言实现带括号的四则运算
考虑复杂的表达式,不可能简单吧。
#include stdlib.h
#include math.h
#include conio.h
#include stdio.h
#include string.h
void SplitK(char *str);
void SplitPrem(char *str);
void Combine(float f1,char Operate,float f2);
void StringBracket(char *str);
char str1[100],str2[100],str3[100],sub_str1[100],sub_str2[100],sub_str3[20];
char sub_str31[20],sub_str32[20],str_4[100],operate;
int pause=0,left=0,k1,k2,k3;
float f1=0.0,f2=0.0, f=0.0;
void main()
{
float temp;
printf("Please input a description :\n");
scanf("%s",str1);
SplitK(str1);
temp=atof(str1);
printf("description value is %.2f\n",temp);
}
void SplitK(char *str)
{
int i,j,k,l,jk;
left=0;
while(*str) {
if(*str == '(') left++;
str++;
}
str2[0]='\0';
str3[0]='\0';
if(left0)
{
StringBracket(str1);
j=strlen(str1);
for( i=0; ij; i++)
{
if(str1[i]== '(')
{
jk=0;
for( k=i; kj; k++)
{
if(str1[k]== ')') break;
for( l=i+1; lk-1; l++)
{
if(str1[l]== '('){jk++; break;}
}
}
if(jk==0)
{
for(l=0; li; l++) str2[l]=str1[l];
str2[i]='\0';
for(l=k+1; lj; l++) str3[l-k-1]=str1[l];
str3[j-k-1]='\0';
for(l=i+1; l=k-1; l++) str1[l-i-1]=str1[l];
str1[k-i-1]='\0';
break;
}
}
}
}
SplitPrem(str1);
}
void SplitPrem(char *str)
{
int i,j,k,l;
f1=0.0;
f2=0.0;
pause=0;
strcpy(str1,str);
StringBracket(str1);
j=strlen(str1);
for( i=1; ij-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
for( k1=i-2; k1=0; k1--)
{
if((str1[k1]=='*'||str1[k1]=='/'||str1[k1]=='+'||str1[k1]=='-'))
{
for( l=0; l=k1; l++) sub_str1[l]=str1[l];
sub_str1[k1+1]='\0';
break;
}
}
for( k2=i+2; k2j; k2++)
{
if((str1[k2]=='*'||str1[k2]=='/'||str1[k2]=='+'||str1[k2]=='-'))
{
for(l=k2; lj; l++) sub_str2[l-k2]=str1[l];
sub_str2[j-k2]='\0';
break;
}
}
if(k10) k1=-1;
for(l=k1+1; li; l++) sub_str31[l-k1-1]=str1[l];
sub_str31[i-k1-1]='\0';
if(k2j) k2=j;
for(l=i+1; lk2; l++) sub_str32[l-i-1]=str1[l];
sub_str32[k2-i-1]='\0';
f1=atof(sub_str31);
f2=atof(sub_str32);
Combine(f1,operate,f2);
}
if(pause==1) break;
}
j=strlen(str1);
for( i=1; ij-1; i++)
{
if((str1[i]=='+'||str1[i]=='-'))
{
strcpy(sub_str1," ");
strcpy(sub_str2," ");
strcpy(sub_str3," ");
strcpy(sub_str31," ");
strcpy(sub_str32," ");
operate=str1[i];
sub_str1[0]='\0';
k3=0;
for( k2=i+2; k2j-1; k2++)
{
if((str1[k2]=='+'||str1[k2]=='-'))
{
k3=1;
for(l=k2; lj; l++) sub_str2[l-k2]=str1[l];
sub_str2[j-k2]='\0';
break;
}
}
for(l=0; li; l++) sub_str31[l]=str1[l];
sub_str31[i]='\0';
if(k2j) k2=j;
if( k3==0) k2=j;
for(l=i+1; lk2; l++) sub_str32[l-i-1]=str1[l];
sub_str32[k2-i-1]='\0';
f1=atof(sub_str31);
f2=atof(sub_str32);
Combine(f1,operate,f2);
}
if(pause==1) break;
}
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
StringBracket(str1);
j=strlen(str1);
str2[0]='\0';
str3[0]='\0';
for( i=0; ij; i++)
{
if((str1[i]=='('))
{
SplitK(str1);
break;
}
}
for( i=0; ij-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
k=1;
if(str1[0]=='-')
{
k=0;
for( l=1; lj-1; l++)
{
if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
{
k=1;
break;
}
}
}
if(k==0) break;
if(k==1)
{
SplitPrem(str1);
break;
}
}
}
}
void Combine(float f1,char Operate,float f2)
{
int i,j,k,l;
f=0.0;
switch (Operate) {
case '+':
f=f1+f2;
break;
case '-':
f=f1-f2;
break;
case '*':
f=f1*f2;
break;
case '/':
if(f2!=0)
f=f1/f2;
break;
}
sprintf(sub_str3,"%5.3f",f);
strcpy(str1,sub_str1);
strcat(str1,sub_str3);
strcat(str1,sub_str2);
StringBracket(str1);
j=strlen(str1);
for( i=0; ij-1; i++)
{
if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
{
k=1;
if(str1[0]=='-')
{
k=0;
for( l=1; lj-1; l++)
{
if((str1[l]=='*'||str1[l]=='/'||str1[l]=='+'||str1[l]=='-'))
{
k=1;
break;
}
}
}
if(k==0) break;
if(k==1)
{
SplitPrem(str1);
break;
}
}
}
pause=1;
strcpy(str_4,str2);
strcat(str_4,str1);
strcat(str_4,str3);
strcpy(str1,str_4);
str2[0]='\0';
str3[0]='\0';
StringBracket(str1);
j=strlen(str1);
for( i=0; ij; i++)
{
if((str1[i]=='('))
{
SplitK(str1);
break;
}
}
}
void StringBracket(char *str)
{
int i,j,len;
len=strlen(str);
j=0;
for(i=0; ilen; i++)
{
if(str[i]!=' ')
{
str[j]=str[i];
j=j+1;
}
}
str[j]='\0';
if(j0 str[j-1]=='.')
{
str[j-1]='\0';
j=j-1;
}
}
C语言程序设计:实现带有括号的四则运算
呵呵。不知道你是否过关了。我是才看到。我写了个c++版本的。
stack_h文件
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#includeiostream
using namespace std;
template class type
class stack
{
public:
stack(int = STACK_INIT_SIZE);
~stack()
{
delete []stackptr;
}
bool push(const type );
bool pop(type );
bool isempty()const;
bool isfull()const;
type getTopValue();
private:
int size;
int top;
type* stackptr;
};
template class type
stacktype::stack(int length)
{
size=length; //防止输入不合理的数字
top=-1;
stackptr=new type[size];
}
////////////////////////////////////////////
templateclass type
bool stacktype::isempty()const
{
return top==-1;
}
///////////////////////////////////////////
templateclass type
bool stacktype::isfull()const
{
return top==size-1;
}
//////////////////////////////////////////
templateclass type
bool stacktype::push(const type data)
{
if(!isfull())
{
stackptr[++top]=data;
return true;
}
return false;
}
/////////////////////////////////////////
templateclass type
bool stacktype::pop(type popvalue)
{
if(!isempty())
{
popvalue=stackptr[top--];
return true;
}
return false;
}
templateclass type
type stacktype::getTopValue()
{
type temp;
if(!isempty())
{
temp=stackptr[top];
}
return temp;
}
#endif
main.cpp
//copyright www
#includeiostream
#include "stack.h"
using namespace std;
bool issign(char );//判断c中的值是否为运算符,如果是则返回1
char Precede(char c1,char c2);//比较运算符之间的优先级
double Operate(double a,char theta, double b);//计算a theta b 的值
double EvaluateExpression(char m[]);//表达式求值
int main()
{
char c[60];
cout"please input the expression and end with '=': "endl;
cinc;
double result=0;
result=EvaluateExpression(c);
cout"the result is :"result;
system("pause");
return 0;
}
//
bool issign(char c)
{
if(c!='+'c!='-'c!='*'c!='/'c!='='c!='('c!=')')
return 0;
else
return 1;
}
char Precede(char c1,char c2)
{
switch(c1)
{
case '+':if(c2=='+'||c2=='-'||c2==')'||c2=='=') return '';
else return '';break;
case '-':if(c2=='+'||c2=='-'||c2==')'||c2=='=') return '';
else return '';break;
case '*':if(c2=='(') return '';
else return '';break;
case '/':if(c2=='(') return '';
else return '';break;
case '(':if(c2==')') return '=';
else return '';break;
case ')': return '';break;
case '=':if(c2=='=') return '=';
else return '';break;
default:return 0;
}
}
double Operate(double a,char theta, double b)
{
switch(theta)
{
case '+': return a+b;break;
case '-': return a-b;break;
case '*': return a*b;break;
case '/': if(b!=0) {return a/b;break;}
else cout"分母不能为零!,输入错误"endl;
default: return 0;
}
}
double EvaluateExpression(char m[])
{
stackdoublenumber; //存放表达式的数值
stackcharsign;//存放表达式的符号
sign.push('=');//把等号存入符号栈中,用来判断表达式已经计算完毕
double stored_a,stored_b;//已经存入stackintnumber的值
int i=0;//m的下标
char signal;//保存符号
while( m[i]!='='||sign.getTopValue()!='=')
{
if(!issign(m[i]))
{
char*p=m[i];
while(!issign(m[i])||m[i]=='.')
{
i++;
}
number.push(atof(p)); //如果不是运算符,则转换为浮点型并且压入存放数字的栈中
}
else
{
switch( Precede(sign.getTopValue() , m[i]))
{
case '':
sign.push(m[i]);i++;break;
case '=':sign.pop(signal);i++;break;
case '':
sign.pop(signal);
number.pop(stored_a);
number.pop(stored_b);
number.push(Operate(stored_b , signal , stored_a));
break;
}
}
}
double result;
number.pop(result);
return result;
}
绝对原创。
用简单的C语言实现带括号的四则运算?
#includestdio.h /*库文件包含*/
#includestring.h /*用于字符串操作*/
#includestdlib.h /*用于exit函数*/
/**************************************************************************
int check(char *c)
输入参数:
char *c: 输入的字符串
返回参数:
0:字符串中有不符合规定的字符
1: 字符串字符符合规定,没有不符合规定的字符.
功能:
检查字符串中有否除了 0-9, +,-,*,/,(,),之外的其他字符,
如果有,则返回0, 表示出现错误。
若没有,则返回1,表式字符串符合规定。
**************************************************************************/
int check(char *c)
{
int k=0;
while(*c!='\0')
{
if((*c='0' *c='9') || *c=='+' ||
*c=='-' || *c=='*' || *c=='/' ||
*c=='.' || *c=='(' || *c==')' )
{
}
else
{
printf("input error, there have the char not the math expression char!\n");
return 0;
}
if(*c=='(')
k++;
else if(*c==')')
k--;
c++;
}
if(k!=0)
{
printf("input error, there is not have correct bracket '()'!\n");
return 0;
}
return 1;
}
如何运用大一C语言基础编写简单带括号的四则运算?
利用堆栈将中缀表达式转换为后缀表达式计算。简单给你讲一下算法:
1.从中缀表达式中逐字符读入操作数
2.若操作数为数字,直接输出到后缀表达式队列
3.若操作数为左括号(,将其压栈
4.若操作数为加减乘除运算符,将其与栈顶元素比较:
①操作数优先级高于栈顶元素,则将操作数压栈;
②操作数优先级等于或低于栈顶元素,先将栈顶元素出栈,然后将操作数压栈。
5.若操作数为右括号),从栈顶元素开始出栈,直到遇到左括号(为止,左括号也出栈。若直到栈底仍然没有发现左括号,返回表达式匹配错误(说明右括号过多)
6.表达式读取完毕,开始将栈中所有剩余元素出栈。若出栈过程中发现有左括号,返回表达式匹配错误(说明左括号过多)
除了左括号以外,所有出栈的元素都进入到后缀表达式队列中。
7.根据后缀表达式计算算式结果。
C语言实现带有括号的四则运算
#includestdio.h
#includectype.h
#includestdlib.h
char token[61]; /*存放表达式字符串的数组*/
int n=0;
void error(void) /*报告错误函数*/
{
printf("ERROR!\n");
exit(1);
}
void match(char expected) /*检查字符匹配的函数*/
{
if(token[n]==expected)
token[++n]=getchar();
else error();
}
double term(void); /*计算乘除的函数*/
double factor(void); /*处理括号和数字的函数*/
double exp(void) /*计算加减的函数*/
{
double temp=term();
while((token[n]=='+')||(token[n]=='-'))
switch(token[n])
{
case'+':match('+');
temp+=term();
break;
case'-':match('-');
temp-=term();
break;
}
return temp;
}
double term(void)
{
double div;
double temp=factor();
while((token[n]=='*')||(token[n]=='/'))
switch(token[n])
{
case'*':match('*');
temp*=factor();
break;
case'/':match('/');
div=factor();
if(div==0) /*处理除数为零的情况*/
{
printf("The divisor is zero!\n");
exit(1);
}
temp/=div;
break;
}
return temp;
}
double factor(void)
{
double temp;
char number[61];
int i=0;
if(token[n]=='(')
{
match('(');
temp=exp();
match(')');
}
else if(isdigit(token[n])||token[n]=='.')
{
while(isdigit(token[n])||token[n]=='.') /*将字符串转换为浮点数*/
{
number[i++]=token[n++];
token[n]=getchar();
}
number[i]='\0';
temp=atof(number);
}
else error();
return temp;
}
main()
{
double result;
FILE *data=fopen("61590_4.dat","at");
if(data==NULL)
data=fopen("61590_4.dat","wt");
if(data==NULL)
return 0;
token[n]=getchar();
result=exp();
if(token[n]=='\n')
{
token[n]='\0';
printf("%s=%g\n",token,result);
fprintf(data,"%s=%g\n",token,result);
}
else error();
fclose(data);
return 0;
getch();
}