C语言程序设计课件

上传人:人*** 文档编号:570126460 上传时间:2024-08-02 格式:PPT 页数:276 大小:3.12MB
返回 下载 相关 举报
C语言程序设计课件_第1页
第1页 / 共276页
C语言程序设计课件_第2页
第2页 / 共276页
C语言程序设计课件_第3页
第3页 / 共276页
C语言程序设计课件_第4页
第4页 / 共276页
C语言程序设计课件_第5页
第5页 / 共276页
点击查看更多>>
资源描述

《C语言程序设计课件》由会员分享,可在线阅读,更多相关《C语言程序设计课件(276页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计语言程序设计教材分析本书内容共有11章,可分为三部分。第1、2章为第一部分,为初学者的入门知识,使读者对c语言编写程序的步骤、方法和程序结构及算法描述有一个大致的了解。第3第5章为第二部分,是程序设计的基础部分,使读者详细了解c语言的基本数据类型和表达式以及c语言的控制结构。掌握了第一、二部分的内容,读者可以完成简单的程序设计。第6章第11章为第三部分,讲述了模块化程序设计的概念和实现的方法,为程序设计提供了更多、更方便的途径,为进行综合程序设计奠定了基础。每一个章节里都有详细的程序范例来说明程序的设计思想、语句的概念、作用、含义和使用方法,使学生能够由浅入深系统地学习c语言的知

2、识,同时掌握一定的编程方法。成绩考核成绩考核成绩考核方法:成绩考核方法:期末成绩期末成绩=平时成绩平时成绩20%+期末考试期末考试80%; 注:平时成绩包括:上课情况、作业情况、上机作业完注:平时成绩包括:上课情况、作业情况、上机作业完成情况等。成情况等。学习学习C的忠告的忠告上机实践上机实践(编程编程)!(Try!)C语言程序设计教程语言程序设计教程第第1章章 引言引言 第第2章章 程序的简单算法制定程序的简单算法制定第第3章章 基本程序语句基本程序语句第第4章章 选择结构选择结构第第5章章 循环结构循环结构 第第6章章 函数与编译预处理函数与编译预处理第第7章章 数组数组第第8章章 指针指

3、针第第9章章 构造数据类型构造数据类型 第第10章章 文件文件第第11章章 位运算位运算C语言程序设计课程的任务1.指导学生掌握C程序设计语言的基础知识;2.培养学生综合分析并编制程序解决实际应用问题的能力;3.培养学生契而不舍的解决问题的精神以及认真的学习态度。通常我们把设计、书写及检查调试程序的过程称为程序设计。应当指出,简单的程序设计应包括以下几个部分:确定数据结构确定算法编写代码调试并运行整理并写出文档资料第一章引言1.1C语言的特点1.2简单的C语言程序介绍1.3C语言程序的结构1.4C程序设计语言的执行1.1C语言的特点C语言有9种控制语句,32个关键字。运算符丰富。共有34种运算

4、符数据结构类型丰富。具有结构化的控制语句语法限制不太严格,程序设计自由度大。C语言允许直接访问物理地址,能进行位操作,可以直接对硬件进行操作。生成目标代码质量高,程序执行效率高。C语言编写的程序可移植性好。1.2简单的C语言程序介绍/* /*ex101.c-ex101.c-在屏幕上输出在屏幕上输出在屏幕上输出在屏幕上输出This is a C program.This is a C program. */ */#include void main( ) printf(“This is a C program.n”); 注释注释 /*ex101.c-在屏幕上输出在屏幕上输出This is a C

5、 program. */C程序中的“/*/”之间的内容称为注释,是程序编写者给程序阅读者留下的一些说明(注释),以帮助阅读者理解程序。编译器不对注释进行编译,只将它们当作空白看待。本程序的第1行中的注释为“ex101.c”,是说明本书编写时将这个程序保存在文件ex101.c中。库函数与文件包含命令include#include n库函数库函数:系统提供的标准函数,程序可直接使用;n使用库函数必须将其有关说明信息写入程序使用库函数必须将其有关说明信息写入程序。为了用户方便,系统定义库函数时,把一类相关库函数的说明信息,分别写在一些文件中。本例中使用了库函数printf,其有关说明信息写在文件st

6、dio.h中。所以在程序的开始加入了# #includeinclude n使用使用C语言的语言的库函数,库函数,库函数,库函数,要在程序前面加上要在程序前面加上类似类似# #include include 的的的的预处理命令预处理命令预处理命令预处理命令main函数任何任何C程序都程序都必须有且只能有一个主函数必须有且只能有一个主函数必须有且只能有一个主函数必须有且只能有一个主函数main()main(),它是程序的入口,它是程序的入口,也是程序的出口。其中,也是程序的出口。其中,main是是函数名函数名函数名函数名,()内可以包含一些内可以包含一些参数参数参数参数; 的内容称为的内容称为函数

7、体函数体函数体函数体, ,其包含若干条其包含若干条C C程序语句程序语句程序语句程序语句;不同语句之间用;不同语句之间用分号分号分号分号分隔;一般情况下,每个程序都由一至多个函数组成;分隔;一般情况下,每个程序都由一至多个函数组成;表示表示main函数函数没有返回值没有返回值函数名函数名函数体函数体语句语句voidvoid main main( ) printf(“Thisprintf(“This is a C program.n”); is a C program.n”); 演示ex101语句printf(“This is a C program.n”);C语言的主函数体由一些语句组成。每个

8、语句由一个分号结束。如本例中,主函数的一个语句:printf (“This is a C program.n”);说明:说明:n函数printf是系统系统提供的一个库函数,printf函函数的功能是向数的功能是向显示器显示器输出一段信息输出一段信息,具体内容括在双引号内具体内容括在双引号内;n参数中的“n”代表一个命令:输出完这行字符后换行,不是要求显示的文字。例例2 写出以下程序的运行结果写出以下程序的运行结果写出以下程序的输出结果写出以下程序的输出结果#include void main( ) printf(“Hellon”); printf(“world!n”); 演示ex102例例3

9、四则运算编程四则运算编程#includeintadd(intx,inty);main()inta,b,c;scanf(%d%d,&a,&b);c=add(a,b);/*函数调用语句*/printf(c=%d,c);intadd(intx,inty)return(x+y);演示ex103演示ex104讨论减、乘、除的编程输入函数Scanf()函数说明函数定义1.4 C程序设计语言的执行程序设计语言的执行对于对于C语言程序来说,这一过程一般分为语言程序来说,这一过程一般分为4步:步:第第1步:编辑源程序;步:编辑源程序;第第2步:编译;步:编译;第第3步:链接;步:链接;第第4步:执行;步:执行;

10、(整个过程如下整个过程如下图图)filename.cfilename.c编编编编 辑辑辑辑(e e e ed d d di i i it t t t )编辑器编辑器编辑器编辑器filename.ofilename.objbj预预预预处处处处理理理理编编编编 译译译译( ( ( (c c c co o o om m m mp p p pi i i il l l le e e e) ) ) )编译器编译器编译器编译器filename.efilename.exexe库函数和库函数和库函数和库函数和其他目标模其他目标模其他目标模其他目标模块块块块链链链链 接接接接( ( ( (l l l li i i

11、 in n n nk k k k) ) ) )链接器链接器链接器链接器出错出错出错出错出错出错出错出错执执执执 行行行行( ( ( (e e e ex x x xc c c cu u u ut t t te e e e/ / / /r r r ru u u un n n n) ) ) )结果结果结果结果出错出错出错出错出错出错出错出错调试调试调试调试debugdebugdebugdebug编编 译译编译就是把用编译就是把用C语言描述的程序翻译成计算机可以直接理语言描述的程序翻译成计算机可以直接理解并执行的机器语言命令组成的程序。解并执行的机器语言命令组成的程序。C语言的编译过程语言的编译过程分

12、为分为两个阶段两个阶段:首先首先是编译预处理,系统要先扫描程序,是编译预处理,系统要先扫描程序,处理所有预处理命令,如把文件包含命令要求的文件包含处理所有预处理命令,如把文件包含命令要求的文件包含(嵌入)到程序中。(嵌入)到程序中。然后然后才开始编译。编译后得到的文件才开始编译。编译后得到的文件称为目标文件。目标文件就是用机器语言描述的文件。称为目标文件。目标文件就是用机器语言描述的文件。C语言的目标文件的后缀为语言的目标文件的后缀为.obj。目标文件的主文件名,一。目标文件的主文件名,一般与源程序文件名相同。般与源程序文件名相同。在编译过程中,还要对源程序中的语法和逻辑结构进行检在编译过程中

13、,还要对源程序中的语法和逻辑结构进行检查。编译任务是由称做编译器(查。编译任务是由称做编译器(compiler)的软件完成的。)的软件完成的。程序在编译过程中,也可能发现错误。这时要重新进入编程序在编译过程中,也可能发现错误。这时要重新进入编辑器进行编辑。辑器进行编辑。链链 接接链接是将与当前程序有关的、已经有的几个目标模块链接链接是将与当前程序有关的、已经有的几个目标模块链接在一起,形成一个完整的程序代码文件。这些已经有的目在一起,形成一个完整的程序代码文件。这些已经有的目标模块有:标模块有: 库函数:如前面使用的库函数:如前面使用的printf; 对于大的程序,常常分成几个模块,分别编写、

14、编辑和对于大的程序,常常分成几个模块,分别编写、编辑和编译,形成不同的目标模块。编译,形成不同的目标模块。经正确链接所生成的文件才是可执行文件。可执行文件的经正确链接所生成的文件才是可执行文件。可执行文件的文件名后缀为文件名后缀为.exe(有的系统为(有的系统为.out)。完成链接过程的)。完成链接过程的软件称为链接器(软件称为链接器(linker)。)。程序在连接过程中,也可能发现错误。这时也要重新进入程序在连接过程中,也可能发现错误。这时也要重新进入编辑器进行编辑。编辑器进行编辑。执执 行行链接后得到的可执行文件名,对操作系统链接后得到的可执行文件名,对操作系统来说,相当于一条命令。在操作

15、系统提供来说,相当于一条命令。在操作系统提供的命令界面上打入这个命令,就可以开始的命令界面上打入这个命令,就可以开始执行这个程序。执行这个程序。C语言的集成开发环境语言的集成开发环境Turboc2.0Turboc+(选用)Vc+等(1)打开Turboc+运行环境。界面如图:从图可以看到在集成环境的上部,有一行“主菜单”,其中包括下面10个菜单项:FileEditSearchRunCompileProjectOptionsDebugWindowHelp分别代表:文件操作、编辑、查找、运行、编译、项目文件、选项、调试、窗口、帮助等功能。用户可通过以上菜单项来选择使用TurboC集成环境所提供的各项

16、主要功能。(2)编辑源程序。在File菜单下选择NEW子菜单项命令,系统的光标处于等待输入C源程序状态。输入完源程序后,选择File菜单下选择Saveas子菜单项命令进行保存,在随后弹出的保存文件对话框中,输入文件名*.c后按“”(3)编译源程序选择Compile主菜单项并在其下拉子菜单中选择Compile命令,则进行编译。若源程序无语错误,生成可执行文件EXE;若源程序有语法错误,在Message窗口显示错误信息,此时没有生成可执行文件,应回到第2步,修改程序的错误,直到无语法错误、生成可执行文件。返回(4)连接程序在Compile菜单中,选择Link子菜单项命令,程序将被连接成可执行程序。

17、注:按F9键,可一次完成编译和连接。(5)执行程序。选择Run子菜单命令,或按快捷键Ctrl+F9。(6)看结果。程序运行后看结果必须选择File菜单下的DOSShell命令或者按快捷键Alt+F5,才能看到运行的结果。如程序未得到预期的结果,应回到第2步,修改程序的错误。(7)退出TurboC+,File-Quit菜单命令或按Alt+X。总结:简单总结:简单C语言程序设计步骤语言程序设计步骤1.分析问题,设计解决方案分析问题,设计解决方案分析问题,设计解决方案分析问题,设计解决方案2.了解和编写了解和编写了解和编写了解和编写C C语言程序代码语言程序代码语言程序代码语言程序代码3.上机调试(

18、编辑、编译、链接、执行)上机调试(编辑、编译、链接、执行)上机调试(编辑、编译、链接、执行)上机调试(编辑、编译、链接、执行)理论课的主理论课的主理论课的主理论课的主要内容要内容要内容要内容 实验课的主要内容实验课的主要内容实验课的主要内容实验课的主要内容 上述每个步骤都可能出现很多错误,上述每个步骤都可能出现很多错误,上述每个步骤都可能出现很多错误,上述每个步骤都可能出现很多错误,具体有三种错误:语法错误、逻辑错误、具体有三种错误:语法错误、逻辑错误、具体有三种错误:语法错误、逻辑错误、具体有三种错误:语法错误、逻辑错误、运行错误。总之,出现错误就要进行运行错误。总之,出现错误就要进行运行错

19、误。总之,出现错误就要进行运行错误。总之,出现错误就要进行调调调调试试试试。作作 业业1、在屏幕上输出如下图形:、在屏幕上输出如下图形:25要求:写出程序,并上机调试,尽量保证要求:写出程序,并上机调试,尽量保证程序能够得到正确结果。程序能够得到正确结果。复习本讲内容复习本讲内容(第一章),预习教材第二章。(第一章),预习教材第二章。第二章程序的简单算法制定2.1结构化程序的算法制定2.2结构化程序的算法描述2.3算法制定的范例2.1结构化程序的算法制定利用计算机处理问题简述2.1 结构化程序的算法制定结构化程序的算法制定例2.1从键盘输入3个数,找出其中最小的那个数。分析:1、需变量的个数-

20、3个2、先比较a,b的值,把小的存在min中。3、再用min与c比较,把数值小的存放在min中。如果ab则min=a,否则min=b;如果c0 -4ac0(双实根)双实根) X1=X1= X2= X2= 如果如果 b b2 2 -4ac=0 -4ac=0(单实根)单实根) X1=X2=X1=X2= 如果如果 b b2 2 -4ac0 -4ac=60)printf(“Passed!”);elseprintf(“Failed”);算法可采用自然语言、流程图、N-S图、PAD图、伪代码等方法来描述。示例:根据学生成绩输出评定结果。一、算法(algorithm)二、算法与流程图二、算法与流程图传统流程

