初学C语言,写给自己的第一个实用程序

计算器:第一个实用程序

在 C 语言编程的学习之路上,同学们在了解基本概念,掌握基础语法之后,一定跃跃欲试想要给自己开发一款有意义的实用程序。

编程实现计算器是一个不错的选择。因为它难度适中,需要用到的知识又恰好涵盖了 C 语言的基本关键点,还具有一定的实用性,是 C 语言初学者比较适合的练手项目。

在进行下一步练习之前,同学们先对照一下自己是否掌握以下知识:

  • 数据类型:整型、字符型、浮点型、枚举、数组、结构体,以及指针等;
  • 基本语句:顺序、循环、分支、跳转等;
  • 算术运算:加、减、乘、除等;
  • 输入输出处理:字符串的格式化输入输出,实现命令行交互。

如果上述知识点都已经掌握,那么我们来考察一下计算器程序都有哪些功能。

大家都使用过手持式计算器,它有一个窗口可以显示输入的数字和计算的结果,还有若干包含数字和运算符的按键,我们通过按键输入数字和运算符完成计算。

以手持式计算器作为参考,我们可以将程序设计为命令行式交互,接收键盘输入的数字和运算符,计算后将结果显示在屏幕上。这里面需要考虑如何对四则运算表达式求值、数据的验证、交互的友好性等问题。

我们现在开始手撸一个计算器程序吧。

手写计算器

在动手写代码前,我们要先确定具体要实现的功能。因为在没想清楚时就一头扎到代码的细节里,写着就会发现难度比自己想象中要大。例如四则运算的混合运算就要判断运算符的优先级,这对于初学者来说实现起来并不容易。

所以我们可以遵循最小可用原则,即规划功能尽量从简单实现开始,但要保证核心功能是完备的。在完成一个版本之后,再增加复杂度,不断迭代前进。

这样既可以保证每一步都能得到可用的程序,还让自己的信心逐渐增强。对于第一版计算器程序,规划以下核心功能:

  • 只实现两个数之间的四则运算;
  • 输入序列为[第一个数] [运算符号] [第二个数]
  • 使用switch-case分支语句处理计算逻辑;
  • 对无效数字和无效符号进行判断。

根据上述功能规划,实现的第一版程序,同学们可以参考一下。

#include <stdio.h>
#include <stdlib.h>

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条件分支语句对运算符进行识别并处理。

我们可以在 Linux 环境下使用 gcc 工具编译、运行调试、测试示例代码。

正常运行示例:
在这里插入图片描述

错误的符号运行示例,判断出&是无效字符:
在这里插入图片描述

判断出除数不能为零的错误运行示例:
在这里插入图片描述

至此,一个能完成两个数之间四则运算的简单计算器程序就开发好了。同学们一定会发现这个程序还有许多地方是可以优化的,例如输入的不是数字,而是字符串,会发生什么?或者交互方式是不是还可以更加友好一些?

所有有待改进之处,同学们都可以去积极探索。接下来我们就将挑战一个更有难度的功能,就是如何实现复杂表达式的计算。

更进一步:复杂表达式的计算

作为一款实用计算器,要能够依据运算符的优先级,实现对多个数的混合四则运算,并且还能支持括号的优先级处理。

这里需要引入一个数据结构——栈(stack),它的特点是“先进后出”,只能在栈顶执行压入(push)和弹出(pop)操作。我们需要创建两个栈:一个操作数栈和一个运算符栈。简单起见,栈可以用数组来实现。

有了栈之后,就要对表达式进行解析,通过对运算符和操作数的入栈、出栈操作,完成整个表达式的计算工作。根据运算符和括号的优先级顺序,从左至右遍历表达式,下面以伪代码的形式说明求值规则。

#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 语言构建一个简单的计算器,并掌握处理用户输入、表达式解析和求值的基本技术。同时可以进一步扩展计算器的功能或进行其他有趣的项目,以便继续发展和挑战自己。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《C语言程序设计第2版》是由李峰编的教材,主要介绍了C语言的基础知识及程序设计技巧。 这本教材首先介绍了C语言的起源和发展历程,以及C语言的特点和优势,让读者对C语言有一个整体的了解。然后,教材从C语言的基本语法开始讲解,包括数据类型、变量、常量、运算符、控制语句等,帮助读者建立起C语言的基础知识框架。接着,教材引入了C语言的数组、指针和字符串等高级特性,使读者能够更好地理解C语言的灵活性和强大性。 在教授C语言的同时,本书也强调了程序设计的方法和技巧。通过大量的例子和实践练习,读者能够锻炼自己的编程思维和动手能力,逐渐形成良好的编程习惯。此外,教材还介绍了一些实用的工具和技术,如调试技巧、模块化编程等,以帮助读者提高程序的效率和质量。 《C语言程序设计第2版》在内容上非常全面、系统,既适合初学者入门,也适合有一定编程经验的读者进一步提高。教材使用简洁明了的语言,结合实例进行讲解,使得读者能够较为轻松地掌握C语言的基本原理和编程技巧。此外,教材还包含了大量的习题和实践项目,以帮助读者巩固所学知识,提升编程能力。 总体而言,李峰的《C语言程序设计第2版》是一本权威且实用的C语言教材,无论是想要入门学习C语言还是提高C语言程序设计技能的读者,都会从这本书中获得很大的帮助。 ### 回答2: 《C语言程序设计第2版》是由李峰编的一本关于C语言程序设计的教材。这本教材主要面向初学者,用简洁明了的语言讲解了C语言的基本语法和常用的编程技巧。 首先,教材从C语言的概述开始,介绍了C语言与其他编程语言的区别,以及C语言程序的结构和基本程序的编方法。然后,教材详细讲解了C语言的各种数据类型、运算符、控制语句和函数,包括条件语句、循环语句、数组、指针等。 此外,教材还介绍了C语言的输入输出、文件操作等高级主题,以及C语言的一些高级特性,如结构体、联合体和位域等。通过实例和练习题的方式,教材帮助读者巩固所学知识,并培养编程思维和解决问题的能力。 与第一版相比,第二版增加了诸多新的内容,如函数指针、动态内存分配和模块化编程等。这些内容更贴近实际的编程需求和现代编程的发展趋势,使读者能够更全面地了解和运用C语言。 总的来说,《C语言程序设计第2版》通过全面而系统的讲解,帮助读者快速掌握C语言的基本知识和编程技巧。无论是从事软件开发、嵌入式系统开发,还是对计算机科学基础有兴趣的读者,都可以在这本教材中找到适合自己的学习内容。无论是作为初学者入门的教材,还是作为参考书籍,都足够实用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值