本次课程将实现一个简易的仅支持两个操作数运算的计算器,不涉及词法分析与语法树,课程内容很简单,适合 C 语言入门(刚掌握语法程度)的学生进行练手。
本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会使用到以下程序(均位于桌面):
-
Xfce 终端(Xfce Terminal): Linux 命令行终端,打开后会进入 Bash 环境,可以执行 Linux 命令。
-
Firefox:浏览器,可以用在需要前端界面的课程里,要双击打开环境里写的 HTML/JS 页面即可。
-
GVim:非常好用的编辑器,最简单的用法可以参考课程《Vim 编辑器》。
使用 GVim 编辑器输入实验所需的代码及文件,使用 Xfce 终端(Xfce Terminal)运行所需命令进行操作。
实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
本课程中的所有源码可以通过以下命令下载:
$ git clone http://git.shiyanlou.com/shiyanlou/Calculator
本次课程我们要使用 C 语言做一个简单的计算器,能执行加、减、乘、除操作。本程序涉及的所有数学知识都很简单,但输入过程会增加复杂性。因为我们需要检查输入,确保用户没有要求计算机完成不可能的任务。还必须允许用户一次输入一个计算式,例如:
32.4 + 32
或者 9 * 3.2
我们将要实现的计算器的执行流程如下:
- 获取用户输入的计算表达式。
- 检查输入的表达式格式,确保表达式对应的实际操作可以执行。
- 执行计算。
- 返回计算结果并在终端打印。
最终我们实现的计算器的运行效果如下图:
获得用户输入非常简单,可以使用 C 语言提供的格式化输入输出函数 printf()
和 scanf()
即可。
下面是负责读取用户输入部分的程序代码:
#include<stdio.h>
int main()
{
double number1=0.0; // 定义第一个操作数
double number2=0.0; // 定义第二个操作数
char operation=0; // operation 必须是 '+' '-' '*' '/' 或 '%'
printf("\nEnter the calculation\n");
scanf("%lf%c%lf",&number1,&operation,&number2);
return 0;
}
接下来我们程序所要实现的功能是对输入的运算表达式进行格式检查。
最基本检查的是我们必须要判断输入表达式所要执行的操作是否有效。有效的操作有 +, -, *, /, %
,所以需要检查输入的操作是否是属于定义中的一个。
另外值得注意的一点是,当输入的操作为 /
或者 %
时,第二个操作数不能为 0
。如果为 0
则操作无效。
以上逻辑判断过程可以通过 if
语句来完成,此外 switch
语句为此提供了一种更好的方式。因为它比起一系列的 if
语句来的更容易理解也更加简洁。
switch(operation)
{
case '+':
printf("=%lf\n",number1+number2);
break;
case '-':
printf("=%lf\n",number1-number2);
break;
case '*':
printf("=%lf\n",number1*number2);
break;
case '/':
if(number2==0)
printf("\n\n\aDavision by zero error!\n");
else
printf("=%lf\n",number1/number2);
break;
case '%':
if((long)number2==0)
printf("\n\n\aDavision by zero error!\n");
else
printf("=%ld\n",(long)number1%(long)number2);
break;
default:
printf("\n\n\aDavision by zero error!\n");
break;
}
取余运算符对 float
或 double
类型是没有意义的,因为它们可以表示精确的结果。只有把 %
运算符应用于整数类型才有意义。因此在应用这个运算符前,把操作数转换为整数。当运算符是 %
时,将第二个操作数转换为一个整数,所以仅仅检查第二个操作数是否为 0
是不够的,还必须检查 number2
在转换为 long
时,值是否为 0.
例如 0.5
不是 0
,但是转换为整数时就是 0
。
编写完程序文件之后,就可以对源文件进行编译获得可执行文件,编译的命令如下:
$ gcc -o Calculator Calculator.c
注意:上方
gcc
指令的格式为,gcc -o 生成文件名 源文件名.c
如果没有提供“生成文件名”,则默认生成文件名为a.out
。
这时候发现目录底下多出了一个 Calculator
文件,这就是我们通过编译链接源文件之后所得到的可执行文件,执行 ./Caculator
指令进行运行。
#include<stdio.h>
int main()
{
double number1=0.0;
double number2=0.0;
char operation=0;
printf("\nEnter the calculation\n");
scanf("%lf%c%lf",&number1,&operation,&number2);
switch(operation)
{
case '+':
printf("=%lf\n",number1+number2);
break;
case '-':
printf("=%lf\n",number1-number2);
break;
case '*':
printf("=%lf\n",number1*number2);
break;
case '/':
if(number2==0)
printf("\n\n\aDavision by zero error!\n");
else
printf("=%lf\n",number1/number2);
break;
case '%':
if((long)number2==0)
printf("\n\n\aDavision by zero error!\n");
else
printf("=%ld\n",(long)number1%(long)number2);
break;
default:
printf("\n\n\aDavision by zero error!\n");
break;
}
return 0;
}
本次课程我们使用 C 语言实现了一个简易的计算器。当然目前计算器能实现的功能还相当简陋,仅能支持两个操作数的简单计算。在这个计算器的基础上,同学们还可以继续扩展,比如能支持任意多个操作数的运算,或者引入运算符优先关系机制等等。