21、图特点: 直观形象; 使用流线。缺点: 占面积大,使用流线任意转移,易出现“乱麻”现象,造成编程与阅读程序困难。二、算法与流程图二、算法与流程图N-S结构化流程图77年美学者I.Nassi和B.Scheiderman提出。特点 取消流线 不允许流程任意转移,只能从上而下顺序执行 规定三种基本结构的流程图单元,由这些基本结构象搭积木似的组成各种算法(结构化设计)。优点 算法清晰,流程不会无规律乱转移。二、算法与流程图二、算法与流程图三种基本结构通常情况下,程序中的语句是以所编写的顺序一句接一句通常情况下,程序中的语句是以所编写的顺序一句接一句地执行,这种执行方法称为地执行,这种执行方法称为“顺序

22、执行顺序执行”。许多。许多C C语句能够语句能够让程序员指定不按编写顺序执行下一条执行语句,这种执让程序员指定不按编写顺序执行下一条执行语句,这种执行方法称为行方法称为“控制转移控制转移”。BohmBohm和和JacopiniJacopini的研究证实,所有的程序都能够只用三种的研究证实,所有的程序都能够只用三种控制结构编写,即控制结构编写,即 顺序结构顺序结构 选择结构(选择结构(selection structureselection structure) 循环结构(循环结构(repetition structurerepetition structure) 顺序结构是顺序结构是C C语言

23、的基本结构,除非指示转移,否则计算语言的基本结构,除非指示转移,否则计算机自动以语句编写的顺序一句一句地执行机自动以语句编写的顺序一句一句地执行C C语句。语句。任何任何C C语言程序都是由七种控制结构(顺序结构、三种选择语言程序都是由七种控制结构(顺序结构、三种选择结构和三种循环结构)构成的。结构和三种循环结构)构成的。二、算法与流程图二、算法与流程图三种基本结构顺序结构A块、B块顺序执行(每块代表一个或一组操作)二、算法与流程图二、算法与流程图三种基本结构选择结构 条件p成立时执行a块(否则执行b块)if 选择结构选择结构 条件为真时执行某个指定的操作,条件为假时跳过该操作(单路选择)if

24、ifelseelse选择结构选择结构 条件为真时执行某个指定的操作,为假时执行另一个指定的操作(双路选择)switchswitch选择结构选择结构 根据表达式的值执行众多不同操作中的某个指定的操作(多路选择) 二、算法与流程图二、算法与流程图三种基本结构循环结构分当型和直到型两类。当型先判断,只要条件为真就反复执行A块,为假则结束循环。直到型先执行A块,再判断条件是否为真,为真则继续执行循环体,为假则结束循环。C语言提供了三种循环结构,即while循环结构,dowhile循环结构和for循环结构。2.2.3PAD图PAD(ProblemAnalysisDiagram)另一种被广泛使用的一种算法

25、的图形表示法。PAD图可以看成是二维的,它能展现算法的层次结构。(顺序结构很简单,在此未画图。)2.3算法制定范例例例2.4 把从键盘输入的大写字母转换成小写把从键盘输入的大写字母转换成小写字母,输出结果。字母,输出结果。问题:问题:1、描述算法、描述算法2、根据算法编写、根据算法编写C程序程序3、运行检查程序是否正确。、运行检查程序是否正确。 演示演示ex2022.3算法制定范例例2.5已知实数a和b,计算u的值:u=(r+s)2。其中,当ab时,r=a2-b2,s=a/b;当ab时,r=b2-a2,s=a/b+4。算法(算法(自然语言描述自然语言描述):):从键盘输入实数从键盘输入实数a和

26、和b。如果如果ab,则,则r=a2-b2,s=a/b;否则,否则,r=b2-a2,s=a/b+4。计算计算u的值:的值: u=(r+s)2。输出输出u的值。的值。开始输入a,babTFr=a*a-b*bs=a/br=b*b-a*as=a/b+4结束u=(r+s)*(r+s)输出u的值流程图输入实数a,babFTr=a*a-b*bs=a/br=b*b-a*as=a/b+4计算的值:u=(r+s)*(r+s)输出u的值N-S图输入实数a,babr=a*a-b*bs=a/br=b*b-a*as=a/b+4计算u=(r+s)*(r+s)输出u的值PAD图/*例例2.5*/#includemain()

27、float a,b,r,s,u;printf(请输入变量请输入变量a、b的值的值:);scanf(%f %f,&a, &b);if(ab)r=a*a-b*b;s=a/b;elser=b*b-a*a;s=a/b+4;u=(r+s)*(r+s);printf(所计算的所计算的u的值为:的值为:%f,u);C语言描述小结:小结: 本章主要介绍了程序算法的制定方法:自然语言、本章主要介绍了程序算法的制定方法:自然语言、流程图、流程图、N-SN-S图和图和PADPAD图。通过用这些方法表示解题图。通过用这些方法表示解题思路。思路。作业:作业: 用流程图、用流程图、 N-SN-S图和图和PADPAD图描述

28、问题的算法:图描述问题的算法: 从键盘输入从键盘输入3 3个整数个整数a,b,c,a,b,c,输出其中的最大的数。输出其中的最大的数。 第三章 基本程序语句C C语言的数据类型简介语言的数据类型简介几个基本概念几个基本概念 C C语言的三种基本数据类型语言的三种基本数据类型基本运算符和表达式基本运算符和表达式C C基本语句基本语句数据的输出数据的输出数据的输入数据的输入 简单程序设计简单程序设计举例举例3.1 3.1 C C语言的数据类型简介语言的数据类型简介 字符型(字符型(charchar) 整型(整型(short,int,long,unsignedshort,int,long,unsig

29、ned) 单精度型(单精度型(floatfloat) 实型实型 双精度型(双精度型(doubledouble) 枚举类型(枚举类型(enumenum) 数组类型(数组类型( ) 构造类型构造类型 结构体类型(结构体类型(structstruct) 共用体类型(共用体类型(unionunion) 指针类型(指针类型(* *)空类型(空类型(voidvoid)基本类型基本类型数据类型数据类型C语言的数据结构3.23.2几个基本概念几个基本概念3.2.1 3.2.1 标识符标识符 1标识符概念标识符概念:是用来标识名称标识名称的,可以用来标识变量名、符号常量名、函数名、类型名、数组名、文件名等。C语

30、言规定标识符只能由字母、数字和下划线组成,且第一个字符必须是字母或下划线。如:Day,month,student,name_1,s2,_12,_t13 注意注意:1)1)C C语言中大写字母和小写字母被认为是两个不语言中大写字母和小写字母被认为是两个不同的字符,大写字母同的字符,大写字母AA与小写字母与小写字母aa则则表示不同的标识符。表示不同的标识符。2)2)采用采用“见名知义见名知义”的原则的原则3.23.2几个基本概念几个基本概念3.2.1 3.2.1 标识符标识符2标识符的分类 关键字关键字( (代表固定含义,不能另做他用。书代表固定含义,不能另做他用。书P P2121) )分为三类分

31、为三类 预定定义标识符符( (有特定含义,包括有特定含义,包括C C语言库函数名语言库函数名 和变异预处理命令允许另做他用,但标识符失去原义和变异预处理命令允许另做他用,但标识符失去原义) ) 用户标识符用户标识符( (用户自己定义,不能使用关键字,可用户自己定义,不能使用关键字,可 以使用预定义标识符,建议不要使用预定义标识符以使用预定义标识符,建议不要使用预定义标识符) )3.23.2几个基本概念几个基本概念3.2.2 3.2.2 常量常量在程序运行中在程序运行中, ,其数值不能被改变的量其数值不能被改变的量1 1直接常量:直接常量:是在程序中直接引用的数据是在程序中直接引用的数据 2 2

32、符号常量:符号常量:符号常量是用标识符来代表一个数据符号常量是用标识符来代表一个数据 符号常量的定义形式符号常量的定义形式: : #define #define 符号常量标识符符号常量标识符 常量数据常量数据 例如例如: #define PI 3.14159: #define PI 3.141593.23.2几个基本概念几个基本概念3.2.3 3.2.3 变量变量变量是指以标识符为名字,其值可以改变的量。变量是指以标识符为名字,其值可以改变的量。1、定义形式:类型标识符变量名1,变量名2,变量名3.; 例如:inta,b,c;floatx,y;charc1,c2;或intc1,c2; 自己设定

33、,满足标自己设定,满足标识符的规定。识符的规定。如:如:intint, ,float,charfloat,char;不可省;不可省变量分为整型、实型、字符型等。变量分为整型、实型、字符型等。3.23.2几个基本概念几个基本概念3.2.3 3.2.3 变量变量2、变量初始化在说明变量的同时给变量一个初始值。int a=5, b=3; int a,b,c; a=b=c=3; int a=b=c=3; 例如例如注意:注意:在同一程序块中,变量不能被重复定义;使用变量时必须“先定义,后使用”。3.33.3 C C语言的三种基本数据类型语言的三种基本数据类型3.3.1 3.3.1 整型数据整型数据1 1

34、、整型常量:、整型常量: (1) (1) 十进制形式十进制形式: : 与数学上的整数表示相同;与数学上的整数表示相同; 例如例如: 12, -100, 0: 12, -100, 0 (2) (2) 八进制形式八进制形式: : 在数码前加数字在数码前加数字0 0; 例如例如: 012=1*8: 012=1*81 1+2*8+2*80 0=10(=10(十进制)十进制) (3) (3) 十六进制形式十六进制形式: : 在数码前加在数码前加0X0X(数字数字0和字母和字母X)。)。 例如例如: 0x12=1*16: 0x12=1*161 1+2*16+2*160 0=18(=18(十进制)十进制)

35、* 八进制的数码范围为八进制的数码范围为07; 018 * 十六进制的十六进制的数码除了数字数码除了数字0 09 9外外, , 还使用英文字母还使用英文字母a f (或或A F)表示表示1015。 如:如:0x1e 3.33.3 C C语言的三种基本数据类型语言的三种基本数据类型2、整型变量()整型变量分类()整型变量分类根据数据所占的二进制位数分为:int、short、long;同样存储长度的数据又分unsigned、signed; 故可组合出六种类型。()整型数据的存储方式()整型数据的存储方式 数据在内存中是以二进制形式存储的。C语言中,一个int型数据通常用两个字节存放,其中最高位用来

36、存放整数的符号,若最高位为0则表示该数为正数,若最高位为1则表示该数为负数。如:int i=-1; 则存放形式为:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 13.33.3 C C语言的三种基本数据类型语言的三种基本数据类型3、值域:变量允许存放的数值范围 由机器中数据的存储长度决定。 VC 6.0 所支持的整型数据 类型名称所占位数数值范围signedint8*4-21474836482147483647signedshortint8*2-3276832767signedlongint8*4-21474836482147483647unsignedint8*404294967

37、295unsignedshortint8*2065535unsignedlongint8*4042949672953.33.3 C C语言的三种基本数据类型语言的三种基本数据类型例例3.1:P24思考:运行结果是否正确,说明理由!思考:运行结果是否正确,说明理由!#includemain()int a,b,c,d;unsigned u,v;a=1;b=3;c=6;d=-7;u=a+b;v=c+d;printf(u=%d,v=%un,u,v);3.33.3 C C语言的三种基本数据类型语言的三种基本数据类型3.3.2 实型数据实型数据1 1、实型常量:、实型常量:(1) (1) 十进制小数形式:

38、十进制小数形式:由数字和小数点组成;由数字和小数点组成; 例如例如: 3.4 , 4. , .3 : 3.4 , 4. , .3 (2) (2) 指数形式指数形式:“十进制小数十进制小数”+“ e(+“ e(或或E)”+“E)”+“十进制数整数十进制数整数”。 例如例如: 12.5e-6: 12.5e-6 表示表示12.512.51010-6 。 规范化指数形式:规范化指数形式: 小数点不能单独出现;小数点不能单独出现; 0.0. .0 .0 . . e e或或E E的两边必须有数,且其后面必须为整数;的两边必须有数,且其后面必须为整数; 如:如: 6E0.2 6E0.2 e5e5 2、实型变

39、量(分类和值域):、实型变量(分类和值域): 关键字关键字 字节数字节数 取值范围取值范围 精度精度( (位位) ) float 4 3.4 float 4 3.41010-38 3.43.4101038 7 7 double 8 1.7 double 8 1.71010-308 1.71.71010308 1515注意注意3.33.3 C C语言的三种基本数据类型语言的三种基本数据类型3.3.3字符型数据字符型数据1 1、常量:、常量: (1) (1) 用单引号括起来的一个字符;如:用单引号括起来的一个字符;如:A、1、?等等。 (2) (2) 用单引号括起来的由反斜杠用单引号括起来的由反斜

40、杠( ( ) )引导的转义字符。引导的转义字符。 字符形式字符形式 功能功能 n n 换行换行 t t 横向跳格横向跳格 b b 退格退格 r r 回车回车 反斜杠字符反斜杠字符 单引号字符单引号字符 dddddd 8 8进制数表示的进制数表示的ASCIIASCII码对应的字符码对应的字符 xhhxhh 16 16进制数表示的进制数表示的ASCIIASCII码对应的字符码对应的字符例如:字符例如:字符A A的的ASCIIASCII码为:码为: 65D65D(十进制)(十进制)=41H=41H(十六进制)(十六进制)=101Q=101Q(八进制)(八进制) 字符字符A A可以表示为可以表示为AA

41、、x41x41、101101。#includemain()charc1=a,c2=b,c3=c,c4=101,c5=116;printf(a%cb%ctc%ctabcn,c1,c2,c3);printf(tb%c%c,c4,c5);转义字符的应用转义字符的应用演示ex3043.33.3 C C语言的三种基本数据类型语言的三种基本数据类型2、变量的分类和值域:分类: char 和 unsigned char;值域: 每个字符型数据在内存中占一个字节;包括ASCII字符表中的所有字符(可显示字符和非显示字符)。3、字符串常量:是用一对双引号括起来的字符序列。如:“SHANGHAI”,“FGHijk

42、”,“CHINA”。 字符串常量的存放:每个字符均以其ASCII码存放,且在最后加一个“空字符” a与与“a”的区别。的区别。注意注意3.43.4 基本运算符和表达式基本运算符和表达式3.4.1 C运算符简介按操作功能运算符大致可分为算术运算符、关系运算符、逻辑运算符、按位运算符以及其它运算符如赋值运算符、条件运算符、逗号运算符等。表达式是由操作数和运算符组成的序列。算术运算符+-*/%关系运算符=!=逻辑运算符!&位运算符|&赋值运算符=条件运算符?:逗号运算符,指针运算符*和&求字节数运算符sizeof强制类型转换运算符分量运算符下标运算符其它运算符号3.43.4 基本运算符和表达式基本运

43、算符和表达式3.4.2算术运算符和算术表达式 1、 基本的算术运算符 +(加):3+4、 +3 -(减):3-5、 -5 *(乘):3*5 /(除):5/2的值为2;5.0/2的值为2.5; %(取余):5%3的值为2; -5%3的值为-2; 5%(-3)的值为2; -5%(-3)的值为-2; 12.3%3 若a能被b整除,则有:a%b=0 整型数据相除,结果整型。5/3为1求余运算两侧为整型数据参与运算的数有一个是实型,则结果为实型3.43.4 基本运算符和表达式基本运算符和表达式2.算术表达式用算术运算符和括符将操作数连接起来的式子。优先级:() *、/、% +、-结合性:从左至右;表达式

44、的值:数值型(int、long、unsigned、double);例如:例如: 已知:已知: float a=2.0; int b=6,c=3; 求解:求解: a*b/c-1.5+ a+(b-5)=? double float long unsigned int char,short float a=2.0;float a=2.0; intint b =6,c =3; b =6,c =3; a*b/c -1.5 +a + (b-5)a*b/c -1.5 +a + (b-5)12.012.0/3/314.0 4.0 - 1.5- 1.52.5 2.5 + 97(int)+ 97(int)99.5

45、 99.5 + 1+ 1100.5100.5(double)(double)3.43.4 基本运算符和表达式基本运算符和表达式3.4.3 赋值运算符和赋值表达式1 1、赋值运算符、赋值运算符 = =2 2、赋赋值值表表达达式式:用用赋赋值值运运算算符符将将变变量量和和表表达达式式连连接接起起来来的的式式子子一般形式为:一般形式为: 赋值运算符赋值运算符 优先级:优先级: 赋值运算符的优先级比算术运算符低。赋值运算符的优先级比算术运算符低。结合性:自右至左(右结合性)。结合性:自右至左(右结合性)。求求值值规规则则: 先先计计算算“=”=”右右边边表表达达式式的的值值,再再将将其其值值赋赋给给左

46、左边边的的变量变量。表达式的值:赋值号左边变量的值即为赋值表达式的值。表达式的值:赋值号左边变量的值即为赋值表达式的值。例如例如:(1)x=(y=12)/4y值为12,x值为3,表达式的值为3(2)x=y=12/4y值为3,x值为3,表达式的值为3(3)x=(y=12/4)y值为3,x值为3,表达式的值为3 (4)(x=y)=12/4 3.43.4 基本运算符和表达式基本运算符和表达式3、复合赋值运算符*=、/=、%=、+=、-=等注意:复合运算符是一个运算符,但功能上,是两个运算符功能的组合。例如:(1)a+=b相当于a=a+ba*=b相当于a=a*ba*=b+c相当于a=a*(b+c)而不

47、是a=a*b+c(2)设a=12,计算表达式a+=a-=a*12和a+=a-=a*=12的值3.43.4 基本运算符和表达式基本运算符和表达式4赋值时的类型转换赋值时的类型转换实实型型数数据据赋赋给给整整型型(字字符符型型)变变量量:去去掉掉小小数数部部分分; 如如:intf=23.457;变量变量f的值为的值为23。整型(字符型)数据赋给实型变量:整型(字符型)数据赋给实型变量: 补足有效位补足有效位。字符型数据赋给整型变量:将字符数据(字符型数据赋给整型变量:将字符数据(8位)放到整型变量的低位)放到整型变量的低8位中,高位中,高8位进行位进行“符号扩展符号扩展”。 一个int、short

48、、long、unsigned型数据赋给一个char型变量:截取低8位赋给字符型变量。带符号的整型数据(int型)赋给long型变量:进行符号扩展。带符号的long型数据赋给int型变量时,只截取低16位赋给int变量。unsignedint型数据赋给longint变量:高位补0。int型数据赋给unsignedint变量:内存情况不变,但若是负数,其符号位也作为数值赋给unsigned型变量。3.43.4 基本运算符和表达式基本运算符和表达式5 5、自增与自减运算符、自增与自减运算符 单目运算符,运算对象是变量,不是表达式或者常量+i,-i:先使变量i的值增1(或减1),再使用变量i的值作为整

49、个表达式的值来参加其它的运算;i+,i-:先使用变量i的值进行其它运算,再使变量i的值增1(或减1)。(1) i+; +i;(2) i=3; j=i+; (3) i=3; j=+i;等价于等价于 i=i+1;i=i+1;j=i;i+; j=i;i+; 所以所以i i的值为的值为4 4,j j的值为的值为3 3。i+;j=i; i+;j=i; 所以所以i i的值为的值为4 4,j j的值为的值为4 4。例如:例如:3.43.4 基本运算符和表达式基本运算符和表达式5、自增与自减运算符自增与自减运算符结合性:自右至左。 如: i = 2; j = -i+; 等价于:j=-(i+); 即: j=-i

50、; i+; “+”与”-“是同优先级 所以i的值为3,j的值为-2。注意“+”或“-”自增与自减运算符的使用。设i=3,k=(i+)+(i+)+(i+),k=?设i=3,k=(i+)+(+i)+(+i),k=?设i=3,j=4,k=i+j,k=?设i=3;printf(“%d%d”,i,-i+);结果为?3.43.4 基本运算符和表达式基本运算符和表达式3.4.4 关系运算符和关系表达式关系运算符和关系表达式1.6种关系运算符:=!=2.关系表达式:用关系运算符将表达式连接起来的式子优先级:(=)(=!=)结合性:自左至右;表达式的值:若为真,则结果为1;若为假,则结果为0。35的值为0;32

51、的值为0;3+(43)*4的值为3;3+43的值为1;a & | 结合性:自左至右;结合性:自左至右; 表达式的值:表达式的值: 若为真,则结果为若为真,则结果为1 1; 若为假,则结果为若为假,则结果为0 0。3.43.4 基本运算符和表达式基本运算符和表达式inta=5;floatb=3.5;!a(0)!(ab)(1)a&b(1)!a&b(0)!a&!b(0)!(a&b)(0)a|b(1)!a|b(1)!a|!b(0)!(a|b)(0)(a0)(0)(a0)(1)例如例如结论:结论:&: :只要有一个为假,结果则为假;只要有一个为假,结果则为假;|: :只要有一个为真,结果则为真;只要有一

52、个为真,结果则为真; ! ! 高高 算术运算符算术运算符 关系运算符关系运算符 &和和| | 赋值运算符赋值运算符 低低 4 - 04 - 01 & 21 & 28 48 3 & 2 | 8 3 & 2 | 8 4 - !53.43.4 基本运算符和表达式基本运算符和表达式注意:注意: 在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例如:例如: (1)a = 0; b = 1; c = a+ & ( b = 3 ); 结果: a为1,b为1,c为0。 (2)a = 1; b = 1; c=0; d = -a | b-

53、| (c = b+3 ); 结果: a为0,b为0,c为0,d为1。3.43.4 基本运算符和表达式基本运算符和表达式逻辑表达式一般用于控制语句中的条件:例如: (1) n是小于m的偶数: (2)year是闰年: (能被4整除但不能被100整除或能被400整除)nm&n%2=0(year%4=0&year%100!=0)|year%400=03.43.4 基本运算符和表达式基本运算符和表达式3.4.6 条件运算符1 1、条件运算符、条件运算符 ? ?和和: : , ,它们与三个操作数组成三目运算。它们与三个操作数组成三目运算。2 2、形式为、形式为: : ? ? :33 3、求值规则和表达式的

54、值求值规则和表达式的值: : 真真( (非非0),0),求解表达式求解表达式2 2 求解表达式求解表达式1 1 条件表达式的值条件表达式的值 假假(0),(0),求解表达式求解表达式3 3例如例如: intmax,a=5,b=3;max=ab?a:ba条件赋值 验证:printf(%d%dn,-a=b+?a+:b+,b);运行结果:453.43.4 基本运算符和表达式基本运算符和表达式5、 结合性:自右至左; y = x10 ? x/10 : x0 ? x: -x; 等价于: y = x10 ? x/10 :(x0? x: -x); 思考:当x的值为15时,表达式的结果为: 当x的值为5时,表

55、达式的结果为:153.43.4 基本运算符和表达式基本运算符和表达式3.4.7逗号运算符: , 形式形式: : 逗号表达式逗号表达式1 1,逗号表达式,逗号表达式2 2,逗号,逗号表达式表达式n n 求值规则求值规则: : 从左至右依次计算各表达式的值从左至右依次计算各表达式的值; 优先级:优先级: 最低;最低; 结合性:自左至右;结合性:自左至右; 表达式的值表达式的值:最后一个表达式的值最后一个表达式的值。3.43.4 基本运算符和表达式基本运算符和表达式例如: a b y 表达式 y=a=4,b=5,a+b; 4 5 4 9 y=(a=4,b=5,a+b); 4 5 9 9 y=(a=4

56、,b=5),a+b; 4 5 5 9 y=a=(4,b=5),a+b; 5 5 5 10注意: C语言常用逗号作为分隔符, 例如: int a=3,b=4,c=5; printf(“%d,%d,%d”,(a,b,c); printf(“%d,%d,%d”,a,(a,b,c),c); 结果为3,5,53.43.4 基本运算符和表达式基本运算符和表达式3.4.8 强制类型转换运算符强制类型转换:指将表达式的类型强制转换为指定的类型,其一般形式为:(类型名)表达式其作用:将表达式的结果的类型强制转换为类型名所指的类型。例如例如(int)(3.4+2.8)的值为6强制类型转换时,得到所需类型的中间变量

57、,而原来变量的类型不会改变。3.43.4 基本运算符和表达式基本运算符和表达式例如:inta=2,b=5;floatx=4.4;则有:表达式结果b/a2(float)b/a2.5(float)(b/a)2.0(int)x%a+x4.4(int)x%(a+x)不合法3.53.5 C C基本语句基本语句C语言的语句可分为以下四类:简单语句(包括输入/输出语句)空语句复合语句流程控制语句3.53.5 C C基本语句基本语句3.5.1简单语句1.表达式语句就是一个表达式加上一个分号。如:a+;x=1;2.函数调用语句由函数调用表达式加分号构成。3.printf(“%d”,a);3.空语句用一个分号表示

58、,其一般形式为:用一个分号表示,其一般形式为: ;3.53.5 C C基本语句基本语句C语言有丰富的标准函数库,可提供各类函数供用户调用,完成预先设定好的操作.#include#includemain()inta=2,b=4;floatx,y;x=a/2+sqrt(b);/*x=3.0*/a+;/*a=3*/y=x*a;/*y=9.0*/printf(“x=%6.2f,y=%6.2f”,x,y);3.53.5 C C基本语句基本语句常用标准库函数求数学函数值:fabs(x)(求x的绝对值)、pow(x,y)(计算x的y次幂)、sin(x)、cos(x)、exp(x)(求ex)、log(x)(求

59、lnx)等。调用标准库函数要注意以下几点:在程序中要包含相应的头文件例如:要使用标准的输入/输出函数printf()等需包含头文件#include要使用数学函数sqrt()等需包含头文件#include调用规则:函数名(参数表)3.53.5 C C基本语句基本语句3.5.2 复合语句用一对花括号将多条语句组合在一起,在语法上相当于一条语句。1、一般形式:内部数据说明;语句1;语句n;注意:(1)(1)在复合语句中说明的变量,是局部变量在复合语句中说明的变量,是局部变量, , 仅在复合语仅在复合语句中有效。句中有效。(2)(2)复合语句的复合语句的 之后,不能有分号。之后,不能有分号。3.53.

60、5 C C基本语句基本语句复合语句(程序块)示例【例3.3】main()intx=1;intx=2; intx=3;printf(“x=%d”,x); printf(“x=%d”,x);printf(“x=%d”,x);3.63.6 数据的输出数据的输出1格式输出函数printf() 格式:printf( “”,输出项1,输出项2,输出项n);例:printf(“x=%d,y=%fn”,x,x+3);格式控制(用双引号括起来,控制输出项的格式和输出一些提示信息)输出表列(用逗号分隔的数据组,可选项)格式控制分为两个部分:普通字符原样输出(转义字符按表3-4输出)格式说明%+格式字符(替换输出)

61、格式说明的一般形式:% - 0 m.n l(或(或h) 格式字符格式字符-左对齐输出0数字前的空位填0m输出域宽(长度,包括小数点)如数据的位数小于m,则左端补以空格 如数据的位数大于m,则按实际位数输出n输出精度(小数位数)l或h长度修正符l长整型及双精度注:long型的数据宜用%ld,double型宜用%lfh表示短整型如%hd%hx3.63.6 数据的输出数据的输出格式字符(规定了输出的数据形式):%d输出十进制整数%x以十六进制无符号形式输出整数%o以八进制无符号形式输出整数%u以无符号十进制数形式输出整数%f输出小数形式浮点数(double型用%lf)%s输出字符串%c输出单字符3.

62、63.6 数据的输出数据的输出【例1】求运行结果。main()inta=30;printf(%d,%o,%x,%u,%c,a,a,a,a,a);结果:30,36,1e,30,结论: 格式字符与对应输出项类型要一致,否则正确的运算结果不能得到正确的显示结果。3.63.6 数据的输出数据的输出【例】若floaty=1234.9999;printf(“%d”,y);则输出结果为何?printf函数使用注意事项:在格式控制字符串中,格式说明与输出项从左到右在类型上必须一一对应匹配。 在格式控制字符串中,格式说明与输出项的个数应该相同。 如果要输出百分号(%),则在格式控制串中用两个连续的百分号(%)来

63、表示。 在调用printf函数时,输出项有自增(自减)运算时,计算输出项的顺序从右至左。 3.63.6 数据的输出数据的输出【例】.格式输出函数示例程序#includemain()inti=97;charch=a;printf(“i=%d,%cn”,i,i);输出结果:i=97,a 两个输出项都是变量两个输出项都是变量i , i , 但以不同的格式输但以不同的格式输出出, ,一个是输出的整型数一个是输出的整型数, ,一个输出的是字符一个输出的是字符a. a. 其格其格式是由式是由%d%d与与%c%c控制的控制的.3.63.6 数据的输出数据的输出字符输出函数字符输出函数 格式:putchar(

64、c)其中c为字符型或整型的常量、变量及其表达式功能: 每次向屏幕输出一个字符供显示。【例】求以下程序运行结果#includemain()charx=a;putchar(x);putchar(b);putchar(x+2);putchar(b+2);结果:abcd1格式输入函数scanf()格式:scanf( “”,&变量名1,&变量名2,,&变量名n);例:scanf( “%d,%d,%d” ,&a,&b,&c );3.73.7 数据的输入数据的输入格式控制(需要输入数据的类型)地址列表(简单变量要用&开头)格式说明的一般形式: % * ml(或h) 格式字符 &求地址的运算符&a表示该变量所

65、占空间的首地址 * 抑制字符(“虚读”,即读入数据后不送给任何变量)注意:scanf()函数没有输出功能(即不会向屏幕显示任何字符)也不能规定小数位数(m.n)典型错误:scanf(“a=%d,b=%d,c=%dn”,&a,&b,&c);scanf(“%5.2f“,&x);3.73.7 数据的输入数据的输入正确语句:printf(“Inputa,b,c=“);scanf(“%d,%d,%d”,&a,&b,&c);scanf(“%5f“,&x);scanf()注意事项字符输入函数 格式:getchar()功能:从键盘上读入一个字符,getchar()包含在stdio.h中。3.73.7 数据的输

66、入数据的输入【例一】#includemain()chara,b;a=getchar();b=getchar();printf(“a=%c,b=%cn”,a,b);运行时,如果输入:Student输出结果为a=S,b=t例例3.133.13 输入圆的半径,输出圆的周长和面积。分析:分析: 1.定义实型变量r、l、s用于存放半径、周长、面积;2.调用输入函数,输入r:3.分别利用周长公式和面积公式求出l、s;4.调用输出函数输出l、s。3.83.8 程序举例程序举例例例3.103.10输入圆的半径,输出圆的周长和面积输入圆的半径,输出圆的周长和面积#includevoidmain()floatr,

67、l,s;scanf(“%f”,&r);/*输入一个浮点数据,存入地址&r*/l=2*3.14159*r;/*计算周长,赋值给l*/s=3.14159*r*r;/*计算面积,赋值给s*/printf(“nl=%8.4f”,l);/*周长占8个字符宽,4位小数*/printf(“ns=%8.4f”,s);/*输出面积,数据共占8个字符宽,4位小数*/3.83.8 程序举例程序举例3.83.8 程序举例程序举例例例3.123.12从键盘输入一个学生的从键盘输入一个学生的3 3门课程的成绩,求其平均并输门课程的成绩,求其平均并输 出,保留一位小数。出,保留一位小数。例例3.11从键盘输入一个小写字母,

68、用大写形式输出该字母。从键盘输入一个小写字母,用大写形式输出该字母。例例3.13 从键盘输入两个整数给两个变量从键盘输入两个整数给两个变量x和和y,交换变量,交换变量x和和y的的值,然后输出。值,然后输出。程序流程控制第三章第三章 顺序结构程序设计顺序结构程序设计1第四章第四章 选择结构程序设计选择结构程序设计2第五章第五章 循环结构程序设计循环结构程序设计3几种控制语句几种控制语句4顺序结构程序设计顺序结构程序设计顺序结构:自顶向下顺序执行语句顺序结构:自顶向下顺序执行语句例:交换两个数的值 34x3tybefore:x=3,y=4;after:x=4,y=3;#includemain()i

69、ntx=3,y=4,t;printf(“before:x=%d,y=%dn”,x,y);t=x;x=y;y=t;printf(“after:x=%d,y=%dn”,x,y);例:从键盘输入一个小写字母,输出其对应的大写字母例:从键盘输入一个小写字母,输出其对应的大写字母及其相应的及其相应的ASCIIASCII码值。码值。程序如下:程序如下:#include#include main()main() char ch1,ch2;char ch1,ch2;ch1=ch1=getchargetchar();();ch2=ch1-32;ch2=ch1-32; printf(nprintf(n lette

70、r:%c,ASCIIletter:%c,ASCII=%d,ch1,ch1);=%d,ch1,ch1);printf(nprintf(n letter:%c,ASCIIletter:%c,ASCII=%d,ch2,ch2);=%d,ch2,ch2); scanf(“%c”,&ch1);运行结果为:运行结果为:a letter:a,ASCII=97letter:A,ASCII=65第四章第四章 选择结构程序设计选择结构程序设计if语句语句: 1.单分支单分支if语句语句 2.双分支双分支if语句语句 3.多分支多分支if语句语句选择结构有两种:选择结构有两种:switch 语句语句按给定条件进行判

71、断,按判断后的不同情况进行不同处理。按给定条件进行判断,按判断后的不同情况进行不同处理。 形式二形式二(一般形式一般形式): 格式格式:if (expression) statement1 else statement2 执行过程:执行过程:if语句常用的两种形式语句常用的两种形式形式一形式一(缺省形式缺省形式):格式:格式:if (expression) statement执行过程:执行过程:表达式语句非00例:例:if (xy) printf(“%d”,x);表达式语句1语句2非00例:例:if (xy) max=x; else max=y;if语句(条件分支语句)【例4-1】在两个数中取

72、大数。main()intnum1,num2,max;printf(ninputtwonumbers:);scanf(%d%d,&num1,&num2);max=num1;if(maxnum2)printf(max=%dn,num1);elseprintf(max=%dn,num2);如:if(a=b&x=y)printf(“a=b,x=y”);if(3)printf(“OK”);if(a)printf(“%d”,a);if(s=2)printf(“hello”);if(s=2,s0)printf(“false”);elseelse要与要与ifif配对使用配对使用ifif后面的表达式类型任意后面

73、的表达式类型任意语句可以是复合语句语句可以是复合语句同一个条件的多种表达方式同一个条件的多种表达方式 如:如:if(x) if(x!=0) if(!x) if(x=0)例考虑下面程序的输出结果:#includemain()intx,y;scanf(“%d,%d”,&x,&y);if(xy)x=y;y=x;elsex+;y+;printf(“%d,%dn”,x,y);CompileError!说明:说明:错误信息:misplacedelseinfunctionmain如:if(ab)r=a*a-b*b;s=a/b;elser=b*b-a*a;s=a/b+4;#include main() int

74、 x,y; printf(Enter integer x:); scanf(%d,&x); y=x=0?2*x+1:0; printf(“when X=%d,f(x)=%dn”,x,y);运行:运行:Enter integer x:10 when X=10,f(x)=21 Enter integer x:-1 when X=-1,f(x)=0 例例 求分段函数的值求分段函数的值 if(x=0) y=2*x+1; else y=0; + + = =)0(12)0(0)(xxxxf#include main() int x,y; printf(Enter integer x:); scanf(%d

75、,&x); if(x) y=1; else y=-1; printf(“when X=%d,y=%dn“,x,y);运行:运行:Enter integer x:10 when X=10,y=1 Enter integer x:0 when X=0,y=-1 例例 if(x!=0) =-1-1!=!= =) 0() 0(1xxy多分支if语句:if-elseif其格式为:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式n)语句nelse语句n+1【例3-3】将学生成绩由百分制转化为等级制。规则如下:85分(含)以上为A级。70分(含)以上且85分以下为B级。60分(含)以

76、上且70分以下为C级。60分以下为D级。main()floatscore;printf(npleaseinputascore:);scanf(%f,&score);if(score=85)printf(thescore%fisAn,score);elseif(score=75)printf(thescore%fisBn,score);elseif(score=60)printf(thescore%fisCn,score);elseprintf(thescore%fisDn,score);程序运行结果如下:pleaseinputascore:89thescore89.000000isA if语句

77、嵌套语句嵌套例:例: #include “stdio.h” main() int x=4,y=5,z=2,max; max=x; if(zy) if(zx) max=z; else if(yx) max=y; printf(“max=%d”,max); 结果结果?缺省缺省 时,时,else总是和它上面离它最近的未配对的总是和它上面离它最近的未配对的 if 配对配对if()if()if()else.else.else.if else 配对原则:配对原则:main()intx=100,y=10,a=30,b=20,k1=10,k2=6;if(ab)if(b!=10)if(!k1)x=1;elsei

78、f(k2)x=10;elsex=20;printf(x=%dn,x);运行结果:x=10例:例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改:修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现实现if else 正确配对正确配对方法:加方法:加 实现实现if else 正确配对方法正确配对方法注意:书写格式不能注意:书写格式不能代替程序逻辑代替程序逻辑if语句嵌套一般形式:if (expr1) if (expr2) statement1 else stat

79、ement2内嵌内嵌ifif (expr1) if (expr2) statement1 else statement2 内嵌内嵌ifif (expr1) statement1else if(expr3) statement2 else statement3内嵌内嵌ifif (expr1) if (expr2) statement1 else statement2else if(expr3) statement3 else statement4内嵌内嵌if内嵌内嵌ifmain()intx,y;printf(”ninputx:”);scanf(”%d”,x);if(x0)y=-1;elseif(

80、x=0)y=0;elsey=1;printf(”x=%d,y=%dn”,y);#includemain()intx,y;printf(Enterintegerx,y:);scanf(%d,%d,&x,&y);if(x!=y)if(xy)printf(XYn);elseprintf(XYn);elseprintf(X=Yn);运行:运行:Enter integer x,y:12,23 XY Enter integer x,y:12,12 X=Y例例 输入两数并判断其大小关系输入两数并判断其大小关系switch语句(开关语句)一般形式:执行过程:switch()case:case:.case:de

81、fault:的值与某一case后面的值匹配时,则执行此case后面的所有的,直至遇到break语句或switch的结束“”,否则,执行default后的。一般是一个整数表达式(或字符表达式)说明:case后面是常量表达式,且值必须互不相同case和常量表达式之间要有空格case后可包含多个可执行语句,且不必加 常量表达式起语句标号作用,跳出必须用break语句 多个case可共用一组执行语句 switch可嵌套 完全可以用if语句或if语句的嵌套来实现。如:switch(z)caseA:caseB:caseC:printf(“score60n”);break;caseF:.如:switch(z

82、)case1:case2:.case2:.如:switch(z)caseA:i+;k-;printf(“An”);break;caseF:.例switch(score)case5:printf(“Verygood!”);case4:printf(“Good!”);case3:printf(“Pass!”);case2:printf(“Fail!”);default:printf(“dataerror!”);运行结果:score为5时,输出:Verygood!Good!Pass!Fail!dataerror!如:intx=3,y=7;switch(z)casex+y:.【例】输入17中的数字,将

83、其转换成相应的星期英文单词。main()intnum;scanf(”%d”,&num);switch(num)case1:printf(”Mondayn”);break;case2:printf(”Tuesdayn”);break;case3:printf(”Wednesdayn”);break;case4:printf(”Tursdayn”);break;case5:printf(”Fridayn”);break;case6:printf(”Saturdayn”);break;case7:printf(”Sundayn”);break;default:printf(”errorn”);若无b

84、reak?【例4-6】编写程序测试是数字、空白、还是其他字符。main()intc;switch(c)case0:case1:case2:case3:case4:case5:case6:case7:case8:case9:printf(”thisisadigitn”);break;case:casen:caset:printf(”thisisablankn”);break;default:printf(”thisisacharactern”);break;补充举例:补充举例:路程路程s越远,每公里运费越低。越远,每公里运费越低。折扣的标准如下:折扣的标准如下: s250km 没有折扣没有折扣2

85、50s500 2折扣折扣500s1000 5折扣折扣 1000s2000 8折扣折扣 2000s3000 10折扣折扣 3000s 15折扣折扣 设每公里每吨货物的基本运费设每公里每吨货物的基本运费为为p,货物重为,货物重为w,距离为,距离为s,折扣,折扣为为d,则总运费,则总运费f 的计算公式为:的计算公式为: fp*w*s*(1-d)折扣的折扣的“变化点变化点”都是都是250倍数倍数 分析折扣变化的规律:分析折扣变化的规律:若若s为整型,则为整型,则c与折扣与折扣d的关系为:的关系为: c=0 d=0 c=1 d=2% c=2、3 d=5% c=4、5、6、7 d=8% c=8、9、10、

86、11 d=10% c=12、13、14、 d=15%若若c=s/250,则折扣,则折扣d如下:如下: c=3000) c=12; else c=s/250; switch (c) case 0:d=0; break; case 1:d=2; break; case 2: case 3:d=5; break; case 4:case 5:case 6: case 7:d=8; break; case 8:case 9:case 10: case 11:d=10; break; case 12:d=15; break; f=p*w*s*(1-d/100.0); printf(“%15.4fn”,f

87、);程序:程序:?能能练习:输入一个由两个数据和一个算术运算符组成的表达式,根据运算符完成相应运算,并输出结果。#includemain()inta,b;charc;scanf(%d%c%d,&a,&c,&b);switch(c)case+:printf(a+b=%d,a+b);break;case-:printf(a-b=%d,a-b);break;case*:printf(a*b=%d,a*b);break;case/:if(b!=0)printf(a/b=%d,a/b);elseprintf(b=0);break;delfault:printf(error);作业:第四章课后习题P65P

88、70上机:练习4 4种循环语句种循环语句whilefordo-while循环是指使用一定条件对同一个程序段重复执行若干次。循环结构又称重复结构,可以完成重复性、规律性的操作。第五章第五章 循循 环环 结结 构构gotogoto语句一般格式:goto 语句标号语句标号由ifgoto构成循环例4-1:main()intx=0,y=0;star:if(x=3)y=x+1;x=x+1;gotostar;printf(“%d”,y);分析输出结果。一般形式:while()执行流程:while语句循环体:被重复执行的部分表达式循环体假(0)真(非0)while 特点:先判断表达式,后执行循环体 说明: 循

89、环体有可能一次也不执行 循环体可为任意类型语句 下列情况,可退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto while语句特点和说明while()例4-2:main()intcount=1;while(count5)printf(”goodmorning!n”);count+;good morning!good morning!good morning!good morning!#includemain()intn=9;while(n6)n-;printf(“%d”,n);876main()intn=9;while(n6)n-;printf(“%dn

90、”,n);6例例4-3:用用while循环求循环求sum=1+2+3+100#includemain()intsum=0;inti=1;while(i=100)sum+=i;i+;printf(“sum=%d,sum);循环初值循环终值循环变量增值循环条件循环体如何求sum=1*2*3*100?【例例5-13】猴子吃桃问题。猴子吃桃问题。猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一猴子第一天摘下若干桃子,当即吃掉一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃掉前一天剩下的一半

91、零一个。到第天早上都吃掉前一天剩下的一半零一个。到第1010天早上再想吃时,天早上再想吃时,就只剩一个桃子了。问第一天共摘了多少个桃子?就只剩一个桃子了。问第一天共摘了多少个桃子?迭代法迭代法设第设第n天为天为xn个,第个,第n+1天为天为xn+1则:则:xn+1= xn/2-1可得递推公式:可得递推公式: xn=(xn+1+1)*2 1n9 x10=1 n=10即:即: x10=1 x9=(x10+1)*2=4 x8=(x9+1)*2 =10 x1=(x2+1)*2=1534算法分析:算法分析:倒推倒推#includemain()intp2=1,p1;intn=9;while(n0)p1=2

92、*(p2+1);p2=p1;n-;printf(“thetotalis%dn”,p1);#includemain()intn=0;longt=1;printf(“nn!n”);while(n8)n+;t*=n;printf(%d%ldn,n,t);运行结果:nn!1122364245120672075040840320求n!(n=18)do-while语句一般形式:dowhile();执行流程:do循环体expr假(0)真(非0)while“;”不能少expr循环体假(0)真(非0)循环体while循环特点:先执行循环体,后判断表达式说明:至少执行一次循环体dowhile可转化成while结构

93、dowhile语句特点和说明dowhile();main()intx=3;doprintf(“%d”,x-=2);while(x=0);1-1x=x-2;printf(“%d”,x);求1+2+3+100#includemain()intsum=0,i;i=1;dosum=sum+i;i+;while(i=100);printf(”sum=%dn”,sum);#includemain()intsum=0;inti=1;while(i=100)sum=sum+i;i+;printf(“sum=%d,sum);main()inti=1,s=0;while(i1)s=s+i;i=i+1;printf

94、(s=%dn,s);s=0main()inti=1,s=0;dos=s+i;i=i+1;while(i1);printf(s=%dn,s);s=1do-while与与while的区别的区别一般形式:for(表达1;表达式2;表达式3)执行流程:expr2循环体假(0)真(非0)forexpr1expr3for语句 一般应用形式:for(初始化表达式;条件表达式;修正表达式)说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省for语句可以转换成while结构表达式1;while(表达式2)表达式3;for语句for(for(表达表达1 ;1 ;表达式表达式2

95、;2 ;表达式表达式3)3) 形式:形式:#includemain( ) int i=0; for(i=0;i10;i+) putchar(a+i);运行结果:abcdefghij形式:形式:#includemain( ) int i=0; for(;i10;i+) putchar(a+i);形式:形式:#includemain( ) int i=0; for(;i10;) putchar(a+(i+);形式:形式:#includemain( ) int i=0; for(;i10;putchar(a+i),i+) ;例:for语句形式的多样性main()inti;for(i=0;i10;i+

96、)i+;printf(“%d”,i);main()inti;for(i=1;i5;i+);printf(“%d”,i);513579空语句求1+2+3+100main()intsum=0,i;for(i=1;i=100;i+)sum=sum+i;printf(”sum=%dn”,sum);几种循环的比较while(表达式)语句;do语句while(表达式);循环控制条件循环控制条件循环条件初始化循环条件初始化循环修改条件循环修改条件也可在也可在forfor前前也可在也可在循环体内循环体内for(表达式1;表达式2;表达式3)语句几种循环的比较123循环体的执行:先判断条件,循先判断条件,循环体

