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

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/205997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-07 17:48
下一篇 2024-12-07 17:48

相关推荐

  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python去掉数组的中括号

    在Python中,被中括号包裹的数据结构是列表,列表是Python中非常常见的数据类型之一。但是,有些时候我们需要将列表展开成一维的数组,并且去掉中括号。本文将为大家详细介绍如何用…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • Python Class括号中的参数用法介绍

    本文将对Python中类的括号中的参数进行详细解析,以帮助初学者熟悉和掌握类的创建以及参数设置。 一、Class的基本定义 在Python中,通过使用关键字class来定义类。类包…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python语言实现人名最多数统计

    本文将从几个方面详细介绍Python语言实现人名最多数统计的方法和应用。 一、Python实现人名最多数统计的基础 1、首先,我们需要了解Python语言的一些基础知识,如列表、字…

    编程 2025-04-28

发表回复

登录后才能评论