您的位置:

用c语言编写表达式求值下载,c语言编写函数表达式的求和

本文目录一览:

编写程序对表达式求值C语言

#include "stdio.h"

#include "malloc.h"

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

//构造一个空栈

Status InitStack(SqStack *S){

S-base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!S-base)

exit(OVERFLOW);

S-top=S-base;

S-stacksize=STACK_INIT_SIZE;

return OK;

}

//判断是否为空栈

Status StackEmpty(SqStack S){

if(S.top == S.base)

return TRUE;

else

return FALSE;

}

//用e返回S的顶元素

Status GetTop(SqStack S, SElemType *e){

if(S.top == S.base)

return ERROR;

*e = *(S.top-1);

return OK;

}

//插入e为新的顶元素

Status Push(SqStack *S, SElemType e){

if((S-top - S-base) = S-stacksize){

S-base = (

SElemType*)realloc(S-base,

(S-stacksize+STACKINCREMENT)*sizeof(SElemType)

);

if(!S-base)

exit(OVERFLOW);

S-top = S-base +S-stacksize;

S-stacksize += STACKINCREMENT;

}

*(S-top)=e;

S-top++;

return OK;

}

//删除S的顶元素,并用e返回其值

Status Pop(SqStack *S, SElemType *e){

if(S-top == S-base)

return ERROR;

S-top--;

*e = *(S-top);

return OK;

}

//从栈底到栈顶依次对S的每个元素调用函数Visit(),一旦失败操作无效

Status ListTraverse(SqStack S,Status (*visit)(SElemType)){

SElemType *p;

p=S.base;

for(p=S.base;pS.top;p++)

(*visit)(*p);

return OK;

}

//输出元素e

Status output(SElemType e){

printf("%d ",e);

return OK;

}

实现表达式求值的代码:

/*计算整数表达式的值

*表达式必须以#结束

*表达式中可以出现多位数字,

*表达式中可以出现空格

*运算符包括+,-,*,/,(,)

*运算结果可以是多位整数,并以整数的形式返回

*/

typedef int SElemType; /*放入堆栈的元素的类型*/

#include ctype.h

#include "stack_s.c"

/*判断输入的某个字符是否是运算符

*c表示输入的字符

*op数组中存放系统能识别的运算符

*/

Status in(char c,char op[]){

char *p;

p=op;

while(*p != '\0'){

if(c == *p)

return TRUE;

p++;

}

return FALSE;

}

/*比较两个运算符的优先级

*a,b中存放待比较的运算符

*''表示ab

*'0'表示不可能出现的比较

*/

char Precede(char a, char b){

int i,j;

char pre[][7]={

/*运算符之间的优先级制作成一张表格*/

{'','','','','','',''},

{'','','','','','',''},

{'','','','','','',''},

{'','','','','','',''},

{'','','','','','=','0'},

{'','','','','0','',''},

{'','','','','','0','='}};

switch(a){

case '+': i=0; break;

case '-': i=1; break;

case '*': i=2; break;

case '/': i=3; break;

case '(': i=4; break;

case ')': i=5; break;

case '#': i=6; break;

}

switch(b){

case '+': j=0; break;

case '-': j=1; break;

case '*': j=2; break;

case '/': j=3; break;

case '(': j=4; break;

case ')': j=5; break;

case '#': j=6; break;

}

return pre[i][j];

}

/*进行实际的运算

*a,b中分别以整数的形式存放两个待运算的操作数

*theta中存放代表操作符的字符

*结果以整数的形式返回

*/

int Operate(int a, char theta, int b){

int i,j,result;

i=a;

j=b;

switch(theta) {

case '+': result = i + j; break;

case '-': result = i - j; break;

case '*': result = i * j; break;

case '/': result = i / j; break;

}

return result;

}

/*从输入缓冲区中获得下一个整数或运算符,并通过n带回到主调函数

*返回值为1表示获得的是运算符

*返回值为0表示获得的是整形操作数

*/