97、可能一次也环体可能一次也不执行。不执行。while(表达式表达式) 语句语句; 后判断条件,后判断条件,循环体至少执循环体至少执行一次行一次.do 语句语句while(表达式表达式);for循环功能强,循环功能强,两者界限不清,使两者界限不清,使用较随意。用较随意。for(表达式表达式1;表达式表达式2;表达式表达式3) 语句语句界限不清界限不清界限不清界限不清小结小结 循环控制有两种方法:循环控制有两种方法:计数法计数法和和标志法标志法。 能确定循环次数时,采用计数法,用能确定循环次数时,采用计数法,用for语句比较清晰;语句比较清晰; 不能确定循环次数时,采用标志法,设法找出循环终不能确定

98、循环次数时,采用标志法,设法找出循环终止条件,用止条件,用while或或do-while语句来实现。语句来实现。 用用while与与do-while语句能实现的程序,用语句能实现的程序,用for语句未必可以语句未必可以实现。实现。 while语句是先判断后执行,语句是先判断后执行,do-while语句是先执行后判断。语句是先执行后判断。在循环体至少执行一次的情况下两者等价。在循环体至少执行一次的情况下两者等价。#includemain()inti,s;s=0;i=1;while(i=100)s=s+i;i+;printf(s=%dn,s);计算计算s=1+2+3+s=1+2+3+100+100

