C语言编程中,怎样使输出的加减乘除是运算符?
题目是编程简易计算器。但试了几次,没有错误没有警告,却就是运算不出来。我想应该是运算符格式有错误。求高人指点啊!
题目是编程简易计算器。但试了几次,没有错误没有警告,却就是运算不出来。我想应该是运算符格式有错误。求高人指点啊!
答案:
#include<stdio.h>
#include<string.h>
#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<c return '<';s=c return '=' ;
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<c return '<';s=c return '=' ;
char m= '<' , n= '=' , k='>' , 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<k;i++) //求出除数tp 使1230除以tp(100)等于 12.3
{
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'<':push(&optr,*p);p++;pr=p;break;
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]; //返回表达式的值
}本人专写烂程序...呵呵
#include<stdio.h>
printf("+ - * /");
#include<string.h>
int main()
{
int a=0,b=0,i,flag=0;
char c,s[100];
printf("please input :");
scanf("%s",s);
for(i=0;i<strlen(s);i++)
{
if(s[i] >= 48)
{
if(flag == 0)
a=a*10+s[i] - 48;
else
b=b*10+s[i] - 48;
}
else
{
flag++;
c=s[i];
}
}
switch(c)
{
case '+' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a+b); break;
case '-' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a-b); break;
case '*' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a*b); break;
case '/' : printf("%d%c%d=%5.2f\n",a,c,b,(double)a/b); break;
}
return 0;
}
就是写在引号里应该是输入加减乘除运算符吧
就是直接输入计算表达式吧
这个需要你自己定义,检测表达式中的字符,是数字正常,是加减乘除则变为加减乘除,你输入的加减乘除号,系统是不认的,只有让系统自己输入就行了,不过这个有点难,要涉及到宏定义,还要判断符号优先级……