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

初学C语言入门必读~ 我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所有的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的;是他们发现了我们可以利用一个预先编写好的程序控制机器,并使之完成我们期望它完成的动作。建议大家在心里默念三遍他们的名字,以示仰慕。当然,如果让你们带着现在的知识回到他们的那个时代,那么就没... 阅读详情

计算器:第一个实用程序

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

C语言篇 -(1)初识C语言 - (2)第一个c语言程序 我是一名初学者,我会以我的角度来展现学习编程的一个过程,每个阶段的对知识点的理解都将写在上面,如果后续对知识点的理解有所偏差,我将会在最上面备注所要纠正的地方,并在新发布的博客上面,提醒之前哪个博客的知识点需要纠正,每个阶段全部发完之后将会总结在一个博客上面。(如果大佬看到我的知识点有错并评论,我将会感谢并纠正错误的知识点,欢迎各位批评指正) 阅读详情

相关推荐

C语言百例实用程序及流程图教程

C语言是一种广泛使用的通用编程语言,诞生于1972年,由贝尔实验室的Dennis Ritchie设计。它以其高效率、灵活性和强大的控制能力,成为了编程领域的一个重要基石。C语言在系统编程、嵌入式开发、操作系统等多个领域都扮演着关键角色。流程图是用图形化方式表示算法、工作流或过程的一种视觉工具,它使用一系列标准符号来展示系统各个组件之间的流程和动作。在软件开发过程中,流程图尤其重要,因为它提供了一种直观的分析、设计和文档化程序逻辑的方法。

weixin_34620658的博客 707

初学C语言,写给自己的第一个实用程序 |文末赠书

在 C 语言编程的学习之路上,同学们在了解基本概念、掌握基础语法之后,一定跃跃欲试想开发一款有意义的实用程序。编程实现计算器是一个不错的选择。因为它难度适中

weixin_42172526的博客 360

微信小程序 实现拼图功能

微信小程序 实现碎片拼图

weixin_45689786的博客 2251

C语言打印出心形表白,初学C语言也能看懂!!

例20:C语言实现打印出心形,初学者的表白神器。 解题思路:这道例题我分了4部分,前3行一部分,4-6行一部分,7-13行一部分,最后一行一部分,读者请仔细阅读注释,小林写的很详细了。 前三行输出,为了让初学者知道,即使最笨的方法也是可以打印的。 4-6行,这三行输出效果一样。 for(i=0;i<3;i++) { for(j=0;j<29;j++) { printf("*"); } printf("\n"); } 最后一行,只是

weixin_48669767的博客 1万+

别再魔改LWIP了!用STM32CubeMX配置F407的TCP保活(KeepAlive)与自动重连

本文详细介绍了如何通过STM32CubeMX配置STM32F407的LWIP协议栈,实现TCP保活(KeepAlive)与自动重连功能,解决网络异常断开问题。文章提供了从基础环境配置到自动重连架构设计的完整指南,帮助开发者构建高可靠的网络连接机制,适用于工业物联网和嵌入式设备开发。

weixin_27038245的博客 237

ansys workbench 静力结构分析 高阶教程

ansys workbench 静力结构分析 高阶教程 目录ansys workbench 静力结构分析 高阶教程新建工程模型导入设置材料模型简化: 主要内容: 材料设置、模型简化、网格细化、约束分析、接触设置、求解设置、报错处理、结果分析 基础教程: ansys workbench 静力结构分析 基础操作流程(入门) ansys版本: 19.0(16.0及以上均可) 参考资料: 推荐教学视频《有限元分析 张晔》(超详细 ???? )、ansys workbench 超级学习手册(查阅用) 说明:一些基

weixin_43434624的博客 5万+

初识c语言系列-1-第一个c语言程序

1、该系列的介绍 2、未来的打算 3、简单介绍c语言 4、第一个c语言程序 5、数据类型 6、常量和变量 7、字符、字符串、转义字符、注释

yanxiang3306 2170

GD32F4系列定时器正交译码器实战:用TIMER1读取旋转编码器信号(附完整代码)