99、#includemain()inti,s;s=0;i=1;dos=s+i;i+;while(i=100);printf(s=%dn,s);#includemain()inti,s=0;for(i=1;i=100;i+)s=s+i;printf(s=%dn,s); i=1; i=1;for( ;i=100; )for( ;i=100; ) s=s+i; s=s+i; i+; i+; main()inti;for(i=1;i=0);去掉分号,结果是?例例:求:求Fibonacci数列第数列第40项。又叫项。又叫兔子繁殖问题(兔子繁殖问题(Fibonacci提出的)提出的)main( ) int n

100、,m; long f1=1,f2=1,f3; printf(“%ld %ld ”,f1,f2); for (m=3;m=40;m+) f3=f1+f2; f1=f2; f2=f3; printf(“%d ”,f3); printf(“n”); 设有一对新生兔子,从第设有一对新生兔子,从第3个月开始,每个月都生一对兔子。按此个月开始,每个月都生一对兔子。按此规律,若所有兔子都不死,问一年后共有多少对兔子?规律,若所有兔子都不死,问一年后共有多少对兔子?迭代法迭代法算法分析:算法分析:月月:1 2 3 4 5 6 7 8:1 2 3 4 5 6 7 8 1 1-1 11 11 11 11 11-1

101、1-1 1 1 1 1-1 1 1 11 1-1 1 1 1 1 11 11 1-1 1 1 1 1 1-1 1 1 11 11 11 11 1 1 1 1 1-1 1 1 11 11 1 1 1兔兔: 1 1 2 3 5 8 13 21f1 f21 1 f3=f1+f2 2 f1 f2 f3=f1+f2 3 f1 f2 f3=f1+f2 5 f1 f2 f3=初始条件初始条件终止条件终止条件迭代公式迭代公式思考:思考:f1=f2和和f2=f3能否对换能否对换位置?不位置?不例例:打印出所有的水仙花数。一个打印出所有的水仙花数。一个3位数,其位数,其各位数字的立方和等于它本身。各位数字的立方和