int getNext(int *n){

char c;

*n=0;

while((c=getchar())==' '); /*跳过一个或多个空格*/

if(!isdigit(c)){ /*通过函数判断如果字符不是数字,那么只能是运算符*/

*n=c;

return 1;

}

do { /*能执行到该条语句,说明字符是数字,此处用循环获得连续的数字*/

*n=*n*10+(c-'0'); /*把连续的数字字符转换成相对应的整数*/

c=getchar();

} while(isdigit(c)); /*如果下一个字符是数字,进入下一轮循环*/

ungetc(c,stdin); /*新读入的字符不是数字,可能是运算符,为了不影响下次读入,把该字符放回到输入缓冲区*/

return 0;

}

int EvaluateExpression(){

int n;

int flag;

int c;

char x,theta;

int a,b;

char OP[]="+-*/()#";

SqStack OPTR;

SqStack OPND;

InitStack(OPTR);

Push(OPTR,'#');

InitStack(OPND);

flag=getNext(c);

GetTop(OPTR, x);

while(c!='#' || x != '#')

{

if(flag == 0)

{

Push(OPND,c);

flag = getNext(c);

} else

{

GetTop(OPTR, x);

switch(Precede(x, c))

{

case ''://栈顶元素优先级低

Push(OPTR,c);

flag = getNext(c);

break;

case '='://脱括号并接受下一字符

Pop(OPTR,x);

flag = getNext(c);

break;

case '':// 退栈并将运算结果入栈

Pop(OPTR, theta);

Pop(OPND,b);

Pop(OPND,a);

Push(OPND, Operate(a, theta, b));

break;

}

}

GetTop(OPTR, x);

}

GetTop(OPND, c);

return c;

}

void main(){

int c;

printf("Please input one expression:");

c=EvaluateExpression();

printf("Result=%d\n",c);

getch();

}

C语言编程(数据结构):表达式求值

/*在TC2 和 VC6下都可以顺利运行。

做了一个下午。一定要用我这个噢。

有简单的输入错误检测。有完整的说明和

注释*/

#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;

}

/**************************************************************************

void move(char *f, double *s,int p)

输入参数:

char *f : 运算符数组

double *s: 数值数组

int p: 当前运算符数组位置。

返回参数:

功能:

将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。

传入值p若为3

则当前符号的数组位置为3.

f[3]=f[3+1].......f[len-2]=f[len-1] f[len-1]='\0';

s[i]=s[i+1].......s[len-1]=s[len] 因为数值比运算符多一个。

***************************************************************************/

void move(char *f, double *s,int p)

{

int i=0,len=strlen(f);

for(i=p; ilen; i++) /*将已经运算过的符号,空出来的位置用后面的符号来填充,*/

{ /*即把乘和除号的位置用后面的加和减号填充*/

f[i]=f[i+1];

s[i]=s[i+1];

}

s[i]=s[i+1];

f[len-1]='\0';

}

/**************************************************************************

double convnum(char *c)

输入参数:

char *c :由数字和小数点组成的字符,用以转换成double型的数值。

返回参数:

num:返回转换好的值。

功能:

将输入的字符串先将其小数点以前的部分复制到temp[]数组中,

若有小数点,则将小数点之后的数值,也就是小数部分先进行计算,值存入num中

计算完成后,再对整数部分进行计算,值加上小数部分的值,存入num中。

***************************************************************************/

double convnum(char *c)

{

double num=0.0;

double a=1.0;

int i=0,p=0,len=0;

char temp[100];

int tempi=0;

int start=0;

int f=1; /*正负符号指示器,若为1则为正数,为-1,此数为负数*/

len=strlen©;

if(c[0]=='-')

{

start=1;

f=-1;

}

for(i=start; ilen; i++)

{

if(c[i]=='.')

{

p=i;

break;

}

temp[tempi++]=c[i]; /*将整数部分复制到temp[]中*/

}

temp[tempi]='\0';

if(p!=0)

{

for(i=p+1;ilen;i++) /*将小数部分计算出来*/

{

if(c[i]=='.') /*如果有多余的小数点,则表示输入错误*/

{

printf("there is more that one dot '.' in number!error!\n");

exit(0);

}

a=a*0.1;

num+=(a*(c[i]-48));

}

}

a=1.0;

len=strlen(temp); /*计算整数部分*/

for(i=len-1;i=0; i--)

{

num=num+(a*(temp[i]-48));

a*=10;

}

num=num*f;

return num;

}

