课题2.简易计算器的设计
问题描述:能够实现两个数的算术运算功能(加、减、乘、除)
1.基本要求
(1)依次输入第一个操作数、运算符、第二个操作数,然后输出运算结果,例如
输入: 13*8
输出: 13*8=104
(2)对错误的表达式有识别功能,例如输入: 12/0
输出: error! Please input again.
(3)除法运算的结果要保留小数位数2位;(4)当输入“exit”时,退出计算器;
(5)利用函数调用的方法实现计算器的计算功
能。
附上整个系统数据结构的定义及系统源代码,各自定义函数的声明部分中,要求对主要变量的作用进行注释,语句部分中要求对关键语句进行注释,以方便阅读和理解程序。
供参考:
#include <stdio.h>
#include <string.h>
void plus(double a, double b)
{
printf("%g + %g = %g\n", a, b, a + b);
}
void minus(double a, double b)
{
printf("%g - %g = %g\n", a, b, a - b);
}
void multiply(double a, double b)
{
printf("%g * %g = %g\n", a, b, a * b);
}
void divide(double a, double b)
{
printf("%g / %g = %.2f\n", a, b, a / b);
}
int main(void)
{
int ret;
char in[64] = { 0 }, x[16], y[16], op[10];
double a, b;//参加运算的两个数
while (1)
{
gets(in);//输入算式
if (strcmp(in, "exit") == 0) break; //输入“exit”时,退出计算器
ret = sscanf(in, "%[0-9.] %[^0-9. ] %[0-9.]", x, op, y);
if (ret == 3) {
sscanf(x, "%lf", &a);
sscanf(y, "%lf", &b);
if (strcmp(op, "+") == 0)
plus(a, b);
else if (strcmp(op, "-") == 0)
minus(a, b);
else if (strcmp(op, "*") == 0)
multiply(a, b);
else if (strcmp(op, "/") == 0 && b != 0)
divide(a, b);
else
printf("error!Please input again.\n");
}
else
printf("error!Please input again.\n");
}
return 0;
}
第一种方法,用简单的switch语句,分别讨论,但是这个有局限性,只能实行二元运算,讨论情况繁多。
第二种方法,用栈,构建两个栈,分别存储运算符和值,把表达式改为后缀表达式或者前缀表达式,进行操作。
#include<stdio.h>
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int main(int argc, const char *argv[])
{
/*
* 定义接收变量,运算字符;
*/
int a,b,d;
char ch;
/*
* 赋初值
*/
a = 0;
b = 0;
ch = '0';
/*
* 控制台输入运算变量,运算符;
*/
printf("请输入需要计算的数及运算符;格式如:'num1 +-x/ num2' \n");
scanf("%d%c%d",&a,&ch,&b);
/*
* 输入数据判断
*/
while((ch != '+')&&(ch != '-')&&(ch != '*')&&(ch != '/'))
{
//fflush(stdin);此种清空缓冲区无效
setbuf(stdin,NULL);
printf("输入运算符有误,请重新输入:\n");
scanf("%c",&ch);
}
/*
* 除数为0做判断
*/
if((ch == '/')&&(b==0))
{
setbuf(stdin,NULL);
printf("除数不能为0,请重新输入:\n");
scanf("%d",&b);
}
/*
* 识别不同运算字符,做不同的运算;
*/
switch(ch)
{
case '+':
printf("%d+%d=%d\n",a,b,add(a,b));
break;
case '-':
printf("%d-%d=%d\n",a,b,sub(a,b));
break;
case '*':
printf("%d*%d=%d\n",a,b,mul(a,b));
break;
case '/':
printf("%d/%d=%d\n",a,b,div(a,b));
break;
default:
printf("Error\n");
}
return 0;
}
/*
* 定义运算函数
*/
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}