本帖最后由 水边的小姑娘 于 2022-10-31 12:48 编辑
这是一个可以连续计算的版本,跟我们平常用的计算器差不多。
效果如下:
代码如下:#include <stdio.h>
#include <stdlib.h>
float result=0;
void calculate (float,char,float);
void plus (float,float);
void mutiply (float,float);
int main(void)
{
char c,ch;
float op1,op2;
start :
printf ("please input a formula:\n");
scanf ("%f%c%f",&op1,&c,&op2);
fflush(stdin);
calculate(op1,c,op2);
printf ("P for QUIT,R for restart...");
ch = getchar();
fflush(stdin);
while ((ch != 'p')&&(ch != 'P'))
{
if ((ch=='r')||(ch=='R'))
{
goto start;
}
printf ("please input:\n");
scanf ("%c%f",&c,&op2);
fflush(stdin);
op1 = result;
calculate(op1,c,op2);
printf ("P for QUIT,R for restart...");
ch = getchar();
fflush(stdin);
}
system ("pause");
return 0;
}
void calculate(float op1,char c,float op2)
{
switch (c)
{
case '-':op2 = -op2;
case '+':plus(op1,op2);break;
case '/':
{
if (op2 == 0) {printf ("the formula is wrong!\n");break;}
else {op2 = 1/op2;}
}
case '*':mutiply(op1,op2);break;
default:break;
}
}
void plus(float op1,float op2)
{
result = op1+op2;
printf ("the result is %.2f\n",result);
}
void mutiply(float op1,float op2)
{
result = op1*op2;
printf ("the result is %.2f\n",result);
}
用了goto,有点愧疚
想请教一下大佬们,怎么实现这样的操作:输入一个四则运算的算式,直接按四则运算规定的顺序计算并且输出结果。
只用告诉我实现的方法就可以了。
其实flex&bison更适合做这件事
sh-5.1$ ls
Makefile parser.y scanner.l
sh-5.1$ cat scanner.l
%option noyywrap
/*%option debug*/
%{
#include "parser.h"
%}
%%
"//".* {}
([1-9]+[0-9]*)|0 {sscanf(yyget_text(), "%d", &yylval); return NUMBER;}
[[:space:]]+ {}
. {return yyget_text()[0];}
%%
sh-5.1$ cat parser.y
%define parse.trace
%define parse.lac full
%define parse.error detailed
%{
#include <stdio.h>
int yylex(void);
void yyerror(const char *s) {
fprintf(stderr, "bc: %s\n", s);
}
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%%
line: %empty
| line ';'
| line exp ';' {printf("= %d\n", $2);}
;
exp: NUMBER
| exp '+' exp {$$ = $1 + $3;}
| exp '-' exp {$$ = $1 - $3;}
| exp '*' exp {$$ = $1 * $3;}
| exp '/' exp {$$ = $1 / $3;}
| '(' exp ')' {$$ = $2;}
| '|' exp %prec UMINUS {$$ = $2 < 0 ? -$2 : $2;}
| '-' exp %prec UMINUS {$$ = -$2;}
;
%%
int main(void) {
//yydebug = 1;
yyparse();
return 0;
}
sh-5.1$ cat Makefile
CFLAGS = -g -Wall -Wextra -Wno-unused-function
all: calc
calc: scanner.o parser.o
$(CC) $(CFLAGS) -o $@ $^
parser.c scanner.c: parser.y scanner.l
flex -o scanner.c scanner.l
bison --header=parser.h -o parser.c parser.y
clean:
rm -f calc
rm -f scanner.o parser.o
rm -f scanner.c parser.c
rm -f parser.h
sh-5.1$ make
flex -o scanner.c scanner.l
bison --header=parser.h -o parser.c parser.y
cc -g -Wall -Wextra -Wno-unused-function -c -o scanner.o scanner.c
cc -g -Wall -Wextra -Wno-unused-function -c -o parser.o parser.c
cc -g -Wall -Wextra -Wno-unused-function -o calc scanner.o parser.o
sh-5.1$ ls
calc Makefile parser.c parser.h parser.o parser.y scanner.c scanner.l scanner.o
sh-5.1$ ./calc
1+2*3-4/5;
= 7
sh-5.1$
|