/**************************************************************************

double good(char *c)

输入参数:

char *c :即将进行运算的字符串型数学表达式。如3.5+(2*3/5)

返回参数:

s[0]:计算结果将放入s[0]中

功能:

将输入的字符串中的数字分别调用convnum(char *c)函数进行数值变换,再将其依

次存入doulbe s[i]中,将加减乘除运算符依次存入字符串符号数组 char f[i]中,

然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此

good(char *c) 递归函数进行递归运算。 然后根据先乘除,后加减的顺序对已

存入数组的数值根 据存入字符串符号数组的运算符进行运算。结果存入s[0]中。

返回最终结果。

***************************************************************************/

double good(char *c) /*可递归函数*/

{ /*取得数值字符串,并调用convnum转换成double*/

char g[100],number[30]; /*g,保存当前的表达式串,number保存一个数的所有字符*/

char f[80]; /*保存所有的符号的堆栈*/

int fi=0; /*保存符号的位置指针*/

double s[80]; /*保存当前所有的数的一个堆栈*/

int si=0; /*保存数字位置指针*/

int k=0; /* 若k=1则表示有一对括号*/

int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/

int cc=0; /*乘除符号数量*/

int jj=0; /*加减符号数量*/

while(*c!='\0')/*当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/

{

k=0;

num=0;

switch(*c)

{

case '+': /*当前字符为+-乘除时则表示*/

case '-':

case '*':

case'/':

f[fi++]=*c;

if(*c=='*' || *c=='/')

cc++;

else

jj++;

if(*(c-1)!=')')

{

number[i]='\0';

i=0;/*完成一个数字的复制,其位置指针i=0*/

s[si++]=convnum(number);

}

break;

case'(': /*有括号,则将当前括号作用范围内的全部字符保存,作为*/

k++; /*一个新的字符表达式进行递归调用good函数计算。*/

while(k0)

{

c++;

g[num]=*c;

num++;

if(*c==')')

{

k--;

}

else if(*c=='(')

{

k++;

}

}

g[num-1]='\0';

num=0;/*完成一个括号内容的复制,其位置指针num=0*/

s[si++]=good(g);

break;

default:

number[i++]=*c;

if(*(c+1)=='\0')

{ number[i]='\0';

s[si++]=convnum(number);

}

break;

}

c++;

}

f[fi]='\0';

i=0;

while(cc0)

{

switch(f[i])

{

case '*': cc--;

s[i+1]=s[i]*s[i+1];

move(f,s,i);

break;

case '/': cc--;

s[i+1]=s[i]/(float)s[i+1];

move(f,s,i);

break;

default:

i++;

break;

}

}

i=0;

while(jj0)

{

switch(f[i])

{

case '+': s[i+1]=s[i]+s[i+1];

jj--;

move(f,s,i);

break;

case '-': s[i+1]=s[i]-s[i+1];

jj--;

move(f,s,i);

break;

default:

printf("operator error!");

break;

}

}

return s[0];

}

void main()

{

char str[100];

double sum=0;

int p=1;

while(1)

{

printf("enter expression: enter 'exit' end of program\n");

scanf("%s",str);

p=strcmp(str,"exit");

if(p==0)

break;

p=check(str);

if(p==0)

continue;

sum=good(str);

printf("%s=%f",str,sum);

printf("\n");

}

printf("good bye!\n");

}

例:

enter expression: enter 'exit' end of program

3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(输入)

3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667

enter expression: enter 'exit' end of program

china(输入)

input error, there have the char not the math expression char!

enter expression: enter 'exit' end of program

exit(输入)

good bye!

用C语言编写程序“算术表达式求值”

#include stdio.h

#include math.h

enum state

;

int ctoi( char c)

bool isNum( char a)

bool isOp(char op)

{

switch(op)

{

case '+':

return true;

break;

case '-':

return true;

break;

case '*':

return true;

break;

case '/':

return true;

break;

default:

return false;

break;

}

}

bool isDot(char dot)

