边学边用c语言课件

边学边用c语言课件

ID:83025143

大小:159.39 KB

页数:123页

时间:2023-09-19

上传者:灯火阑珊2019
边学边用c语言课件_第1页
边学边用c语言课件_第2页
边学边用c语言课件_第3页
边学边用c语言课件_第4页
边学边用c语言课件_第5页
边学边用c语言课件_第6页
边学边用c语言课件_第7页
边学边用c语言课件_第8页
边学边用c语言课件_第9页
边学边用c语言课件_第10页
资源描述:

《边学边用c语言课件》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

边学边用c语言课件第一讲c语言概述第二讲基本数据类型第三讲控制结构(一)第四讲控制结构(二)第五讲运算符和表达式第六讲函数第七讲数组第八讲字符与字符串第九讲变量类别与编译预处理第十讲指针(一)第十一讲指针(二)第十二讲结构体、共用体和枚举类型第十三讲指向结构体的指针与链表第十四讲文件

1第一讲C语言述引言ー、教学目的本讲主要介绍了C语言的特点、基本结构、基本输入输出语句和C程序的编辑、编译、运行方法,要求了解c语言的特点,掌握C程序的基本结构,掌握输入输出函数scanf()和printf()的基本使用方法,熟悉C程序的编辑、编译、调试和运行过程。二、知识要点1.C语言的特点(1)丰富的数据类型(2)结构化的控制语句(3)高效率的目标代码(4)可移植性好2.C语言的基本结构(1)由一个主函数main()或ー个主函数及其它函数组成(2)每个函数用{}括起来(3)每个语句后加“;”3.库函数printf()的使用

2(1)函数printf()的功能和使用格式(2)常用转义字符的使用(3)常用格式符的意义和使用1.库函数scanf()的使用(1)函数scanf()的功能和使用格式(2)格式控制与输入数据格式的关系(3)地址表列的使用2.C程序开发过程(1)编辑、编译、连接和执行(2)源程序、目标程序、可执行程序三、边用边学§1.1c语百简史C语言是由D.M.Ritchie于1972年在B语言的基础上设计的,主要用于编写UNIX操作系统的。1977年出现了可移植的C语言编译程序,使得用C语言编写的UNIX系统可以在各种计算机上使用。随着UNIX的广泛应用,C语言得到了普及和推广,并最终独立于UNIX而成为世界上应用最广泛的计算机语言之一。1983年美国国家标准化协会(ANSI)制订了C语言标准,即ANSIC。目前流行的各种版本的C语言都是以它为基础的,如TurboC,

3MicrosoftC,QuickC等。1.21.2C语言的特点ー、丰富的数据类型C具有整型、浮点型、字符型、数组类型、指针类型、结构体类型、共用体类型等多种数据类型。特别是C的指针类型,功能强大、灵活方便。二、结构化的控制语句C语言的控制结构语句符合结构化程序设计要求,并且用函数作为程序模块,使得程序结构清晰、可读性好、易于调试。三、高效率的目标代码C语言允许直接访问物理地址、直接对硬件操作,提供对字节、位、内存和寄存器操作,可以调用或嵌入汇编语言代码,并且经过C编译程序生成的目标代码质量高、执行效率高。四、可移植性好用C语言写的程序,基本上可以不加修改地用于各种计算机和操作系统上。1.3C程序的基本结构一、C程序的基本结构讲解

4例1在屏幕上显示:Heilo!tfincludemain()(printf("Hello!

5");)输出:Hello!例2求两数之和#includemain(){inta,b,sum;a=123;b=456;sum=a+b;printf("sumis%d

6v,sum);)输出:sumis579例3输入a、b两个数,输出其中最大值。tfincludefloatmax(floatx,floaty){floatz;

7if(x>y)z=x;elsez=y;returnz;}main(){floata,b,c;scanf(“統,%f”,&a,&b);c=max(a,b);printf("%f,%f,themaxis%f

8”,a,b,c);)输入:23,56输出:23.000000,56.000000,maxis56.000000二、C程序的基本结构1.由一个主函数main(),或一个主函数及其它函数组成2.每个函数用{}括起来3.每个语句后加;三、C语言的三类函数及其采用的意义LC程序是由一个主函数main〇或一个主函数及其它函数组成。C程序由函数构成,使用函数可以简化了主函数以及实现模块化程序设计。

9c语言的函数可以分为三类:第一类:主函数,名为main〇〇每个程序中只能有一个、也必须有一个主函数。无论主函数在什么位置,C程序总是从主函数开始执行。第二类:用户自定义函数,可有可无,数目不限。第三类:C语言提供的库函数,例如输出函数printf()和输入函数scanf()2.每个函数的内容用大括号“{『’括起来。3.每个语句后加“;”。§1.4库函数printf()和scanf()的使用printf()和scanf()函数是C语言中两个最基本的库函数,存在于TurboC所在目录的子目录include中的stdio.h头文件内,使用时应该在源程序中加入#include(TurboC2.0可以缺省)。ー、函数printf()功能:通过标准输出设备(如屏幕)输出ー组数据。格式:printf(格式控制,输出表列)1.“格式控制”是用双引号括起来的部分,由要输出的文字和数据格式说明组成。例:printf(aHello!”);printf(a%f,%f,themaxis%f

10”,a,b,c);