本文详细介绍了GD32F4系列定时器正交译码器的实战应用,重点讲解如何使用TIMER1模块高效读取旋转编码器信号。内容涵盖硬件连接、定时器配置、方向判断与速度计算等关键环节,并提供了完整的代码实现和优化建议,帮助开发者快速掌握GD32微控制器在工业控制和消费电子领域的编码器接口设计。

weixin_29169505的博客 201

开篇——写给C语言初学者们

@ [TOC] 写给C语言初学者们 作为一名有十余年C语言程序设计教学经历的人,从语法到程序、从思维到动手,自己也经历了:C难、C很简单、C其实难的历程。决定从此贴开始,总结下学习C的方方面面,希望把自己的一些心得和C语言初学的同学们交流交流。 1 C为什么难 绝大部分高校的理工类学生,入校都有一名程序设计必修课,如:python、C、VB等;相比较而言,对初学者来说,C语言入门是最难的,我觉得有如下原因: 1) C语言是最接近计算机硬件的高级语言。离机器越近,离人就更远。所以学起来就要费劲些,但程序的效

ypandam的博客 1561

海思HiMPP开发避坑指南:MMZ内存与系统内存傻傻分不清?一个例子讲透

本文深入解析海思HiMPP开发中MMZ内存与系统内存的关键差异与应用场景,帮助开发者避免常见的内存混淆问题。通过实际案例和性能对比,详细介绍了MMZ内存的特性和优化策略,提升多媒体处理效率。

weixin_30772105的博客 468

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6684

如何写出第一个c语言程序

​一般对于初学者来说,任何语言的第一个程序几乎都是“hello world”,在c语言程序里它由三大部分构成:1,引入头文件的#include;我们要用库函数前都要引入头文件,比如要使用库函数printf就要引入头文件stdio.h,而#include就承担了这个功能,他的原理大致是把头文件黏贴到我们的程序里2,大致框架int main()和ruturn 0,这二者其实是相互呼应的,int main()是main函数会返回一个整数的意思,所以会return0相互呼应

m0_70441385的博客 1502

部署与可视化系统:移动端跟踪系统:YOLOv8 + ByteTrack 结合 Android CameraX 实现实时行人计数 App

本文详细介绍了在Android移动端实现实时行人检测、跟踪与计数系统的完整方案。系统采用YOLOv8+ByteTrack技术栈,基于NCNN推理引擎,无需云端算力即可在手机端侧完成全流程处理。文章从技术选型、系统架构、CameraX集成等多个维度进行深入解析,重点阐述了移动端部署面临的工程挑战和优化策略。通过四层管道模型设计,实现了从图像采集到目标跟踪的高效处理流程,并采用C++ NDK开发确保性能。该系统在中端手机上可达到10FPS,旗舰机型可达30FPS,为移动端实时目标跟踪提供了可落地的解决方案。

ZXSXJ的博客 92

初学C语言

C语言是一种通用的、高级的编程语言,诞生与20世纪70年代初由美国贝尔实验室的丹尼斯里奇(Dennis Ritchie)开发,是在B语言的基础上发展而来,最初是为了编写UNIX操作系统而设计。UNIX、Linux、MySQL等都是用C语言实现的。

2502_91631152的博客 1885

Unity之OpenXR+XR Interaction Toolkit接入HTC Vive

目前VR领域,最流行的设备要当属HTC VIVE了。以前在Unity端接入HTC VIVE设备时,都是通过SteamVR+VRTK来接入的。但是随着Unity的版本升级和OpenXR标准的流行,再加上VR设备的逐渐增多。SteamVR+VRTK的方式已经无法更好的满足大家的需求。

TxNet 4137

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c语言怎么学自学,初学者如何学习c语言,带你玩转C语言

初学者如何学习c语言,带你玩转C语言来源 : 未知 2018-10-11现在技术发展很快,尤其是计算机行业,计算机的基础是c语言,可以说做什么都需要编程,编程最为基础的就是C语言了,C语言他是一个很有发展前景的计算机编程语言,近十年来,它在编程语言排行榜(TIOBE)稳居前三,C语言绝对是值得初学者学习的一门语言,那今天就带你玩转C语言(1)首先学习C语言你就要有一个好的心态,要有坚持的心...

weixin_32937021的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 仙人掌之歌——豪赌(1)
程序猿阿诺
博客等级 码龄23年 25粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值