int checkString( char str[], double *a, double * b, char* op, int num)

{

enum state s = BEGIN;

int a_i = 0;

int b_i = 0;

double num1 = 0;

double num2 = 0;

int pointNum = 0;

for( int i = 0; i num; ++i)

{

if(str[i] == ' ')continue;

switch(s)

{

case BEGIN:

if(isNum(str[i]))

elses = ERROR;

break;

case P2:

if(isNum(str[i]))

else if(isDot(str[i]))

{

s = P3;

}

else if(isOp(str[i]))

{

*op = str[i];

s = P5;

}

else

s = ERROR;

break;

case P3:

if(isNum(str[i]))

{

num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum) ;

s = P4;

}

else

s = ERROR;

break;

case P4:

if(isNum(str[i]))

{

num1 = num1 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P4;

}

else if(isOp(str[i]))

{

*op = str[i];

s = P5;

}

else

s = ERROR;

break;

case P5:

if(isNum(str[i]))

{

num2 = num2 * 10 + ctoi(str[i]);

s = P6;

}

else

s = ERROR;

break;

case P6:

pointNum = 0;

if(isNum(str[i]))

{

num2 = num2 * 10 + ctoi(str[i]);

s = P6;

}

else if(isDot(str[i]))

{

s = P7;

}

else

s = END;

break;

case P7:

if(isNum(str[i]))

{

num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P8;

}

else

s = END;

break;

case 8:

if(isNum(str[i]))

{

num2 = num2 + ctoi(str[i]) * pow(0.1, ++pointNum);

s = P8;

}

else if(isOp(str[i]))

{

s = END;

}

else

s = END;

break;

case ERROR:

printf("express error. \n");

break;

}

if (s == END || s == ERROR)

break;

}

if(s==END)

else

}

int main()

{

char op;

double a;

double b;

char string[128] = ;

scanf("%s", string);

printf("the expression you input is : %s. \n", string);

getchar();

if (-1 == checkString(string, a, b, op, 128))

{

printf("error occur while checking expression. Be sure no space in your expression when input\n");

getchar();

return 0;

}

double result;

switch(op)

{

case '+':

result = a + b;

break;

case '-':

result = a - b;

break;

case '*':

result = a * b;

break;

case '/':

if(b != 0)

result = a / b;

else

{

printf(" error! %d/%d", a, b);

return -1;

}

break;

default:

printf("undefined expression.\n");

break;

}

printf("%f %c %f = %f\n", a, op, b, result);

return 0;

}

用c语言编写表达式求值下载,c语言编写函数表达式的求和

2023-01-03
c语言表达式6ab,C语言表达式求值

2023-01-04
算术表达式求值数据结构c语言,表达式求值数据结构 c语言

2023-01-03
c语言笔段式,用c语言表示分段函数

2022-11-24
c语言算术表达式的语法分析,c语言表达式计算

2022-11-24
将数学表达式写成c语言表达式,将数学表达式写成c语言表达式的

2023-01-04
c语言表达式128,C语言表达式5278的值是

2023-01-05
c语言英文表达,c语言的英语

2022-11-28
c语言的赋值表达式语句规则,c语言中正确的赋值表达式

2023-01-05
c语言中逗号表达式由什么分隔,c语言里的逗号表达式

2022-11-30
公式求解c语言,C语言函数公式

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

2023-01-04
函数求值c语言,函数求值c语言怎么写

2022-11-29
c语言表达类型,c语言表达式种类

2022-12-01
c语言正确表式,c语言常用表达式

2022-12-02
c语言冒号:,c语言冒号表达式

2022-11-30
c语言怎么将一个表达式赋值,c语言中正确的赋值表达式

2023-01-03
c语言判断逻辑表达式真假,c语言表达式真假的值怎么表示

2022-11-29
c语言问号前后,c语言中的问号表达式

本文目录一览: 1、c语言中" : "(冒号)和问号是什么意思 2、C语言运算符中问号是什么意思 3、C语言中,问号表示什么意思? 4、C语言里面?问号什么意思?:什么意思? 5、C语言问号前后表达式

2023-12-08
电脑编写c语言,电脑编写c语言的软件

2022-11-24