11要输出的文字除了可以使用字母、数字、空格和一些数学符号以外,还可以使用ー些转义字符表示特殊的含义(如“'n")。转义字符功能见表1-1〇表1.1常用转义字符转义字符功能

12回车换行符,光标移到下一行行首\r回车不换行,光标移动到本行行首\t横向跳格(8位为一格,光标跳到下一格起始位置,如第9或17位等)\b退一格,光标往左移动一格\f走纸换页\\用于输出反斜杠字符“ヽ”ヽ’用于输出单引号字符“‘”ヽ”用于输出双引号字符“””\ddd三位八进制数ddd对应的ASCII码字符\xhh两位十六进制数hh对应的ASCII码字符ttincludemain()printf(“123456789012345678901234567890

13");printf("123\t456

14〃);printf(“12345\bl23\r9

15")

16运行结果:1234567890123456789012345678901234569234123举一反三:写出下列输出结果printf("\tfirst\b\b\bsh\\\r\'No.1ヽ'");数据格式说明由“ガ开头,形式为水数据输出宽度说明X格式符》,数据格式说明用在需要输出变量或运算数值结果的时候,它的个数与输出表列的个数ーー对应。数据宽度说明中如果实际数据小于宽度,则根据宽度是否大于零而左补空格或右补空格。如果实际数据大于宽度,按实际位数输出。如果缺省宽度说明,则按实际宽度输出(实数位数按照格式符默认位数输出)。常用格式符见表『2。表1.2常用格式符格式符功能d以带符号的十进制形式输出整数(整数不输出正号)0以不带符号的ハ进制形式输出整数X以不带符号的十六进制形式输出整数U以不带符号的十进制形式输出整数C以字符形式输出ー个字符S输出ー个或多个字符

17f以小数形式输出单、双精度数,默认输出6位小数e以标准指数形式输出单、双精度数,数字部分小数位数为6位ttincludemain()(printf(“a二%4d,b=%-6.2f,c二%c,d二%s”,12,3.456,'A',"hello”);}运行结果:a=12,b=3.46,c=A,d=hello举一反三:写出下列输出结果printf(“x二%d,y二%-6.2f,z二%2d",2,8.999,300);2.输出表列可以是变量、表达式或者是数值。输出表列的类型决定了“格式控制”中使用的“数据格式符”,其个数决定了“数据格式说明”的个数。如已知a二3,则语句printf(“%d+%d=%d”,a,12,a+12);3+12=15二、函数scanf()功能:通过标准输入设备(如键盘)输入ー组数据。格式:scanf(格式控制,地址表列)格式控制同printf〇函数的格式控制。其中特别注意:如果格

18式控制中加入了格式符以外的其它字符,则通过键盘等输入设备输入数据时这些字符也要同样输入,如果格式符中无其它字符间隔,输入时可以用空格、回车或跳格键Tab。地址表列是由若干个地址组成的表列,变量的地址表示法是在变量前加上&符(数组不用)。函数scanf()是将输入设备输入的数据赋给地址表列中对应的变量。地址表列的个数和变量类型,决定了格式控制中格式符的个数和形式。§1.5C程序的开发过程开发ー个C程序,一般要经历编辑、编译、连接和运行四个步骤。ー、源文件的编辑用户通过编辑器,将自己开发的C语言程序输入计算机的过程称为C程序源文件的编辑。编辑生成的文件以文本形式存储,扩展名为“.C”,也称为C的源程序。源程序文件以ASCII码形式存储,不含任何格式和样式,计算机不能直接执行。二、编译计算机把C的源程序翻译成计算机可以识别的二进制形式的目标

19代码文件,这个过程称为编译,由C的编译程序完成。C的编译程序在编译的同时,还对源程序的语法和程序的逻辑结构等进行检查。当发现错误时,将会列出错误的位置和种类,此时需要重新编辑修改源程序。如果编辑成功则生成目标文件,文件名同源程序文件名,扩展名为“.obj”。编译生成的目标文件,不包含程序运行所需要的库函数等,计算机仍然不能直接执行。三、连接连接程序以将目标程序和其它目标程序模块,以及系统提供的c库函数等进行连接生成可执行文件的过程,称为“连接”。连接生成的可执行文件的文件名同源程序文件名,扩展名为“.exe”。连接生成的可执行文件,计算机可以直接执行。四、运行在DOS环境直接键入C程序的可执行文件名,或者在C的集成环境下选择“RUN”命令,以及在Windows的资源管理器内双击该可执行文件名,都可以获得运行结果。如果运行结果有误,需要重新编辑源程序,再进行编译、连接、运行,直到得到满意的运行结果。作业及上机练习学以致用1.使用printf()函数显示下列菜单:

20Menu1.Inputthestudents'namesandscores2.Searchscoresofsomestudents3.Modifyscoresofsomestudents4.Listallstudents'scores5.QuitthesystemPleaseinputyourchoise(1-5):1.参照例1.7和例1.8,选择ー种方法编写ー个程序,实现输入六个数输出最小数。2.编写ー个程序,从键盘上输入华氏温度,屏幕显示对应的摄氏温度。华氏温度和摄氏温度的转换公式为:c二(f-32)/I.8第二讲基本数据类型引言ー、教学目的通过介绍C语言的数据类型和存储特点,要求了解C语言数值数据和文字数据的表示方法,掌握c语言基本数据类型的存

21储格式,掌握变量的定义和赋值,了解数据运算中类型的自动转换和强制转换。二、知识要点1.C语言的数据类型数据类型分类2.数值数据的表示(1)整数数据的表示和存储形式(2)浮点小数的表示和存储形式3.文字数据的表示(1)单个字符的表示和存储形式(2)字符串的表示和存储形式4.变量的定义和赋值(1)变量的命名

22(2)变量的定义(3)变量的赋值5.C语言类型修饰符(1)long型修饰符的意义(2)unsigned型修饰符的意义6.表达式中数据类型转换(1)自动类型转换(2)强制类型转换、边用边学§2.1C语言的数据类型C语言提供的数据类型分类如下:C数据类型(基本类型〈浮点型|字符型I枚举类型r单精度浮点型!双精度浮点型构造类型指针类型r数组类型《结构体类型1共用体类型§2.2数值数据的表示

23C语言中使用的数值数据有两种:整数和浮点小数。ー、整数整数可以用十进制数、ハ进制数和十六进制数形式表示。除符号外,如果整数的第一位数字是。时为ハ进制数,前两位数字为Ox时为十六进制数,其余的形式为十进制数。一般整数的存储空间为2个字节,取值范围一般为ザ〜2y,即-32768〜32767。如果超过这个范围,只有使用占4个字节的长整型数,即在整数后面加上一个字母L(大小写均可),此时取值范围可以扩大到ー中〜”1,即ー2147483648〜2147483647。二、浮点小数C语言中的浮点小数描述的是实数,可以采用十进制小数形式或者指数形式表示。十进制小数形式:包含整数部分、小数点和小数部分。其中小数点不能省略。指数形式:包含尾数部分、字母E或e和阶码。例如2.78E12o注意尾数部分不能省、阶码必须是整数。浮点小数一般为单精度浮点类型,占用4个字节,有效位数6〜7位,如果需要精度特别高,可以采用双精度浮点类型,有效位数可以达到16〜17位。

24§2.3文字数据的表示C语言把文字数据分为两种类型:单个字符和字符串。ー、单个字符单个字符的表现形式是由单引号括起来的一个字符,例如:'a,〇其中单引号、双引号和反斜杠的表现形式比较特殊,分别是,「、,ヽ”,、へ、,。在C语言中转义字符被认为是具有特殊意义的单个字符,例如,、げ,代表ー个换行符。单个字符在内存中只占用1个字节,其存储的内容为该字符在ASCI!码表中对应的数值。二、字符串字符串是由双引号括起来的字符序列,例如:“thisisaprogram.">“Hello!”、“IlikeC"〇字符串中的字符按照从左到右的顺序,依次存储在一段连续的空间里,其中每ー个字符占用一个字节,其内容为该字符在ASCH码表(见附录)中对应的数值。需要注意的是C语言的字符串在实际存储时,将自动在字符串尾部加了一个结束标志'、0'(其ASCH码值为〇)〇

25§2.3变量的定义和赋值C语言中的数据有两种基本形式:常量和变量。C语言中所有的变量在使用前必须先定义,说明变量类型。ー、变量的定义变量定义的形式如下:类型标识符变量名;变量在定义时要注意以下几个问题:1.变量的命名要符合C语言规定的标识符的命名规则,即只能由字母、数字和下划线组成,首字母必须为字母或下划线。此外C语言中规定的有特殊用途的关键字,例如int、float,if等,不能作为变量名称。C语言中大小写是敏感的。但是习惯上,C中的变量一般用小写字母表示。2.变量的数据类型决定了它的存储类型,即该变量占用的存储空间。所以定义变量类型,就是为了给该变量分配存储空间,以便存放数据。基本的变量类型及其存储空间见表2.1:表2.1C基本数据类型

26皿名称存储空间取值范围实例int整型2个字节介于ー32768〜32767的整数inti,J;float单精度4个实数,有效位数6〜float浮点型字节7位x;double双精度8个实数,有效位数15〜double浮点型字节16位y;char字符型1个字节ASCH码字符,或-128-127的整数charc;注:char型变量只能存放ー个字符,汉字或字符串的存储需要用字符数组实现。二、变量的赋值变量需要预置ー个值,即赋值。赋值操作通过赋值符号“二”把右边的值赋给左边的变量:变量名二表达式;例如x=3;a=a+1;f=3*4+2;其中需要注意的是:1.数学中的“二”符号不同于C语言中的赋值符号“二”。2.如果赋值时两侧类型不一致时,系统将会作如下处理:

27将实数赋给ー个整型变量时,系统自动舍弃小数部分。将整数赋给ー个浮点型变量时,系统将保持数值不变并且以浮点小数形式存储到变量中。当字符型数据赋给ー个整型变量时,不同的系统实现的情况不同,一般当该字符的ASCH值小于127时,系统将整型变量的高字节置。、低字节存放该字符的ASCH值。变量在定义的同时也可以赋初值,称作变量的初始化。1.字符型变量的值可以是字符型数据、介于ー128〜127的整数或者转义字符。22.5C语言类型修饰符基本类型可以带修饰性前缀,即类型修饰符,扩大C语言基本数据类型的使用范围。C语言共有4种类型修饰符:long长型short短型signed有符号型unsigned无符号型short型和long型用于整型和字符型,其中!ong型还可以用于双精度型。short型不常用,对于不同机型取值范围不同,这里不再介绍。longint(简写为long)型的存储长度为4个字节,范围す〜2J,用于存储整数超过int型取值范围的情况。longdouble型存储长度16

28个字节,约24位有效数字,取值范围超过double型。有符号型signed和无符号型unsigned适用于char型、int型和long型三种类型,区别在于它们的最高位是否作为符号位。unsignedchar型取值范围〇〜255(即。〜2'-i),unsignedint(简写为unsigned)型取值范围〇〜65535(即。〜2"t),unsignedlong型取值范围。〜2』。12.6表达式中数据类型转换C语言中不同的数据类型的取值范围不同,在进行混合运算时结果会如何呢?ー、自动类型转换C语言规定,不同类型的数据在参加运算前会自动转换成相同类型,再进行运算。转换的规则是:如果运算的数据有float型或double型,自动转换成double型再运算,结果为double型。如果运算的数据中无float型或double型,但是有long型,数据自动转换成long型再运算,结果为long型。其余情况为int型。

29二、强制类型转换在C语言中也可以使用强制类型转换符,强迫表达式的值转换为某ー特定类型。强制类型转换形式为:(类型)表达式强制类型转换最主要的的用途ー是满足ー些运算对类型的特殊要求,例如求余运算符“か’,要求运算符两侧的数据为整型,(int)2.5%3二是防止丢失整数除法中的小数部分。作业与上机练习1.编程输出字符。、9、A、Z、a、z的ACSII码的十进制、ハ进制和十六进制的表示形式。2.参考例L2_6.C编写ー个程序,从键盘输入字符(例如‘1’),转换成十进制数(即1),并输出。提示:“1”的ASCH码为十进制数49,将其减去一个数等于十进制1即可。3.已知a=3,b=2,c=2.5,计算(float)(a+b)/3+(int)c的值。4.编写ー个程序输出5!、10!的结果。5.参考例L2_8.C编写ー个程序,输入2个学生的姓名、学号、英语、数学、计算机成绩,输出这两个学生的姓名、学号和平均分。

30第三讲控制结构(一)弓I言ー、教学目的本讲主要介绍了程序设计的一般方法、结构化程序设计思想以及C语言的顺序结构和选择结构的实现方法,要求熟练掌握if语句和switch语句的使用,了解结构化程序设计思想,并且可以按照一般程序设计方法完成简单程序的设计过程。二、知识要点1.程序设计的一般方法(1)程序设计的主要因素(2)程序设计的一般方法(3)流程图的画法2.结构化程序设计(1)结构化程序设计的基本思想(2)结构化程序设计的三种基本结构及其特点3.顺序结构C语言顺序结构的实现4.if语句

31(1)if语句的几种形式和使用方法(2)if语句的嵌套(3)else与if的配对问题1.switch语句(1)switch语句的基本形式(2)switch语句的使用三、边用边学§2.1程序设计的一般方法程序设计的一般方法可以概括为以下四个步骤:ー、明确处理对象、选择算法二、画流程图流程图用来表示各种操作的图框,用流程图表示的算法直观形象,便于编程。以下是常见的流程图符号:〇^37◊〇!一起止框输入输出框判断框处理框流程线图3.1

32三、编写程序四、调试程序§2.1结构化程序设计结构化程序设计的基本思想是:任何程序都可以用三种基本结构的组合来实现。这三种基本结构是:顺序结构、选择结构和循环结构。这三种结构都具有一个入口和一个出口。选择结构程序段2图3.3结构化程序设计的三种基本结构程序段1顺序结构此外结构化程序设计思想要求限制无条件转移语句(即goto语句)的使用。§3.3顺序结构

33顺序结构是结构化程序设计的三种基本结构中最简单的。它可以

34独立存在,也可以出现在选择结构或循环结构中,总之整个程序都存在顺序结构。在顺序结构中,函数、一段程序或者语句是按照出现的先后顺序执行的。§3.4if语句C语言中的选择结构有两种:if语句和case语句。if语句主要提供两个分支的选择,case语句提供多分支的选择。ー、if语句的基本形式if语句的基本形式和流程图如图3.5所示:if(条件)齣1:齣2;图3.5if语句的形式和流程图当语句2为空时,else可以省略,if语句形式变换为:if(条件)齣;不成立图3.7迁港句的形式和流程图二、if语句的嵌套if语句可以互相嵌套,即当if语句中的语句1或语句2是ー个

35含if语句的复合语句时,形成if语句的嵌套。if语句的嵌套常见形式有两种:形式ー:当语句2是if语句结构if(条件D餉]else(if(条件2)餉2ゝelse&6]3形式二:当语句1是if语句结构if(条件1)if(条件2)血!しelse语句2-else&&]3在if语句嵌套中,需要特别注意else与if的配对问题。C编译系统处理该问题的原则是:else总是与同一语法层次中离它最近的尚未配对的if配对。§3.5switch语句C语言提供了switch语句解决多分支选择问题。switch语句的一般形式和流程图如下:

36switch(3^1^达式)(case数值1:语句!;break;case数值2:语句2;break;case数值n:语句mbreak;default:^6]n+1;整型表达式也可以是字符型表达式。数值1到数值n可以是整数或者字符常量。switch语句执行过程是:首先计算整型表达式,根据结果与case后面的常量数值进行比较,如果等于case后面数值则执行其后的语句,然后跳出。如果case后的数值没有与表达式值相等的情况时,则执行default后面的语句再跳出。其中,缺省break则执行符合表达式数值的语句及其后的语句,直到遇见breakオ跳出switch语句。缺省default,当没有与表达式值相等的数值时,直接跳出switch语句。上机练习与课后作业1.输入两个数,判断两个数的关系是“大于”、“等于”或“小于”,并输出结果。2.从键盘任意输入三个整数,按从小到大顺序输出。3.判断ax2+bx+c=0方程的有几个解,如果有解则输出。系数a、b、c由键盘输入。4.要求输出如下菜单主菜单

371.输入学生成绩2.查询学生成绩3.打印输出成绩0.退出系统请选择(0-3):如果选择1,则显示“请输入”;选择2,则显示“请输入查找学生学号”;选择3,显示“正在输出”;选择〇,显示“谢谢使用”;选择其它则显示“输入错误”。(用switch语句实现)。

38第四讲控制结构(二)引言ー、教学目的本讲主要介绍了C语言提供的三种循环结构语句:while语句、do-while语句和for语句,介绍了循环结构中常用的语句break、continue的使用以及循环的嵌套。要求大家掌握这三种循环结构的使用,理解break和continue在循环结构中的不同作用,了解循环的嵌套。二、知识要点1.while语句(1)while语句的一般形式和使用(2)循环语句的使用注意事项2.do-while语句(1)do-while语句的一般形式和使用(2)do-while语句与while语句的不同3.for语句(1)for语句的一般形式和使用(2)三种循环语句的比较

391.break和continue语句(1)break语句的使用(2)continue语句的使用(3)break和continue语句的区别2.循环语句的嵌套三、边用边学§4.1while语句while语句的一般形式和流程图如下所示:while(条件)语句ノノXゝ不成立成立J语句段图4.1while语句流程图while语句的执行过程是:当条件成立时执行循环体中的语句,然后再次判断条件,重复上述过程,直到条件不成立时结束循环。while语句的特点是:当ー开始条件就不成立时,一次也不执行循环语句。在循环结构的设计中,特别需要注意的是:避免死循环。循环体中必须有改变循环条件的语句,并且可以使程序执行到某ー时刻

40不满足这个条件而结束循环。§4.2do-while语句do-while语句的一般形式和流程图如下所示:do循环体语句while(条件”图4.3do.while语句流程图do-while语句的执行过程是:执行循环体中的语句,然后判断条件,条件成立再执行循环体;重复上述过程,直到条件不成立时结束循环。do-while语句的特点是:当ー开始条件就不成立时,已经执行了一次循环语句。此外特别注意while(条件)后面的分号不要省。while语句可以转换为do-while语句,二者基本上是等价的,唯ー不同的是:当ー开始条件就不成立时,while语句不执行循环体,而do-while语句执行ー次循环体。§4.3for语句for语句的一般形式和流程图如下所示:

41for(表达式1;条件;表达式2)齣表达式1语句成X亠表达式2图45for语•句流程图for语句的执行过程是:第一步执行表达式1,第二步判断条件,第三步当条件成立时执行循环体中的语句和表达式2;然后重复第二、三步直到条件不成立结束循环。§4.4break语句和continue语句ー、break•句break语句除了可以用在switch语句中,还可以用在循环体中。在循环体中遇见break语句,立即结束循环,跳到循环体外,执行循环结构后面的语句。break语句的一般形式为:break;在循环体中break语句常与if语句搭配使用,并且break语句只能用在switch语句和循环语句中。二、continue语句continue语句用于结束本次循环,即在循环体中遇见continue语句,则循环体中continue语句后面的语句不执行,接着进行下

42一次循环的判定。它的一般形式为:continue;continue语句只用于循环结构的内部,一般同if配合使用。continue语句和break语句用在循环体中的作用是不同的。continue语句只取消本次循环的continue语句后面的内容,而break语句终止了整个循环过程。§4.5循环的嵌套ー个循环语句的循环体内包含另ー个完整的循环语句,称为循环的嵌套。while语句、do-while语句和for语句都可以互相嵌套,甚至可以多层嵌套。循环嵌套时注意内循环变量的初始化问题。此外,break只能跳出ー层循环(或者ー层switch语句结构)。§4.6goto语句goto语句为无条件转移语句,它的一般形式为:goto语句标号;语句标号的命名需要符合C语言对标识符的命名规则,即语句标号由字母、数字和下划线组成,其中第一个字符不能是数字。标号必须加在某个语句的前面,并且在标号后面使用冒号。当程序执行到goto

43语句后,程序转移到标号指定的语句继续执行。标号只对got〇语句有意义,当其它场合下遇见语句标号,则直接执行语句而忽视标号的存在。goto语句可以与if组合,构成循环语句。此外goto语句也用于从循环体内跳出循环,尤其在多层循环中,使用goto语句可以跳到任意一层循环体内。但是这种用法不符合结构化程序设计要求,应该尽量避免。上机练习与课后作业1.用十进制、ハ进值、十六进制、字符形式输出ASCI!码表33〜126中的代码。2.计辑Zた+Zと的结果.3.计算1!+2!+……+10!的值。4.用循环的嵌套输出如下图形:****5.要求输出如下菜单主菜单1.输入学生成绩2.查询学生成绩3.打印输出成绩

440.退出系统请选择(0-3):如果选择1,则显示“请输入”;选择2,则显示“请输入查找学生学号”;选择3,显示“正在输出”;选择〇,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。用循环语句实现用户的重复输入,直到输入选择为“〇”时,结束循环。

45第五讲运算符和表引言ー、教学目的本讲主要介绍了c语言的算术运算符、关系运算符、逻辑运算符、赋值运算符、自增和自减运算符、逗号运算符以及条件运算符的功能、结合性和优先级。要求大家掌握含有这些运算符的表达式值的判定,并且在编程中熟练运用这些运算符解决问题。二、知识要点1.算术运算符和算术表达式(1)算术运算符使用注意事项(2)算术运算符的结合性和优先级2.关系运算符和关系表达式(1)关系运算符的优先级(2)关系表达式值的判定3.逻辑运算符和逻辑表达式(1)逻辑运算符的使用

46(2)逻辑运算符的优先级(3)逻辑表达式值的判定1.赋值运算符和赋值表达式(1)赋值运算的结合性和优先级(2)复合赋值运算的使用2.自增运算符和自减运算符(1)自增运算符和自减运算符的作用(2)自增运算和自减运算的前置方式和后置方式的区别3.逗号运算符和逗号表达式(1)逗号运算符的作用(2)逗号表达式的值4.条件运算符和条件表达式(1)条件运算符的使用三、边用边学§5.1算术运算符和算术表达式ー、算术运算符C语言提供的算术运算符及功能如下:

47+:加法运算符。如1+2的结果为3〇-:减法运算符,或负值运算符。如5-3、ー2的结果分别为2和~2〇*:乘法运算符。如2*3的结果为6〇/:除法运算符。如4/2的结果为2。%:模运算符,或称取余运算符,要求%两侧均为整型数据。如8%3的结果为2〇计算时需要注意的是:一是运算的数据都是整型数据时,结果为整型,如果有实数,则结果为double型。二是模运算符要求运算符两侧必须为整型数据,如果不是整型数据可以采用强制类型转换。二、算术表达式用算术运算符将数据对象连接起来的式子,称为算术表达式。表达式的运算按照运算符的结合性和优先级来进行。C规定了运算符的结合方向,即结合性。算术运算符的结合性是从左往右算。C语言规定负值运算符优先级高于乘、除、模运算符,乘、除、模运算符优先级高于加、减运算符,当表达式中优先级相同时,按照运算符的结合性。如果需要先计算优先级低的可以使用小括号“()”,小括号的优先级最高。§5.1关系运算符和关系表达式

48ー、关系运算符C语言提供的以下关系运算符:く:小于运算符。如aく4。く二•小于等于运算符。如3〈二5。>:大于运算符。如x>y。》二:大于等于运算符。如x>=0。ニニ:等于运算符。如a==bo!二:不等于运算符。如y!二1。两个数据在进行值的比较时,其结果不是成立就是不成立,其中成立为“真”,不成立为“假”。在C语言中,任何非。值为“真”,。值为“假”。关系运算的结果仅产生两个值:1表示“真”,。表示“假”。二、关系运算符结合性与优先级关系运算符的结合性为“从左往右”。关系运算符中〈、く二、>、>ニ的优先级相等,ニ二、!二优先级相等,且前者高于后者。关系运算符的级别小于算术运算符。三、关系表达式用关系运算符将两个数据或表达式连接起来的式子,称为关系表达式。关系表达式的值为1或。。§5.1逻辑运算符和逻辑表达式

49、逻辑运算符逻辑运算表示两个数据或表达式之间的逻辑关系。C语言提供的逻辑运算符有三种:逻辑与运算符“&&”、逻辑或运算符“丨丨”、逻辑非运算符、”。逻辑运算的结果也只有两个:“真”为1和“假"为〇〇二、逻辑运算符结合性与优先级逻辑运算符“!”的结合性为“从右往左”、“&&”和“丨丨”的结合性为“从左往右”。逻辑运算符的优先级为“!”高于“&&”高于“丨丨”。例如表达式!(3〈4)||(2>5)&&(4>1),贝リ!的运算结果为假、&&的运算结果为假,最终|丨的结果为假,即该表达式的值为0。“!”的优先级高于算术运算符,“&&”和“丨丨”的优先级低于关系运算符。见下图5.1。三、逻辑表达式逻辑表达式的值为1或。。由于C语言编译系统在判断ー个量为“真”、“假”时,以〇为“假”,以非〇为“真”。所以逻辑

50运算符也可以直接连接数据,如!4的结果为0、3&&0的结果为〇。§5.1赋值运算符和赋值表达式ー、简单赋值运算C语言中最常见的赋值运算符是“二”,其作用是将赋值运算符右边的表达式赋予左边的变量,形如:变量二表达式,称为赋值表达式。例如:x=4。赋值运算符的结合性为从右往左,其优先级低于算术运算符、关系运算符和逻辑运算符。二、复合赋值运算算术运算符“+—*/%"和赋值运算符“二”结合起来,形成复合赋值运算符。如下所示:+二:加赋值运算符。如a+=3+1,等价于a=a+(3+1)〇一二:减赋值运算符。如a一二3+1,等价于a=a-(3+1)〇・二:乘赋值运算符。如a*=3+1,等价于a=a*(3+1)〇/二:除赋值运算符。如a/=3+1,等价于a=a/(3+1)〇0":取余赋值运算符。如a%=3+1,等价于a=a%(3+1)〇复合赋值运算符的作用是先将复合运算符右边表达式的结果与左边的变量进行算术运算,然后再将最终结果赋予左边的变量。所以复合运算要注意:一是复合运算符左边必须是变量;二是复合运算符右边的表达式计算完成后オ参与复合赋值运算。

51复合赋值运算符的结合性和优先级等同于简单的赋值运算符复合运算符常用于某个变量自身的变化,尤其当左边的变量名很长时,使用复合运算符书写更方便。§5.1自增运算符和自减运算符自增和自减运算符是C语言所特有的,主要用于给ー个变量加1或减1。自增和自减运算符及其功能如下:++:自增运算符。如a++,++a,都等价于a=a+1。一:自减运算符。如a--,--a,都等价于a二aT。自增和自减运算符是单目运算符。自增运算符和自减运算符可以放到变量前面(前置方式)或者后面(后置方式),这两种方式同样实现了变量的自增或自减运算。但是当变量的自增运算或者自减运算同其它运算配合构成一个表达式时,前置运算时变量先做自增或自减运算,再将变化后的变量值参加表达式中的其它运算。后置运算时变量在参加表达式中的其它运算之后,再做自增或自减运算。§5.2逗号运算符和逗号表达式逗号运算符主要用于连接表达式。例如:

52a=a+1,b=3*4用逗号运算符连接起来的表达式称为逗号表达式。它的一般形式为:表达式1,表达式2,,表达式n逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式no整个逗号表达式的值是最后一个表达式的值。逗号表达式的结合性从左往右,它的优先级是最低的。§5.1条件运算符和条件表达式条件运算符是C语言的唯一的三目运算符,即它需要3个数据或表达式构成条件表达式。它的一般形式为:表达式1?表达式2:表达式3如果表达式1成立,则表达式2的值是整个表达式的值,否则表达式3的值是整个表达式的值。如图5.2所示:图5.2if-else结构可以替换条件运算符,但是条件运算符不能替换所有的if-else结构。只有当if-else结构为两个分支情况,并且

53都给同一个变量赋值时オ可以用条件运算符替换。条件运算符的结合方向为从右往左。条件运算符的优先级仅高于赋值运算符和逗号运算符,低于关系、算术运算符和逻辑运算符。上面我们介绍了C语言的常用运算符,其优先级从高到低总结如下:!、++负值运算符ー算术运算符的・、/、%加法运菖符+、够法运算符ー关系运算符的<、<=、>ヽ>=关系运图符的==、t条件运算符?:赋值运算符=、*=、/=、%=、+=、—=,,逗号运算符,低课后作业与上机练习1.试编程求出最小的正整数n,使得n满足除3余2、除5余3、除7余4。2.编写一个程序,可以将例5.12生成的密电码译回原文。3.输入两个正整数m和n,求出它们的最小公倍数。算法:最小公倍数等于m*n再除以它们的最大公约数。4.参照例5.11编写一个程序,要求计算出生日到计算日的总天数。算法:1)输入出生年yearl、月monthl、日datel和计算日年year2、

54月month2>日date2o2)统计yearl到year2T的总天数:for(n二yearl,days二〇;n〈year2;n++)if(n是闰年)days+=366elsedays+=365;3)计算出出生日和计算日是当年的第daysl和days2。同例5.11〇4)总天数等于days+days2-days15.根据上题结果,判断体力、情绪和智力状态。方法如下:体力状态:用总天数除以23,余数在。〜11为体力高潮期,否则为体力低潮期。情绪状态:用总天数除以28,余数在。〜14为情绪高潮期,否则为情绪低潮期。智力状态:用总天数除以33,余数在。〜16为智力高潮期,否则为智力低潮期。

55第六讲函数.打印本ー、教学目的通过介绍C语言的函数的概念、定义和调用,要求掌握函数的定义、调用方式,了解函数形参和实参的特点,掌握函数的嵌套调用和递归调用,并能熟练编写具有一定功能的函数。二、知识要点1.概述(1)c语言函数的分类(2)C语言中函数的执行过程2.函数的定义(1)函数的定义的一般形式(2)函数形参的使用及其注意事项3.函数的返回值4.函数的调用(1)函数调用的形式(2)函数实参的使用及其注意事项(3)函数实参和形参的关系

56(4)函数的声明(5)函数的嵌套调用1.函数的递归调用(1)编写递归调用函数的方法(2)函数递归调用的注意事项三、边用边学§6.1概述C程序是由一个主函数和其它若干函数构成,每个函数实现一定的功能,其中主函数main。是必需的,其它函数被主函数调用或者其它函数之间相互调用。C语言的函数可以分为三类:主函数main()、库函数(如printf()ヽscanf()等)和用户自定义函数。函数的使用不仅简化了主函数,而且符合模块化程序设计方法。C程序总是从主函数开始执行,其它函数只有在被主函数或其它正在执行的函数调用时才能被程序执行,执行后返回调用函数,最后返回到主函数,在主函数中结束整个程序的运行。所有的函数在定义时是相互独立的,它们之间是平行关系,所以不能在ー个函数内部定义另ー个函数,即不能嵌套定义。函数间可以互相调用,但是不能调用主函数。

57§6.2函数的定义ー、函数的定义常见的函数定义的形式如下:类型标识符函数名(形参类型说明表列){函数体)类型标识符为函数的类型,与return语句返回值的类型相同,可以理解为函数最终的结果的类型。它可以是任何一种有效的类型,当函数类型标识符缺省时默认是整型。如果函数无返回值时,类型标识符为VOido函数名要符合C语言规定的标识符的命名规则,函数名字必须唯一,不能与函数体内变量或形式参数名相同。形参类型说明表中的形参用于接受主调函数传递过来的数值。形参的命名只要符合变量的命名规则即可,无需与主调函数中的变量名一致。如果函数不需要从主调函数处接受数据,可以不带形参,此时形参类型说明表是空的,但是函数名后面的圆括号不能省。函数体也可以是空的。§6.3函数的返回值在调用函数时,有时需要将运算结果返回主调函数,此时需要使用return语句返回ー个值,称作函数返回值。return语句形式如下:

58return(表达式);表达式可以是ー个变量、常量或者表达式。函数返回值的类型应该与函数类型一致,如果不一致时,函数类型决定返回值的类型。函数没有返回值时,函数类型说明为void。§6.2函数的调用ー、函数调用的一般形式函数调用的一般形式为:函数名(实参表列);关于参数调用注意以下几点:1.如果实参表列中含有多个参数,则各参数用逗号间隔。实参表列也可以没有,但括号不能省略。2.实参和形参必须个数相等、类型一致、顺序对应,进行数据的“值传递”。特别要注意的是:实参和形参之间是“单向的值传递”。3.实参可以是常量、变量、表达式或函数。例如:4.函数同变量一样,在调用前应该在主调函数中事先说明,即“声明”。声明的方法是在主调函数开始位置加上被调函数的“函数原型”,即函数定义的第一行。有两种情况可以不用声明:ー是当

59被调用函数的定义的位置在主调函数之前,二是被调用函数是整型into二、函数的嵌套调用C语言中函数不能嵌套定义,但是可以嵌套调用,即在调用ー个函数的过程中可以又调用另ー个函数。16.5函数的递归调用C语言的函数调用允许直接或间接地调用该函数本身,称为函数的递归调用。递归调用函数的使用可以解决具有递归性质的问题。在编写递归算法的时要特别注意:递归调用必须可以满足一定条件时结束递归调用,否则无限地递归调用将导致程序无法结束。作业与上机练习1.写ー个函数intprime(intx),如果x是素数返回值为1,否则返回。。并用主函数验证它。2.写ー个函数doublepower(doublex,intn),其返回值为犬,并用此函数计算1.5ゝ3,求1到10共10个数中取出3个不同的数,共有多少种组合方式?算法:使用数学中的组合公式,其中m二10,n二3。c:=關4.用递归算法编写求Fibonacci数列第n项值的函数fib(intn),并用主函数输出它的前20项来验证该函数。

60第七讲数组ナ卩本ー、教学目的本讲介绍C语言中数组的定义和使用,其中重点介绍ー维数组的定义、引用、初始化和作为函数参数时数据传递方式,此外对二维数组的定义、引用和初始化在文中也作了详细的说明。要求大家熟练掌握ー维数组的使用,了解的二维数组的应用,并且理解数组元素和数组名作函数参数的不同,进而灵活运用数组作函数参数编程。二、知识要点(1)维数组的定义和引用(1)数组元素的类型和构造方法(2)ー维数组的定义(3)ー维数组元素的个数与下标(4)ー维数组元素的引用(5)ー维数组的存储形式2.ー维数组的初始化一维数组初始化的几种形式

612.多维数组的定义和使用(1)二维数组的定义和存储顺序(2)二维数组的引用(3)二维数组初始化的几种形式3.数组作为函数参数(1)数组元素作为函数参数(2)数组名作为函数参数三、边用边学§7.1一维数组的定义和引用数组类型的所有元素都属于同一种类型,并且是按顺序存放在ー个连续的存储空间中,即最低的地址存放第一个元素,最高的地址存放最后的ー个元素。数组类型的优点主要有两个:ー是让ー组同一类型的数据共用ー个变量名,而不需要为每ー个数据都定义ー个名字;ニ是由于数组的构造方法采用的是顺序存储,极大方便了对数组中元素按照同一方式进行的各种操作。此外需要说明的是数组中元素的次序是由下标来确定的,下标从〇开始顺序编号。数组可以是ー维数组、二维数组或者多维数组。ー、ー维数组的定义

62ー维数组的定义形式为类型标识符数组名[元素个数];数组的定义要注意以下几个问题:1.数组名的命名规则同变量名的命名,要符合C语言标识符的命名规则。2.数组名后面的“[ド是数组的标志,不能用圆括号或其它符号代替。3.数组元素的个数必须是一个固定的值,可以是整型常量、符号常量(第九讲中介绍)或者整型常量表达式。定义数组时,系统将按照数组类型和个数分配一段连续的存储空间存储数组元素。在定义数组要特别注意:绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数(形参和数组初始化时除外)。4.数组元素的个数表示数组最多可以存放的数据。二、ー维数组元素的引用数组必须先定义后使用。在数组的使用时要注意:C语言规定只能逐个引用数组元素,而不能一次引用整个数组。数组元素引用的一般形式是:数组名[下标]下标可以用整型常量、整型变量或者整型表达式,其范围从。开始,小于等于“元素个数一1”。由此可见,数组名后中括号内的内容在不同场合的含义是不同的:在定义时它代表数组元素的个数,其它情况则是下标(与数组名联合起来表示某一个特定的数组元素)。

63数组元素存放是按照下标的顺序按次序存放的。另外需要注意的是:C语言不检查数组的边界。所以当超越边界时,例如出现a[5],系统不会提示错误,但是可能运行时导致其它变量甚至程序被破坏。数组元素的使用方法与同类型的变量的使用方法相同,可以参加各种运算。数组常用循环语句来处理。§7.1ー维数组的初始化数组的初始化的一般形式如下:类型标识符数组名[元素个数]={元素值表列};有关数组的初始化的说明如下:1.元素值表列,可以是数组所有元素的初值,也可以是前面部分元素的初值。2.当对全部数组元素赋初值时,元素个数可以省略。但“[ド不能省。此时系统将根据数组初始化时大括号内值的个数,决定该数组的元素个数。但是如果提供的初值小于数组希望的元素个数时,方括号内的元素个数不能省。注意:数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个元素一个元素地赋值。§7.2多维数组的定义和使用

64C语言允许使用多维数组。最简单的多维数组是二维数组。ー、二维数组的定义二维数组的定义形式为类型标识符数组名[元素个数1][元素个数2];二维数组中元素的存放顺序是按行存放的,即先按顺序存放第一行的数组元素,再放第二行的数组元素。多维数组的定义方式可以按照二维数组的定义:类型标识符n维数组名[元素个数1][元素个数2]-[元素个数n];即n维数组就有n个“[元素个数]”。多维数组的存储顺序为:最左边的下标变化最慢,越往右变化越快,最右边的下标变化最快。例如上例中三维数组x的存储顺序为二、二维数组的引用二维数组中元素的表示形式为数组名[下标1][下标2]同一维数组一样,二维数组的下标可以是整型常量、整型变量或者整型表达式。为了便于理解二维数组下标的含义,我们可以将二维数组看作一个行列式或矩阵,则下标1用来确定元素的行号(从〇开始,小于等于“元素个数1”减1),下标2用来确定元素的列号(从。开始,小于等于“元素个数2"减1)。

65n维数组中元素的表示形式为n维数组名[下标1][下标2]…[下标n]其中下标的取值范围和类型同二维数组,并且n维数组的元素同样可以赋值和出现在表达式中。三、二维数组的初始化二维数组的初始化方法有以下几种形式:1)按行对二维数组初始化。2)按照数组的存储顺序赋初值。3)只对部分元素赋值。4)如果对数组元素全部赋初值,定义数组时元素个数1(最左边的元素个数)可以省略,元素个数2不能省略。注意:同一维数组ー样,二维数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个元素一个元素地赋值。§7.1数组作为函数参数数组中的元素和数组名都可以作函数参数,但是效果是不一样的。ー、ー维数组元素作为函数参数ー维数组中元素作为函数的实参,与同类型的简单变量作为实参ー样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响作为数组元素的实参。

