您的位置:

实现带括号的四则运算c语言,实现带括号的四则运算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();

}

实现带括号的四则运算c语言,实现带括号的四则运算c语言是什么

2023-01-03
尖括号c语言,c语言尖括号含义

2023-01-03
c语言变量除号,c语言除号运算规则

2023-01-07
c语言运算级别高低,c语言什么符号运算级别最低

2022-11-25
c语言逗号运算急停,c语言 逗号运算

2023-01-04
c语言int小括号,c语言intmain后面括号里

2022-12-02
c语言宏的运算,c语言宏定义计算

2023-01-05
c语言乘号运算,c语言乘号运算符

2023-01-05
关于c语言异或运算的,C语言 异或运算

2023-01-04
c语言与运算具体怎么算,c语言的与运算

2022-11-25
c语言知识笔记,c语言最全笔记

2023-01-04
c语言判断括号,c语言里的括号

2022-11-28
c语言符位计算,c语言的位运算符号

2022-12-01
编程c语言包括什么,c语言编程

本文目录一览: 1、c语言程序由什么组成 2、c语言是什么 3、c语言都有什么? c语言程序由什么组成 C语言源程序是由:数据类型、常量与变量、数组、指针、字符串、文件输入/输出构成。具体介绍:1、数

2023-12-08
c语言中的实型号,c语言中实型数是什么

2023-01-05
c语言int括号,C语言中括号

2023-01-04
c语言的34个运算符,c语言34种运算符表

2022-11-25
c语言中的运算顺序是,c语言中的运算顺序是什么意思

2022-11-24
c语言八进制带符号,c语言八进制带符号怎么输入

2022-11-27
c语言位运算保留,c语言位运算的运算规则

2023-01-05