内容推荐 《C语言程序设计(第5版)》是面向程序设计初学者的C语言基础教材,以培养大学生的逻辑思维能力和程序设计能力为编写指导思想,综合运用案例教学、比较教学、任务驱动等多种教学方法,系统介绍C语言程序设计的基本理论、基本方法和基本过程。本书内容组织注重基础,突出应用,兼顾提高,强化主干知识,弱化细枝末节; 实例设置注重易学性、趣味性和系列化,易教易学。 全书共10章,内容包括程序设计概述、简单程序设计、选择结构程序设计、循环结构程序设计、数组程序设计、函数程序设计、指针程序设计、结构体程序设计、文件程序设计以及综合程序设计。 本书配有教学课件、例题和习题程序源代码、在线题库等教学资源,并编写了配套教材《C语言程序设计(第5版)实验指导与习题解答》。 本书适合作为高等院校C语言程序设计课程的教材,也可作为编程开发人员及程序设计爱好者的自学参考书。 目录 第1章 程序设计概述 1.1 程序设计语言 1.2 算法 1.2.1 算法概念与算法描述 1.2.2 算法的逻辑结构 1.2.3 算法的特性 1.2.4 算法评价 1.3 程序设计与实现 1.3.1 程序设计的基本过程 1.3.2 编辑和运行C语言程序 1.4 C语言程序的基本结构 1.4.1 程序的函数化结构 1.4.2 标识符与保留字 1.4.3 程序风格 小结 习题一 第2章 简单程序设计 2.1 数据类型、常量与变量 2.1.1 数据类型 2.1.2 常量 2.1.3 变量 2.2 数据的输入与输出 2.2.1 用printf()函数输出数据 2.2.2 用scanf()函数输入数据 2.2.3 字符的输入与输出 2.3 简单运算 2.3.1 算术运算 2.3.2 赋值运算 2.3.3 变量自增和自减运算 2.3.4 逗号运算 2.4 编译预处理命令简介 2.5 简单程序设计实例 2.6 表达式中数据类型的转换 *2.7 定义数据类型别名 *2.8 const常量 小结 习题二 第3章 选择结构程序设计 3.1 if选择结构 3.1.1 if选择结构程序示例 3.1.2 关系表达式 3.1.3 逻辑表达式 3.1.4 if命令 3.1.5 条件运算 3.2 switch选择结构 3.3 选择结构程序实例 小结 习题三 第4章 循环结构程序设计 4.1 循环结构控制命令 4.1.1 while命令 4.1.2 dowhile命令 4.1.3 for命令 4.2 循环体中的控制命令 4.2.1 break命令 4.2.2 continue命令 4.3 循环嵌套 4.4 goto命令 4.5 循环结构程序实例 小结 习题四 第5章 数组程序设计 5.1 一维数组程序设计 5.1.1 一维数组程序示例 5.1.2 一维数组的定义及元素引用 5.1.3 数值型一维数组的输入和输出 5.1.4 数值型一维数组的初始化 5.1.5 字符型一维数组的初始化 5.1.6 一维数组的存储 5.2 字符串操作 5.2.1 字符串的输入和输出 5.2.2 多字符串操作函数 5.3 二维数组程序设计 5.3.1 二维数组的定义及元素引用 5.3.2 二维数组的输入和输出 5.3.3 二维数组的初始化 5.3.4 二维数组的存储 5.4 数组应用程序实例 小结 习题五 第6章 函数程序设计 6.1 函数概述 6.2 函数定义及调用 6.2.1 函数定义 6.2.2 函数值和return命令 6.2.3 函数调用 6.3 函数嵌套和递归函数 6.3.1 函数嵌套 6.3.2 递归函数 6.4 数组与函数 6.4.1 数组元素作函数参数 6.4.2 一维数组名作函数参数 6.4.3 二维数组与函数 6.5 函数应用程序实例 6.6 变量的作用域和存储类型 6.6.1 变量的作用域 6.6.2 变量的存储类型 *6.7 编译连接多个源文件的C程序 小结 习题六 第7章 指针程序设计 7.1 指针概述 7.2 指针变量的定义和使用 7.2.1 指针变量程序示例 7.2.2 定义指针变量 7.2.3 使用指针变量 7.3 指针与数组 7.3.1 指针与一维数组 7.3.2 指针与二维数组 7.3.3 指针与字符串 7.3.4 指针数组 7.4 指针作函数参数 7.4.1 简单变量指针作函数参数 7.4.2 指向数组的指针作函数参数 7.4.3 字符串指针作函数参数 7.4.4 指针数组作函数参数 *7.4.5 使用带参数的main()函数 7.5 指针函数 7.6 指针应用程序实例 小结 习题七 第8章 结构体程序设计 8.1 结构体数据概述 8.2 结构体类型和结构体变量 8.2.1 结构体程序示例 8.2.2 定义结构体数据类型 8.2.3 结构体变量的定义及使用 8.3 结构体数组 8.3.1 结构体数组的定义及元素引用 8.3.2 结构体数组的初始化 8.3.3 结构体数组应用实例 8.4 结构体指针变量 8.4.1 结构体指针变量的定义及使用 8.4.2 结构体指针作函数的参数 8.5 使用链表存储数据 8.5.1 使用链表存储数据示例 8.5.2 链表的特点 8.5.3 动态内存管理函数 8.5.4 定义链表结构 8.6 链表的基本操作 8.6.1 链表结点的插入 8.6.2 链表结点的删除 8.6.3 链表结点的查找 8.7 结构体应用程序实例 8.8 动态数组 小结 习题八 第9章 文件程序设计 9.1 文件概述 9.1.1 文件的概念 9.1.2 文件的分类 9.1.3 文件的一般操作过程 9.1.4 文件类型指针 9.2 文件的基本操作 9.2.1 打开和关闭文件 9.2.2 文件的字符读写 9.2.3 文件结束状态测试 9.2.4 文件的数据块读写 9.3 文件的其他操作 9.3.1 文件位置指针的定位 9.3.2 文件的格式化读写 9.3.3 文件的字符串读写 9.4 文件应用程序实例 小结 习题九 第10章 综合程序设 序言 前言 教材建设是课程建设的重要内容,也是我们 坚持不懈、努力探索的一项教学实践。加强C语 言程序设计教材的建设,打造适合程序设计初学 者的C语言程序设计精品教材是我们始终不渝的 目标,本书的每次改版都在向这一目标迈进。本 书的编写坚持基础教材的定位,面向程序设计初 学者,同时突出C语言程序设计的应用性、实践 性特点,突出主干知识教学,注重逻辑思维能力 和基本程序设计能力培养。与前一版本相比,这 一版的改进主要体现在便于学习、便于讲解和规 范性方面。一是充实和加强了部分实例的分析和 讲解说明; 二是优化和拓展了部分实例程序代 码; 三是更新和规范化了部分图示; 四是优化 了部分标识符名称。考虑到教材使用的连续性, 为了方便之前已选用本书老版的老师教学,本次 改版保持了原有的目录结构。全书共10章,包括 程序设计概述、简单程序设计、选择结构程序设 计、循环结构程序设计、数组程序设计、函数程 序设计、指针程序设计、结构体程序设计、文件 程序设计和综合程序设计。本书主要有以下特点 。第一,突出主干知识教学,适合程序设计初学 者。本书面向程序设计初学者编写,在知识选取 上采取“瘦身”策略,消除了很多C语言教材中 存在的“知识臃肿”现象。本书内容突出C语言 程序设计的主干知识,淡化分支知识,知识体系 脉络清晰,可读性和易学性强。第二,以实例引 领教学内容,符合认知规律。凡是适合以程序实 例开始的新知识,均通过程序实例和程序说明予 以引导,首先建立感性认识,然后进行相关知识 的系统介绍,符合认知规律,利于新知识学习。 第三,设置系列案例,突出程序设计主线。本书 设置了贯穿第1~9章的“学生数据管理”系列案 例、贯穿部分章节的“字符串处理”和“图案输 出”等系列案例,突出程序设计主线,实现前后 贯通、密切衔接、循序渐进的系统性教学。第四 ,注重算法设计教学,培养创新思维能力。创新 思维能力培养是本书的一个重要目标,其着力点 是算法设计教学。一是设置应用实例和综合实验 ,着重进行算法设计教学; 二是发挥系列案例 的对比教学优势,加强算法设计教学; 三是通 过应用程序的完善性分析,结合启发式教学法加 强算法设计教学。第五,设置综合实训内容,系 统介绍程序设计流程。第10章为综合程序设计内 容,以通讯录程序设计为实例,体现软件工程思 想,针对C语言结构化程序设计的特点,详细介 绍了C语言应用程序的设计方法与过程。第六, 练习题目系列化,便于连贯性学习。例如,在第 5~9章设置了Josephus环报数游戏程序设计系列 习题,并作为实验必做题目列入了实验指导内容 。第七,资源丰富,方便教学。本书有配套的教 学课件、参考教案、例题程序源代码、习题程序 源代码、在线试题库(包含500余道题,涵盖多 种题型)等教学资源供读者免费使用,并配套辅 导教材《C语言程序设计(第5版)实验指导与习 题解答》。完成本书教学需要约60学时,目录中 加*的章节不影响本书的教学系统性,可作为选 学内容。本书由张磊、徐荣龙任主编,周金玲、 马明祥、徐兴敏任副主编,全书由张磊统稿。黄 忠义、刘海慧、王桂东、魏建国、薛莹、张元国 、张凤云、张留朝、孙晓东、张敏、王兆红、徐 英娟、滕秀荣等参与了本书的编写并做了大量素 材整理、程序调试、文稿审校等工作,在此表示 感谢。清华大学出版社的付弘宇编辑及相关人员 为本书的出版做了大量严谨、细致的工作,在此 一并致谢。读者可以通过关注清华大学出版社微 信公众号“书圈”(见封底)下载本书的配套资 源。读者扫描本书封底的“作业系统”二维码, 绑定微信账号,即可使用在线题库。关于本书及 配套资源使用中的问题,请发邮件至 404905510@qq.com与责任编辑沟通。 编者2022年8月 精彩页 第3章选择结构程序设计 选择结构是程序的3种逻辑结构之一,在C语言程序中使用if命令和switch命令实现选择结构。本章系统介绍选择结构程序设计知识,主要内容包括用于表示条件的关系表达式和逻辑表达式、if命令和switch命令的结构及执行过程、选择结构程序设计的基本方法等。 任何选择处理都是有条件的,合理、正确地表达和使用选择条件是选择结构程序设计的重要内容。 3.1if选择结构 在第1章关于选择结构算法的知识中讨论了判定“优等生”问题的选择结构算法(算法流程图见图15),其中分支选择的条件是ave≥90(ave表示平均成绩),该条件成立时显示“优等生”,否则显示“加油!”。本节从此算法的实现程序开始,逐步介绍if选择结构的相关知识。 3.1.1if选择结构程序示例 【例31】输入一个学生的两门课程的成绩,若平均成绩不低于90,则显示“优等生”,否则显示“加油!”。 程序如下: #include int main() { int s1,s2,ave;/*s1、s2为课程成绩,ave为平均成绩*/ printf("输入两门课程的成绩: "); scanf("%d,%d",&s1,&s2); /*输入课程成绩s1、s2*/ ave=(s1+s2)/2; \t/*计算平均成绩ave*/ if(ave>=90) /*选择控制*/ printf("优等生\n"); /*ave不低于90时执行该语句*/ else printf("加油!\n"); /*ave不足90时执行该语句*/ return 0; } 程序解析: 该程序中的ifelse命令用于实现选择控制,选择条件是ave>=90。当ave>=90成立时执行语句“printf("优等生\n");”,输出字符串“优等生”; 否则执行语句“printf("加油!\n");”,输出字符串“加油!”。本例中决定选择哪个分支的条件ave>=90称为关系表达式。 以下是程序的执行实例,请读者根据具体数据分析程序的选择控制过程。 程序第1次执行结果: 输入两门课程的成绩: 88,96 (此时表达式ave>=90成立) 优等生 程序第2次执行结果: 输入两门课程的成绩: 77,85 (此时表达式ave>=90不成立) 加油! 3.1.2关系表达式 关系表达式是由关系运算符连接运算对象而构成的表达式。在选择结构中,进行分支选择的条件常使用关系表达式。例如,在例31的程序中使用ave>=90作为选择控制条件,其中的>=符号称为关系运算符。 1. 关系运算符 C语言有6种关系运算,分别表示两个对象进行大小比较的6种情况,即大于、大于或等于、小于、小于或等于、等于、不等于,其运算符及含义如表31所示。 表31关系运算符及其含义 关系运算符含义实例 >大于ave>90 >=大于或等于ave>=90 <小于ave<90 <=小于或等于ave<=90 ==等于ave==90 !=不等于ave!=90 2. 关系表达式的值 关系表达式只有两个取值,或者是1,或者是0。当关系表达式所表示的“关系”成立时,其值为1,否则其值为0。例如在例31中,第1次执行程序时变量ave的值为92,关系表达式ave>=90成立,则其值为1; 第2次执行程序时变量ave的值为81,关系表达式ave>=90不成立,则其值为0。 3. 关系运算的优先级 (1) 关系运算>、>=、<以及<=的优先级相同,关系运算==和!=的优先级相同,前面一组运算符的优先级高于后面一组运算符的优先级。 (2) 关系运算的优先级低于算术运算的优先级。 (3) 关系运算的优先级高于赋值运算的优先级。 4. 关系运算的结合性 6种关系运算都是左结合的。例如,关系表达式a<5>b与(a<5)>b等价,若a=-2、b=2,则其值为0。 3.1.3逻辑表达式 逻辑表达式是由逻辑运算符连接运算对象而构成的表达式,它在程序中常用于表示复杂条件如下: if(表达式1) {语句组1} else if(表达式2) {语句组2} else if(表达式3) {语句组3} else if(表达式n) {语句组n} else {语句组n+1} 该结构中的每个“表达式”都是进行分支选择的条件,“表达式”的值为非0值时表示选择条件成立,所属的语句组即被执行。 以下是ifelse if命令的具体执行过程: 当ifelse if命令被执行后,即从上到下逐个对条件进行判断, 一旦条件成立就执行该条件所属的语句组,其下的所有条件都不再判断,它们的语句组也不被执行,ifelse if命令即执行结束; 当任何一个条件都不成立时,则执行{语句组n+1},并结束ifelse if命令。图38所示为四层if结构的ifelse if语句流程图。 图38ifelse if结构的流程图 【例38】用ifelse if结构改写例37的程序。 程序如下: #include int main() { int s1,s2,ave; printf("输入两门课程的成绩: "); scanf("%d,%d",&s1,&s2); ave=(s1+s2)/2; if(ave<0) printf("数据错误!\n"); /*ave<0成立时* |