66二、数组名作为函数参数数组名作为函数参数,此时形参和实参都是数组名(或者是表示地址的指针变量,见第十讲),传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。数组名作函数参数时要注意:形参中的数组要定义,并且要求与实参数组类型一致,但是形参数组的大小(即元素个数)可以小于等于实参数组的元素个数,甚至形参数组的元素个数可以省略,而由一个专门的参数传递元素个数。三、多维数组作为函数参数多维数组元素作函数参数同一维数组元素作函数参数相同,是单

67向的值传递。多维数组名作为函数参数,与一维数组名作为函数参数一样,传递的是数组的起始地址,即形参数组与实参数组的起始地址相同,此时形参数组可以小于实参数组。但在使用时注意:当多维数组名作为实参时,对应的形参数组的最左边(即第一维)元素个数1可以指定也可以省略,但是第二维以及其它高维的元素个数不能省略。上机练习和作业1.已知一个数组a[5]={l,2,3,4,5}、b⑸二知1,4,2,7,9),数组c[5]等于数组a、b对应元素之和。输出数组c中个元素的值。2.写ー个函数voidchange(intarray[],intn),可以将数组array中的n个元素逆序存放。即array[0]与a[nT]互换,array[1]与array[n-2]互换〇3.求两个矩阵的乘积c。已知矩阵a、b的值:「1231プ2、可以用数组a[2][3]、b[3][2]表示矩阵a、b,则其乘积矩阵c用数组[2][3]表示时,它的元素等于a[i][j]、b[j][i]的乘积。4.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。方法:定义二维数组days_of_month[2][12],令该数组第一行由非闰年的12个月的天数组成,第二行由闰年12

