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

发布时间:2023-01-03

本文目录一览:

  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(left>0)
    {
        StringBracket(str1);
        j=strlen(str1);
        for( i=0; i<j; i++)
        {
            if(str1[i]== '(')
            {
                jk=0;
                for( k=i; k<j; k++)
                {
                    if(str1[k]== ')') break;
                    for( l=i+1; l<k-1; l++)
                    {
                        if(str1[l]== '('){jk++; break;}
                    }
                }
                if(jk==0)
                {
                    for(l=0; l<i; l++) str2[l]=str1[l];
                    str2[i]='\0';
                    for(l=k+1; l<j; 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; i<j-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; k2<j; k2++)
            {
                if((str1[k2]=='*'||str1[k2]=='/'||str1[k2]=='+'||str1[k2]=='-'))
                {
                    for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
                    sub_str2[j-k2]='\0';
                    break;
                }
            }
            if(k1<0) k1=-1;
            for(l=k1+1; l<i; l++) sub_str31[l-k1-1]=str1[l];
            sub_str31[i-k1-1]='\0';
            if(k2>=j) k2=j;
            for(l=i+1; l<k2; 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; i<j-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; k2<j-1; k2++)
            {
                if((str1[k2]=='+'||str1[k2]=='-'))
                {
                    k3=1;
                    for(l=k2; l<j; l++) sub_str2[l-k2]=str1[l];
                    sub_str2[j-k2]='\0';
                    break;
                }
            }
            for(l=0; l<i; l++) sub_str31[l]=str1[l];
            sub_str31[i]='\0';
            if(k2>=j) k2=j;
            if( k3==0) k2=j;
            for(l=i+1; l<k2; 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; i<j; i++)
    {
        if((str1[i]=='('))
        {
            SplitK(str1);
            break;
        }
    }
    for( i=0; i<j-1; i++)
    {
        if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
        {
            k=1;
            if(str1[0]=='-')
            {
                k=0;
                for( l=1; l<j-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; i<j-1; i++)
    {
        if((str1[i]=='*'||str1[i]=='/'||str1[i]=='+'||str1[i]=='-'))
        {
            k=1;
            if(str1[0]=='-')
            {
                k=0;
                for( l=1; l<j-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; i<j; i++)
    {
        if((str1[i]=='('))
        {
            SplitK(str1);
            break;
        }
    }
}
void StringBracket(char *str)
{
    int i,j,len;
    len=strlen(str);
    j=0;
    for(i=0; i<len; i++)
    {
        if(str[i]!=' ')
        {
            str[j]=str[i];
            j=j+1;
        }
    }
    str[j]='\0';
    if(j>0 && 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
#include<iostream>
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>
stack<type>::stack(int length)
{
    size=length; //防止输入不合理的数字
    top=-1;
    stackptr=new type[size];
}
template <class type>
bool stack<type>::isempty()const
{
    return top==-1;
}
template <class type>
bool stack<type>::isfull()const
{
    return top==size-1;
}
template <class type>
bool stack<type>::push(const type &data)
{
    if(!isfull())
    {
        stackptr[++top]=data;
        return true;
    }
    return false;
}
template <class type>
bool stack<type>::pop(type &popvalue)
{
    if(!isempty())
    {
        popvalue=stackptr[top--];
        return true;
    }
    return false;
}
template <class type>
type stack<type>::getTopValue()
{
    type temp;
    if(!isempty())
    {
        temp=stackptr[top];
    }
    return temp;
}
#endif

main.cpp

//copyright www
#include<iostream>
#include "stack.h"
using namespace std;
bool issign(char c); //判断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;
    cin>>c;
    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[])
{
    stack<double> number; //存放表达式的数值
    stack<char> sign; //存放表达式的符号
    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语言实现带括号的四则运算?

#include<stdio.h> /*库文件包含*/
#include<string.h> /*用于字符串操作*/
#include<stdlib.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. 除了左括号以外,所有出栈的元素都进入到后缀表达式队列中。
  8. 根据后缀表达式计算算式结果。

C语言实现带有括号的四则运算

#include<stdio.h>
#include<ctype.h>
#include<stdlib.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();
}