数据类型:整型、字符型、浮点型、枚举、数组、结构体,以及指针等; 基本语句:顺序、循环、分支、跳转等; 算术运算:加、减、乘、除等; 输入输出处理:字符串的格式化输入输出,实现命令行交互。
只实现两个数之间的四则运算; 输入序列为[第一个数] [运算符号] [第二个数]; 使用switch-case分支语句处理计算逻辑; 对无效数字和无效符号进行判断。
根据上述功能规划实现的第一版程序,同学们可以参考一下:
#include
#include
int main(int argc, char *argv[]) {
double num1, num2, result; // 声明变量
char op;
printf("请输入第一个数字:");
scanf("%lf", &num1);
printf("请输入运算符:");
scanf(" %c", &op);
printf("请输入第二个数字:");
scanf("%lf", &num2);
switch(op) { // 根据运算符进行相应运算
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if(num2 == 0) { // 处理除数为0的情况
printf("错误:除数不能为0\n");
exit(1);
}
result = num1 / num2;
break;
default: // 处理无效运算符的情况
printf("错误:%c 是无效运算符\n", op);
exit(1);
}
printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
return 0;
}
审查上述代码,我们以double类型来定义待计算的变量,以char类型将运算符作为字符型存储,然后通过switch-case条件分支语句对运算符进行识别并处理。
判断出除数不能为零的错误运行示例:
#define STACK_SIZE 128
double eval_expr(char* expr) {
// 定义运算符栈和操作数栈
char op_stack[STACK_SIZE];
double num_stack[STACK_SIZE];
对于每个token in expr:
如果 token 是操作数:
将 token 解析为操作数,并压入 num_stack
如果 token 是运算符:
当 op_stack 非空 且 栈顶运算符的优先级 >= token 的优先级:
弹出栈顶运算符,从 num_stack 弹出两个操作数进行运算,并将结果压入 num_stack
将 token 压入 op_stack
当 op_stack 非空:
弹出栈顶运算符,从 num_stack 弹出两个操作数进行运算,并将结果压入 num_stack
return num_stack 的栈顶元素
}
为了更好地理解,我们来观察一个混合运算示例:"3 * 4 + (2 - 1) / 5 ^ 2"。
// 在“3 * 4”入栈后,栈中数据如下
num_stack = [3, 4];
op_stack = [*];
// 遇到 + 号,它的优先级低于 * 号,暂停入栈,将 3 * 4 出栈先行计算,再将结果12入栈
num_stack = [12];
op_stack = [+];
// “(2-1”入栈之后数据如下
num_stack = [12, 2, 1];
op_stack = [+, (, -];
// 遇到右括号,停止入栈,要匹配左括号,并弹出栈中数据进行计算
num_stack = [12, 1];
op_stack = [+];
// “/5^2”入栈后数据如下
num_stack = [12, 1, 5, 2];
op_stack = [+, /, ^];
// 接下来依次对出栈数据进行计算,得到结果
num_stack = [12.04];
op_stack=[];
同学们可以在前面完成的完整示例的基础上添加功能,将伪代码改写为具体的功能实现。这个功能更加复杂,实现的时候要有耐心,把握细节,同时多考虑错误处理和异常情况。
通过这个主题,同学们了解了如何使用 C 语言构建一个简单的计算器,并掌握了处理用户输入、表达式解析和求值的基本技术。同时可以进一步扩展计算器的功能或进行其他有趣的项目,以便继续发展和挑战自己。
对于有更高追求的同学们,可以系统地学习《C Primer Plus 第6版》这本书,它包含了更丰富、更详细的 C 语言知识,学会它你就能实现任何想要的功能。
▲限时特惠5折
读懂《C Primer Plus(第6版)》,
首先,本书从 C 语言的基本概念开始,逐步引导同学们掌握语法、数据类型、运算符和流程控制等基本知识; 其次,书中的解释和示例都非常清晰明了,避免了过多的专业术语和复杂语法的使用。作者通过贴近生活的示例和实际编程问题,帮助同学们更好地理解抽象的概念; 最后,书中还提供了大量的练习题和编程挑战,同学们可以通过实践不断巩固所学知识,快速理解并应用所学内容,建立起对 C 语言编程的基础认知。