68个月的天数组成,则根据年判断:闰年时i为1、非闰年时i为0,累计days_of_month[i][〇]到days_of_month[i][month-1]的天数,再加上date,得到总天数。1.根据例7.10的算法,修改例7.8,要求按照平均成绩从高到低的顺序输出学号和平均分。提示:对平均分aver排序,当aver元素互换时,学号num元素对应互换。2.根据例7.9,进ー步完成“学生成绩管理系统”。即输出如下菜单主菜单1.输入学生成绩2.查询学生成绩3.打印输出成绩0,退出系统请选择(1~0):如果选择1,调用例7.9的输入函数input();选择2,调用voidsearch(longnum[],floataver[],intn),该出数口[以根据输入的学号输出该学生的各课成绩和平均分;选择3,调用例7.9的输出函数output();选择。,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。该程序只有当输入选择为“0”时结束,否则返回主菜单。

69第八讲字符与字符串引言ー、教学目的本讲主要介绍了C语言中关于字符和字符串的操作方法。要求大家掌握字符和字符串的输入输出方法,掌握字符串的存储特点以及常用字符串操作函数的使用,了解的二维字符串数组的使用。二、知识要点1.单个字符的输入输出(1)函数getchar()的使用(2)函数putchar()的使用2.字符数组与字符串(1)字符数组(2)字符串3.字符串的输入和输出函数(1)函数puts()的使用(2)函数gets()的使用4.字符串操作函数strcat()、strcmp〇、函数strlen()、strcpy()、strlwr()、strupr()的功能5.二维字符串数组

70(1)二维字符串数组的初始化(2)二维字符串数组的输入输出三、边用边学§81单个字符的输入输出C语言头文件“stdio.h”中还定义了两个专门用于单个字符输入输出的函数getchar()和putchar()〇ー、字符输入函数getchar()getchar()函数作用是从输入设备(如键盘)读取ー个字符。函数getchar〇没有参数,其一般形式为getchar();其执行结果是从输入设备得到ー个字符。可见,getchar〇函数同带格式符猊的scanf()函数都可以接收ー个字符,并且可以将得到的字符赋给ー个字符型变量或者整型变量。但是不是所有场合二者都可以互相替换。下面我们列出了它们的不同之处:(1)getchar()一次只能接收ー个字符。(2)getchar()可以接收回车字符。而scanf()将回车作为

71数据的间隔符或结束符。(1)getchar〇接收的字符可以不赋给任何变量。二、字符输出函数putchar()putchar()函数作用是将一个字符输出到输出设备(如显示器)。它的一般形式为putchar(字符型或整型数据);函数putchar〇的可以输出字符型变量、整型变量、字符型常量以及控制字符和转义字符。(2)2字符数组与字符串一、字符数组如果一个数组的元素是字符型数据,则该数组为字符数组。所以字符数组的定义、引用、初始化同样遵循上一讲“数组”的规定。字符数组的赋值符合数组的有关要求,除了在定义时初始化,只能一个元素一个元素地赋值。同样将字符数组中的全部内容输出,也只能一个元素一个元素地输出。上述方式只能用于处理已知个数的字符序列,并且当字符序列发生变化时,字符数组无法伴随字符序列长度的变化而变化。可见,将一个字符序列看作是单个字符的集合的处理方式比较单一和笨拙。C语言中常将字符序列当作字符串来处理,由于字符串的结构

72的特殊性,它不仅具备一般单个字符的集合的所有处理方式,而且它的输入输出更为灵活,并且可以使用C语言提供的强大的字符串处理函数。所以C语言的字符串的处理方式,极大地提高了C语言处理字符序列的能力。二、字符串在C语言中,字符序列当作字符串来处理。字符串的处理是基于字符数组的。字符串在实际存储时其尾部添加了一个结束标志‘'0‘。’、0'代表ASCH码为。的字符,是ー个空操作符,表示什么也不干。所以采用字符数组存放字符串,其赋值时应包含结束标志‘、。’。字符串除了具备以上字符数组的处理方式之外,还可以采用C语言提供的输入输出字符串的格式符“%s”。需要注意的是:当格式符为“如”时,scanf()函数的地址列表是字符数组的名字,并且无需加地址符&。printf〇函数中格式符对应的变量是字符数组的名字。利用格式符“如"输入输出字符串,字符数组只要不小于字符串的个数即可。所以这是C语言中最常用的字符序列处理方法。(1)3字符串的输入和输出函数

73在C语言提供了字符串的输入输出函数gets〇和puts〇,它们在头文件“stdio.h”中定义的,用于整串字符串的输入输出。一、字符串输出函数puts〇puts〇函数作用是将一个字符串(以‘、。’结束的字符序列)输出,其一般形式为puts(字符数组名);或puts(字符串);函数puts〇的使用注意以下几个问题:1.函数puts〇一次只能输出ー个字符串。2.函数puts〇可以输出转义字符。3.函数puts〇输出字符串后自动换行。printf〇函数可以同时输出多个字符串,并且能灵活控制是否换行。所以printf()函数比puts()函数更为常用。二、字符串输入函数gets〇gets〇函数作用是将一个字符串输入到字符数组中,其ー般形式为gets(字符数组名);gets()函数同scanf()函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符串结束标志‘、。’。函数gets〇的使用时要注意以下几个问题:1.函数gets〇只能一次输入一个字符串。

741.函数gets〇可以读入包含空格和TAB的全部字符,直到遇到回车为止。使用格式符"%s”的函数scanf(),以空格、TAB或回车作为一段字符串的间隔符或结束符,所以含有空格或TAB的字符串要用gets()函数输入。28.4字符串操作函数C语言提供了很多字符串操作函数,其对应的头文件为string,ho1.strlen(字符串)strlen〇是测试字符串实际长度的函数,它的返回值是字符串中字符的个数(不包含'、0'的个数)。2.strcpy(字符数组1,字符串2)strcpy〇用于将字符串2复制到字符数组1中。函数strcpy()使用时注意以下几点:(1)字符数组1必须足够大,以便容纳字符串2的内容。(2)字符串2可以是字符数组名或者字符串常量。当字符串2为字符数组名时,只复制第一个‘'0’前面的内容(含‘、0'),其后内容不复制。3.strcat(字符数组1,字符串2)strcat()的作用是将字符串2的内容复制连接在字符数组1的后面,其返回值为字符数组1的地址。

75函数strcpy()使用时注意以下几点:(1)字符数组1不能是字符串常量,并且必须足够大,以便可以继续容纳字符串2的内容。(2)连接前字符数组1的''0'将被字符串2覆盖,连接后生成的新的字符串的最后保留一个''。'。1.strcmp(字符串1,字符串2)strcmp()的作用是比较字符串1和字符串20两个字符串从左至右逐个字符比较(按照字符的ASCH码值的大小),直到字符不同或者遇见''0'为止。如果全部字符都相同,则返回值为。。如果不相同,则返回两个字符串中第一个不相同的字符的ASCH码值的差,即字符串1大于字符串2时函数值为正,否则为负。汉字同样可以作为字符串处理,可以使用strlenO.strcpy()、strcat()和strcmp()函数,注意1个汉字相当于2个字符,并且汉字比较大小是按照汉字存储在计算机中的国标码的大小。2.strlwr(字符串)strlwr〇的作用是将字符串中大写字母转换成小写字母。3.strupr(字符串)strupr〇的作用是将字符串中小写字母转换成大写字母。18.5二维字符串数组ー、二维字符串数组的初始化

76二维字符串数组的初始化,可以采用二维字符数组初始化形式或者字符串初始化形式,如:charname[2][10]二{{'J',‘'h','n',‘、〇'},{'M','a'r'ビy'、〇'}};charname[2][10]={{"John"},{"Marry"}};charname[2][10]={"John","Marry"};三种方法效果ー样。二、二维字符串数组的赋值和引用由于二维数组可以看作是ー个特殊的一维数组,它的数组元素是一个ー维数组。所以二维字符串数组可以看作是这样ー个ー维数组,它的元素是一个字符串。例如:charname[2][10]={"John","Marry"};三、二维字符串数组作为函数参数二维字符串数组的元素和数组名都可以作为函数参数,并且使用方法与二维数组的使用方法相同。作业1.编写ー个函数string_change(charstr[]),要求实现str中的字符的互换。如"abcde”换成"edcba”。2.编写—函数charsearch(charstr[],charc),如果

77字符串str中包含字符c则返回数值1,否则返回数值0。1.编写ー个函数stringcut(charstring[],charc),其功能是删除字符串中所有的字符变量c,例如charstring="abaca”;charc二'a';则执行string_cut(string,c)后,string的内容变为“be”。2.编写ー"个函数string_search(charstrl[],charstr2[]),如果字符串str!中包含字符串2则返回数值1,否则返回数值〇〇3.进ー步完善“学生成绩管理系统”。主菜单1.输入学生成绩2.按姓名查询学生成绩3.按学号查询学生成绩4.打印输出成绩0,退出系统请选择(0-4):如果选择1,输入学生姓名、学号、成绩;选择2,可以按照姓名查找该学生的各课成绩和平均分;选择3,可以按照学号查找该学生的各课成绩和平均分;选择4,可以按照学号输出学生姓名、学号、成绩;选择〇,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。

78第九讲变量类别与号打印本编译预处理页引言ー、教学目的本讲主要介绍了全局变量和局部变量以及自动变量、静态变量和寄存器变量的特点和关系,介绍了编译预处理命令中的宏定义和文件包含,要求大家掌握局部变量和全局变量的特点和使用方法,了解自动变量和静态变量的区别,掌握不带参数的宏和带参数的宏的使用,熟练运用“文件包含”功能。二、知识要点1.全局变量和局部变量(1)局部变量的特点(2)全局变量的特点(3)全局变量的应用2.自动变量、静态变量和寄存器变量(1)自动变量的存储形式(2)静态变量的存储形式和使用注意事项(3)寄存器变量的存储形式

791.宏定义(1)不带参数的宏定义(2)带参数的宏定义2.文件包含文件包含的作用和使用方法§9I全局变量和局部变量C语言根据变量作用域的不同,将变量分为局部变量和全局变量。ー、局部变量在函数内部定义的变量称为局部变量,它只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。二、全局变量在所有函数外部定义的变量称为全局变量。全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。全局变量主要用于函数之间数据的传递。具体应用在两方面:一是函数可以将结果保存在全局变量中,这样函数得到多个执行结

80果,而不局限于ー个返回值;ニ是由于函数可以直接使用全局变量的数据,从而减少了函数调用时的参数。§9.2自动变量、静态变量和寄存器变量C语言的变量根据分配的存储空间的不同,可以分为寄存器变量、静态变量和自动变量。ー、自动变量自动变量的存储空间为内存中的动态数据区,该区域中的数据随程序需要动态地生成或释放。在函数体内或者复合语句内定义的局部变量都属于自动变量。自动变量的类型修饰符auto放在变量的类型说明之前。但是auto一般是不写的。局部变量只要不专门说明是static存储类型,都确定为自动变量,采用动态存储方式。自动变量的特点是当程序执行到自动变量的作用域时,オ为自动变量分配存储空间,并且定义自动变量的函数执行结束后,程序将释放该自动变量的存储空间,留给其它自动变量使用。二、静态变量静态变量的存储空间为内存中的静态数据区,该区域中的数据在整个程序的运行期间一直占用这些存储空间,直到整个程序运行结束。

81所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,オ为局部静态变量。静态变量的特点是在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。即静态变量的生存期就是整个程序的运行期。在选择使用静态局部变量还是自动变量,可以从以下两点考虑:ー是如果需要在两次函数调用之间保持上一次函数调用结果,可以使用局部静态变量;ニ是如果在每次调用函数时都必须对局部变量初始化,选择自动变量。但是实际上局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。三、寄存器变量为了提高运算速度,C语言允许将一些频繁使用的局部变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存。寄存器变量只要在定义时加上类型修饰符register即可。四、用extern、static声明的全局变量如果组成这ー个程序的几个文件需要用到同一个全局变量,只要在其它引用该全局变量的源程序文件中说明该全局变量为extern即可。反之,如果希望一个源程序文件中的全局变量仅限于该文件使用,只要在该全局变量定义时的类型说明前加一个static。§9.2宏定义

82C语言提供的预处理命令主要有:宏定义、文件包含和条件编译。其中宏定义分为带参数的宏定义和不带参数的宏定义。一、不带参数的宏定义不带参数的宏定义的一般形式为#define标识符字符串它的作用是在编译预处理时,将源程序中所有标识符替换成字符串。无参数的宏定义使用时,要注意以下几个问题:(1)宏名一般用大写字母,以便与变量名的区别。(2)在编译预处理时宏名与字符串进行替换时,不作语法检查。(3)宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令。(4)宏定义时可以引用已经定义的宏名。(5)对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。二、带参数的宏定义带参数的宏定义的一般形式为^define标识符(参数表)字符串它的作用是在编译预处理时,将源程序中所有标识符替换成字符串,并且将字符串中的参数用实际使用的参数替换。带参数的宏定义使用时,要注意以下几个问题:

83(1)在宏定义时,宏名和参数之间不能有空格。(2)一般在定义宏时,字符串中的形式参数外面加一个小括号。§9.4文件包含“文件包含”用于ー个源程序文件包含另外一个源程序文件的全部内容。”提供的文件包含预处理命令的一般形式:#includeく文件名〉或者#include“文件名”“文件包含”的使用时要注意:(1)ー个#include命令只能指定一个被包含的文件。(2)“文件包含”可以嵌套。作业及上机练习1.使用全局变量,编写程序实现通过调用ー个函数doublecalculate(doublex,doubley),可以得到两个数的和、差、积、商。2.应用局部静态变量实现输入n,输出1+2+3++n的结果。3.输出Fibonacci数列的前20项的值。应用局部静态变量的方法。4.定义带参数的宏MAX(a,b)、MIN(a,b)、ABS(a)分别求两个数的最大值、最小值和一个数的绝对值。5.定义宏名LeapYear(year)和Isupper(a),判断year

84是否是闰年以及a是否是大写字母。1.已知三角形的边长a、b、c,求三角形的面积area=Js(s-a)(sーら)(s-ご)其中s=(a+b+c)/2。要求定义两个带参数的宏用来表示s和areao2.使用符号常量N代表学生人数,进ー步完善“学生成绩管理系统”。

85第十讲指针(一)『本ー、教学目的本讲主要介绍了c语言中指针的基本概念和指向变量的指针变量、指向一维数组的指针变量和指向字符串的指针变量的定义及使用,要求掌握指针变量的定义和引用,掌握指向数组元素和字符串中字符的指针变量的使用,理解指针变量作函数参数与数组名或字符串作函数参数的关系。二、知识要点1.地址和指针(1)地址和指针的概念(2)变量的直接引用方式和间接引用方式2.指向变量的指针变量(1)指针变量的定义(2)指针变量的引用(3)指针变量作函数参数3.指针与一维数组

86(1)指向数组元素的指针变量的定义和引用(2)数组元素的两种引用方法(3)数组名与指针变量作函数参数1.指针与字符串(1)指向字符串的指针变量(2)字符串与指向字符串的指针变量作函数参数三、边用边学§101地址和指针计算机内存是以字节为单位的存储空间。内存的每一个字节都有ー个唯一的编号,这个编号就称为地址。凡存放在内存中的程序和数据都有一个地址。当C程序中定义一个变量时,系统就分配ー个带有唯一地址的存储单元来存储这个变量。例如,若有下面的变量定义:chara-A';intb=66;longc=67;系统将根据变量的类型,分别为a、b和c分配1个、2个和4个字节的存储单元,此时变量所占存储单元的第一个字节的地址就是该变量的地址。假设系统为变量分配的存储单元及地址如图10.1所示,则变量a

87的地址是FFD2,b的地址是FFD3,c的地址是FFD5〇程序对变量的读取操作(即变量的引用),实际上是对变量所在存储空间进行写入或取出数据。通过变量名来直接引用变量,称为变量的“直接引用”方式,这种引用方式是由系统自动完成变量名与其存储地址之间的转换。此外,C语言中还有另一种称为“间接引用”的方式。它首先将变量的地址存放在ー个变量(存放地址的变量成为指针变量)中,然后通过存放变量地址的指针变量来引用变量。ー个变量的地址称为该变量的指针。用来存放ー个变量地址的变量称为指针变量。当指针变量P的值为某变量的地址时,可以说指针变量P指向该变量。§10.2向变量的指针变量ー、指针变量的定义指针变量同其它变量ー样,必须先定义,后使用。指针变量定义的一般形式为:类型名・指针变量名;例如:int*p;float*q;char*t;在定义指针变量时需要注意以下几点:(1)变量名前面的是ー个说明符,用来说明该变量是指针变量,这个是不能省略的,但是它不是变量名的一部分。

88(2)类型名表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。我们将在其后的内容中进ー步介绍指针变量定义类型的必要性。指针变量也允许在定义时进行初始化。二、指针变量的引用指针变量有两个有关的运算符:(1)&取地址运算符(2)・指针运算符例如:&a表示变量a的地址,*p表示指针变量p指向的变量。关于指针的引用有两点需要注意:(1)指针变量是用来存放地址的,不要给指针变量赋常数值。(2)指针变量没有指向确定地址前,不要对它所指的对象赋值。三、指针变量作为函数参数在C语言中,函数参数可以是指针类型。当指针变量作函数参数,其作用是将一个变量的地址传送到另ー个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。§10.3指针与一维数组ー、指向数组元素的指针变量

891.定义与赋值这种定义方式与指向变量的指针变量的定义相同。例如:inta[5],*p;指针变量P可以指向任何整型变量,因此也可以指向数组a的任一・兀素。例如:p=&a[O];表示P指向数组的第一个元素a[0]。C语言规定,数组名代表数组的首地址,也是第一个数组元素的地址。因此上面的赋值语句等价于:P二a;指向数组元素的指针也可以在定义时赋初值。2.引用如有以下的定义和赋值:inta[5],*p;p=&a[1];即指针变量P指向数组元素a[l],则可以通过指针运算符来对数组元素进行引用。例如:*p=10;表示对P所指向的数组元素a[l]赋值,上式等价于a[l]=10;C语言规定,如果p指向ー个数组元素,则p+1表示指向数组该元素的下ー个元素。假设P二&a[O],则p+1表示数组元素a[l]的地址。引用ー个数组元素可以有两种方法:

90(1)下标法,如a[i]〇(2)指针法,如・(p+i)〇二、数组名作函数参数在函数调用时,是把实参数组的首地址传递给形参数组,这样形参数组中的元素值如发生变化就会使实参数组的元素值也同时变化。如果我们令一个指针变量指向数组的第一个元素,或者等于数组名,此时数组名和指针变量的含义相同,都表示数组的首地址。所以实参和形参使用数组名时可以用指针变量替换。以下列出实参和形参使用数组名或指针变量的四种情况:实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量三、指向数组元素的指针变量作函数参数虽然数组名与指向数组首地址的指针变量都可以作函数参数,但是由于指向数组元素的指针变量不仅可以指向数组首地址,也可以指向数组中任何ー个元素,所以指向数组元素的指针变量作函数参数的作用范围远远大于数组名作函数参数。§10.4指针与字符串ー、指向字符串的指针变量

91C语言中,字符串是通过ー维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串的操作。由于字符串是按照字符数组形式存储的,所以对字符串中字符的引用也可以用下标法或指针法。二、字符串作函数参数将字符串作为函数参数传递,可以使用字符数组名作参数或指向字符串的指针变量作参数。与上一节数组名作函数参数类似,实参和形参的对应情况也有四种。实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量作业及上机练习1.要求定义3个整型变量及指向整型变量的3个指针变量,利用3个指针变量完成数据的输入、从小到大排序、输出。2.已知一个整型数组a[10],要求定义2个指向整型变量的指针变量max、min,使得它们分别指向数组的最大数和最小数。3.编写ー个函数intpalindrome(char*string),如果字符串string是回文,返回值为!,否则为〇。"回文”指顺读、逆读都ー样的字符串,例如”12321"、“abba”。4.编写ー个函数stringin(char*strl,char*str2),如果字符串str!中包含字符串str2,则返回数值1,否则返回数值0。5.编写ー个求子串的函数substr(char*sl[],chars2[],

92intm,intn),其作用是将字符串si中从第m个字符开始的n个字符放入字符串s2中。

93第十一讲指针(二)封T印本页ー、教学目的本讲主要介绍了返回指针值的函数、指向函数的指针、指针数组、指针与多维数组、指向指针的指针以及命令行参数,要求掌握分别指向函数、数组、指针的指针变量的定义和引用,掌握指针数组处理若干字符串的方法,掌握main()函数形参的定义和使用,了解指向数组的指针与指针数组、指向函数的指针变量与定义返回值是指针的函数的区别。二、知识要点1.返回指针值的函数返回指针值的函数的定义2.指向函数的指针(1)指向函数的指针的定义(2)使用指向函数的指针调用函数的方法3.指针数组指针数组的定义和应用4.指针与多维数组

94(1)指向二维数组的元素的指针变量的定义和使用(2)指向二维数组中一维数组的指针变量的定义和使用(3)指向数组的指针变量和指针数组的区别1.指向指针的指针指向指针的指针变量的定义和引用2.命令行参数(1)处理命令行参数的main()函数的定义(2)定义main(intargc,char*argv[])中argc、argv的含三、边用边学§11.1返回指针值的函数返回值为指针型数据的函数,定义的一般形式为:类型名・函数名(参数表);§11.211.2指向函数的指针一、指向函数的指针的定义指向函数的指针变量定义的一般形式为:类型名(・指针变量名)〇J

95二、指向函数的指针的引用C语言规定函数名就是函数的入口地址。所以当指向函数的指针变量等于ー个函数名时,表示该指针变量指向函数。此时可以通过指向函数的指针变量调用该函数。即一般调用函数的形式是函数名(实参表)改为指向函数的指针变量调用函数时,调用形式变为(・指针变量名)(实参表)指向函数的指针变量在使用时要注意:由于这类指针变量等于ー个函数的入口地址,所以它们作加减运算是无意义的。§11.1指针数组指针数组定义的形式为:类型名・数组名[常量表达式];指针数组的主要用于管理同种类型的指针,其中最常用在处理若干个字符串(如二维字符数组)的操作。§11.2指针与多维数组不带任何下标的二维数组名表示二维数组的起始地址,对其进行加法操作时则表示作为其元素的一个ー维数组(即二维数组一行)的起始地址。只带ー维下标的二维数组名表示作为其元素的一个ー维数组(即二

96维数组一行)的起始地址,对其进行加法操作时表示该ー维数组(即二维数组一行)的ー个元素的地址。ー、指向二维数组元素的指针变量在c语言中指针即是地址,如果指针变量等于只带ー维下标的二维数组名,它的定义、赋值、引用与指向ー维数组元素的指针变量形式相同,例如inta[2][3],*p;P二a[0];此时P指向ー维数组a[0]的起始地址,即p、a此]、&a[〇][〇]相同。对其进行加法操作时P+1等同于a[O]+l,都指向数组元素a[0][l]o所以*(p+1)等于元素a[0][1]的值。二、指向二维数组中一维数组的指针变量C语言规定一种指针变量,如果该指针变量等于不带任何下标的二维数组名,指针变量指向作为二维数组元素的一个ー维数组(即二维数组的一行),这样对指针变量进行加减操作则指针将在二维数组中的行上移动。这种指针变量的定义形式如下:类型符(舒旨针变量名)[指向的ー维数组元素的个数]那么对于ー个由2行3列组成的二维数组a[2][3],如果指针变量P指向这个二维数组中包含3个元素的第一行一维数组,则指针变量P的定义和赋值形式如下:inta[2][3],(*p)[3];

