C语言程序设计作为一门实践性很强的基础课程,在培养学生计算思维能力方面具有重要作用。本书面向程序设计初学者,以强化计算思维表达能力培养为目标,提高学生解决实际问题的逻辑思维能力。内容汇集了北京航空航天大学“程序设计基础训练”和“C语言程序设计”课程组多年实践教学的程序设计训练题集与题解分析,难度由浅入深、循序渐进。知识点覆盖了C语言编程环境与基本方法、基本数据处理、结构化编程、函数及其应用、数组与字符串及应用、指针及其应用、结构与联合以及I/O 和文件操作等,集知识性、趣味性于一体。此外,在北京航空航天大学Online Judge (OJ)编程平台开设了程序设计训练专版(https://accoding.cn/index),便于使用本书的读者实践练习。
本书可作为计算机、软件等信息类专业程序设计实践环节的基础教材,也可以作为非信息类专业学生和程序设计爱好者的程序设计入门及提高训练教材。
在面向新工科的人才培养改革中,要求高等教育培养的人才具备工程思维、设计思维和数字思维的系统性计算思维能力,具备融合学科交叉知识解决复杂工程问题的实践能力。在这样的人才培养要求下,程序设计课程不仅仅是计算机、软件工程等信息类专业的必修基础课,也必将成为所有工科专业的基础课程,它的重要性甚至将与数学、物理等传统的基础课程相当。通过学习程序设计课程,培养学生的计算思维;在深入理解计算机相关专业知识的基础上,培养学生解决复杂工程问题的能力,这在面向满足社会需要和适应智能化技术发展的人才培养方面具有重要意义。
C语言程序设计作为一门实践性很强的程序设计基础课程,在培养学生计算思维能力方面具有重要作用。因此,编写一本侧重培养学生计算思维,以程序设计实践为主的程序设计类实训教程对于培养适应工业化、信息化、智能化的新形势专业人才尤为重要。本书力求充分结合程序设计课实践性非常强的特性,以强化计算思维表达能力和良好的代码书写习惯培养为目标,突出计算思维训练,提高学生解决实际问题的逻辑思维能力。本书内容汇集了北京航空航天大学“程序设计基础训练”和“C语言程序设计”课程组多年的实践教学内容,实训题目由浅入深、循序渐进,有一定的覆盖面,集知识性、趣味性于一体。本书可以作为计算机、软件等信息类专业程序设计实践环节的基础教材,为后续“数据结构”“算法分析与设计”等课程的学习奠定基础;也可以作为非信息类专业学生和程序设计爱好者的程序设计入门与提高训练教材。
本书力求培养学生两方面的能力,一方面是培养学生掌握C语言的基本概念、各种数据类型、输入输出、控制结构、函数、数组、指针、文件等语法及语义基础的能力;另一方面是通过程序设计训练,培养学生分析问题、解决问题的能力。帮助学生了解结构化程序设计思想,学习程序设计方法、技巧、风格,从而提升学生程序设计能力,养成良好的编程习惯,获得良好的程序设计学习起点,为后续学习专业理论和专业高级应用课程提供必要的计算思维和程序设计能力,为专业领域的创新活动奠定坚实的基础。
本教程共9章。第1章主要介绍C语言编程环境和基础的程序设计流程,是程序设计的基础;第2~8章包括C语言的核心知识点及其程序设计要点,每一章主要由本章重难点回顾、精编实训题集、题集解析与参考程序和本章小结组成。其中,本章重难点回顾以知识结构图的形式直观地展现了本章重难点内容,让读者一目了然地看清本章知识点以及各知识点间的关联,并针对本章的重点难点知识进行解析,同时总结常见问题。实训题集是每章的主要内容,每一个上机题目都是课程组精心编写、集知识性和趣味性于一体的小案例,可有效提高读者的编程兴趣。题集解析与参考程序包括解题思路与参考例程。第9章是综合训练,重在训练和培养学生分析问题和解决问题的综合能力。本书共精选140余道编程题目,基本涵盖了典型的C语言程序设计基础知识点和要点,熟练掌握并灵活运用这些例程,对编程基础能力训练将有很大帮助。
本书的主要特色之一是基于自主开发的北京航空航天大学OnlineJudge(OJ)系统(https://accoding.cn/index)开设了程序设计训练专版,覆盖了本书所有题目及其扩展题目,方便使用本书的教师和学生实践练习。此外,OJ上包括了更丰富的课程(包含Python、C语言程序设计,数据结构,算法分析与设计等),题库中包括的题目数量更加丰富,远超本书的范围,涉及的知识面也更加广阔,难度分布也很宽。读者在进行本教程的训练时,可根据需要选择相应的课程,完成更高级的编程训练和挑战。
本书是笔者所在的教学团队在程序设计类课程多年实践教学工作基础上的一个总结。主要编写人员有:李辉勇、孙青、宋友,课题组任课老师荣欣、刘禹、肖文磊、王君臣、方宁、路新喜、谭火彬、李莹、任磊、宋晓、陈高翔、李可、邓志诚、樊江、张勇和谢凤英,以及历届课程助教都参与了本书题目的设计、题解编写、例程测试等工作,没有大家的付出,无法完成本书的编写。在此谨表示诚挚的谢意。
受限于笔者之能力,加之时间仓促,书中难免存在一些不足和错误之处,恳请读者批评指正,使之完善提高。
笔者
2020年10月于北京
第1章C语言编程环境与基本方法1
1.1C语言程序的基本概念及组成1
1.2常用IDE介绍2
1.3C语言编程的几个基本步骤6
1.4C语言编程的常见错误6
1.5C语言程序调试简介8
第2章基本数据处理10
2.1本章重难点回顾10
2.1.1基本输入及格式化输出10
2.1.2数据类型转换12
2.1.3const与#define13
2.2精编实训题集14
题21简单字符(串)输出:颜文字表情图案绘制14
题22简单字符(串)输出:转义符应用14
题23基本输入输出及运算:数的向上取整14
题24基本输入输出及运算:计算预期收益14
题25基本输入输出及运算:计算平均值14
题26基本输入输出及运算:计算圆柱体表面积15
题27模运算:简单取模操作15
题28模运算:数的按位拆分15
题29模运算:数位翻转15
题210模运算:学号识别码16
题211模运算:队列找字母16
题212模运算:火仙草数16
题213数据类型转换:分数转小数16
题214位运算:AopBProblem17
2.3题集解析与参考程序17
2.4本章小结23
第3章结构化编程24
3.1本章重难点回顾25
3.1.1逻辑表达式25
3.1.2条件语句常见问题25
3.1.3计数器控制循环27
3.1.4标志控制循环28
3.1.5break和continue语句30
3.2精编实训题集31
题31逻辑表达式的妙用:名次预测31
题32单分支选择结构:寻找第二小数31
题33单分支选择结构:重逢时刻31
题34单分支选择结构:方程求解32
题35双分支选择结构:直线与圆32
题36双分支选择结构:温度转换32
题37双分支选择结构:统计阶乘的尾数033
题38双分支选择结构:字符大小写转换33
题39多分支条件语句:求解分段函数33
题310多分支条件语句:窗口的嵌套34
题311多路选择的switch语句:简单计算器35
题312选择结构的嵌套:交换生条件审核35
题313选择结构的嵌套:观影计划35
题314多路分支选择结构:方向判断36
题315while循环(计数器控制):判断2的幂次数36
题316while循环(标志控制):破译密码36
题317dowhile循环(标志控制):士兵站队37
题318for循环(计数器控制):日历计算37
题319for循环(计数器控制):求数列的一项38
题320for循环:理财计划38
题321循环嵌套:寻找完数39
题322循环嵌套:寻找质因数39
题323循环嵌套:等式填空39
题324循环嵌套:最短正整数序列40
3.3题集解析及参考程序40
3.4本章小结57
第4章函数及其应用58
4.1本章重难点回顾59
4.1.1递归思想59
4.1.2变量的作用域60
4.2精编实训题集62
题41定义与调用函数:三角形的判断62
题42定义与调用函数:猜素数62
题43定义与调用函数:cos(x)级数展开式63
题44定义与调用函数:分数相加与化简63
题45定义与调用函数:星期几63
题46定义与调用函数:求未遮挡面积63
题47全局变量的使用:熊猫序列64
题48标准库函数的使用:模拟投骰子64
题49标准库函数的应用:求极坐标65
题410标准库函数的应用:求面积65
题411递归函数:倒序输出66
题412递归函数:整数划分66
题413递归函数:递归汉诺塔67
题414递归函数:走迷宫67
题415递归函数:Ackermann函数67
题416递归函数:送快递68
题417递归函数:二分法解方程68
4.3题集解析及参考程序68
4.4本章小结86
第5章数组与字符串及应用87
5.1本章重难点回顾88
5.1.1字符串和字符数组88
5.1.2二维数组90
5.2精编实训题集92
题51一维数组应用:进制转换92
题52一维数组应用:阿狄的冒险92
题53一维数组应用:最萌身高差93
题54一维数组应用:卖口罩93
题55一维数组应用:成绩平均分94
题56一维数组应用:狐狸捉兔子94
题57一维数组应用:子序列95
题58一维数组应用:孤独的数95
题59一维数组应用:数组漂移95
题510一维数组应用:统计质数96
题511一维数组应用:火柴拼图96
题512一维数组应用:约瑟夫问题96
题513一维数组应用:求蓄水量97
题514一维数组应用:元素查找97
题515一维数组应用:绝对值排序问题98
题516一维数组应用:集合的加法98
题517一维数组应用:首个出现三次的字母98
题518一维数组应用:字符统计99
题519字符串和字符数组:分子量99
题520字符串和字符数组:字符统计99
题521字符串和字符数组:字符串匹配100
题522字符串和字符数组:字符串纠错100
题523字符串和字符数组:简写字符串的扩展101
题524字符串和字符数组:Excel表的列号101
题525字符串和字符数组:求相反数101
题526二维数组应用:卷积计算102
题527二维数组应用:蛇形矩阵102
题528二维数组应用:游戏教学103
5.3题集解析及参考程序104
5.4本章小结131
第6章指针及其应用132
6.1本章重难点回顾133
6.1.1指针与数组133
6.1.2常见问题133
6.2精编实训题集134
题61作为函数参数的指针:成绩统计134
题62作为函数参数的指针:矩阵变换135
题63作为函数参数的指针:整数求和136
题64作为函数参数的指针:高斯消元法解方程136
题65作为函数参数的指针:单词排序136
题66指向一维数组的指针:字符串替换137
题67指向一维数组的指针:子串逆置137
题68指向一维数组的指针:数的互逆137
题69指针数组的应用:计算并输出月份138
题610指针数组的应用:单词集合138
题611指针数组的应用:更遥远的星期几139
题612指针数组的应用:输出文章内容139
题613函数指针实例:有趣的排序问题139
题614函数指针实例:求众数139
题615函数指针实例:比赛排行榜140
题616函数指针实例:田忌赛马141
题617函数指针实例:求凸多边形面积141
6.3题集解析及参考程序141
6.4本章小结165
第7章结构与联合166
7.1本章难点回顾166
7.1.1结构数组与二维表的对应关系166
7.1.2单向链表167
7.1.3类型定义语句170
7.2精编实训题集171
题71结构应用:工作DDL171
题72结构应用:数据编码问题171
题73结构应用:按要求选择钢管172
题74结构应用:OJratings172
题75结构应用:寻找爱好相同的人173
题76结构应用:辅导员的生日推送173
题77链表应用:再解约瑟夫问题174
题78结构联合应用:数据表排序174
7.3题集解析及参考程序175
7.4本章小结185
第8章I/O和文件操作186
8.1本章重难点回顾186
8.1.1二进制文件操作186
8.1.2正文文件操作188
8.1.3文件读写操作中的定位189
8.1.4标准输入输出的重新定向191
8.2精编实训题集192
题81标准文件操作的I/O函数:分析日期和时间192
题82标准文件操作的I/O函数:由参数确定输出的小数位数192
题83指定文件的读写函数:字符输入输出192
题84指定文件的读写函数:读文本内容并显示193
题85指定文件的读写函数:文件复制193
题86指定文件的读写函数:成绩表格193
题87指定文件的读写函数:格式化输入输出193
题88文件读写函数的使用:日程列表193
题89读写操作的定位:求文件长度193
题810读写操作的定位:字符统计193
题811读写操作的定位:文件倒置输出193
8.3题集解析及参考程序193
8.4本章小结199
第9章C语言程序设计综合训练200
9.1程序设计基本方法200
9.1.1程序设计基本过程200
9.1.2程序性能分析202
9.1.2程序中的错误处理205
9.1.3程序的测试205
9.2精编实训题集206
题91查找指定大小数值206
题92位图206
题93时间转换问题207
题94切割木棍207
题95最长子序列208
题96简化比例208
题97组合购物208
题98数的奇偶分解209
题99序列等式209
题910下一个序列209
题911图片光滑处理210
题912排队接水210
题913公共前缀搜索211
9.3题集解析及参考程序211
9.4本章小结223
参考文献224