102、等于它本身。分析:百位数i=m/100;十位数:j=m/10%10;个位数k=m%10;判断m=i3+j3+k3main()inti,j,k,m;for(m=100;m1000;m+)i=m/100;j=m/10%10;k=m%10;if(m=i*i*i+j*j*j+k*k*k)printf(%5d,m);穷举法穷举法计数法计数法统计从键盘输入一行字符的个数.main()intcount=0;while(getchar()!=n)count+;printf(%d,count);标志法:标志法:循环终止条件循环终止条件main( ) int x,max,i; scanf(“%d”,&x); ma

103、x=x; for (i=2;imax) max=x; printf(“max=%dn”,max);依次输入依次输入10个数,找出最大数。个数,找出最大数。分析:分析:输入输入x1x1 max输入输入x2若若x2max则则x2 max输入输入x3若若x3mx则则x3 max输入输入x4有一个分数序列有一个分数序列2/1,3/2,5/3,8/5,21/13求该数例前求该数例前20项之和项之和main()intn,t;floata=2,b=1,s=0;for(n=1;n=a&c=A&c=0&c=9)digit+;elseothers+;printf(all in all:char=%d space=

104、%d digit=%d others=%dn,letters,space,digit,others); 循环的嵌套:循环体本身包含循环语句 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉(1)while()while().(2)dodowhile();.while();(3)while()dowhile();.(4)for(;)dowhile();while().内循环外循环内循环循环的嵌套for(i=1;i5;i+)j=1;while(j4)printf(i=%d,j=%dn,i,j);j+;for(j=1;j4:j+)printf(i=%d,j=%dn,i,j)

105、;i=1,j=1i=1,j=2i=1,j=3i=2,j=1i=2,j=2i=2,j=3i=3,j=1i=3,j=2i=3,j=3i=4,j=1i=4,j=2i=4,j=3 形状形状 形状形状main()inti,j;for(i=1;i=9;i+)printf(“%4d”,i);printf(“n”);for(i=1;i=9;i+)printf(“%c”,-);printf(“n”);for(i=1;i=9;i+)for(j=1;j=9;j+)printf(“%4d”,i*j);printf(“n”);P71例例12:打印九九乘法表:打印九九乘法表 形状形状1 2 3 4 5 6 7 8 91

106、2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 打印表头打印表头9个数字个数字打印虚线打印虚线打印打印表体表体for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%4d”,i*j);printf(“n”);打印打印表体表体for(i=1;i=9;i+)for(j=0;j=i-1;j+)printf(“%4c”,);for(j=i;j=9;j+)printf(“%4d”,i*j);printf(“n”);打印打印表体表体打印打印空格空格例:百马百担例:百马百担有有100匹马,驮匹马,驮100担货,大马驮担货,大马驮3担,中马驮担

107、,中马驮2担,两匹小担,两匹小马驮马驮1担。问有大、中、小马各多少?担。问有大、中、小马各多少?算法分析:算法分析:main( ) int a,b,c; for (a=0;a33;a+) for (b=0;b50;b+) c=100-a-b; if (3*a+2*b+c/2.0=100) printf(“a=%d ”,a); printf(“b=%d ”,b); printf(“c=%dn”,c); 设大、中、小马各为设大、中、小马各为a a、b b、c c,则:,则: 3a+2b+c/2=100 a+b+c=100可得:可得: 0a33 0b50 0c200穷举法穷举法若问有几种解决方法,若

108、问有几种解决方法,则应如何修改程序?则应如何修改程序?用变量用变量k作为计数作为计数器,在器,在if语句中增语句中增加加“k+;”语句语句例例:打印图形。打印图形。1 23 456789 0 1* * * * * * * * * * *算法分析:算法分析:第第1行:行:1个个*,6个个空格空格,换行,换行第第2行:行:3个个*,4个个空格空格,换行,换行第第3行:行:5个个*,1个个空格空格,换行,换行第第4行:行:7个个*,0个个空格空格,换行,换行第第i(14)行:行:2i-1个个*,8-2i个个空格空格,换行换行main( ) int i,j; for (i=1;i=4;i+) for

109、(j=1;j=2*i-1;j+) printf(“*”); for (k=1;k=8-2*i;k+) printf(“ ”); printf(“n”); 2i-1个个*8-2i个个空格空格换行换行补充举例:打印图形。补充举例:打印图形。1 23 45 6 78 9 1011* * * * * * * * * * * * * *算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*号,换行号,换行第第2行:行:2个空格,个空格,5个个*号,换行号,换行第第3行:行:3个空格,个空格,5个个*号,换行号,换行第第4行:行:4个空格,个空格,5个个*号,换行号,换行第第5行:行:5个空格,个空

110、格,5个个*号,换行号,换行第第i(15)行:行:i个空格,个空格,5个个*号,换行号,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=i;j+) printf(“ ”); for (j=1;j=5;j+) printf(“*”); printf(“n”); i个空格个空格5个个*号号换行换行循环语句嵌套时,当外层循环语句嵌套时,当外层循环变量取循环变量取1个值时,内个值时,内层循环变量要取遍所有值层循环变量要取遍所有值补充举例(续):打印图形。补充举例(续):打印图形。1 23 45678 90 1*1 23 45 6 78 90 1122333

111、4444555551 23 45 6 78 90 1*算法分析:算法分析:第第1行:行:5个空格,个空格,1个个*_,换行,换行第第2行:行:4个空格,个空格,2个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:2个空格,个空格,4个个*_,换行,换行第第5行:行:1个空格,个空格,5个个*_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个*_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=6-i;j+) printf(“ ”); for (j=1;j=i;j+) printf(“*_”)

112、; printf(“n”); 6-i个空格个空格i个个*_换行换行算法分析:算法分析:第第1行:行:5个空格,个空格,1个个1_,换行,换行第第2行:行:4个空格,个空格,2个个2_,换行,换行第第3行:行:3个空格,个空格,3个个3_,换行,换行第第4行:行:2个空格,个空格,4个个4_,换行,换行第第5行:行:1个空格,个空格,5个个5_,换行,换行第第i(15)行:行:6-i个空格,个空格,i个个i_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=6-i;j+) printf(“ ”); for (j=1;j=i;j+) printf