97P二a;此时p指向二维数组a的起始地址。对其进行加法操作时p+1等同于a+1,指向包含3个元素的ー维数组所以*(p+1)等于ー维数组名a[l],*(p+1)+1等于a[l]+l,所以*(*(p+1)+1)等于a[l][l]。指向数组的指针变量在使用时,要注意与元素是指针类型的指针数组的区别。例如:int(*q)[3],*p[3];q是指向ー个包含3个整型元素的ー维数组的指针变量,p是ー个由P[0]、p[l]>p[2]共3个指向整型数据的指针组成的ー维数组。§11.111.5指向指针的指针指针的地址可以赋给另ー个指针变量,这另ー个指针变量就称为指向指针的指针。指向指针的指针定义的一般形式为:类型名・・指针变量名;例如:int**p;表示P是ー个指向int型指针变量的指针。§11.2命令行参数

98C语言允许main函数带两个参数。带参数的main函数的一般形式为:main(intargc,char*argv[])()其中,参数argc为整型,是命令行中参数的个数,命令名也作为ー个参数。argv为指向字符串的指针数组,它的元素依次指向命令行中的各个字符串,包括命令名。作业与上机练习1.修改第ハ讲“学以致用”的第3题,要求函数string_cut(char*string,charc)的返回值为字符串的地址。2.编写并验证去掉字符串中前导空格的函数char*head_cls(char"str)〇3.修改例11.9,已知学生库char"name[6]={“Join”,“Mary”,“Lily”,“Bob”,“Williams”,“White”};要求根据输入学生姓名查找该学生是第几个。4.利用main函数可以读取命令行参数,建立文件like,c。当命令行有2个参数时,例如!ikefootball,输出Doyoulikefootball?当命令行有3个参数时,例如likefootballbasketball日寸,输出Doyoulikefootballorbasketball?当命令行有4个以上参数时,例如!ikeCVbFoxproJava时输出DoyoulikeC,Vb,FoxproorJava?5.根据例11.10进ー步完善“学生成绩管理系统”。

99第十二讲结构体、共用昌打卬本体和枚举类型页引言ー、教学目的本讲主要介绍c语言中的三种类型的定义和使用,其中两种是构造类型:结构体类型和共用体类型,ー种是c语言的基本类型:枚举类型。要求大家掌握结构体类型、共用体类型和枚举类型的变量的定义,掌握结构体类型和共用体类型变量及其成员的引用等基本操作,理解结构体数组的应用,理解结构体和共用体变量存储形式的不同,了解枚举类型变量的处理方式。二、知识要点1.结构体类型的定义(1)结构体类型定义的一般形式(2)结构体类型定义中的注意事项2.结构体类型变量(1)结构体类型变量定义的三种方法(2)结构体类型变量的初始化

100(3)对结构体变量中成员的引用(4)对整个结构体变量的引用1.结构体数组(1)结构体数组定义的三种方法(2)结构体数组的初始化(3)对结构体数组元素的成员进行引用2.共用体(1)共用体类型和共用体变量定义的方式(2)共用体变量与结构体变量的区别(3)共用体变量成员的引用(4)共用体变量作为结构体变量的成员5•枚举类型(1)枚举类型和枚举变量定义的一般形式(2)枚举元素的处理三、边用边学§12.1结构体类型的定义结构体类型定义的一般形式为:

101struct结构体名{类型名1成员名1;类型名2成员名2;类型名n成员名n;};其中,struct是关键字,是结构体类型的标志。结构体名是由用户定义的标识符,它规定了所定义的结构体类型的名称。结构体类型的组成成分称为成员,成员名的命名规则与变量名相同。§12.2结构体类型变量ー、结构体变量的定义定义结构体类型的变量有三种方法:1.先定义结构体类型,再定义变量。注意:定义变量时,structperson必须在ー起使用,它的用法与int、char等类型名的用法相同。2.定义类型的同时定义变量。3.直接定义结构体类型变量,省略类型名。二、结构体变量的初始化将结构体变量各成员的初值顺序地放在ー对大括号中,并用逗号分隔。对结构体类型变量赋初值时,按每个成员在结构体中的顺序ーー对应赋

102值。三、结构体变量的引用对结构体变量的引用可以分为对结构体变量中成员的引用和对整个结构体变量的引用。一般对结构体变量的操作是以成员为单位进行的。(1)对结构体变量中成员的引用引用的一般形式为:结构体变量名.成员名“.”是成员运算符,它在所有运算符中优先级最高。(2)对整个结构体变量的引用相同类型的结构体变量之间可以进行整体赋值。注意:结构体变量只允许整体赋值,其它操作如输入、输出等必须通过引用结构体变量的成员进行相应的操作。§12.2结构体数组一、结构体数组的定义定义结构体数组的方法和定义结构体变量的方法一样,只是必须说明其为数组。定义结构体变量的三种方法都可以用来定义结构体数组。二、结构体数组的初始化和一般数组ー样,结构体数组也可以进行初始化。

103数组每个元素的初值都放在ー对大括号中,括号中依次排列元素各成员的初始值。三、结构体数组的引用对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规则和对结构体变量成员的引用规则即可。§12.212.4共用体一、共用体类型及其变量的定义共用体类型定义的一般形式为:union共用体名{类型名1成员名1;类型名2成员名2;类型名n成员名n;);其中,union是关键字,是共用体类型的标志。共用体名是由用户定义的标识符,它规定了所定义的共用体类型的名称。共用体类型也由若干成员组成。共用体类型变量的定义也有三种方法。1.先定义共用体类型,再定义变量。

1041.定义类型的同时定义变量。2.直接定义共用体类型变量。二、共用体变量的引用共用体变量也必须先定义,后使用。不能直接引用共用体变量,只能引用共用体变量的成员。引用的一般形式为:共用体变量名.成员名共用体变量的每个成员也可以像普通变量ー样进行其类型允许的各种操作。但要注意:由于共用体类型采用的是覆盖技术,因此共用体变量中起作用的总是最后一次存放的成员变量的值。共用体变量可以作为结构体变量的成员,结构体变量也可以作为共用体变量的成员,并且共用体类型也可以定义数组。注意:不能对共用体变量进行初始化。不能将共用体变量作为函数参数和返回值。312.5枚举类型ー、枚举类型及其变量的定义枚举类型定义的一般形式为:enum枚举名{枚举元素L枚举元素2,……};其中,enum是关键字,是枚举类型的标志。枚举名是由用户定义的标识符,它规定了所定义的枚举类型的名称。

105枚举类型变量的定义有两种方法。1.先定义枚举类型,再定义变量。2.直接定义枚举变量。说明:(1)枚举类型中的枚举元素是用户定义的标识符,对程序来说,这些标识符并不自动代表什么含义。(2)在C编译中,将枚举元素作为常量处理,称为枚举常量。因此不能对它们进行赋值。(3)枚举元素是被处理成一个整型常量的,它的值取决于定义时各枚举元素排列的先后顺序。第一个枚举元素的值为〇,第二个为1,依次顺序加1。二、枚举类型变量的基本操作1.枚举变量的赋值只能给枚举变量赋枚举常量。不能直接给枚举变量赋整型值,但是可以通过将整型值强制类型转换成枚举类型赋值。2.枚举元素的判断比较3.枚举变量只能通过赋值语句得到值,不能通过输入语句直接输入数据。也不能使用输出语句直接输出枚举元素,可以通过switch语句将枚举元素以字符串形式输出。上机练习与课后作业

1061.定义ー个包括年、月、日的结构体变量,当输入年、月、日数据后,计算该日是这一年中的第几天。2.从键盘输入10个学生的数据,每个学生的数据包括:学号、姓名、三门课的成绩。要求输出三门课总平均成绩,及最高分学生的数据(包括学号、姓名、三门课成绩、平均分数)。3.从键盘输入5个用户的数据,每个用户包括:姓名和电话号码(8位数字)。要求按姓名排序后,输出用户的全部数据。4.定义ー种类型Stu可以放学生的姓名、学号、英语成绩,其中英语成绩有的老师按照“优”、“良”、“中”、“及格”、“不及格”五个等级给的,有的老师按照百分制给的成绩,要求该类型可以如实反映学生的情况。5.定义ー个枚举变量,其枚举元素为人民币的面值。要求输出枚平兀索子付甲。6.使用结构体类型,修改“学生成绩管理系统”。

107第十三讲指向结构寻打印本体的指针与链表页引言ー、教学目的本讲首先介绍了c语言中指向结构体变量和结构体数组的指针变量的使用,接着介绍了结构体数据作为函数参数的使用,最后介绍了链表的概念和基本操作。要求大家掌握指向结构体变量的指针变量和指向结构体数组及数组元素的指针变量的定义和引用,理解指向结构体变量的指针变量、结构体变量及其成员作为函数参数的使用方法,掌握链表中结点的描述方式,了解链表的建立、输出、插入和删除操作。二、知识要点1.指向结构体变量的指针变量(1)指向结构体变量的指针变量的定义(2)利用指向结构体变量的指针变量对结构体变量成员的引用2.指向结构体数组的指针变量指向结构体数组的指针变量的使用3.结构体数据作函数参数

108(1)结构体变量的成员作函数参数(2)结构体变量作函数参数(3)指向结构体的指针作函数参数3.链表的概念(1)链表的组成(2)结点用结构体类型描述(3)动态申请和释放内存单元的函数4.链表的操作(1)建立链表(2)在链表中插入结点(3)删除链表中的结点三、边用边学§13.1指向结构体变量的指针变量指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可。例如:structperson{charname[20];charsex;

109intage;floatheight;);structperson*p;则指针变量P,它可以指向structperson类型的结构体变量。将一个指针变量指向一个结构体变量后,可以利用指向该结构体的的指针变量引用成员,如:(*指针变量名).成员名以上形式也常写成:指针变量名一》成员名其中,ー》为指向运算符,它是由符号“一”和“〉”两部分构成的。指向运算符的优先级和成员运算符相同,也是最高ー级。§13.1指向结构体数组的指针变量指针变量可以指向整型、字符型、浮点型等基本类型数组。同样,指针变量也可以指向结构体类型的数组。程序L13_2.C功能:使用指向结构体数组的指针变量。#includevoidmain(){structperson{charname[20];

110charsex;intage;floatheight;}per[3]={{?,LiPing",'M',20,175},{"WangLing",'F',19,162.5},{"ZhaoHui",'M',20,178}};structperson*p;for(p=per;p

111",p—>name,p—>sex,p—>age,p—>height);}13.3结构体数据作函数参数不仅结构体变量的成员可以作函数参数,结构体变量以及指向结构体变量的指针都可以作函数参数。ー、结构体变量的成员作函数参数结构体变量的成员作实参与简单变量、数组元素等作实参是ー样的。

112二、结构体变量作函数参数C允许将整个结构体变量作为函数参数传递。传递的是结构体变量全部成员的值,将实参中成员的值赋给对应的形参成员。用结构体变量作实参时,由于要为形参结构体变量分配存储空间,还要ーー对应传递各成员的值,这样会增加处理的时间同时也浪费了内存空间,从而影响程序的运行效率。三、指向结构体的指针作函数参数使用指向结构体的指针作函数实参,形参也必须是ー个指向相同结构体类型的指针变量,其它使用方法不变。13.313.4链表的概念链表是动态数据结构中最基本的形式,它的规模大小可以根据需要进行动态变化,达到合理地使用存储空间。链表有一个“头指针”变量,用来指向链表的第一个元素。链表中的每个元素都称为“结点”,结点包含两部分内容:ー是实际的数据信息;二是下一结点的指针,链表的最后ー个元素置为“NULL”(空地址),标志链表结束。ー个结点可以用一个结构体类型来描述。结构体中包含若干成员,用来表示结点的数据信息。此外必须有一个成员是与结点类型一致的指针,用来指向后续结点。例如,ー个链表的结点可以定义为以下的结构体类型:

113structnode{intdatal;floatdata2;structnode*next;);其中,成员next是指向结点的指针变量,它指向next所在的structnode结构体类型数据。C系统的库函数中提供了动态申请和释放内存存储单元的函数。(1)malloc函数malloc函数的原型为:void*malloc(unsignedintsize)函数的功能是:在动态存储区域中分配ー个size字节的连续空间。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如没有足够的存储空间分配,则返回〇(记为NULL)值。(2)calloc函数calloc函数的原型为:void"calloc(unsignedintn,unsignedintsize)函数的功能是:在动态存储区域中分配n个为size字节的连续空间,并将该存储空间自动置初值。。函数的返回值为指针,它的值是所分配的存储区域的起始地址。如分配不成功,则返回。值。(3)free函数

114free函数的原型为:voidfree(void*ptr)函数的功能是:释放由Ptr所指向的存储空间。ptr的值必须是malloc或calloc函数返回的地址。此函数无返回值。§13.5链表的操作ー、建立链表建立链表就是从无到有逐渐增加链表结点的过程,即输入结点数据,并建立前后链接的关系。下面是建立链表的函数creat():structnode"create(){structnode"head,"tail,"p;intx;head二tail二NULL;printf("

115请输入ー个整数:");scanf(〃%d〃,&x);while(x!=0){p=(structnode")malloc(sizeof(structnode));p->data=x;p—>next=NULL;if(headニニNULL)

116head二tail二p;else{tail—>next=p;tail二p;)printf("请输入ー个整数:");scanf(〃%d〃,&x);)return(head);}二、在链表中插入结点插入结点的操作有以下几种情况:(1)链表是空链表,插入的结点作为链表的第一个结点。(2)链表非空,结点插入到链表的第一个结点前,使插入的结点成为链表第一个结点。(3)链表非空,结点插入到链表的末尾,使插入的结点成为链表最后一个结点。(4)链表非空,结点插入到链表中间某个结点之后。下面函数insert(structnode*head,intvalue)的作用是

