描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302514305丛书名: 高等学校计算机基础教育规划教材
本书适合作为大学计算机专业和非计算机专业的程序设计基础课程教材,也可供自学的读者使用。
第1章程序设计技术概述1
1.1程序设计语言概述1
1.1.1程序设计语言1
1.1.2计算思维4
1.2算法4
1.2.1算法的概念4
1.2.2算法的特性6
1.2.3算法的描述6
1.3软件的编制步骤10
1.4C程序设计语言的产生与特点12
1.5C语言程序的运行环境(Visual C 6.0编译环境)13
1.5.1C语言程序上机步骤13
1.5.2建立C程序的步骤13
1.5.3Visual C 6.0集成环境18
1.5.4程序的调试和运行19
1.6错误解析21
练习122第2章程序设计基础24
2.1C程序概述24
2.1.1一个简单的C程序24
2.1.2C语言的字符集26
2.1.3C语言词汇26
2.2基本数据类型28
2.2.1常量与变量29
2.2.2整型数据32
2.2.3实型数据36
2.2.4字符型数据39
2.2.5变量赋初值44
2.3运算符与表达式45
2.3.1C语言运算符简介45
2.3.2算术运算符和算术表达式46
2.3.3关系运算符与关系表达式48
2.3.4逻辑运算符与逻辑表达式49
2.3.5赋值运算符和赋值表达式50
2.3.6逗号运算符和逗号表达式55
2.3.7自增、自减运算符56
2.3.8条件运算符和条件表达式58
2.4不同类型数据之间的转换59
2.5错误解析62
练习264第3章标准库函数66
3.1C标准库函数的分类67
3.2常用数学库函数68
3.3printf()函数69
3.4scanf()函数77
3.5putchar()函数82
3.6getchar()函数83
3.7随机函数84
3.8错误解析86
练习386第4章选择结构88
4.1复合语句88
4.2if语句90
4.2.1if语句中的表达式90
4.2.2单分支if语句91
4.2.3双分支if语句93
4.2.4多分支if语句95
4.2.5if语句的嵌套98
4.2.6条件运算符实现选择结构102
4.3switch语句103
4.4应用程序举例106
4.5错误解析111
练习4113第5章循环控制结构117
5.1while语句117
5.2for语句124
5.3do…while语句130
5.4多重循环结构135
5.5break语句和continue语句139
5.5.1break语句139
5.5.2continue语句140
5.6应用程序举例143
5.7错误解析151
练习5155第6章函数157
6.1C程序与函数概述157
6.1.1模块化程序设计157
6.1.2C程序的一般结构158
6.2函数的定义与调用159
6.2.1函数的定义159
6.2.2函数的调用162
6.2.3函数的参数传递165
6.3函数的传址引用167
6.3.1地址的存储与使用167
6.3.2指针说明和指针对象的引用168
6.4局部变量与全局变量172
6.4.1局部变量173
6.4.2全局变量174
6.5变量的存储类型176
6.5.1存储类型区分符176
6.5.2自动变量177
6.5.3静态变量179
6.5.4外部变量181
6.5.5寄存器变量182
6.5.6存储类型小结183
6.6函数的嵌套与递归调用185
6.6.1函数的嵌套调用185
6.6.2函数的递归调用187
6.7编译预处理190
6.7.1宏定义191
6.7.2文件包含194
6.7.3条件编译196
6.8错误解析197
练习6198第7章数组200
7.1一维数组的定义及使用200
7.1.1一维数组的定义200
7.1.2一维数组的引用202
7.1.3一维数组的初始化204
7.1.4程序举例206
7.2一维数组与指针运算207
7.2.1一维数组的数组名207
7.2.2一维数组的下标与指针208
7.2.3作为函数参数的一维数组的数组名212
7.3二维数组的定义及使用215
7.3.1二维数组的定义215
7.3.2二维数组元素的引用216
7.3.3二维数组的初始化216
7.3.4二维数组应用举例218
7.4二维数组与指针运算221
7.4.1二维数组与元素指针221
7.4.2二维数组与行指针222
7.4.3作为函数参数的二维数组的数组名225
7.5使用内存动态分配实现动态数组228
7.5.1动态内存分配的步骤228
7.5.2动态内存分配函数228
7.6错误解析231
练习7232第8章常用算法235
8.1算法的概念235
8.1.1算法描述235
8.1.2算法的特性236
8.1.3算法的评估236
8.2排序算法237
8.2.1冒泡排序算法237
8.2.2选择排序算法239
8.2.3插入排序算法242
8.2.4基于二维数组的排序243
8.3查找算法245
8.3.1顺序查找245
8.3.2二分查找246
8.3.3基于二维数组的查找算法247
8.3.4其他查找方法250
8.4基本数值算法250
8.4.1基本数值算法概述250
8.4.2求一元非线性方程实根250
8.4.3求一元函数定积分的数值255
练习8259第9章字符数组与字符串261
9.1字符数组261
9.1.1字符数组的定义与赋值261
9.1.2字符数组的初始化262
9.1.3字符数组的引用264
9.2字符串266
9.2.1字符串的定义及其输入与输出266
9.2.2字符串的处理与字符串处理函数269
9.2.3字符串与指针运算273
9.3字符数组与字符串应用举例276
9.4错误解析278
练习9280第10章结构和联合282
10.1结构类型的定义与引用282
10.1.1结构类型的定义282
10.1.2结构变量的引用285
10.2结构数组的声明、引用和初始化287
10.3联合290
10.3.1联合的定义290
10.3.2联合变量的说明291
10.3.3联合变量的使用 292
10.4枚举类型294
10.5定义类型说明符296
10.6应用程序举例297
10.7常见错误解析299
练习10300第11章指针302
11.1数组、地址与指针302
11.1.1数组、地址与指针的关系302
11.1.2一维数组中的地址与指针303
11.1.3二维数组中的地址与指针305
11.2指针数组与指向指针的指针306
11.2.1指针数组306
11.2.2指向指针的指针310
11.3main()函数的参数312
11.4函数指针315
11.5指针函数318
11.6链表321
11.6.1链表的概念321
11.6.2链表的实现321
11.6.3单向链表的操作322
11.6.4链表的建立322
11.6.5链表的输出325
11.6.6链表结点的插入与删除325
11.7应用程序举例326
11.8错误解析328
练习11330第12章位运算334
12.1位运算的概念334
12.1.1字节与位334
12.1.2补码334
12.2二进制位运算336
12.2.1二进制位运算336
12.2.2位复合赋值运算符344
12.3应用程序举例344
12.4错误解析345
练习12345第13章文件操作347
13.1文件概述347
13.2文件的使用348
13.2.1文件的声明348
13.2.2文件的打开与关闭349
13.2.3文件的读写351
13.3随机文件的读写361
13.4应用程序举例362
13.5错误解析368
练习13368第14章绘制图形370
14.1绘图简介370
14.2EasyX的下载与安装373
14.2.1EasyX的下载373
14.2.2安装EasyX373
14.3绘图前的准备374
14.3.1颜色375
14.3.2坐标375
14.3.3设备376
14.4绘图函数376
14.4.1绘图环境相关函数376
14.4.2颜色模型相关宏及函数377
14.4.3图形颜色及样式设置相关函数378
14.4.4图形绘制相关函数382
14.4.5文字输出相关函数385
14.5绘图举例388
14.6错误解析393
练习14394第15章项目开发395
15.1软件工程概述395
15.1.1软件工程的基本概念395
15.1.2分析阶段397
15.1.3设计阶段397
15.1.4实现阶段398
15.1.5测试阶段399
15.1.6软件维护400
15.1.7文档400
15.2客户信息管理系统401
15.2.1用软件工程方法指导软件开发401
15.2.2客户信息管理系统的实现403
15.3俄罗斯方块414
15.3.1俄罗斯方块简介414
15.3.2俄罗斯方块的实现代码415
练习15425参考文献426附录AASCII编码427附录BC语言的运算符428附录CC语言的库函数429附录DEasyX的库函数436
C语言从诞生之日起就一直保持着旺盛的生命力,不断发展壮大、日臻完善,已经成为目前使用最广泛的编程语言之一。与其他高级语言相比,C语言处理功能丰富,表达能力强,使用灵活方便,执行程序效率高,可移植性强;具有丰富的数据类型和运算符,语句非常简单,源程序简洁清晰;可以直接处理硬件系统和对外围设备接口进行控制。C语言是一种结构化的程序设计语言,支持自顶向下、逐步求精的结构化程序设计技术。另外,C语言程序的函数结构也为实现程序的模块化设计提供了强有力的保障。因此纵然有C 、Java这样的后继者,但到目前为止,它们依然没有取代C的迹象。尤其C99标准发布以后,C语言的旺盛生命力再次得到了保持和延续。
本书的编写者全部是一直战斗在高等学校教学一线,承担“C语言程序设计”课程的教学任务的大学教师,有丰富的教学和C语言编程工作经验,有将自己积累的C语言程序设计经验介绍给大家的强烈愿望,因为在教学实践中,作者感受最深的就是,学习者普遍反映C语言难学、难懂,而事实上,学习者感觉难的往往并不是C语言的核心内容,学习的过程就是学习者与教师、与教材交互的过程,只要遵照一定的学习规律,这个交互过程并不难达成。学习者应该明白,选择一本交互性好的教材是至关重要的。不可否认,一些经典的C语言教材在教学中所起的巨大作用。但是,传统教材过细的内容组织也让学习者迷失了方向。本教材以指针为主线,贯穿于始终。另外,本教材也特别强调实践能力的培养,学习者首先应该学会用适当的编程工具编制、调试程序。学习者在编程实践中不断遇到问题,不断解决问题,自然就会明白许多细节。本书在介绍核心语法的基础上,以培养动手编程能力为首要目标,把那些烦琐的内容留待以后慢慢研究。
本书共分15章,将C语言的特色内容“指针”贯穿于始终,将这一难点分散到相关章节,避免了难点集中造成学习者丧失学习的兴趣。同时,借助于第三方工具的支持,讲述了在Visual C 中的绘图方法,由于绘图的引入,不但可以提高学生学习的兴趣,还能增加C语言的实际应用。
第1章介绍了程序设计的基本知识,详细阐述了软件的编制方法,使学习者对软件的编制有一个概念上的认识和理解,并能将这些方法应用于后续章节的学习中。
第2章介绍了C语言的基本知识,重点阐述了变量的声明方法,使学习者掌握变量、地址、存储数据之间的关系,同时还讲述了运算符。
第3章介绍了C语言标准库函数和顺序结构程序设计的基本方法,使学习者能够使用库函数编写简单的顺序结构程序。
第4章介绍了选择结构的相关语法,使学习者能够解决选择结构所涉及的问题。
第5章介绍了循环结构的相关语法,使学习者能够解决循环结构所涉及的问题。
第6章介绍了函数的相关知识,重点介绍了基本使用方法、函数参数的传值调用和传址调用,使学习者能够综合使用函数参数的传值调用和传址调用来解决实际问题。
第7章介绍了C语言中数值型一维数组和二维数组的相关知识,使学习者能够熟练使用函数来解决数组的相关问题。
第8章介绍了排序、查询、方程求解、求积分等内容,使读者能够利用所学的知识解决一些实际问题。
第9章介绍了字符串与字符数组的相关知识,使学习者能够处理与字符串和字符数组相关的问题。
第10章介绍了结构和联合的基本概念,使学习者能够综合使用数组、指针以及结构和联合来解决一些实际问题。
第11章介绍了指针的高级使用,使学习者能够处理涉及指针数组、函数指针和指针函数的相关问题。
第12章介绍了位运算的相关知识,使学习者对位运算有一个较为系统的认识并能够使用所学的位运算知识解决相关问题。
第13章介绍了文件的概念以及处理文件问题所涉及的函数,使学习者在掌握常用文件函数的基础上来解决一些实际问题。
第14章介绍了如何借助于第三方工具EasyX,很方便地在Visual C 6.0下绘制图形以及动画,进而编制简单的游戏。
第15章介绍了用软件工程的方法指导大型软件的开发方法,以提高软件的开发效率、降低开发成本、提高软件正确性等。
以上各部分都可以独立教学,自成体系。教师可根据情况适当取舍。
本书由郑州轻工业学院的尚展垒、司丽娜、孟牒、郑远攀等编著,其中,尚展垒任主编,司丽娜、孟牒、郑远攀任副主编,参加本书编写的还有郑州轻工业学院的杨学冬、张江伟和艾怡静。第1章、第10章和附录由尚展垒编写,第2、3章由司丽娜编写,第4、5章由孟牒编写,第6、7章由郑远攀编写,第8~10章由杨学冬编写,第11、12、15章由张江伟编写,第13、14章由艾怡静编写。尚展垒负责本书的组织工作,司丽娜负责本书的统稿工作。
本书的顺利出版得到郑州轻工业学院和清华大学出版社的大力支持。在本教材的编写过程中从许多同行的著作中得到启发,在此表达感谢之情。由于作者学识所限,难免存在疏漏,恳请各位读者批评指正。
编者2018年8月
在进行程序设计时,仅仅使用前面学过的顺序结构和选择结构,往往解决不了一些较复杂的问题,例如阶加、求一个班学生的平均成绩等。C语言还提供了一种重要的控制结构——循环结构。利用循环结构可以解决复杂的、重复性的操作。循环结构的作用是使某段程序重复的执行,具体循环的次数会根据某个条件来决定。循环结构的应用非常普遍,使用起来也比较灵活,熟练掌握循环结构对于学习编程是非常重要的。循环结构主要包括3种基本形式: while语句、for语句、do…while语句。除了这3种常见形式之外,还有一种goto语句,不过这种语句一般不提倡使用。
本章主要介绍循环结构的3种基本语句及其特点,重点讲解常用的循环算法和编程方法,使读者能够熟练运用这3种基本循环控制结构编写程序。
本章知识点:
(1) while语句的一般形式及应用。
(2) for语句的一般形式及应用。
(3) do…while语句的一般形式及应用。
(4) 多重循环结构的使用。
(5) break语句和continue语句。在现实生活中,有很多事情需要根据一定的规律重复操作,如果在写程序时,每一个重复操作写若干行代码是不现实的,因为有些重复的次数事先可以估算出来,有些是估算不出来的,为此,就需要使用循环结构来实现这些重复性的操作。
例如,从键盘读入一批正整数(以输入0作为结束标志),求其和。很显然,输入数据和阶加求和的动作是重复执行的。为了能够求和,用一个变量(s),其初始值是0,然后每输入一个数,就与s相加。也就是说,s是已输入的数据的和。最后输出s即可。伪代码如下: s=0;
输入一个数n;
当n不是0时循环下面两个语句:
s=s n;
输入下一个数n;
输出和s;在实现中间的循环时,需要用到C语言的循环语句。下面分别介绍C语言的3个循环语句。
5.1while 语 句
while语句也叫“当型”循环。“当型”循环是指在循环条件成立时,程序就一直执行循环体语句。while语句的一般形式如下: while (表达式)
语句1;while语句的执行过程: 首先计算while后括号内的表达式,当表达式的值为真(非0)时,执行循环体语句,然后继续判断表达式的值,重复上述执行过程,只有当表达式为假(0)时才退出循环,程序跳转到循环体后面的第一行代码处执行。流程图如图51所示。
说明:
(1) while是关键字。while后括号内的表达式一般是条件表达式或逻辑表达式,但也可以是C 语言中任意合法的表达式,其计算结果为0则跳出循环体,非0则执行循环体。
(2) 循环体语句可以是一条语句,也可以是多条语句,如果循环体语句包含多条语句,则需要用一对花括号({ })把循环体语句括起来,采用复合语句的形式。
图51while语句流程图
图52程序流程图
例51求1~100的和,即求 ∑100n=1n。
例题分析: 这是一个简单的求和问题,需要连续的阶加,因此只能使用循环结构实现重复阶加的操作。设变量sum用于存放循环执行过程中的求和结果,设变量n为循环控制变量,同时也是每一次求和运算的基本数据项,然后可以利用while循环结构进行循环阶加。
程序流程图如图52所示。#include “stdio.h”
void main()
{
int n,sum;
n=1;sum=0;/变量赋初值/
while (n<=100)
{
sum=sum n;/阶加/
n ; /修改基本数据项n/
}
printf(“sum=%d\n”,sum);
}程序运行结果如下: sum=5050在读程序时,正确的分析语句的执行顺序,即正确判断语句的跳转以及确定此时变量的值是非常重要的,是能否正确理解程序的关键,例51的程序执行过程及变量值的变化进行具体的分析如表51所示。表51程序执行过程的具体分析执行
顺序执行语句执行结果sum的值n的值说明1n=1;sum=0;01变量赋初值2计算表达式n<=1001<=100 结果为“真”判断循环条件3sum=sum n; n ;sum←0 1, n←1 1,12执行循环体语句4计算表达式n<=1002<=100 结果为“真”判断循环条件5sum=sum n; n ;sum←1 2, n←2 1,33执行循环体语句………………200计算表达式n<=100100<=100 结果为“真”4950100判断循环条件201sum=sum n; n ;sum←4950 100, n←100 1,5050101执行循环体语句202计算表达式n<=100101<=100 结果为“假”判断循环条件203printf(“sum=%d\n”,sum);退出循环体,执行循环体下面的语句需要注意的几个问题:
(1) 阶加算法。这个程序采用的算法思想称为阶加,即不断用新阶加的值取代变量的旧值,最终得到求和结果,变量sum也叫“累加器”,初值一般为0。阶加尽管方法简单,但却是循环结构程序设计中经常采用的一种算法思想,后面的很多复杂程序最终都可以转化为阶加或类似阶加的问题来解决。使用C语言的循环结构对若干数进行阶加一般要包括以下几个步骤:
步骤1,设置基本数据项的初值;(例如上面程序中的n=1)
步骤2,设置存放结果变量的初值;(例如上面程序中的sum=0)
步骤3,循环条件判断,若条件满足,则转到步骤4,否则转到步骤;
步骤4,阶加并修改基本数据项;(例如上面程序中的sum=sum n;n 😉
步骤5,转步骤3;
步骤6,结束并输出结果。
(2) 必须给变量赋初值。在C语言中定义的变量必须要赋初值,即使变量的初值为0,赋初值也不能省略。如果没有给变量赋初值,那么变量的初值就会是一个不可预知的数,结果将没有意义。例如本题中,读者可以省略赋值语句sum=0;调试看结果。
(3) 正确判断条件的边界值。当n得知为100时,程序将继续执行循环体,然后控制流程再次判断条件表达式,此时,n的值为101(见表51),表达式n<=100结果为假,退出循环。退出循环后,循环控制变量n的值是101,而不是100。
(4) 避免出现“死循环”。使用while循环一定要注意在循环体语句中出现修改循环控制变量的语句,使循环趋于结束,如在本例中的n ;否则条件表达式的计算结果永远为“真”,就会出现死循环。
(5) 可能出现循环体不执行。while循环是先判断表达式的值,后执行循环体,因此,如果一开始表达式为假,则循环体一次也不执行。例如以下程序段: s=0;
i=10;
while(i<=5)
{
s=s i;
i ;
}
printf(“%d\n”,s);循环体一次也不执行。最后输出的结果如下: 0(6) while后面括号内的表达式一般为关系表达式或逻辑表达式,但也可以是其他类型的表达式,例如算术表达式等。只要表达式运算结果为非0,就表示条件判断为“真”,运算结果为0,就表示条件判断为“假”。例如下面的几种循环结构,它们所反映的逻辑执行过程是等价的,均表示当n为奇数时执行循环体,否则退出循环。while (n%2)while (n%2==1)while(n%2!=0)
{{{
… ……
}}}有时,条件表达式可能只是一个变量,例如有以下程序段: …
p=1;
while (p)
{
…
p=0;
…
}甚于,条件表达式的地方可以是一个常量。例如: while(1)
{
…
break;
}在这种情况下,在循环体中必须有使流程跳出循环结构的语句,例如break、goto等。这两个语句一般与if语句配合使用。
例52使用while语句求n!。
例题分析: 该题与例51非常相似,只是把求和改成乘积。另外由于n的值并不确定,需要程序执行的时候由用户输入,要用到输入函数。#include “stdio.h”
void main()
{
int n,i=1;
double sum=1;
printf(“请输入一个正整数: “);
scanf(“%d”,&n);
while (i<=n)
{
sum=sumi;/累乘求积/
i ; /修改基本数据项i/
}
printf(“%d!=%.0f\n”,n,sum);
}程序运行情况如下:
输入: 请输入一个正整数: 6↙输出: 6!=720注意: 在此程序中,存放结果的变量sum的类型是double,这是因为n!一般都比较大,若程序输入20,其结果如图53所示。但如果把sum的类型改为int,则结果如图54所示,明显出错了,所以在编程时,数据类型选用得是否合适,也是很关键的。
图53例52的运行结果
图54sum为int时的运行结果
理解和掌握循环结构三要素之间的关系是非常重要。循环变量赋初值、判断控制表达式和修改循环变量的值是所谓的“循环三要素”。一般来说,进入循环之前,应该给循环变量赋初值,确保循环能够正常开始;在控制表达式中判断循环变量是否达到循环的终止值;在循环体中对循环变量进行修改,以使循环正常的趋向终止。在编写程序时要注意它们的位置关系。循环控制变量的初值可能会影响控制表达式的设计和控制变量修改语句的语序。例如,把例52中循环变量的初值改为0,则其他两个要素就要随之改变,修改后的程序如下: int n,i=0;
double sum=1;
printf(“请输入一个正整数: “);
scanf(“%d”,&n);
while (i{
i ;
sum=sumi;
}
printf(“%d!=%.0f\n”,n,sum);此题虽然和例51非常像近,但仍有两个需要注意的问题。
(1) 变量合理赋初值。变量初值的选取要根据实际情况,本例题中用来存放乘积结果的变量sum初值就应赋1,而不是0。
(2) 防止出现数据溢出错误。累乘结果变量sum的结果虽然是整数,在这里不能定义成int型数据。由于int型变量可以存放数据的范围比较有限(根据编译环境不同有所不同),当用户输入的n值比较大时,就可能得到一个非常大的结果,为防止在计算阶乘时发生数据溢出错误,把sum定义成double类型(但还是要注意输入数据时不能太大)。
(3) 程序中的改变: 循环条件由i<=n改变为ii ; /修改基本数据项i/改为i ;
sum=sumi; 请读者分析其中的原因。
例53编写程序,输入一个字符序列,直至换行为止,统计出大写字母、小写字母、数字、空格和其他字符的个数。
程序分析: 这是一个关于字符处理的问题,首先可以定义一个字符变量ch,利用getchar()函数把用户从键盘输入的字符逐个接收,存储在ch中,然后对ch进行判断分类。当读取的字符不是换行符时重复执行循环体,直到遇到换行符为止。while语句的条件表达式可以写成这样(ch!= ‘\n’)。
程序如下: #include “stdio.h”
void main()
{
char ch;
int a,b,c,d,e;
a=b=c=d=e=0;
while((ch=getchar())!=’\n’) /从键盘输入的字符,遇到换行符则停止循环/
{
if(ch>=’A’&&ch<=’Z’)
a ; /判断是否为大写字母/
else if(ch>=’a’&&ch<=’z’)
b ;/判断是否为小写字母/
else if(ch>=’0’&&ch<=’9′)
c ;/判断是否为数字/
else if(ch==’ ‘)
d ;
else
e ;
}
printf(“%d,%d,%d,%d,%d\n”,a,b,c,d,e);
}注意:
(1) 表达式(ch=getchar())!=’\n’的执行分两步,首先利用getchar()函数从终端接收一个字符,存储在ch中,然后再判断ch是否为’\n’,不能省略内部的括号。如果写成如下形式: ch=getchar()!=’\n’调试结果就会发生错误,因为表达式的关系运算符“!=”运算优先级别高于赋值运算符“=”,程序中的语句相当于 while(ch=(getchar()!=’\n’))即先把接收的字符与’\n’进行关系运算,再把关系运算的结果“真(1)”或者“假(0)”存储在ch中,这显然是错误的。
(2) 从终端键盘向计算机输入时,是在用户按Enter键以后才将一批数据一起送到内存缓冲区中去的。有以下程序段: char ch;
while((ch=getchar())!=’\n’)
printf(“%c”,ch);程序运行情况: 输入: abcdefg↙
输出: abcdefg结果并不是: aabbccddeeffgg
5.2for语句
for语句是循环控制结构中使用最为广泛的一种控制语句,它充分体现了C语言的灵活性。for语句有时也被称为“计数”型循环,因为它特别适合已知循环次数的情况。但事实上,for循环同样适用于循环次数不确定而只知道循环结束条件的情况。for循环可以实现所有的循环问题,它是C语言中形式最灵活,功能最强大的一种循环控制结构。
图55for语句流程图for语句的一般形式如下: for(表达式1;表达式2;表达式3)
循环体语句;从语法形式上看,for语句语法上要比while语句复杂,for后面的括号内有3个表达式,并使用分号(;)分隔,这3个表达式的运算次数、运算时间以及在循环中发挥的作用各不相同。它的执行过程如下:
步骤1,计算表达式1;
步骤2,计算表达式2,若表达式2的值为“真”(非0),则执行一次循环体语句,然后转步骤3,若表达式2的值为“假”(0),则转步骤4;
步骤3,计算表达式3,然后转步骤2;
步骤4,退出循环,执行for语句后面的其他语句。
for语句执行的流程图如图55所示。
其中的表达式1、表达式2和表达式3可以是任何一种C语言合法的表达式,但最常用、最简单的形式是这样的: 即在表达式1中给循环变量赋初值;表达式2则是循环条件控制表达式;表达式3则实现循环控制变量的改变,使循环趋于结束。具体如下: for(循环变量赋初值;循环条件;循环变量增值)
循环体语句;for语句的功能等价于下面while语句: 表达式1;
while (表达式2)
{循环体语句
表达式3;
}如果用for语句改写例51,则#include “stdio.h”
void main()
{
int n,sum=0;
for (n=1;n<=100;n )
sum=sum n;
printf(“sum=%d\n”,sum);
}由此可以看出,相对于while语句,for语句在形式上更加简洁、方便。
例54设n=30,编写程序,计算并输出S(n)的值。S(n)=(1×2)/(3×4)-(3×4)/(5×6)+(5×6)/(7×8)+…+(-1)(n-1)×
[(2n-1)·(2n)]/[(2n+1)·(2n+2)] +…图56程序流程图例题分析: 这是一个阶加的问题,题目明确是求前30项的和,因此选用for循环是最合适的。设变量s用于存放循环执行过程中的求和结果,设变量n为循环控制变量,每一次求和运算的数据项在题目中已经给出,即(-1)n-1×[(2n-1)·(2n)]/[(2n+1)·(2n+2)],数据项的值会随循环变量n的改变而改变。
程序流程图如图56所示。代码如下: #include “stdio.h”
#include “math.h”
void main()
{
int n;
float s=0;
for(n=1;n<=30;n )
s=s pow((-1),(n-1))((2n-1)2n)/((2n 1)(2n 2));
printf(“s(n)=%f”,s);
}运行结果如下: s(n)=-0.459873注意: 在程序中如果使用了数学函数,就必须在源文件开头添加如下预编译命令: #include “math.h”本题目中用到了一个数学函数pow(),它的作用是进行幂运算,即求xy的值。函数形式为double pow(double x,double y)由于pow()函数的结果是double,在有些地方是整型数据的正负相间运算,可以利用若干-1相乘来实现。最初的正负号与第一项相同,设为sign=1,1表示正号,在下一次使用时,与-1相乘,即sign=-sign,此时sign就变成-1,表示此项的符号是负的,如此下去即可。
例55求1-2+3-4+5-6+… -100的值。#include “stdio.h”
void main()
{
int n,s,sign;
sign=1; /1表示正号,与第一项的正负对应/
s=0;
for(n=1;n<=100;n )
{
s=s nsign;
sign=-sign; /与-1相乘,与下一项的正负号对应/
}
printf(“s=%d\n”,s);
}关于for语句的几点说明:
(1) 循环体语句可以是简单语句也可以是使用一对花括号括起来的复合语句。如果是一个语句,也可以和for写在一行上,这样使程序看起来更加简洁;如果循环体包含多条语句,最好是另起一行,采用一对花括号括起来的复合语句形式,增加程序的可读性。
(2) 表达式的省略。for语句中的3个表达式均可以省略,但是两个分号不能省略。
① 省略表达式1。如果for语句中的表达式1被省略,表达式1的内容可以放在for循环结构之前。表达式1的内容一般来说是给循环变量赋初值,那么如果在循环结构之前的程序中循环变量已经有初值,那么表达式1就可以省略,但分号不能省。例如在例54中,for语句中如果省略表达式1,可以改写成如下形式:…
int n=1;
float s=0;
for( ;n<=30;n )
s=s pow((-1),(n-1))((2n-1)2n)/((2n 1)(2n 2));
printf(“s(n)=%f”,s);
…② 省略表达式2。如果表达式2省略,就意味着每次执行循环体之前不用判断循环条件,循环就会无休止地执行下去,就形成了“死循环”。例54如果省略表达式2,形式如下: …
评论
还没有评论。