113、(“%d_”,i); printf(“n”); 6-i个空格个空格i个个i_换行换行算法分析:算法分析:第第1行:行:1个空格,个空格,5个个*_,换行,换行第第2行:行:2个空格,个空格,4个个*_,换行,换行第第3行:行:3个空格,个空格,3个个*_,换行,换行第第4行:行:4个空格,个空格,2个个*_,换行,换行第第5行:行:5个空格,个空格,1个个*_,换行,换行第第i(15)行:行:i个空格,个空格,6-i个个*_,换行,换行main( ) int i,j; for (i=1;i=5;i+) for (j=1;j=i;j+) printf(“ ”); for (j=1;j3是否是否为

114、素数为素数main( ) int n,m; scanf(%d,&m); for (n=2;nm-1) printf(the %d is a primern,m); else printf(the %d is not a primern,m); 例:验证素数例:验证素数 素数是除了素数是除了1 1和它自身外,和它自身外,再也找不到能被它整除的数。再也找不到能被它整除的数。 即:若即:若m m不能被不能被2 2到到m-1m-1中中所有整数整除,则所有整数整除,则n n为素数。为素数。 已证明只要从已证明只要从2 2判断到判断到m/2m/2或或 即可。即可。算法分析:算法分析:求求100200间的全

115、部素数间的全部素数?也可用也可用m/2或或sqrt(m)与break语句退出循环不同的是,continue语句只结束本次循环,忽略循环体中剩下的语句,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。 例:输出100以内的偶数main()int i; for(i=1;i=100;i+) if(i%2!=0) continue;printf(%d ,i); 本次循环结束,循环体中剩余语句被忽略,执行达式3.进入下一循环.continue做if的内嵌语句if(i%2= =0) if(i%2= =0) printf(%d(%d ,i); ,i);continue语句例例:打印打印3

116、-100内的素数。内的素数。main( ) int n,m; scanf(“%d”,&m);for(m=3;m=100;m+) for (n=2;nm/2;n+) if (m%n=0) break; if (nm/2) continue; printf(“%5d”,m); #include main()() int i,s; s=0; for(i=1;i=10;i+) if(i%2=0) continue; if(i%10=7) break; s=s+i; printf(s=%dn,s);阅读下面程序,写出运行结果阅读下面程序,写出运行结果 结果:结果:S=9return和gotomain()

117、intsum=0,i=1;Loop:if(ib)max=a;elsemax=b;returnmax;main()inta,b;scanf(“%d%d”,&a,&b);printf(“MAXis%dn”,max(a,b);main()intx,y,z;x=2;y=7;z=5;switch(x0)case1:switch(y10)case1:printf();break;case0:printf(!);break;case0:switch(z=5)case0:printf(*);break;case1:printf(#);break;default:printf(%);break;default:

118、printf(&);printf(n);思考运行结果是什么?小结前五章主要讲了C语言的基础知识,3种基本的数据类型和几种运算符及表达式,C语言中3种基本的结构以及简单的编程思想。要求:通过这几章的学习,要求学生掌握C的编程思想以及算法的制定,同时要求掌握调试程序的方法第第 6 6 章章 函函 数数6.1 6.1 函数的概述与分类函数的概述与分类6.2 6.2 函数定义函数定义6.3 6.3 函数的调用函数的调用6.4 6.4 标识符的作用域标识符的作用域6.6 6.6 函数应用举例函数应用举例 6.1 6.1 函数的概念与分类函数的概念与分类 C程序设计的基础工作是函数的设计和编制。程序设计的

119、基础工作是函数的设计和编制。C程序完全由函数组成。除语言本身提供的库函数外,程序完全由函数组成。除语言本身提供的库函数外,用户还可根据需要定义任意多个自己的函数,这些用户还可根据需要定义任意多个自己的函数,这些函数可以同函数可以同main函数放在一个源文件中;也可以分函数放在一个源文件中;也可以分放在不同的源文件中,单独进行编译,形成独立的放在不同的源文件中,单独进行编译,形成独立的模块(模块(.obj),),然后将若干然后将若干obj文件链接在一起,形文件链接在一起,形成一个可执行文件(成一个可执行文件(.exe)。)。 C函数分类函数分类 除除main函数函数外外, 其它为系统函数、自编函

120、数其它为系统函数、自编函数。系统函数系统函数:由系统提供,放在不同的头文件中,用由系统提供,放在不同的头文件中,用 户可调用。户可调用。 例如:例如:sin(x), scanf(“%d”,&x) 。自编函数:自编函数:由用户按语法规则编写。由用户按语法规则编写。 注意注意: :自编函数若与系统函数同名,则系统自编函数若与系统函数同名,则系统函数不能用。函数不能用。4-1 . c 4-2. cz1( ) z5( )z2( ) z4( )main( ) z3( ) 所所有有的的函函数数都都是是独独立立的的。即即函函数数不不能能嵌嵌套套,不附属于另一个函数,书写的顺序任意。不附属于另一个函数,书写的

121、顺序任意。4-2.c 4-2.obj4-1.c 4-1.obj编译编译编译编译连接连接4-1. exe执行执行C函数之间的关系函数之间的关系main ( )a()b()c()d()x() 1) DOS调用调用main函数;函数;main函数调用函数调用其它函数;其它函数;其它函数可相互调用。其它函数可相互调用。 2) 执行时从执行时从main()开始,调用其他函数后,仍然返开始,调用其他函数后,仍然返回回main(),最后从最后从main()结束结束 。C函数执行过程函数执行过程6.2 6.2 函数定义函数定义 按照规定的格式,将一个子任务编写成一个按照规定的格式,将一个子任务编写成一个函数。

122、函数。函数的定义函数的定义例如:例如:编写一个求平均分的函数就是平均分函数编写一个求平均分的函数就是平均分函数 的定义。的定义。 完成一个子工作的程序模块后有两种可能:完成一个子工作的程序模块后有两种可能:(1)通过执行函数得到一个明确的执行结果,该通过执行函数得到一个明确的执行结果,该 结果需要回送到调用函数中。结果需要回送到调用函数中。例如:例如:调用求绝对值函数调用求绝对值函数abs(-10),可得到具体),可得到具体 的函数值的函数值10。(2)仅完成某个功能,不需回送到执行的具体结仅完成某个功能,不需回送到执行的具体结 果。果。例如:例如: 执行输出函数执行输出函数printf(“*

123、”)的结)的结 果是显示果是显示10个个*。 函数类型函数类型 函数名函数名( (类型类型 形参形参1 1,类型,类型 形参形参2 2,) 说明部分说明部分 语句部分语句部分 函数定义的格式函数定义的格式 说明说明: 1. 类型符表示函数的返回值类型类型符表示函数的返回值类型: : 若无返回值:若无返回值:类型符类型符void void ; 若有返回值:函数名前有类型符,且利用若有返回值:函数名前有类型符,且利用 returnreturn语句将函数值返回调用函数。语句将函数值返回调用函数。2. return语句:语句: return 表达式表达式;或或 return(表达式表达式); 编写函数

124、时,若求函数值,就要用编写函数时,若求函数值,就要用return,若,若函数类型为函数类型为void,则不用,则不用return语句。语句。 功能功能:return语句先计算表达式的值,再将该值语句先计算表达式的值,再将该值作为函数运算的结果回送给调用者。如果函数类型作为函数运算的结果回送给调用者。如果函数类型与与return语句中表达式类型不一致,系统语句中表达式类型不一致,系统以函数类以函数类型为准,返回时自动进行类型转换型为准,返回时自动进行类型转换。格式格式: 1)return语句只能返回一个结果,若有多个处语句只能返回一个结果,若有多个处理结果需返回调用函数,要采用其他方法。理结果需

125、返回调用函数,要采用其他方法。 2)若没有)若没有return语句,就一直执行到函数体的语句,就一直执行到函数体的末尾末尾 ,然后返回调用函数。,然后返回调用函数。 3)流程从调用函数中的哪条语句转移到被调函)流程从调用函数中的哪条语句转移到被调函数,返回时仍回到该语句。即从数,返回时仍回到该语句。即从哪里出,还返回到哪里出,还返回到哪里。哪里。 特点特点: :void print( ) / void类型,不能有类型,不能有return语句语句 int i ; for( i=1; i=10; i+) printf(“*”); int f ( int n) 函数首部函数首部 int y=1,i;

126、 for(i=1;i=n;i+) y=y*i; return(y);函函数数体体例如:例如:void output( int n) int i; for( i=1; iy) return(x); else return(y);viod main() int a,b,c; printf(“input a ,b:”); scanf(“%d%d”,&a,&b); c=max(a,b); printf(“max is %dn”,c); 例程例程6-2: 求两数中较大者。求两数中较大者。3. 每个参数前要有每个参数前要有类型符类型符,若无参数,若无参数,( )不能省略不能省略 float ave( in

127、t x , y ) float ave( int x, int y , char c ) 6.3 6.3 函数的调用函数的调用 执行一段子程序并带回计算的结果;或完成执行一段子程序并带回计算的结果;或完成子程序中的操作。子程序中的操作。 函数的入口:函数首部函数的入口:函数首部 函数的出口:函数的出口:retrun语句,函数最后的语句,函数最后的 注意注意: :不能利用不能利用goto插入到函数内,或插入到函数内,或break中中断函数。断函数。见见P.82-83。 按函数在程序中出现的位置来按函数在程序中出现的位置来 分,共有分,共有3种种。1. 函数语句:函数语句: 因为因为 void类型

128、不需返回值,把函数调用作为一个类型不需返回值,把函数调用作为一个独立的语句,仅完成一定的操作。独立的语句,仅完成一定的操作。 函数名函数名(实参表实参表);例如:例如: scanf(“%d”, &x); printf(“%d”, x);函数调用的形式函数调用的形式void p2( int n) int i ; for( i=1; i=n; i+) printf( “*”); void p1( ) printf( “ 显示显示10个个*n ” ) ; void main( ) p1( ); p2( 10 ); 例程例程 6-3: 2. 函数表达式:函数表达式: 作为表达式,出现在允许表达式出现的

129、地方,要作为表达式,出现在允许表达式出现的地方,要 求带回一个确定的值,以参加表达式的运算。求带回一个确定的值,以参加表达式的运算。 int f( int n) void main( ) int j ; int y=1 ; int s; for(j=1;j=n;j+) s=1+f(2)+f(3)+f(4)+f(5); y=y*j; printf(“s=%ldn”, s ); return(y); 例程例程 6-4 : 3. 函数参数:函数参数: 函数调用作为一个函数的参数,即嵌套调用。函数调用作为一个函数的参数,即嵌套调用。 例如:例如: m=max ( a, max( b, c) ); s=

130、sum( 10, sum( 100 , 28 ) ) ; 见见P.84-85 例例6.7,例,例6.8函数的提前声明函数的提前声明 虽然虽然C语言中的函数,放置顺序任意,但必须符语言中的函数,放置顺序任意,但必须符合先声明后使用的原则。合先声明后使用的原则。系统函数:系统函数: 利用利用#include命令调入。放在程序的最前面。命令调入。放在程序的最前面。 用户函数:用户函数: 在程序中的位置应遵循在程序中的位置应遵循“先定义,后使用先定义,后使用”的的原原则,否则要提前声明。则,否则要提前声明。 函数的提前声明:函数的提前声明: 将被调函数的首部置于调用函数的说明部分。将被调函数的首部置于

131、调用函数的说明部分。例程例程6-5: 用函数求平均分。用函数求平均分。 P.86 例例6.9,例,例6.10函数参数的传递函数参数的传递 C程序是由函数组成的,每个程序是由函数组成的,每个C函数是独立的函数是独立的程序模块。程序模块。 决不允许利用决不允许利用goto等转向跳跃语句,将数据从等转向跳跃语句,将数据从函数外插入函数内执行,这样破坏了函数的独立函数外插入函数内执行,这样破坏了函数的独立性及模块的结构化,同时函数返回时也找不到返性及模块的结构化,同时函数返回时也找不到返回点。回点。 但是函数之间有时需要一定的联系,例如:将但是函数之间有时需要一定的联系,例如:将A函数的数据传递到函数

132、的数据传递到B函数中。函数中。 函数之间的联系工作,通过参数的传递来完成。函数之间的联系工作,通过参数的传递来完成。函数参数的作用:函数参数的作用: 参数用来在独立的函数之间传递数据,建立函参数用来在独立的函数之间传递数据,建立函数间的联系,根据参数的功能,有两类参数。数间的联系,根据参数的功能,有两类参数。 位置:位置:出现在函数调用的出现在函数调用的( )( )中。中。格式:格式:函数名(实参函数名(实参1,实参,实参2,实参实参n)实参的形式:实参的形式:表达式、函数、变量、数。表达式、函数、变量、数。功能:功能:将调用函数中的数据传递到被调函数中。将调用函数中的数据传递到被调函数中。

133、1. 实际参数实际参数(实参实参):2. 形式参数形式参数(形参形参): 位置:位置:在被调函数首部在被调函数首部( )中说明的各量。中说明的各量。 格式:格式:类型类型 变量变量1,类型,类型 变量变量2,类型类型 变量变量n 功能:功能:其作用是接收调用函数传递过来的实参值,其作用是接收调用函数传递过来的实参值, 所以形参只能是变量所以形参只能是变量(存储单元形式存储单元形式)。 例如:例如:int f( int x, int, n, float y)形式参数形式参数每个变量名每个变量名前要有类型前要有类型说明:说明: 1)多个参数间用逗号分隔,实参与形参在)多个参数间用逗号分隔,实参与形

134、参在个数个数类型、顺序上类型、顺序上,必须一一,必须一一对应或赋值兼容对应或赋值兼容。 2)函数被调用时,才临时分配单元给形参)函数被调用时,才临时分配单元给形参, 函数执函数执行完毕,这些单元被释放。行完毕,这些单元被释放。 这样程序中占用的固定单元较少,执行速度快,这样程序中占用的固定单元较少,执行速度快,不需考虑变量名的重用,便于多人编程。不需考虑变量名的重用,便于多人编程。 需要接收外来数据的变量安排为形参,否则安排需要接收外来数据的变量安排为形参,否则安排为普通变量。为普通变量。 33)实参仅用来传递数据或地址,不再分配存储)实参仅用来传递数据或地址,不再分配存储)实参仅用来传递数据

135、或地址,不再分配存储)实参仅用来传递数据或地址,不再分配存储单元,用户函数的调用同系统函数。单元,用户函数的调用同系统函数。单元,用户函数的调用同系统函数。单元,用户函数的调用同系统函数。例如:例如:例如:例如: sin(x); sin( sin(x); sin( intint x); x); ave(nave(n); ); aveave( ( intint 10 ); 10 );void output( int n) int i; for( i=1; i=n; i+) printf(*); printf(n); 例程例程 6-6:void main( ) int n; output( 10

136、); n=20; output( n+5 ); output( n ); 每次调用每次调用output函数时,函数时,分配给分配给n的存储单元地址的存储单元地址可能不同。可能不同。实参传数据实参传数据给形参,可给形参,可以是表达式,以是表达式,但先计算后但先计算后传递传递先分配单元,再先分配单元,再接收数据。接收数据。 故故只能是变量,有只能是变量,有类型符声明类型符声明不要写成不要写成output(int n);变量变量n已分配已分配P.89 例例6.11函数之间数据的传递方式函数之间数据的传递方式:1. 将实参传给形参,有二种方式:将实参传给形参,有二种方式: 复制式传递数据方式复制式传递

