|
10鱼币
本帖最后由 水边的小姑娘 于 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$
复制代码
|
|