c语言数组中元素的加减乘除,c语言中,取余运算符和加减乘除的运算顺序??...

2014-11-25 回答

#include

#include

#define n 100

typedef struct{   //操作数栈

float d[n];

int len;     //len相当于top

}stacks,*lists;

typedef struct{  //运算符栈

char c[n];

int len;    //len相当于top

}stack,*list;

int init(list p);   //stack 初始化

int inits(lists p);    //stacks 初始化

int pushs(lists p,float m);   // stacks 入栈

int push(list p,char c);   //stack 入栈

int pops(lists p,float *m);  //stacks 出栈

int pop(list p,char *c);  //stack  出栈

int in(char c);  //判断c是否为数据 是则返回 1 否则 返回 0

char pre(char s,char c);  //判断s c的优先级 s>c return '>'; s

float operate(float a,char t,float b); //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b

float value(char s[]);  //求表达式s 的值

void main(){

char s[n];  int n; float f;

printf("*******************express evaluate***********************\n");

while(1){

printf("please input a express\n");

scanf("%s",s);    //输入表达式

n=strlen(s);    //求表达式的长度

printf("express length=%d\n",n); //输出表达式的长度

s[n]='#';    //在表达式尾部插入'#' 注: # 表示操作结束

f=value(s);   //计算表达式的长度

printf("f=%.5f\n",f);  //输出表达时的值 注 只输出前五位小数

printf("continue input 1,break input 0\n");

scanf("%d",&n); printf("\n");     //判断是否继续进操作  是则输入 1,否则输入 0

if(!n) break;  }

}

int init(list p){

if(!p) {printf("error,init stack null\n"); return 0;}

p->len=0;

return 1;

}

int inits(lists p){

if(!p) {printf("error,init stacks null\n"); return 0;}

p->len=0;

return 1;

}

int pushs(lists p,float m){

if(!p) {printf("error,pushs stacks null\n"); return 0;}

p->d[p->len++]=m; return 1;

}

int push(list p,char c){

if(!p) {printf("error,push stack null\n"); return 0;}

p->c[p->len++]=c; return 1;

}

int pops(lists p,float *m){

if(!p) {printf("error,push stacks null\n"); return 0;}

*m=p->d[--p->len]; return 1;

}

int pop(list p,char *c){

if(!p) {printf("error,push stack null\n"); return 0;}

*c=p->c[--p->len]; return 1;

}

int in(char c){  //判断c是否为数据 是则返回 1 否则 返回 0

if(c>='0'&&c<='9'||c=='.') return 1; return 0;}

char pre(char s,char c){  //判断s c的优先级 s>c return '>'; s

char m= '' , r;

if((s=='-')||(s=='+')){

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

r=m;

else r=k; }

if((s=='*')||(s=='/')){

if((c=='(')) r=m;

else r=k;  }

if(s=='('){

if(c==')') r=n;

else r=m;  }

if(s==')')

r=k;

if(s=='#') {

if(c=='#') r=n;

else r=m;  }

return r;

}

float operate(float a,char t,float b){   //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b

if(t=='-') return a-b;  if(t=='+') return a+b;

if(t=='*') return a*b;  if(t=='/') return a/b; }

float value(char s[]){

stacks opnd;  stack optr;  char *p,*pr,x,t; float a,b,m=0;

inits(&opnd); init(&optr);  int k=0,i,tp=10;

push(&optr,'#');  //将'#'压入栈optr中,作结束标志

p=pr=s;   //初始化 指针 p pr 使pr p 指向 表达式

while(*p!='#'||optr.c[optr.len-1]!='#'){//当p指向的操作符 和optr 中的栈顶元素都为'#'时 操作结束

if(in(*p))  //如果p指向数字 则把 数字字符串转化为实型(float)数据 并存入栈opnd中

{

m=0; k=0;  tp=10;

while(in(*p)) p++;  //使p指向下一个运算符

while(pr!=p)

{

if(*pr!='.')   //如果pr指向小数点 则跳过

m=(m+*(pr++)-'0')*10;  //将单个字数字符转化为数据 并逐位求和

else{                   //如 12.3 -> 1230

k=p-pr; pr++; }

}

for(i=0,tp=10;i

{

tp=tp*10;

if(i==k-1)

tp=tp/10;

}

pushs(&opnd,m/tp); //输入栈opnd中

}

else switch(pre(optr.c[optr.len-1],*p)){

case'

case'=':pop(&optr,&x);p++;pr=p;break;

case'>':pop(&optr,&t);  pops(&opnd,&b);  pops(&opnd,&a);  //输出一个操作符和两个数据

pushs(&opnd,operate(a,t,b));break;} //运算

}

return opnd.d[opnd.len-1]; //返回表达式的值

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值