137、数据方式 传送地址方式传送地址方式 (数组和指针中介绍数组和指针中介绍) 复制式传递数据方式复制式传递数据方式 当调用函数时,实参将数据传给了形参后,它当调用函数时,实参将数据传给了形参后,它们之间没有任何联系,即单向按值传送。们之间没有任何联系,即单向按值传送。 由于实参和形参不在同一个函数,分配存储由于实参和形参不在同一个函数,分配存储单元的时间不同,所以实参和形参不管单元的时间不同,所以实参和形参不管是否同名,是否同名,亦不同存储单元亦不同存储单元,所以在被调函数中,无论形参,所以在被调函数中,无论形参如何变化都不会影响实参值,处理的结果利用如何变化都不会影响实参值,处理的结果利用ret

138、urn语句带回。语句带回。 从前面介绍的很多例程中,可看出复制式传从前面介绍的很多例程中,可看出复制式传递数据方式的特点:不同函数中的同名变量不同递数据方式的特点:不同函数中的同名变量不同存储单元。存储单元。 由于每个参数只能传递一个数据,当需要传由于每个参数只能传递一个数据,当需要传递的数据较多时,显得很不方便。递的数据较多时,显得很不方便。#includevoid main() int a=15,b=25; void swap(int a, int b); printf(1.a=%d b=%dn,a,b); swap(a,b); printf(4.a=%d b=%dn,a,b);void

139、swap(int a, int b) int t; printf(2.a=%d b=%dn,a,b); t=a;a=b;b=t; printf(3.a=%d y=%dn,a,b); 例程例程 6-7:局部变量的值传递。局部变量的值传递。 2. 利用全局变量可在每个函数中使用不释放内存利用全局变量可在每个函数中使用不释放内存单元的特点。单元的特点。 在函数外部说明的变量是全局变量。从声明的在函数外部说明的变量是全局变量。从声明的位置开始,以下的所有函数中都是有效的,即多个位置开始,以下的所有函数中都是有效的,即多个函数都可使用、改变它的值。函数都可使用、改变它的值。 全局变量的使用增加了函数间的

140、联系,但却降全局变量的使用增加了函数间的联系,但却降低了函数的独立性。因此在模块化设计方法中不提低了函数的独立性。因此在模块化设计方法中不提倡过多地使用全局变量。倡过多地使用全局变量。 int i ; / 全局变量可在全局变量可在2个函数中使用个函数中使用void print( ) for( i=1; i=10; i+) printf(“*”); int f ( int n) int y=1; for(i=1;i1) 每次计算方法相同每次计算方法相同例如:例如: 求求n!1. 从数学上定义从数学上定义见见P.93 例例6.13,6.146.4 6.4 标识符的作用域与存储方式标识符的作用域与存

141、储方式变量的作用域变量的作用域变量的生命期被称为变量的作用域。变量的生命期被称为变量的作用域。 变量声明的方式不同,位置不同,其作用变量声明的方式不同,位置不同,其作用域也不同。域也不同。C语言中的变量,按作用域范围可语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。分为两种,即局部变量和全局变量。 局部变量局部变量 凡在函数凡在函数(含含main 函数函数)内或内或 内内定义的变量定义的变量称为局部变量。称为局部变量。生命期生命期: 局部变量仅在函数内局部变量仅在函数内或或 内内有效。有效。说明说明: 1) 不同的函数可具有同名的变量不同的函数可具有同名的变量, 它们它们所所占内占

142、内存单元存单元不同不同, 互不影响。形参为局部变量互不影响。形参为局部变量。 2)在复合语句中在复合语句中说明的变量仅在说明的变量仅在 内有效内有效。全局变量全局变量 在所有函数之外说明的变量为全局变量。在所有函数之外说明的变量为全局变量。生命期生命期: 自说明的位置开始至文件结尾全部有效。自说明的位置开始至文件结尾全部有效。 int p=1, q=5; /p,q可在可在f1,f2,main中使用中使用 float f1( int a) int b, c; / b,c只能在只能在f1中使用中使用 char c1, c2; / c1,c2可在可在f2,main中使用中使用 char f2( in

143、t c, y ) int i, j ; / i,j只能在只能在f2中使用中使用 void main() 例如:例如: 1. 因为可在多个函数中使用,相当于这些函数因为可在多个函数中使用,相当于这些函数的公共变量。于是的公共变量。于是, 当一个函数对其值进行改变后当一个函数对其值进行改变后, 另一个函数使用该变量的值亦相应改变。另一个函数使用该变量的值亦相应改变。 优点:可将某函数的结果带到另一个函数中优点:可将某函数的结果带到另一个函数中 缺点:始终占据内存单元;通用性差。缺点:始终占据内存单元;通用性差。2. 当全局和局部变量同名时当全局和局部变量同名时, 局部变量有效。局部变量有效。说明:

