實現帶括號的四則運算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/zh-hant/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

發表回復

登錄後才能評論