117在已知头结点head链表中按照从小到大的顺序插入数据value。structnode"insert(structnode"head,intvalue)structnode*new,*p,*q;new二(structnode*)malloc(sizeof(structnode));new—〉data二value;p二head;if(headニニNULL)/・链表是空链表・/{head=new;new—>next=NULL;)else{while((p—>next!=NULL)&&(p—>datadata>=value){if(headニニp)/・链表非空,插入到第一个结点前・/{new—>next二head;head=new;Jelse/・链表非空,插入到链表中间・/{q—>next=new;

118new—>next=p;

119else/・链表非空,插入到链表末尾・/{p—>next=new;new—>next=NULL;}}return(head);三、删除链表中的结点从链表中删除结点,是指把该结点从链表中分离出来,即改变链表的链接关系。从链表中删除的结点有两种处理情况:ー是调用函数free()来释放该结点所占的存储空间,将它从内存中删除;二是将该结点插入到其它链表中等待处理。下面函数delete(structnode*head,intvalue)的作用是在已知头结点head链表中查找ー个数据value,并从链表中删除。structnode"delete(structnode"head,intvalue){structnode"p,"q;p二head;if(headニニNULL)/"链表是空链表"/{printf(〃这是ー"空链表!'n");return(head);)while((p—>next!=NULL)&&(p—〉data!=value))/"寻找删除结点位置・/

120{q=p;p=p—>next;}if(value==p—>data){if(headニニp)head二p一〉next;/・删除链表第一个结点・/elseq—>next=p—>next;/・删除链表结点・/free(p);}elseprintf("此链表没有数据%d!

121",value);/・链表中无此结点・/return(head);)作业与上机练习1.在例13.5的基础上,增加一个求链表中所有结点数据之和的函数add(),在王函数中输出结果。2.修改例13.5,使得建立的链表是ー个由浮点数据组成的无序链表,然后将链表中所有结点数据按照从小到大的顺序生成一个新的链表,最后输出显ホ。3.已知一个链表中存储了若干名学生的信息,每名学生的信息包括:学号、英语成绩、数学成绩、计算机成绩。现编写ー个函数search〇,要求根据输入的学生学号,输出他的各科成绩。

1221.使用链表存储同学的通讯录,内容包含姓名、地址、邮政编码和电话,然后利用函数delete〇,根据输入的同学姓名,删除该同学记录,最后输出显示。2.设有两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。3.在主函数中用create()函数建立一个空表,然后显示ー个菜单提醒用户选择:1.输入、2.删除、3.输出显示、4.退出,选择输入时调用insert〇函数,选择删除时调用delete〇函数,选择输出显示时调用。utput〇函数,选择退出时结束程序。4.使用链表完善“学生成绩管理信息系统”。

123第十四讲文件:印本ー、教学目的通过介绍C语言文件的基本类型以及相关操作,要求掌握文件的打开、关闭,了解数据写入文件和从文件中读取的操作以及文件指针的定位,理解ASCH文件与二进制文件的不同特点。二、知识要点1.文件概述(1)文件的概念22)ASCH文件和二进制文件2,文件的打开与关闭(1)FILE结构体类型与文件类型指针(2)文件的打开(3)文件的关闭3.文件的读写操作(1)函数fgetc()、fputc()的使用(2)函数fgets()、fputs()的使用(3)函数fprintf()、fscanf()的使用

124(4)函数fwrite()>fread()的使用3.文件的其它常用函数函数feof()ヽrewind()ヽfseek()ヽftell()的使用三、边用边学§14.1文件概述“文件”是指存储在计算机外部存储器中的数据的集合。计算机在处理文件时,只要知道文件的名字,就可以自动完成对文件的查找、存取、删除等各种操作。C语言将文件看作是字符构成的序列,即字符流。其基本的存储单位是字节。C语言中的文件,按照数据存放的形式分为两类:一类是将数据当作一个一个字符,按照它的ASCII代码存放,称为ASCI!文件或文本(text)文件。第二类是按照数据值的二进制代码存放,称为二进制文件中。§14.2文件的打开与关闭ー、文件类型指针C语言在stdio.h中定义了一个FILE文件结构体类型,包含管理和控制文件所需要的各种信息。它的定义形式如下:

125FILE・指针变量名;文件指针变量的赋值操作是由打开文件函数fopen〇实现的。二、文件的打开C语言文件的打开是通过stdio.h函数库的fopen〇函数实现的。它的调用方式一般为:文件指针变量=fopen(文件名,处理文件方式);在使用时要注意:(1)“文件名”是要打开的文件的文件名字,但在书写时要符合C语言的规定。例如文件名"a:\tc\wl.c",由于‘''是转义字符的标志,所以在该函数中的文件名应写成”a:\\tc\\wl.c"〇(2)打开文件时“处理文件方式”决定了系统可以对文件进行的操作。C语言提供的“ASCH文件处理方式”及作用见下表。表14.1ASCI!文件处理方式的作用与影响mode处理方式当文件不存在时当文件存在时向文件输入从文件输出读取出错打开文件不能可以“ポ'写入建立新文件覆盖原有文件可以不能"a”追加建立新文件在原有文件后追加可以不能

126“r十”读取/写入出错打开文件可以可以“w+”写入/读取建立新文件覆盖原有文件可以可以“a+”读取/追加建立新文件在原有文件后追加可以可以注:如果是二进制文件,在使用时只要在模式后添加字符b即可,如“rb”、“rb+”分别表示读取二进制文件和以读取/写入打开二进制文件。(3)如果由于文件不存在等原因造成不能打开文件,则调用fopen〇后将返回一个空指针NULL。三、文件的关闭文件的关闭通过stdio.h中的fclose()函数实现。具体用法是:fclose(文件指针);例如:fclose(fp);则程序将文件类型指针fp所指向的文件关闭。fp不再指向该文件。§14.3文件的读写操作ー、按字符读写的函数fgetc()、fputc〇

1271.fputc()函数函数fputc〇的作用是向文件写入ー个字符。其调用形式为:fputc(字符,文件型指针变量)例:fputc('A',fp);fp为ー个文件类型指针变量,上式将字符常量'A,(也可以是字符型变量)写入文件当前位置,并且使文件位置指针下移ー个字节。如果写入操作成功,返回值是该字符,否则返回EOF。2.fgetc〇函数函数fgetc〇的作用是从ー个文件中读取ー个字符。其调用形式为:fgetc(文件型指针变量)例:a二fgetc(fp);fp为ー个文件类型指针变量,函数fgetc(fp)不仅返回文件当前位置的字符,并且使文件位置指针下移ー个字符。如果遇到文件结束,则返回值为文件结束标志EOF。二、按字符串读写的函数fgets()、fputs〇1.fputs()函数函数fputc()的作用是向文件写入ー个字符串。其调用形式为:fputs(字符串,文件型指针变量)其中字符串可以是字符串常量、指向字符串的指针变量、存放字符串数组的数组名。写入文件成功函数返回值为0,否则为EOF。注意:字符串的结束标志‘、〇‘不写入文件。例如:

128fputs("Hello”,fp);fp为ー个文件类型指针变量,上式将字符串中的字符H、e、1、1、。写入文件指针的当前位置。1.fgets()函数函数fgets〇的作用是从ー个文件中读取ー个字符串。其调用形式为:fgets(字符数组,字符数,文件型指针变量)例:fgets(str,n,fp);其作用是从fp指向的文件的当前位置开始读取nT个字符,并加上字符串结束标志'、0'一起放入字符数组str中。如果从文件读取字符时遇到换行符或文件结束标志EOF,读取结束。函数返回值为字符数组str的首地址。三、按格式要求读写的函数fprintf〇、fscanf()1.fprintf()函数函数fprintf()的作用与printf()相似,只是输出对象不是标准输出设备而是文件,即按照格式要求将数据写入文件。它调用的一般形式为:fprintf(文件型指针变量,格式控制,输出表列);例如:fprintf(fp,"%ld,%s,%5.If”,num,name,score);它的作用是将变量num、name>score按照为Id、%s>%5.If的格式写入fp指向的文件的当前位置。2.fscanf()函数函数scanf〇从通过标准输入设备读取数据,同样函数fscanf

129〇按照格式要求从文件中读取数据。它调用的一般形式为:fscanf(文件型指针变量,格式控制,输入表列);例如:fscanf(fp,"%ld,%s,%5.If",&num,&name,&score);它的作用是从fp指向的文件的当前位置开始,按照%ld、%s、%5.If的格式取出数据,赋给变量num、name和score。函数fprintf()和fscanf()主要用于数据文件的读写,既可以使用ASCI!文件也可以使用二进制文件。四、按数据块读写的函数fread()、fwrite〇1.fwrite()函数函数fwrite()的作用是将成批的数据块写入文件。它调用的ー般形式为:fwrite(写入文件的数据块的存放地址,ー个数据块的字节数,数据块的个数,文件型指针变量);如果函数fwrite()操作成功,则返回值为实际写入文件的数据块的个数。例如:已知一个structstudent类型的数组stu[20],则语句fwrite(&stu[l],sizeof(structstudent),2,fp);是从结构体数组元素Stu[l]存放的地址开始,以ー个结构体structstudent类型变量所占字节数为ー个数据块,共写入文件类型指针fp

130指向的文件2个数据块,即stu⑴、stu[2]的内容写入文件。如果操作成功,函数的返回值为2。1.fread()函数函数fread〇的作用是从文件中读出成批的数据块。它调用的一般形式为:fread(从文件读取的数据块的存放地址,ー个数据块的字节数,数据块的个数,文件型指针变量);同样,如果函数fread()操作成功,则返回值为实际从文件中读取数据块的个数。例如:已知stul是一个结构体structstudent变量,则fread(&stul,sizeof(structstudent),1,fp);是从文件类型指针fp指向的文件的当前位置开始,读取1个数据块,该数据块为结构体structstudent类型变量所占字节数,然后将读取的内容放入变量stul中。注意:fwrite()和fread()函数读写文件时,只有使用二进制方式,オ可以读写任何类型的数据。最常用于读写数组和结构体类型数据。§14.4文件的其它常用函数文件指针的定位非常重要。下面我们介绍ー些文件操作中常用的函数,这些库函数在C语言的stdio.h头文件中定义的。ー、函数feof()

131函数feof〇用来检测ー个指向文件的指针是否已经指到了文件最后的结束标志EOF。调用的一般形式为:feof(文件型指针变量);如果文件型指针指向的文件的当前位置为结束标志EOF,则函数返回一个非零值,否则返回。值。二、函数rewind()函数rewind()将令指向文件的指针重新指向文件的开始位置。函数无返回值。其调用形式为:rewind(文件型指针变量);例如:rewind(fp);fp是ー个指向文件的指针,执行该语句后,fp指向文件的开始位置,即文件的第一个数据。三、函数fseek()函数fseek〇可以将使得指向文件的指针变量指向文件的任何ー个位置,实现随机读写文件。它调用的形式为:fseek(文件型指针变量,偏移量,起始位置);函数fseek〇将以文件的起始位置为基准,根据偏移量往前或往后移动指针。其中偏移量是一个长整型数,表示从起始位置移

132动的字节数,正数表示指针往后移、负数表示指针往前移。起始位置用数字〇、1、2或者用名字SEEK_SET、SEEK用UR、SEEK_END代表文件开始、文件当前位置和文件结束位置。如果指针设置成功,返回值为〇,否则为非。值。四、函数ftell〇函数ftell〇用于测试指向文件的指针的当前位置。它的调用方式为:ftell(文件型指针变量);函数的返回值是ー个常整型数,如果测试成功,则返回指向文件的指针当前指向的位置距离文件开头的字节数,否则返回TL。作业与上机练习1.将键盘输入的10个浮点数保存到一个二进制文件中(要求采用写入模式),然后在文件末尾再追加若干数据(要求采用追加模式),最后统计文件中数据的个数(要求采用读取模式)。2.已知2个文件datal和data2,将它们的内容合并起来,生成第3个文件data3o

1331.已知一个由西文字符组成的ASCH文件,要求将文件中的英文字母按照如下形式变换,然后生成一个新的密码文件。aozboycoxdoweovf=ugothosioエj=qk=pl=omon2.已知一个文件包含若干人的姓名、通讯地址、邮政编码和电话,要求根据此文件生成只包含所有人姓名和电话的新文件。3.利用文件知识,参照L14_9.C例题,完成“学生成绩管理信息系统”的开发。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