144、说明:见见P.98 例例6.18-20 变量的存储类别变量的存储类别表达了在程序运行期间一个变表达了在程序运行期间一个变量存在的空间、时间。量存在的空间、时间。 C系统给每个系统给每个C程序在内存中分配一片区域用来程序在内存中分配一片区域用来存放程序和数据。存放程序和数据。程序区程序区静态存储区静态存储区动态存储区动态存储区存放数据,变量值存放数据,变量值内存分配内存分配变量的存储方式变量的存储方式变量又可分为四种具体形式变量又可分为四种具体形式2. 静态变量静态变量(static)4. 寄存器型变量(寄存器型变量(register ,已,已不用不用)3. 外部变量外部变量(extern)1.

145、 自动型变量自动型变量(auto) 静态存储变量静态存储变量: 用用 static 说明的变量或全局变量。说明的变量或全局变量。 存放在静态存储区存放在静态存储区, 在程序整个运行过程中在程序整个运行过程中, 始终占据始终占据固定的内存单元固定的内存单元, 到程序执行完毕才释放到程序执行完毕才释放 。注意:注意: 1、用、用static声明的变量,程序运行中仅在声明的变量,程序运行中仅在第第一次调用时赋初值,一次调用时赋初值,以后调用不再赋初值,而是以后调用不再赋初值,而是使用上一次调用的值(因为存储单元不释放)。使用上一次调用的值(因为存储单元不释放)。 2、若不赋初值、若不赋初值, 则系统

146、置初值则系统置初值0 。#include int fac ( int n) static int f=1; f=f n; return(f); void main ( ) int i; for (i=1; i=5; i+) printf (%d!=%dn, i, fac( i ) ); 例程例程6-9: 求求n! 每一次调用每一次调用fac(i), 输出输出一个一个i ! ,同时保留这个同时保留这个i !的值以便下次再乘的值以便下次再乘(i+1)。运行结果为:运行结果为: 1!1 2!2 3!6 4!24 5!120 动态存储变量动态存储变量: 用用 auto 说明或缺省。存放于说明或缺省。存

147、放于 动态存储区动态存储区, 函数调用时临时分配的单元,调用函数调用时临时分配的单元,调用 结束,释放这些单元。在程序执行过程中,这种结束,释放这些单元。在程序执行过程中,这种 分配和释放是动态的。分配和释放是动态的。 在一个程序中几次调用同一函数,分配给函在一个程序中几次调用同一函数,分配给函 数中局部变量的存储空间可能不同。数中局部变量的存储空间可能不同。 外部变量外部变量(extern) 若一个程序分成若一个程序分成2个文件保存,在个文件保存,在B文件中要用文件中要用A文件中的全局变量,则在文件中的全局变量,则在B文件中将该变量声明文件中将该变量声明成外部变量,这样就可在成外部变量,这样

148、就可在B文件中,引用在文件中,引用在A文件文件中说明并赋值的全局变量。中说明并赋值的全局变量。例例6-10:/ 1.c文件文件int x;void main() void f(); x=10; f();/ 2.c 文件文件#includevoid f() extern int x; printf(x=%dn, x );说明:说明: 若被调函数和调用函数不在同一文件,必须若被调函数和调用函数不在同一文件,必须 在调用函数中对被调函数声明,或作为全局量。在调用函数中对被调函数声明,或作为全局量。 / 1.c文件文件int n=100;void f();void main() / void f();

149、 f( );/ 2.c 文件文件#includevoid f() extern int n; int i,s=0; for(i=1;i=n;i+) s+=i; printf(s=%dn,s);例例6-11: 一个一个C程序由一个或多个源程序文件组成。每程序由一个或多个源程序文件组成。每个源程序文件中有若干个函数。最后将若干个文件个源程序文件中有若干个函数。最后将若干个文件组成一个组成一个C程序执行。程序执行。多文件操作多文件操作方法一:方法一: 利利用用#include命命令令,将将另另一一个个文文件件的的内内容容包包含含进来;编译、连接、执行等操作同单文件。进来;编译、连接、执行等操作同单文

150、件。注意:文件要放在同一个文件夹中。注意:文件要放在同一个文件夹中。例如:例如: #include “a2.c” #include ”a3.c” void main( ) 方法二:方法二: 利用利用 vc 的的projectc工程。工程。数组:一种数据类型数据类型基本类型构造类型指针类型空类型整型实型字符型数组结构联合枚举单精度型双精度C语言的数据类型第7章 数数 组组引言整型int、字符型char、实型float、double是简单变量,相互之间无任何联系,要表示数学上的矢量、矩阵、下标变量等比较困难。例如一个班级30个学生,求某门课的平均分数floata0,a1,a2,a3,.,a29,a

151、verage;.average=(a0+a1+a2+a3+a4+.+a29)/30average=0;average=average+a0;average=average+a1;average=average+a2;.average=average+a29;average=average/30;average=average+ai;i=0,1,2,29程序得到简化floata30,average=0;.for(i=0;i30;i+)average=average+aiaverage=average/30其中a是数组名,ai是数组元素,i是数组的下标,若改用数组average=average+a

152、i;i=0,1,2,29数组由许多元素组成每个元素对应一个存储单元数组元素有共同的名,访问数组元素通过下标实现用下标表示数组元素之间的联系。7.1一维数组7.1.1一维数组的定义和引用1. 1.定义定义格式类型名数组名数组长度其中类型名定义数组元素的类型数组名按标识符规则取名数组长度表示该数组的元素个数,及元素的下标范围0数组长度-1之间操作定义数组名、全体元素的类型、元素的个数、数组元素的下标取值范围,分配相应的内存单元例inta10;floatf5;表示a是数组名,有10个元素,下标取值在09之间,即a0,a1,a2a9,全部为整型。f是数组名,有5个元素,下标取值在04之间,即f0,f1

153、,f2,f3,f4,全部为实型。2.引用格式数组名下标其中数组名在说明部分已定义过下标可以是整型常量、变量、表达式,下标值必须在定义的取值范围,即0数组长度-1之间例inta10,k=3;a0=a1+ak-a2*3;数组元素的使用方法与同类型的变量相同例scanf(%d,&ai);temp=ai;ai=ak;ak=temp;printf(%d,ai);其优点,数组的下标是可变的例voidmain()inti,a10;for(i=0;i=0;i-)printf(%3d,ai);输出9876543210iai=i0a0=01a1=18a8=89a9=9iai9a998a880a00注数组使用之前必

154、须先定义只能引用单个的数组元素,不能一次引用整个数组数组元素下标不要越界例inta9;a1=2*a9;错误(语法不错)例7-2求Fibonacci(斐波那契)数列的前20个数1,1,2,3,5,8,13,用f数组存放。#includestdio.hvoidmain()inti,f20;f0=1;f1=1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)printf(%d,fi);if(i+1)%5=0)printf(n);7.1.2使用一维数组编程f0=1f1=1i=2f2=f0+f1=1+1=2i=3f3=f1+f2=1+2=3i=4f4=f2+f3=2

155、+3=5i=5f5=f3+f4=3+5=8i=19f19=f17+f18=6765f0=1 i=0 f1=1 i=1 fi=fi-2+fi-1 2i1911235813f0 f1 f2 f3 f4 f5 f6例7-3输入n个互异的整数,将它们存入数组中,再输入1个数x,然后在数组中找x。如果找到,输出相应的下标,否则输出“NotFound”。算法 将x与数组元素依次比较。无序数据序列的查找(遍历算法)#includestdio.hvoidmain()inti,n,a20;scanf(%d,&n);for(i=0;in;i+)scanf(%d,&ai);for(i=0;i=n)printf(No

156、tFoundn);输入数组a输入xi=0,n-1,1x=aiii=n输出iNotFound0110停例7-4输入一个正整数n(1x10min=xi=aindexaindex=a0a0=iminai10min=aii=1,n-1,1iindex=imin=a0index=0输入a,b,c,dmin=aminb10min=b输出min停minc10min=cmind10min=d#includestdio.hvoidmain()inti,index=0,n,a10;scanf(%d,&n);for(i=0;in;i+)scanf(%d,&ai);for(i=1;iai)index=i;printf

157、(%d%dn,index,aindex);i=aindex;aindex=a0;a0=i;for(i=0;iaiindex=iaindex016311312311212318024190aindexai10i=1,n-1,1iindex=iindex=0i=aindexaindex=a0a0=i输出2113689例7-1选择法排序对n个数小到大排序算法(1)在n个数(a0an-1)中找到最小数,将它与a0交换。(2)在未排序的n-1个数(a1an-1)中找到最小数,将它与a1交换。(n-1)未排序的2个数(an-2an-1)中找到最小数,将它与an-2交换如2618745确定第1最小1与a0对

158、换1628745确定第2小值2与a1对换1268745确定第3小值4与a2对换1248765确定第4小值5与a3对换1245768确定第5小值6与a4对换1245678确定第6小值把思路用流程图描述n个数先存入a数组a0an-1中n个数(a0an-1)中找最小数,与a0交换n-1个数(a1an-1)中找最小数,与a1交换2个数(an-2an-1)中找最小数,与an-2交换indexajaindexindex=j10j=i+1,i+2,.,n-1jindex=it=aiai=aaindex=t-2i=0,1,.,ni#includestdio.hvoidmain()inti,j,n,index;

159、floata10,t;scanf(%d,&n);for(i=0;in;i+)scanf(%f,&ai);for(i=0;in-1;i+)index=i;for(j=i+1;jn;j+)if(ajaindex)index=j;t=ai;ai=aindex;aindex=t;for(i=0;in;i+)printf(%f,ai);printf(n);ajaindexindex=j10j=i+1,i+2,.,n-1ji=0,1,.,n-2iindex=it=aiai=aindexaindex=t7.1.3一维数组的初始化在定义数组的同时即给数组元素赋值格式类型名数组名数组长度=常量表达式序列其中常数

160、表达式序列:常数表达式1,常数表达式2,.即初值操作将常数表达式序列的初值依次赋值于数组各元素如inta10=0,1,2,3,4,5,6,7,8,9;经过定义初始化后a0=0,a1=1,.a9=9注当定义数组的长度省略,则数组个数由初值个数决定如inta=1,2,3,4,5;即为inta5;a0=1,a1=2,a2=3,a3=4,a4=5注ANSIC规定只有静态存储的数组才能初始化staticinta10=0,1,2,3,4,5,6,7,8,9;但一般的C编译系统允许自动型数组也能初始化autointa10=0,1,2,3,4,5,6,7,8,9;省略auto的,即为自动型static型与au

161、to型区别存储单元分配:static分配固定存储空间auto动态分配存储空间存储单元缺省值:static为0auto为随机值例staticinta5;a数组的5个元素全为0autointb5;b数组的5个元素均是不定值注当数组指明的元素个数大于初值个数时,初值只赋予数组开始若干个元素,余下部分为相响应类型的缺省值。例staticinta10=0,1,2,3,4;即为a0=0,a1=1,a2=2,a3=3,a4=4;a5a9=0intb10=0,1,2,3,4;即为b0=0,b1=1,b2=2,b3=3,b4=4;b5b9=不定值实际上,TC或VCb5b9仍为0#includevoidmain(

162、)intnum26=2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,91,97;inti,j,m,line=0;for(i=6;i=100;i+=2)for(j=0;j26;j+)for(m=j;m26;m+)if(numm+numj=i)line+;printf(%d=%d+%d,i,numj,numm);if(line%5=0) printf(n);例验证哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。例如6=3+3,8=3+5,18=7+11。要求将6100之间的偶数都表示成两个素数之和,打

163、印时一行打印5组。7.2二维数组7.2.1二维数组定义和引用1.定义格式类型说明符数组名数组长度1数组长度2与一维数组比较,多了一个下标,一般称前个下标为行,第二个称为列例floata34;定义了a数组3行4列12个元素均为实型a00a01a02a03a10a11a12a13a20a21a22a23数组元素在内存排序,按行存放123456789101112a00a01a02a03a10a11a12a13a20a21a22a23多维数组定义多维数组定义格式类型说明符数组名数组长度1.数组长度nn个数组长度为n维数组例floata234;定义了a数组为三维2*3*4个元素均为实型a000a001a

164、002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a111a112a113a120a121a122a123多维数组元素在内存排序,靠右的维数先变,依次向左变化1234567891011121314151617181920212223242. 2.二维数组元素的引用二维数组元素的引用格式数组名下标1下标2多维数组数组名下标1下标2.下标n其中数组名在说明部分已定义过下标可以是整型常量、变量、表达式,各下标值必须在定义的取值范围,即0定义下标的数组长度-1如floata34;a12=a23/2;例7-6定义32的二维数组a,数组元

165、素的值由下式给出aij=i+j(0i2,0j1)将该数组元素按矩阵的形式输出#includestdio.hvoidmain()inti,j,a32;for(i=0;i3;i+)for(j=0;j2;j+)aij=i+j;for(i=0;i3;i+)for(j=0;j2;j+)printf(%4d,aij);printf(n);输出:0112237.2.2使用二维数组编程01122300a00=0+0=001a01=0+1=110a10=1+0=111a11=1+1=220a20=2+0=2321a21=2+1=3ijaij=i+j#includestdio.hvoidmain()chara32

166、,i,j;for(i=0;i3;i+)for(j=0;j2;j+)aij=i+j;for(i=0;i3;i+)for(j=0;j2;j+)printf(%d,aij);printf(n);for(j=0;j6;j+)printf(%d,a0j);输出011223011223说明:行下标*列长度+列下标行长度*列长度a00=0a01=1a10=1相同于a02a11=2a03a20=2a04a21=3a05如a05,0*2+53*2例7-5将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。算法遍历矩阵全部元素,比较,找出最大值设row记录最大值的行下标c

167、ol记录最大值的列下标arowcol就是最大值voidmain()intcol,i,j,row;inta32;for(i=0;i3;i+)for(j=0;j2;j+)scanf(%d,&aij);row=col=0;for(i=0;i3;i+)for(j=0;jarowcol)row=i;col=j;printf(max=a%d%d=%dn,row,col,arowcol);例7-7输入一个正整数n(1bjii=0,1,n-1j=0,1,n-1#includestdio.hvoidmain()inti,j,n,a66,b66;scanf(%d,&n);for(i=0;in;i+)for(j=0

168、;jn;j+)scanf(%d,&aij);for(i=0;in;i+)for(j=0;jn;j+)bji=aij;for(i=0;in;i+)for(j=0;jn;j+)aij=bij;for(i=0;in;i+)for(j=0;jn;j+)printf(%4d,aij);printf(n);转置(行列互换)即为对角线为界aijajifor(i=0;in-1;i+)for(j=i+1;jn;j+)t=aji;aji=aij;aij=t;a01a10a02a20a12a21遍历上三角阵for(i=1;in;i+)for(j=0;ji;j+)t=aji;aji=aij;aij=t;遍历下三角阵i

169、=j#includestdio.hvoidmain()inti,j,n,t,a66;scanf(%d,&n);for(i=0;in;i+)for(j=0;jn;j+)scanf(%d,&aij);for(i=0;in-1;i+)for(j=i+1;jn;j+)t=aji;aji=aij;aij=t;for(i=0;in;i+)for(j=0;jn;j+)printf(%4d,aij);printf(n);例7-7利用对角线为界aijaji,程序得到简化7.2.37.2.3二维数组的初始化二维数组的初始化两种形式1.按顺序赋初值格式类型说明符数组名数组长度1数组长度2=常量表达式序列;操作将常数

170、表达式序列的初值依次赋值于数组各元素,数组元素按行排序(内存单元排序)例inta34=1,2,3,4,5,6,7,8,9,10,11,12;即a00=1a01=2a02=3a03=4a10=5a11=6a12=7a13=8a20=9a21=10a22=11a23=122.分行赋初值格式类型说明符数组名数组长度1数组长度2=常量表1,常量表2,.,常量表n;操作将常数表1赋值于数组第一行元素,将常数表2赋值于数组第二行元素,.,将常数表n赋值于数组第n行元素例inta34=1,2,3,4,5,6,7,8,9,10,11,12;获得同上结果注(1)方法比较,后者优越,一行数据对一行数组元素,界限清

171、楚;特别当行尾有零元素不必在初值表中列出例inta33=1,2,5,0,0,0,4,5,0;简化为inta33=1,2,3,4,5;注(2)数组元素赋初值时,定义第一维的长度可以缺省例inta4=1,2,3,4,5,6,7,8,9,10,11,12;即inta34=1,2,3,4,5,6,7,8,9,10,11,12;又例inta4=0,0,3,0,10,0即例7-8定义一个函数day_of_year(year,month,day)计算并返回year、month和day是该年的第几天。例如,调用day_of_year(2000,3,1)返回61,2000年是闰年调用day_of_year(19

172、99,3,1)返回60,1999年不是闰年显然,对1month-1的月天数累加,再加上当月的day。但2月的天数根据是否闰年取29天或28天用数组tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;存放显然非闰年使用tab0k闰年使用tab1k其中k代表月份程序intday_of_year(intyear,intmonth,intday)intk,leap,s=0;inttab23=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,3

173、0,31,30,31,31,30,31,30,31;leap=(year%4=0&year%100!=0)|year%400=0;for(k=1;kmonth;k+)s+=tableapk;s+=day;returns;定义数组tab213初始化各月份的天数根据年份year确定是否闰年(判别闰年的条件为能被4整除但不能被100整除,或能被400整除)根据月份month累加1month-1月份的天数最后加上当月的天数算法7.3 7.3 字符串与数组字符串与数组字符串与数组字符串与数组在C语言中,字符串的存储和运算可以用一维字符数组来实现。7.3.1一维字符数组一维字符数组用于存放字符型数据。它的

174、定义、初始化和引用与其他类型的一维数组一样。例charc10;c0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;定义c数组名,包含10个元素,是字符型在内存存放1.定义printf(Iamhappyn);2.初始化例charc10=I,a,m,h,a,p,p,y;注(1)初值的个数不能超过元素的个数如chara5=I,a,m,h,a,p,p,y;不允许(2)初值的个数少于元素的个数,将数值赋于前面的数组元素余下元素以字符0充填如charc11=I,a,m,h,a,p,p,y;c:Iamhappy00ASCII为0的字符,作为字符串的结束等价于cha

175、rc11=I,a,m,h,a,p,p,y,0;charc11=I,a,m,h,a,p,p,y,0;注:在字符数组0与0等价(3)当数组长度缺省,由初值个数决定数组元素的个数如charc=c,p,r,o,g,r,a,m;自动定义c数组9个元素,即c93.引用例main()charc10=I,a,m,h,a,p,p,y;inti;for(i=0;i=字符个数+1scanf()的%s的输入例charch6;scanf(%s,ch);输入China得ch=China0例7-11输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。分析:由于字符串少于80个字符,数组长度就取其上限80,

176、以n作为输入结束符。#includestdio.hvoidmain()inti=0,count=0;charstr80;while(stri=getchar()!=n)i+;stri=0;for(i=0;stri!=0;i+)if(stri=0)count+;printf(count=%dn,count);i:012345输入:9b465str输出:count=4#includestdio.hvoidmain()inti=0,count=0;charstr80;scanf(%s,str);for(i=0;stri!=0;i+)if(stri=0)count+;printf(count=%dn,

177、count);/*输入一行中不能有空格*/4. 4.字符串有效长度与字符数组的长度字符串有效长度与字符数组的长度例#includestdio.h#includestring.hvoidmain()chars10=Happy;intl1,l2;l1=strlen(s);l2=sizeof(s);printf(s=%sl1=%dl2=%dn,s,l1,l2);l1=strlen(Happy);l2=sizeof(Happy);printf(s=%sl1=%dl2=%dn,s,l1,l2);运行s=Happyl1=5l2=10s=Happyl1=5l2=6字符串有效长度:字符串的字符的个数,不包括0

178、strlen():计算字符串有效长度sizeof():计算字节数注:0赋值数组元素,将改变字符串长度如上例s3=0;则s的有效长度为3字符数组的长度:字符数组定义的长度,数组元素的个数例7-9输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。例123451104+2103+3102+4101+510012345即为多项式计算5.字符串应用进制转换a0xn-1+a1xn-2+an-3x2+an-2x+an-1x表示数进制改写为(a0x+a1)x+a2)x+an-2)x+an-1如12345(110+2)10+3)10+4)10+5(a0xn-2+a1xn

179、-3+an-3x1+an-2)x+an-1(a0xn-3+a1xn-4+an-3)x+an-2)x+an-1程序为:d=0;for(i=0;in;i+)d=d*x+ai;算法(an=getchar()!=nn=0n+d=0i=0,n-1,1d=d*10+ai-0i输出d10#includestdio.hvoidmain()intn=0,i;longd=0;chara10;while(an=getchar()!=n)n+;an=0;for(i=0;ai!=0;i+)d=d*10+ai-0;printf(%ldn,d);由于ai是字符转成数值ai-0进制x=10,则程序为:d=0;for(i=0;

180、in;i+)d=d*10+ai-0;7.47.4 数组作为函数参数1.形参是变量,实参可以是数组元素,形参与实参结合是单值传递#includestdio.hvoidmain()inta10,b10,i,j,n=0,m=0;scanf(%d,&j);for(i=0;ij;i+)scanf(%d,&ai);for(i=0;ij;i+)scanf(%d,&bi);for(i=0;in)printf(abn);elseif(mn)printf(ay)flag=1;elseif(xy)flag=-1;elseflag=0;return(flag);例两个数组a、b比较大小数组元素2.形参是数组,实参应为

181、数组名例有一维数组x内放10个学生的成绩,求平均成绩程序floataverage(floata10)inti;floataver=a0;for(i=1;i10;i+)aver=aver+ai;aver=aver/10;return(aver);#includestdio.hvoidmain()floatx10,aver;inti;for(i=0;i10;i+)scanf(%f,&xi);printf(n);aver=average(x);printf(average=%f,aver);aver=aver/10;数组名数组注(1)数组名是数组内存的首地址,数组的虚实结合是地址传递,把实参数组的起

182、始地址传递形参数组,两个数组共占一段内存单元如形参a10与实参x10结合xaa0123456789起始地址存储单元x0123456789由此可见实际实参数组在运行,因而函数执行完毕实参数组的内容可能被改变。利用这点可以使函数返回更多的值。利用这点可以使函数返回更多的值。例编一函数,用选择法对数组(10个元素)小大排序voidsort(intx10,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(xjxk)k=j;t=xk;xk=xi;xi=t;#includestdio.hvoidmain()inta10,i;for(i=0;i10

183、;i+)scanf(%d,&ai);sort(a,10);for(i=0;i100)exit(1);for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(xjxk)k=j;t=xk;xk=xi;xi=t;main()inta10,i;for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);for(i=0;i10;i+)printf(%d,ai);printf(n);voidsort(intx,intn)inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(xjxk)k=j;t=xk;xk=xi;xi=

184、t;例有一个34矩阵,求其中的最大元素max_value(inta4,intn)inti,j,k,max;max=a00;for(i=0;in;i+)for(j=0;jmax)max=aij;return(max);main()staticintb34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max_valueis%dn,max_value(b,3);4.形参、实参的数组元素个数、维数可以不一致,原因是编译不检查,只是起始地址的传递。原则上实参数组元素个数形参数组元素个数。voidprint(inta,intn)inti;for(i=0;iabot|xatopto

185、p=botmid=(top+bot)/2x=amidxamidbreakbot=mid-1top=mid+1x=amid输出mid,x打印无此数1011110000a0aN-1:小到大排序x:为查找的数top:查找区间下标下界bot:查找区间下标上界mid:查找区间折半下标#defineN10#includestdio.hvoidmain()intaN,top=0,bot=N-1,mid=0,x,i;for(i=0;i=a0&x=aN-1)while(top=bot)mid=(top+bot)/2;if(x=amid)break;elseif(xamid)bot=mid-1;elsetop=mid+1;if(x=amid)printf(a%d=%dn,mid,amid);elseprintf(nonumber);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号