《《C语言强化训练》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语言强化训练》PPT课件.ppt(137页珍藏版)》请在金锄头文库上搜索。
1、C语言语言强化训练强化训练第一部分第一部分 语法与语义语法与语义第二部分第二部分 程序构造方法程序构造方法C+语言程序设计强化训练目的强化训练目的:l加强程序设计基础知识掌握与加强程序设计基础知识掌握与C C语言基本编程语言基本编程能力的培养。包括基本语法、数据结构和基本能力的培养。包括基本语法、数据结构和基本算法。算法。 l内容重点突出,注重实用的原则。内容重点突出,注重实用的原则。2关于计算机基础部分:关于计算机基础部分:l计算机基础涉及范围广,第一靠平时的积计算机基础涉及范围广,第一靠平时的积累;第二关注计算机领域的新发展和我国累;第二关注计算机领域的新发展和我国在计算机方面的新成就。在
2、计算机方面的新成就。3关于关于C语言学习方法:语言学习方法:学习计算机语言的目的是为了程序设计,学习计算机语言的目的是为了程序设计,因此计算机语言的学习不仅仅是掌握知识,因此计算机语言的学习不仅仅是掌握知识,更注重于应用能力的培养,因此学习过程中,更注重于应用能力的培养,因此学习过程中,应从两方面着手:应从两方面着手:l掌握知识:熟记相关的语法、语义;掌握知识:熟记相关的语法、语义;l应用能力培养:程序设计方式、方法的学习;应用能力培养:程序设计方式、方法的学习;通过实验、总结,把知识转变为应用能力。通过实验、总结,把知识转变为应用能力。4C语言难点:语言难点:lC语言是众多计算机高级语言中最
3、难学的语语言是众多计算机高级语言中最难学的语言之一。言之一。C语言有很强的特性,语言有很强的特性,数据类型数据类型丰丰富,富,语法语义语法语义变化繁多、既严谨又灵活。要变化繁多、既严谨又灵活。要消化这些,需要投入大量的时间和精力。消化这些,需要投入大量的时间和精力。l学习学习C语言,一方面学生缺乏这方面的学习语言,一方面学生缺乏这方面的学习经验,对于这门全新、经验,对于这门全新、枯燥枯燥、庞大的课程,、庞大的课程,心有余而力不足。心有余而力不足。更重要的是经过一段时更重要的是经过一段时间学习缺乏应有的信心。间学习缺乏应有的信心。5学习计算机语言时的思维:学习计算机语言时的思维:l学习计算机语言
4、的思维是一种学习计算机语言的思维是一种自顶向下自顶向下的的思维方式,可用八个字来形容:思维方式,可用八个字来形容:自顶而下,自顶而下,逐步细化逐步细化。也就是从宏观到微观,从整体。也就是从宏观到微观,从整体到局部。这种思维符合我们大学计算机的到局部。这种思维符合我们大学计算机的教学。这种思维强调的是教学。这种思维强调的是“纲举目张纲举目张”,强调的是强调的是分层次思考分层次思考。6关于该讲义内容说明:关于该讲义内容说明:l该讲义的大部分例题来自该讲义的大部分例题来自C语言等级考试语言等级考试真题。但也有部分题目来自其他语言等级真题。但也有部分题目来自其他语言等级考试真题或自拟的题目。考试真题或
5、自拟的题目。7第一部分第一部分语法与语义语法与语义一、一、C语言最基本部分语言最基本部分1.保留字与标识符保留字与标识符标识符是指常量、变量、语句标号以及用户自标识符是指常量、变量、语句标号以及用户自定义函数的名称。作为标识符必须满足以下规则:定义函数的名称。作为标识符必须满足以下规则:l标识符必须由字母、下划线或数字标识符必须由字母、下划线或数字(09)组成;组成;l标识符的第一个字符可以是字母标识符的第一个字符可以是字母(az,AZ)或下划或下划线线(_);l保留字不能作标识符。保留字不能作标识符。8第一部分第一部分语法与语义语法与语义特别提示:特别提示:C语言是一种大小写敏感的语言。语言
6、是一种大小写敏感的语言。如:如:Test、test是是2个不同的标识符。个不同的标识符。例:例:以下选项中,以下选项中,_是是C语言关键字。语言关键字。A.printfB.includeC.funD.default9第一部分第一部分语法与语义语法与语义2.常量常量l整数:注意八和十六进制数;整数:注意八和十六进制数;l实数:用指数形式表示小数时,方幂实数:用指数形式表示小数时,方幂e(或或E)前后必须是数字,前后必须是数字,e的前面可以是整数也可以的前面可以是整数也可以是小数,但是小数,但e后面只能为后面只能为13位整数。如:位整数。如:1.24e3、-4.3e-2是合法的实数。但是合法的实数
7、。但1.3e、e2、1.2e3.1等是不合法的实数。等是不合法的实数。10第一部分第一部分语法与语义语法与语义l字符数:字符常量是用单引号括起来的一个字符数:字符常量是用单引号括起来的一个字符,如字符,如e、E;或或“”开始,后开始,后跟一个字符或一个整型常量(字符的跟一个字符或一个整型常量(字符的ASCII码值)的方法来表示另一个字符。码值)的方法来表示另一个字符。如:如:0、n、20等。等。l字符串常量:用一对双引号将字符串常量:用一对双引号将0个或若干个个或若干个字符括起来。注意中间字符括起来。注意中间0字符、字符串长度字符、字符串长度和占用内存字节数。和占用内存字节数。如:如:”123
8、1230abc”11第一部分第一部分语法与语义语法与语义l符号常量:符号常量:#definea10constintb=20;字符常量是用单引号括起来的一个字字符常量是用单引号括起来的一个字符,如符,如e、E;或或“”开始,后跟开始,后跟一个字符或一个整型常量(字符的一个字符或一个整型常量(字符的ASCII码码值)的方法来表示另一个字符。符号常量在值)的方法来表示另一个字符。符号常量在程序中不能被改变。程序中不能被改变。12第一部分第一部分语法与语义语法与语义例:例:1.设有定义和声明如下:设有定义和声明如下:#defined2intx=5;floaty=383;charc=d;以下表达式中有语
9、法错误的是以下表达式中有语法错误的是。Ax+By+Cc+Dd+2.以下语句中有语法错误的是以下语句中有语法错误的是。Aprintf(%d“,0e);Bprintf(”%f“,0e2);Cprintf(”%d”,0x2);Dprintf(”%s”,“0x2”);13第一部分第一部分语法与语义语法与语义3.表达式表达式l算术运算符与表达式算术运算符与表达式运算符有:运算符有:+、-、*、/、%。特别关注:特别关注:/和和%运算。运算。 对于除法运算,如果运算符两边的操作数都是对于除法运算,如果运算符两边的操作数都是整数,其运算结果也是整数,即两数整除;如果两整数,其运算结果也是整数,即两数整除;如
10、果两个操作符中有一个是实数,其运算结果就是实数。个操作符中有一个是实数,其运算结果就是实数。4/5运算结果为运算结果为04.0/5或或4.0/5或或4.0/5.0运算结果为运算结果为0.85/4运算结果为运算结果为15.0/4或或5/4.0运算结果为运算结果为1.25。14第一部分第一部分语法与语义语法与语义例:例:1.已知有声明已知有声明“inta=3,b=4,c;”,则执行语句则执行语句“c=1/2*(a+b);”后,后,c的的值为值为_。A.0B.3C.3.5D.42.以以下下双双目目运运算算符符中中要要求求两两个个操操作作数数均均为为整整型的运算符是型的运算符是_。A|B&CD15第一
11、部分第一部分语法与语义语法与语义l关系运算符与表达式关系运算符与表达式运算符有:运算符有:、=、=、=、!=。特别关注:特别关注:1.把把=理解理解=或把或把=写成写成=。重点。重点在上机改错题。在上机改错题。2.注意类似式子:注意类似式子:设有定义设有定义intx=3;计算计算5x10的值。的值。例:例:intk=0;while(k=1)k+;问问while的循环次的循环次数。数。16l逻辑运算符与表达式逻辑运算符与表达式运算符有:运算符有:!、&、|。特别关注:逻辑表达式优化所带来的影响特别关注:逻辑表达式优化所带来的影响(也也称副作用称副作用)。例:例:已知有声明已知有声明“inta=1
12、2,b=15,c;”,则执行表达式则执行表达式“c=(a|(b-=a)”后,变量后,变量b和和c的值分别为的值分别为_。 第一部分第一部分语法与语义语法与语义17l赋值运算符与表达式赋值运算符与表达式运算符有:运算符有:=和与算术、位的复合赋值。和与算术、位的复合赋值。特别关注:多重赋值的实现形式。特别关注:多重赋值的实现形式。例:例:已知有声明已知有声明“intn;floatx,y;”,则执行语句则执行语句“y=n=x=3.89;”后,后,Y的值为的值为_。A3B3.0C3.89D4.0第一部分第一部分语法与语义语法与语义18赋值运算符赋值运算符左边必须是内存中一个可以左边必须是内存中一个可
13、以访问且可以合法修改的对象,可以是变量名、访问且可以合法修改的对象,可以是变量名、引用名、数组的元素、指针变量所指向的合法引用名、数组的元素、指针变量所指向的合法空间,而不能是常量或表达式。空间,而不能是常量或表达式。看下面的赋值运算:看下面的赋值运算:3.1415926=pi; x+y=z;constintN=30;N=40;第一部分第一部分语法与语义语法与语义19l逗号运算符与表达式逗号运算符与表达式逗号也称顺序求值表达式,最后一个表达式的逗号也称顺序求值表达式,最后一个表达式的值作为整个逗号表达式的结果。值作为整个逗号表达式的结果。例:设有语句:例:设有语句:inti=1,s=1;for
14、(;s+i6,i=5;i+)s+=i;以下以下for循环语句的循环次数为循环语句的循环次数为_。l位运算符位运算符第一部分第一部分语法与语义语法与语义20l类型转换类型转换-自动类型转换自动类型转换类型转换有自动类型转换和强制类型转换。类型转换有自动类型转换和强制类型转换。关注转换原则。关注转换原则。例:例:1.若有声明若有声明“floaty=3.14619;intx;”,则计算表达式则计算表达式“x=y*100+0.5,y=x/100.0”后后y的值是的值是。 2.已知有声明已知有声明“charch=g;”,则表达则表达式式ch=ch-a+A的值为字符的值为字符_的编码。的编码。第一部分第一
15、部分语法与语义语法与语义21l类型转换类型转换-强制类型转换强制类型转换例:例:设有声明设有声明“inta=3,b=4;floatx=4.5,y=3.5;”,则表达式则表达式“(float)(a+b)/2+(int)x(int)y”的值是的值是。第一部分第一部分语法与语义语法与语义22l+与与-特别关注:前置与后置的问题,圆括号不能改特别关注:前置与后置的问题,圆括号不能改变后置的问题。变后置的问题。例:有如下程序段:例:有如下程序段:inta5=1,3,5,7,9,*p=a;printf(%dn,*(p+);则执行则执行的结果是的结果是_。 第一部分第一部分语法与语义语法与语义23二、输入二
16、、输入/输出输出输入和输出是计算机语言的重要组成部分。输入和输出是计算机语言的重要组成部分。常用输入常用输入/输出函数输出函数putchar():把变量中的一个字符常量输出到显示器屏幕上把变量中的一个字符常量输出到显示器屏幕上;getchar():从键盘上输入一字符常量,此常量是该函数的值从键盘上输入一字符常量,此常量是该函数的值;printf():把各类数据,加以格式控制输出到显示器屏幕上把各类数据,加以格式控制输出到显示器屏幕上;scanf():从键盘上输入各类数据,并存放到程序变量中从键盘上输入各类数据,并存放到程序变量中;puts():把一个字符串常量输出到显示器屏幕上把一个字符串常量
17、输出到显示器屏幕上;gets():从键盘上输入一个字符串常量并放到程序的数组中从键盘上输入一个字符串常量并放到程序的数组中。第一部分第一部分语法与语义语法与语义24l最常用的最常用的“格式控制字符串格式控制字符串”说明如下。说明如下。 (1)%d:是按十进制整型数据格式输出,数据长度是按十进制整型数据格式输出,数据长度为实际长度。为实际长度。%与与d之间可以加正数之间可以加正数m,控制输控制输出宽度。出宽度。(2)%s:控制输出一个字符串。控制输出一个字符串。 (3)%f:按小数形式输出十进制实数(包括单、按小数形式输出十进制实数(包括单、双精度),实数的整数部分全部输出,并输出双精度),实数
18、的整数部分全部输出,并输出6位小数。位小数。“%m.nf”表示输出实数共占表示输出实数共占m个字符个字符位置,其中位置,其中n位小数,多余位左端补空格。位小数,多余位左端补空格。 第一部分第一部分语法与语义语法与语义25注意事项:注意事项:(1)掌握常用的一些格式控制字符;掌握常用的一些格式控制字符;(2)格式说明中格式说明中%与后面格式符之间不能有空格,除了与后面格式符之间不能有空格,除了X,E,G格式符外,其他格式符必须用小写字母。格式符外,其他格式符必须用小写字母。(3)若要输出若要输出%可在格式控制字符串中使用两个连续的可在格式控制字符串中使用两个连续的%。例如。例如:printf(“
19、%d%n”,5);输出结果:输出结果:5%第一部分第一部分语法与语义语法与语义26例例:已已知知有有声声明明和和语语句句“inta;scanf(”a=d”,a);”,欲欲从从键键盘盘上上输输入入数数据据使使a中中的的值为值为3,则正确的输入应是,则正确的输入应是_。第一部分第一部分语法与语义语法与语义27三、三、C语言程序结构语言程序结构1.程序的三种基本结构程序的三种基本结构l顺顺序序结结构构:是是指指程程序序按按照照语语句句在在程程序序的的先先后后顺顺序序逐逐句句运行。没有分支、跳转。运行。没有分支、跳转。l分分支支(或或选选择择)结结构构:是是指指程程序序根根据据不不同同的的条条件件执执
20、行行不不同同的的分分支支的的语语句句,如如C语语言言中中的的if、switch语语句句、条条件运算符语句。件运算符语句。l循循环环结结构构:是是指指程程序序在在满满足足一一定定的的条条件件下下循循环环执执行行的的相相关关语语句句,如如C语语言言中中的的while、dowhile、for语语句。句。 由这由这3种基本结构可以组成任何复杂逻辑的程序。种基本结构可以组成任何复杂逻辑的程序。第一部分第一部分语法与语义语法与语义282.C C语言的语句有以下六大类语言的语句有以下六大类: :l说明语句:说明语句:在在C+中,实现对数据结构的定义中,实现对数据结构的定义和描述、对变量的定义性说明的语句被称
21、为说和描述、对变量的定义性说明的语句被称为说明语句。明语句。如:如:inta;l表达式语句:表达式语句:在合法的表达式后面加上分号,在合法的表达式后面加上分号,即形成了表达式语句。即形成了表达式语句。a=10;l控制语句:控制语句:控制改变程序运行顺序的语句被称控制改变程序运行顺序的语句被称为控制语句。包括:选择语句、循环语句、流为控制语句。包括:选择语句、循环语句、流程跳转语句等。程跳转语句等。如:如:break;第一部分第一部分语法与语义语法与语义29l函数调用语句:函数调用语句:在函数的调用后面加上分号,在函数的调用后面加上分号,即形成函数调用语句。即形成函数调用语句。如:如:about
22、();l空语句:空语句:只有一个分号组成的语句称为空语句,只有一个分号组成的语句称为空语句,它不做任何操作。它不做任何操作。l复合语句:复合语句:当用将若干条语句括起来,当用将若干条语句括起来,C+将其作为一条语句进行处理,被称为复合将其作为一条语句进行处理,被称为复合语句。语句。第一部分第一部分语法与语义语法与语义303.C语言程序组成语言程序组成 任任何何一一个个复复杂杂的的C语语言言程程序序是是由由一一个个main()函函数数和和若若干干个个用用户户自自定定义义函函数数组组成成的的。main()函函数数是是整整个个程程序序执执行行时时的的入入口口,必必须须有有且且只只能能有一个,可放在程
23、序的任何地方。有一个,可放在程序的任何地方。4. 简单的设计方法简单的设计方法第一部分第一部分语法与语义语法与语义31例例:C语语言言规规定定,在在一一个个源源程程序序中中main函函数数的的位置位置_。A.必须在最开始必须在最开始B.必须在最后必须在最后C.必须在预处理命令的后面必须在预处理命令的后面D.可以在其他函数之前或之后可以在其他函数之前或之后第一部分第一部分语法与语义语法与语义32四、流程控制语句四、流程控制语句C语言流程控制语句有:语言流程控制语句有:l选选择择语语句句:if语语句句、switch语语句句、条条件件运运算算符语句;符语句;l循循环环语语句句:while语语句句、d
24、o_while语语句句、for语句;语句;l控制语句:控制语句:break语句、语句、continue语句语句。第一部分第一部分语法与语义语法与语义331.条件语句条件语句l单分支的单分支的if语句语句if(表达式表达式)语句语句if后后面面的的表表达达式式一一般般是是一一个个逻逻辑辑表表达达式式,如如果果表表达达式式的的计计算算结结果果为为逻逻辑辑真真(非非0),则则执执行行语语句句;反反之之,则不执行这个语句。则不执行这个语句。【提提示示】:if后后面面只只能能跟跟一一条条语语句句,若若if后后面面需需要要跟跟多多条语句,则需用条语句,则需用“”将其变成一条复合语句。将其变成一条复合语句。
25、注意:注意:条件和循环结构中要注意条件和循环结构中要注意=和和=混淆。混淆。第一部分第一部分语法与语义语法与语义34l双分支的双分支的if语句语句if(表达式表达式)语句语句1else语句语句2这这种种if语语句句格格式式的的含含义义是是:如如果果if后后面面的的表表达达式式求求值值结结果果为为非非0,则则执执行行语语句句1,否否则则执执行行语语句句2。同同样样要要求求语语句句1和和语语句句2是是一一条条语句。语句。第一部分第一部分语法与语义语法与语义35lif语句的嵌套语句的嵌套if条件语句嵌套时,条件语句嵌套时,else语句总是与最近的、语句总是与最近的、同同一块内的,一块内的,没有与没有
26、与else配对的配对的if语句配对。语句配对。例:例:if()if()else()例:例:1.以下程序段的输出结果是以下程序段的输出结果是_。 int x=10,y=20,t=0; if(x=y)t=x;x=y;y=t; printf(“%dt%dn”,x,y);2. 以下程序段的输出结果是以下程序段的输出结果是_。inta=1,b=3,c=5;if(c=a+b)cout“yes”elsecout“no”;第一部分第一部分语法与语义语法与语义362.开关语句开关语句(switch)switch语句也称开关语句、多重选择语语句也称开关语句、多重选择语句。一般用于句。一般用于“根据一个量的多种不同
27、取值实根据一个量的多种不同取值实现程序的执行流程的多个分支现程序的执行流程的多个分支”。用。用switch语句可以避免语句可以避免if-else多层嵌套造成的书写错多层嵌套造成的书写错误,方便程序阅读。误,方便程序阅读。注意:注意:语句格式、语法和语句格式、语法和break语句的作用。语句的作用。第一部分第一部分语法与语义语法与语义37 【提提示示】:a.各各个个case(包包括括default)分分支支出出现现的次序可以任意;的次序可以任意;b.case分分支支是是开开关关语语句句的的入入口口,其其后后面面的的语语句序列可以是一条语句,也可以是多条语句。句序列可以是一条语句,也可以是多条语句
28、。 c.break语语句句是是可可选选的的,当当所所执执行行的的case分分支支没没有有break,则则继继续续往往下下执执行行其其他他分分支支的的语语句句序序列列,直直到到遇遇到到break语语句句或或switch语语句句的的关关括括号号“”为止。为止。 d.case后后的的常常量量表表达达式式需需为为整整型型常常量量,取取值值可为整型、字符型或枚举型。可为整型、字符型或枚举型。第一部分第一部分语法与语义语法与语义38例:执行语句序列例:执行语句序列intn;scanf(“%d”,&n);switch(n)case1:case2:printf(“1”);case3:case4:rintf(“
29、2”);break;default:rintf(“3”);时,若键盘输入时,若键盘输入1,则屏幕显示,则屏幕显示A)1B)2C)3D)12第一部分第一部分语法与语义语法与语义393.循环结构语句循环结构语句C语言循环结构语句有语言循环结构语句有:while()、dowhile()、和和for()三种循环语句。三种循环语句。第一部分第一部分语法与语义语法与语义40lwhile循环语句循环语句while语句格式为:语句格式为:while(表达式表达式)语句语句 其其中中,表表达达式式可可以以是是任任意意合合法法的的表表达达式式,是是循循环环的的控控制制条条件件,语语句句是是重重复复执执行行的的循循
30、环环体体,可可以以是是C C语语言的一条语句,也可以是言的一条语句,也可以是C C语言的一条复合语句。语言的一条复合语句。while语语句句的的执执行行过过程程是是:先先判判断断表表达达式式的的值值,若若表表达达式式的的值值为为逻逻辑辑真真(非非0),则则进进入入循循环环执执行行循循环环体体,然然后后自自动动回回到到循循环环控控制制条条件件的的判判断断点点,计计算算表表达达式式的的值值,并并重重复复以以上上的的过过程程,直直到到表表达达式式的的值值为假(或为为假(或为0)为止。)为止。第一部分第一部分语法与语义语法与语义41学习循环的方式方法:学习循环的方式方法:循环的三个要素:循环的三个要素
31、:寻找重复执行部分;循环的条件;进入循环前的初始化。第一部分第一部分语法与语义语法与语义42ldowhile循环语句循环语句dowhile语句的格式为:语句的格式为:do语句语句while(表达式表达式)dowhile循循环环的的执执行行过过程程是是先先执执行行循循环环体体语语句句,后后判判断断循循环环条条件件表表达达式式的的值值。表表达达式式的的值值为为真真,继继续续执执行行循循环环,表表达达式式的的值值为为假假,则则结结束束循循环环。因因此此,do_while循循环环保保证证了了循环体语句至少执行一次。循环体语句至少执行一次。第一部分第一部分语法与语义语法与语义43lfor循环语句循环语句
32、for循环语句的格式为:循环语句的格式为:for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句语句 其其中中表表达达式式1称称为为循循环环初初值值表表达达式式,表表达达式式2称称为为控控制制表表达达式式(循循环环终终值值表表达达式式),表表达达式式3 3称称为为增增量量表表达达式式,语语句句序序列列为为任任意意合合法法的的一一条条C C语语言言语语句句或或复复合语句。合语句。【提提示示】:for语语句句中中3个个表表达达式式都都可可以以省省略略,但但两两个个分分号号不不能能省省略略。表表达达式式1可可以以放放在在for语语句句之之前前,表表达达式式3可可以以放放在在循循环环体体中中
33、。表表达达式式2也也可可省省略略。如如果果表达式表达式2省略,表示循环条件恒成立。省略,表示循环条件恒成立。第一部分第一部分语法与语义语法与语义44例例:1.下下列列关关于于“for(e1;e2;e3)s1;”的的描描述述中中不不正正确确的是的是_。A存在存在“for(;)s1;”的情况的情况B表达式表达式e1和和e3可为空,但可为空,但e2不能为空不能为空C表达式表达式e2的值可增可减的值可增可减D循环体循环体s1可以为空,但分号可以为空,但分号(;)必须有必须有2.以下循环语句的循环体的执行次数为以下循环语句的循环体的执行次数为_。for(ints=0,j=1;j=10;s+=j);j+;
34、3.循循环环语语句句:“for(intx=0,y=0;y!=100|x10;)x+;”,执行的循环次数是执行的循环次数是_。A.无限次无限次B.10C.11D.100第一部分第一部分语法与语义语法与语义454.分析程序的运行结果:分析程序的运行结果:#includevoidmain(void)intn=0,m=0;for(inti=0;i3;i+)for(intj=0;j=i)n+;m+;printf(“%dn%dn”,n,m);第一部分第一部分语法与语义语法与语义46lbreak语句语句在在switch语语句句中中,break语语句句终终止止当当前前所所在在的的case语语句句表表,从从而而
35、也也就就终终止止了了整整个个switch语句。语句。在在循循环环语语句句中中,break语语句句可可以以提提前前结结束束该该语语句句所所在在的的循循环环。在在嵌嵌套套循循环环中中,break终终止止的的是是其其所所在在的的循循环环语语句句,而而并并非非终终止止所所有有的的循循环。环。第一部分第一部分语法与语义语法与语义47lcontinue语句语句continue语语句句用用来来终终止止本本次次循循环环。当当程程序序执执行行到到continue语语句句时时,将将跳跳过过其其后后尚尚未未执执行行的的循循环环体体语语句句,开开始始下下一一次次循循环环,并并根根据据循环控制条件决定是否再次执行循环。
36、循环控制条件决定是否再次执行循环。 在在 循循 环环 语语 句句 的的 循循 环环 体体 中中 如如 果果 执执 行行 到到continue语语句句,则则跳跳过过循循环环体体中中continue语句的后续语句,将控制转移到下一轮循环。语句的后续语句,将控制转移到下一轮循环。第一部分第一部分语法与语义语法与语义48例:例:1.有如下程序段有如下程序段:intsum=0,i;for(=1;10;+) if(i%3=0)break;sum+=i;printf(“sum=%dn”,sum);把把break改为改为continue分析结果。分析结果。第一部分第一部分语法与语义语法与语义492.以下程序运
37、行后的输出结果是以下程序运行后的输出结果是_。#includevoidmain()intk=4,n=0;for(;nk;)n+;if(n%3!=0)continue;k-;coutk,n; 第一部分第一部分语法与语义语法与语义503.在给定范围内查找在给定范围内查找k使得用公式使得用公式k2+k+17生生成的整数满足以下条件:该数的十进制表示中成的整数满足以下条件:该数的十进制表示中低低3位数字相同,去掉低位数字相同,去掉低3位后的整数是回文位后的整数是回文数。例如,当数。例如,当k=461时用公式生成的整数是时用公式生成的整数是212999,该数满足所给条件。,该数满足所给条件。第一部分第一
38、部分语法与语义语法与语义51五、数组五、数组在在结结构构化化程程序序设设计计中中,数数组组是是组组织织数数据据的的最最重重要要、最最有有效效手手段段。很很多多算算法法和和编编程程技技巧巧都都是建立在数组的基础之上的。是建立在数组的基础之上的。 数组是有序的相同类型数据的集合。数组是有序的相同类型数据的集合。数数组的特征是:组的特征是:数组名;数组名;数组类型(也就是数组类型(也就是数组各元素的类型);数组各元素的类型);维数维数(即标识数组元即标识数组元素所需的下标个数素所需的下标个数);数组大小数组大小(即可容纳数即可容纳数组元素的个数组元素的个数)。第一部分第一部分语法与语义语法与语义52
39、1.一维数组一维数组l一维数组的定义与一维数组的定义与初始化初始化一一维维数数组组也也称称向向量量,它它是是由由具具有有一一个个下下标标的的数数组组元素组成的数组,它的定义形式为:元素组成的数组,它的定义形式为:; 数组定义时,说明数组大小的表达式必须是数组定义时,说明数组大小的表达式必须是常常量量表达式。数组定义时,没有初始化时,静态或全表达式。数组定义时,没有初始化时,静态或全局数组为局数组为0 0,其他的是不确定的值。当只对部分元素,其他的是不确定的值。当只对部分元素初始化时,其余元素为初始化时,其余元素为0 0。初始化时,初始化值个数。初始化时,初始化值个数不能多于数组元素个数。不能多
40、于数组元素个数。第一部分第一部分语法与语义语法与语义53第一部分第一部分语法与语义语法与语义例:例:1. 下列数组定义中错误的是_。 A. int a12=1;B.int a22=1,2; Cint a33; Dint a43; 2. 下列数组定义中错误的是_。 A. int n=10;int an; B. int a(10); C. const int n=10;int an; D. int n;scanf(“%d”,&n);int an;54第一部分第一部分语法与语义语法与语义例:例:3. 下列数组定义中错误的是_。 A. int a4=0,1,2,3; B. int a=0,1,2,3,
41、4; Cint a4=0,1,2,3,4; Dint a4=0;55l一维数组的引用一维数组的引用引用数组元素的语法格式为:引用数组元素的语法格式为:其其中中,是是非非负负的的整整型型表表达达式式,也也就就是是数数组组的的下下标标,数数组组下下标标是是用用来来指指定定所所要要访访问问的的数数组组中中的的元元素素的的位位置置。提提示示:数数组组下下标标范范围围是是从从0开开始始的的到到数组的大小数组的大小-1。 如:如:inta10;则则数组下标范围是数组下标范围是0 09 9。 数数值值数数组组不不能能整整体体输输入入/ /输输出出,也也不不能能整整体体引引用用,包括数组之间的赋值。包括数组之
42、间的赋值。第一部分第一部分语法与语义语法与语义562.二维数组二维数组l二维数组的定义与二维数组的定义与初始化初始化二二维维数数组组对对应应数数学学中中的的行行列列式式或或矩矩阵阵。定定义义二二维维数组的一般格式为:数组的一般格式为:;二二维维数数组组中中的的每每个个元元素素要要用用两两个个下下标标来来表表示示,规规定定表表示示为为二二维维数数组组的的行行下下标标的的大大小小,表表示示为为二二维维数数组组的的列列下下标标的的大小。大小。第一部分第一部分语法与语义语法与语义57二维数组元素的表示方法为:二维数组元素的表示方法为:;提提示示:两两个个下下标标的的取取值值范范围围都都从从0开开始始。
43、在在C语语言言中中,二二维维数数组组在在计计算算机机中中的的存存储储顺顺序序是是按按行行顺顺序序存存储储的的,即即先先存存储储第第1行行元元素素,然然后后再再存存储储第第2行行元元素素,依依次次类推。类推。第一部分第一部分语法与语义语法与语义58例:例:1.对二维数组对二维数组a进行正确初始化的是进行正确初始化的是。Ainta23=1,2,3,4,5,6;Binta3=1,2,3,4,5,6;Cinta2=1,2,3,4,5,6;Dinta2=1,2,3,4;2. 设设 int b5=1,2,3,4,5,6,7;, 则则 元元 素素b12的值是的值是。A.0B.2 C.6D.7第一部分第一部分
44、语法与语义语法与语义593.数组应用数组应用-排序和查找排序和查找排排序序和和查查找找是是建建立立在在数数组组基基础础上上的的最最重重要要的的算算法法。排排序序的的算算法法很很多多,最最基基本本而而常常用用的的算算法法是是选选择择排排序序法和冒泡排序法。法和冒泡排序法。 查找是在排序的基础上进行的。基本的查找方查找是在排序的基础上进行的。基本的查找方法有顺序查找和折半查找两种方法。法有顺序查找和折半查找两种方法。第一部分第一部分语法与语义语法与语义60【例】【例】:在一个有:在一个有10个元素的数组个元素的数组a中找出值中找出值最大的元素及其位置。最大的元素及其位置。分析:分析:这里采用这里采
45、用“打擂台打擂台”算法。算法。1、设置一个擂台、设置一个擂台(变量变量max),先将一个数先将一个数(通通常是常是a0)放在擂台上放在擂台上(max=a0);2、用下一元素用下一元素(a1)与擂台上的数与擂台上的数(max)进行进行比较,大者留台上。比较,大者留台上。3、将第三个元素、将第三个元素(a2)再与台上的数比较,同再与台上的数比较,同样是大者留台上。样是大者留台上。4、如此比下去直到所有的数、如此比下去直到所有的数(a1a9)都上都上台比过为止。最后留在台上的就是大者。台比过为止。最后留在台上的就是大者。61#includevoidmain() inti,j,max,a10=6,9,
46、8,5,2,4,7,3,1,0;max=a0;j=0;/将将a0放在擂台上放在擂台上for(i=1;imax)/如果擂台如果擂台max上的数字小上的数字小max=ai; /就将就将ai留在擂台上留在擂台上j=i;/记录擂台上数在数组中的位置记录擂台上数在数组中的位置printf(”max=%d,其位置为:其位置为:%dn”,max,j);62 【例】用冒泡排序法对【例】用冒泡排序法对n n个整数进行升序排序。个整数进行升序排序。 注意:元素的序号从注意:元素的序号从0 0开始,程序如下:开始,程序如下:for(i=0;ii;j-)if(ajaj-1)t=aj;aj=aj-1;aj-1=t;63
47、#includevoidmain()inta10=12,5,34,26,18,8,4,22,9,15;intn=10,i,j,t;for(i=0;ii;j-)if(ajaj-1)t=aj;aj=aj-1;aj-1=t;for(i=0;in-1;i+)printf(“%dt”,ai);printf(“n”);64【例】用选择排序法对【例】用选择排序法对1010个整数进行升序排序。个整数进行升序排序。#includevoidmain() inta10=12,5,34,26,18,8,4,22,9,15;intn=10,i,j,t;for(i=0;in-1;i+)for(j=i+1;jaj)t=ai
48、;ai=aj;aj=t;for(i=0;in-1;i+)printf(“%dt”,ai);printf(“n”);65【例】【例】用顺序查找法在数组中查找指定的元素。用顺序查找法在数组中查找指定的元素。#includevoidmain() inta10=12,5,34,26,18,8,4,22,9,15;intx,i,n=10;scanf(“x=%d”,&x);for(i=0;in;i+)if(ai=x)break;if(i=n)printf(“%d不在数组中!不在数组中!n”,x);elseprintf(”%d其位置为:其位置为:%dn”,x,i);66【例】【例】在具有在具有10个元素的数
49、组中,用二分查找法个元素的数组中,用二分查找法(也称折半查找法也称折半查找法)在数组中查找指定的元素。在数组中查找指定的元素。分析分析:二分法二分法查找要求数组元素是查找要求数组元素是有序有序的。的。二分法查找基本思路是二分法查找基本思路是(以升序为例以升序为例):在:在一个区间一个区间l,r中计算中点位置中计算中点位置m=(l+r)/2,如如果果am就是要查找的就是要查找的x,则查找成功!则查找成功!67#includevoidmain()inty10=5,7,8,14,25,36,44,50,69,80;inti,n,m,x;scanf(“输入要查找的数输入要查找的数:%d”,&x);n=
50、0;m=9;i=(n+m)/2;while(n=m&yi!=x)if(yix)m=i-1;i=(n+m)/2; if(yi!=x)printf(Nofound!n“);elseprintf(“数数%d在数组的第在数组的第%d个数个数!n“,x,i);684.字符数组字符数组 字符数组可以整个字符串一次输入字符数组可以整个字符串一次输入/ /输出输出(使用数组名),但在使用数组名整体一次输(使用数组名),但在使用数组名整体一次输出时,注意字符串结束符出时,注意字符串结束符00。在实际操作时,要在实际操作时,要特别注意字符串中有特别注意字符串中有无字符转义序列。无字符转义序列。第一部分第一部分语法
51、与语义语法与语义69例:例:1.以下程序运行后的输出结果是以下程序运行后的输出结果是_。main()chara7=“a00a00”;inti,j;i=sizeof(a);j=strlen(a);printf(“%d%d”,i,j);chara=“a1231230ef”;第一部分第一部分语法与语义语法与语义702.在在自自动动类类型型数数组组初初始始化化时时,若若初初始始化化的的元元素素比比数数组组的元素少,则其余元素初始化为:的元素少,则其余元素初始化为:;“inta3=3;”则则a2;“inta3=1,3,5,7;”则会则会;“inta3;”则则a2的值的值。3.设有下列语句序列:设有下列语
52、句序列:。intx;scanf(“%d”,&x);floatz,yx=1,2,3,4,5,6,7,8;/Az=y3;/BA.z的值为的值为4B.z的值为的值为3C.B行语句错行语句错D.A行语句错行语句错第一部分第一部分语法与语义语法与语义714.要要定定义义数数组组A,使使得得其其中中每每个个元元素素的的数数据据依依次次为为:3、9、4、8、0、0、0,错错误误的的定定义义语语句句是:是:A.intA=3,9,4,8,0,0,0;B.intA7=3,9,4,8,0,0,0;C.intA=3,9,4,8;D.intA7=3,9,4,8;第一部分第一部分语法与语义语法与语义72六、函数六、函数1
53、.函数的基本知识函数的基本知识(1).函数定义函数定义函数定义时,有返回值要注意函数的返回值类函数定义时,有返回值要注意函数的返回值类型与型与return语句后的表达式类型相一致,函数没有返语句后的表达式类型相一致,函数没有返回值时(回值时(void),),则用则用return;语句。语句。函数可以嵌套调用,但不可以嵌套定义。在一函数可以嵌套调用,但不可以嵌套定义。在一个函数的函数体中定义另一个函数是非法的。个函数的函数体中定义另一个函数是非法的。第一部分第一部分语法与语义语法与语义73(2).函数调用函数调用调用函数时,实参和形参要求一一对应。调用函数时,实参和形参要求一一对应。函数调用有两
54、种:作为表达式的函数调用函数调用有两种:作为表达式的函数调用和函数调用语句。对于没有返回值的函数调用和函数调用语句。对于没有返回值的函数调用只能通过函数调用语句实现。只能通过函数调用语句实现。(3).函数调用参数传递函数调用参数传递参数传递有三种:值传递、地址传递和引参数传递有三种:值传递、地址传递和引用传递。用传递。第一部分第一部分语法与语义语法与语义74(4).作用域(难点)与存储类作用域(难点)与存储类在在C+中,作用域共分为五类:块作用中,作用域共分为五类:块作用域;文件作用域;函数原型作用域;函数作用域;文件作用域;函数原型作用域;函数作用域;类作用域。域;类作用域。 局部变量:局部
55、变量:在一个函数内部定义的变量在一个函数内部定义的变量或在一个块中定义的变量称为局部变量。或在一个块中定义的变量称为局部变量。 全局变量:全局变量:在函数外定义的变量或用在函数外定义的变量或用extern说明的变量称为全局变量。全局变量的说明的变量称为全局变量。全局变量的作用域称为文件作用域,即在整个文件中都可作用域称为文件作用域,即在整个文件中都可以访问。以访问。第一部分第一部分语法与语义语法与语义75(1)设设有有函函数数定定义义调调用用语语句句“f(e1,e2),(e3,e4,e5);”,则则实实参参个个数数是是A。(A)2(B)3(C)4(D)5(2)下列函数中对调用它的函数没有起到任
56、何作用的是下列函数中对调用它的函数没有起到任何作用的是C。(A)voidf1(double&x)-x;(B)doublef2(doublex)returnx-1.5;(C)voidf3(doublex)-x;(D)doublef4(double*x)-*x;return*x;第一部分第一部分语法与语义语法与语义76(3)以下程序输出的第一行是以下程序输出的第一行是01234第二行是第二行是15 。#include(作用域作用域)intk;voidmain(void)k=10;for(inti=0;i5;i+)intk;k+=i;/由于重新定义变量由于重新定义变量k,所以就有不同的作用域所以就有
57、不同的作用域coutk;k+;:k+;coutnkn;第一部分第一部分语法与语义语法与语义772.递归函数递归函数在利用递归方法求值时,必须注意三点:在利用递归方法求值时,必须注意三点:1.递归的公式;递归的公式;2.递归的结束条件;递归的结束条件;3.递归的约束条件。递归的约束条件。关键是找到递归公式和递归的结束条件。关键是找到递归公式和递归的结束条件。递归函数在调用时分两部分:递推和回归。递归函数在调用时分两部分:递推和回归。第一部分第一部分语法与语义语法与语义78(1).以下程序的输出结果是(以下程序的输出结果是(vrg)。)。#includevoidfunc2(inti);chars=
58、“verygood!”voidfunc1(inti)coutsti;if(i3)i=+2;func2(i);voidfunc2(inti)coutsti;if(i3)i=+2;func1(i);voidmain()inti=0;func1(i);第一部分第一部分语法与语义语法与语义79(2).以下程序的输出结果是(以下程序的输出结果是(15)。)。#includelongfib(intn)if(n2)return(fib(n-1)+fib(n-2);elsereturn5*n;voidmain()coutfib(3);第一部分第一部分语法与语义语法与语义80(3)以以下下程程序序输输出出的的第
59、第一一行行是是11第第二二行行是是41最最后后一行是一行是x=10。#includevoidfun(intn,int*s)intf1,f2;if(n=1|n=2)*s=1;elsefun(n-1,&f1);fun(n-2,&f2);*s=2*f1+f2+1;coutf1tf2n;voidmain(void)intx;fun(4,&x);cout”x=”xn;第一部分第一部分语法与语义语法与语义81(4)以下程序输出的结果是以下程序输出的结果是dcba。#includevoidshow(char*s)if(*s)show(s+1);cout*s;voidmain(void)show(“abcd0
60、efg0hij”);coutn;第一部分第一部分语法与语义语法与语义82(5)以以下下程程序序输输出出的的第第一一行行是是123第第二二行行是是321第三行是第三行是123。#includevoidp1(chars,inti)if(si!=0)p1(s,i+1);coutsi;voidp2(chars,inti)coutsi;if(si!=0)p2(s,i+1);voidmain(void)charstr=”123”;coutstrn;p1(str,0);coutn;p2(str,0);coutn;第一部分第一部分语法与语义语法与语义833.重载函数重载函数定义的定义的重载函数必须具有重载函数
61、必须具有: :相同的函数名相同的函数名但具有不同的参数个数或不同的参数类型。但具有不同的参数个数或不同的参数类型。 调用重载该函数时,将根据实参的数据调用重载该函数时,将根据实参的数据类型和重载函数的形参匹配,确定调用其中的类型和重载函数的形参匹配,确定调用其中的一个重载函数。一个重载函数。第一部分第一部分语法与语义语法与语义844.静态变量静态变量 静态静态类型类型变量有确定的初值。静态变量有确定的初值。静态类型类型变量对变量对全局变量和局部变量有不同的含义。全局变量和局部变量有不同的含义。 静静态态类类型型变变量量只只能能初初试试化化一一次次。当当局局部部变变量量使使用用静静态态类类型型变
62、变量量时时,其其作作用用将将保保存存函函数数的的运运行行结结果果,以以便便下下次次调调用用函函数数时时,能能继继续续使使用用上上次次计计算算的的结结果果。但但不不在在变变量量的的作作用用域域时时,不不能能直直接接使使用用,确确需需使使用用时,可通过变量的地址取值(即指针)。时,可通过变量的地址取值(即指针)。 当全局变量使用静态当全局变量使用静态类型类型变量时,表示所说明变量时,表示所说明的变量仅限于这个源程序文件内使用。的变量仅限于这个源程序文件内使用。第一部分第一部分语法与语义语法与语义85(1)以下程序输出的结果是以下程序输出的结果是i=105i=110。 #include int t(
63、) static int i=100; i+=5; return i; void main(void) couti=t()n; couti=t()n; 第一部分第一部分语法与语义语法与语义86(2)以下程序输出的结果是以下程序输出的结果是i=105105i=105110。 #include int t(int *p) static int i=100;*p=&i; i+=5; return i; void main(void) int i,*p;i=t(&p); couti=it *pn; t(&p); couti=it *pn; 第一部分第一部分语法与语义语法与语义87(3)以以下下程程序序
64、输输出出的的第第一一行行是是20,第第二二行行是是400。#includeintf(intx)staticintu=1;x+=x;returnu*=x;voidmain(void)intx=10;coutf(x)n;coutf(x)n;第一部分第一部分语法与语义语法与语义88(4)以以下下程程序序输输出出的的第第一一行行是是21,第第二二行行是是53。#includeintf(void)staticinta,b=10,c=1;a+=b;b+=c;returnc=a+b;voidmain(void)coutf()n;coutf()n;第一部分第一部分语法与语义语法与语义895.编译预处理指令编译
65、预处理指令编译预处理指令包括三方面的内容:编译预处理指令包括三方面的内容:文件包含、宏指令和条件编译,其重点文件包含、宏指令和条件编译,其重点是宏指令是宏指令-带参数的宏定义。带参数的宏定义。注意:注意:在在宏调用时,将不作任何语法检宏调用时,将不作任何语法检查,也不做任何计算,只作简单替换。查,也不做任何计算,只作简单替换。第一部分第一部分语法与语义语法与语义90(1)若有宏定义:若有宏定义:#defineN2#defineY(n)(N+1)*n)则则执执行行语语句句“z=2*(N+Y(N+2);”后后,z的的值值为为20。(2)若有宏定义:若有宏定义:#defineT(x,y,z)x*y*
66、z/4则则表表达达式式“z=T(3+4,2*4,4+4);”后后,z的的值值为为132。第一部分第一部分语法与语义语法与语义91(3)若有宏定义:若有宏定义:则则D。#defineM(a,b)a*b;/Eintx=M(3+4,5+6),y;/Fy=M(3,4);/GA.编译时编译时,E行语法错行语法错B.编译时编译时,F行语法错行语法错C.编译时编译时,G行语法错行语法错D.编译时编译时,F行和行和G行语法错行语法错(4)若有宏定义:若有宏定义:#defineP(x,y)x/y#definePP(a,b)a*bintc=P(2+3,2+3)+PP(2+3,2+3);则则c的值为的值为17。第一
67、部分第一部分语法与语义语法与语义92(5).编译以下程序时,结果是编译以下程序时,结果是B。#include/第第1行行#defineaa123;/第第2行行voidmain(void)/第第3行行coutaan;/第第4行行A.编译时第编译时第2行出错行出错B.编译时第编译时第4行出错行出错C.编译时第编译时第2,4行出错行出错D.编译时无错误编译时无错误第一部分第一部分语法与语义语法与语义93六、指针、引用和函数六、指针、引用和函数1.指针指针指针变量的访问有两种形式:访问指针变指针变量的访问有两种形式:访问指针变量的值和访问指针的内容。量的值和访问指针的内容。指针可执行的运算有三种:赋值
68、运算、指针可执行的运算有三种:赋值运算、关系运算和算术运算。关系运算和算术运算。指针变量指针变量+,-+,-,* *,& &之间的混合运算之间的混合运算, , * *p1+p1+、*+p1*+p1、(*p1)+(*p1)+、+*p1 +*p1 。第一部分第一部分语法与语义语法与语义942.指针和一维数组指针和一维数组假设有:假设有:intint a10,*point;point=&a0; a10,*point;point=&a0;总结:总结:(1).(1).数组名等同于数组的第数组名等同于数组的第0 0个元素的地址,也个元素的地址,也是数组的起始地址。是数组的起始地址。(2).(2).当指针变
69、量当指针变量pointpoint指向数组指向数组a a的第的第0 0个元素后个元素后, ,则则point+ipoint+i等同于等同于a+i,a+i,为为aiai的地址。的地址。(3).(3).当指针变量当指针变量pointpoint指向数组指向数组a a的第的第0 0个元素后个元素后, ,则则* *( (point+i)point+i)、*(a+i)*(a+i)、aiai、pointipointi和和* *& &aiai都表示元素都表示元素aiai。 注意:注意:point+point+允许,但允许,但a+a+不允许。不允许。第一部分第一部分语法与语义语法与语义953.指针与二维数组指针与二
70、维数组要注意区分元素地址和行地址。要注意区分元素地址和行地址。例:假设有数组:例:假设有数组:intint a44,*point; a44,*point;第第0 0行第行第0 0列的元素地址:列的元素地址:a0,&a00,a0,&a00,*&a0,*a *&a0,*a 等。等。第第0 0行的行地址:行的行地址:& &a0,a a0,a 等。等。PointPoint指针变量只能存放元素地址值。指针变量只能存放元素地址值。第一部分第一部分语法与语义语法与语义96(1)以下程序输出的第一行至第三行分别是以下程序输出的第一行至第三行分别是112、358、132134。#includevoidf(int
71、*q1,int*q2,int*q3)*q3=*q1+*q2;voidmain(void)inti,j,a33=1,1,*p1=a0;int*p2=a0+1,*p3=a0+2;for(i=2;i9;i+)f(p1+,p2+,p3+);for(i=0;i3;i+)for(j=0;j3;j+)coutaijt;coutn;第一部分第一部分语法与语义语法与语义974.指向数组的指针指向数组的指针对于一个对于一个m列的二维数组,我们可以定列的二维数组,我们可以定义一个指向它的指针:义一个指向它的指针:“int(*p)m;”。然然后就有:后就有:“p=a;”。这里的指针这里的指针p称为称为“指向指向数组的
72、指针数组的指针”(也称指向数组的指针变量也称指向数组的指针变量)。定义指向数组的指针的一般形式为:定义指向数组的指针的一般形式为:(*)第一部分第一部分语法与语义语法与语义98【例例】使用指向数组的指针输出数组中的元素。使用指向数组的指针输出数组中的元素。voidmain()inta34=0,1,2,3,4,5,6,7,8,9,10,11;int(*p)4,i,j;p=a;/指针指针p指向数组指向数组a(起始地址)(起始地址)for(i=0;i3;i+)for(j=0;jab;if(ab)exchang(&a,&b);coutatbn;实参为实参为地址地址输入数据:输入数据:94运行结果:运行
73、结果:49 1004.指针和字符串指针和字符串当字符串和指针结合在一起,使用起来就当字符串和指针结合在一起,使用起来就特别灵活。在各类考试中经常会出现相关的题特别灵活。在各类考试中经常会出现相关的题目。目。 (1)(完善程序题完善程序题)以下程序的功能是:输入以下程序的功能是:输入两个字符串,把这两个字符串拼成一个新的字两个字符串,把这两个字符串拼成一个新的字符串,输出拼接后的字符串。符串,输出拼接后的字符串。第一部分第一部分语法与语义语法与语义101第二部分第二部分结构化程序设计结构化程序设计(1)(完善程序题完善程序题)以下程序的功能是:输入两个字以下程序的功能是:输入两个字符串,把这两个
74、字符串拼成一个新的字符串,符串,把这两个字符串拼成一个新的字符串,输出拼接后的字符串。输出拼接后的字符串。#includechar *stringcat(char *to,char *from)/实现拼接 char *p= to ; /把form拼接到to后面 while(*to+); to- ; while( *to+ =*from+) ;return p;102(2)下列程序中函数下列程序中函数insertstr的功能是:在字符串的功能是:在字符串str中中所有出现子串所有出现子串str1的后面插入子串的后面插入子串str2。如本程序的如本程序的输出为:输出为:“Iamastudentto
75、o.Youareastudenttoo.Heisastudenttoo.”#include#includechar *insertstr(char *str,char *str1,char str2) char *p,*p1,*q1,*t1; int i,len2; if(*str=0| *str1=0| *str2=0) return str; len2=strlen(str2); p=str; t1=str2;103 while(*p!=0) p1=p;q1=str1; while(*p1=*q1& *q1 ) p1+;q1+; if(p!=p1&*q1=0) p= p1 ;while(*
76、p1+!= 0); for(;p1=p;p1-) *( p1+len2 )=*p1; for(i=0;*(t1+i)!=0;i+) *p+=*(t1+i); p+ ; return str;1045.引用引用引引用用是是某某一一变变量量(目目标标)的的一一个个别别名名,对对引引用用的的操作与对变量直接操作完全一样。操作与对变量直接操作完全一样。定义引用的一般格式:定义引用的一般格式:&=;“目目标标变变量量名名”必必须须是是已已经经定定义义过过的的变变量量或或引引用用。符符号号“&”在在不不同同的的场场合合有有不不同同的的含含义义。在在数数据据声声明明时时(如如int&a),“&”意意为为引引
77、用用,若若“&”前前无无类类型型符符,则是取变量的地址则是取变量的地址(如如inta,*p=&a)。第一部分第一部分语法与语义语法与语义1056.参数传递参数传递l方式有值传递、地址传递和引用传递三种。方式有值传递、地址传递和引用传递三种。怎么理解参数传递呢?怎么理解参数传递呢? l前期知识回顾前期知识回顾计算机内存单元、地址与数据计算机内存单元、地址与数据第一部分第一部分语法与语义语法与语义106l理解理解C语言中,最简单的语句:语言中,最简单的语句: inta=10;10地址地址变量名变量名变量的值变量的值a2000H第一部分第一部分语法与语义语法与语义107l形参与实参的对应关系形参与实
78、参的对应关系假设:主调函数中有定义:假设:主调函数中有定义:intx=10,*p=&x,y10;形参形参实参实参值传递:类型值传递:类型参数名参数名intf(inta)常量、变量、表达式常量、变量、表达式f(x)地址传递:类型地址传递:类型*参数名参数名类型类型参数名参数名intf(int*a)intf(inta)&变量名、指针变量名、变量名、指针变量名、数组名数组名f(p)或或f(&x)f(y)引用传递:类型引用传递:类型&参数名参数名intf(int&a)变量名变量名f(x)108参数不同传递方式对结果的影响参数不同传递方式对结果的影响#includeintf1(inta)a+;retur
79、na;intf2(int*a)(*a)+;return*a;intf3(int*a)a+;return*a;intf4(int&a)a+;returna;voidmain() inty=20,x=10;printf(%d,%dn,x,f1(x);x=10;printf(%d,%dn,x,f2(&x);x=10;printf(%d,%dn,x,f3(&x);x=10;printf(%d,%dn,x,f4(x);10,1111,1110,2011,11109第一部分第一部分语法与语义语法与语义七、七、结构体结构体 有时需要将不同类型的数据组合成一个有机有时需要将不同类型的数据组合成一个有机的整体,
80、以便于引用。这些组合在一个整体中的的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。数据是互相联系的。 110第一部分第一部分语法与语义语法与语义1.结构体类型说明结构体类型说明声明一个结构体类型的一般形式为声明一个结构体类型的一般形式为struct 结构体名结构体名 成员表列成员表列 ; 111第一部分第一部分语法与语义语法与语义2.结构体类型变量定义结构体类型变量定义定义结构体类型变量的方法定义结构体类型变量的方法先声明结构体类型再定义变量名先声明结构体类型再定义变量名structstudentintnum;charname20;charsex;112第一部分第一部分语法与语义语
81、法与语义声明结构体类型时定义变量名声明结构体类型时定义变量名structstudentintnum;charname20;charsex;stu1,stu2;直接定义结构体变量直接定义结构体变量struct intnum;charname20;charsex;stu1,stu2;113第一部分第一部分语法与语义语法与语义3.结构体类型变量引用结构体类型变量引用 在定义了结构体变量以后在定义了结构体变量以后,当然可以引用这个当然可以引用这个变量。但应遵守以下规则变量。但应遵守以下规则:(1) 不能将一个结构体变量作为一个整体进行输入不能将一个结构体变量作为一个整体进行输入和输出。例如和输出。例如
82、,已定义已定义student1和和student2为结构为结构体变量并且它们已有值。不能这样引用体变量并且它们已有值。不能这样引用: printf (%d,%s,%c,%d,%f,%sn,student1); 只能对结构体变量中的各个成员分别进行输只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为:入和输出。引用结构体变量中成员的方式为: 结构体变量名结构体变量名.成员名成员名1144.指针和链表指针和链表要掌握指针和链表,对相关语句所实现的要掌握指针和链表,对相关语句所实现的功能必须非常明确。设有结构体说明:功能必须非常明确。设有结构体说明:需要黑板画图说明需要黑板
83、画图说明structNodeintdata,Node*next;Node*p1,*p2;p1=newNode;/产生一个新结点产生一个新结点p2=p2-next;/p2指针指向下一个结点指针指向下一个结点p2-next=p1;/把把p1指向的新结点连到指向的新结点连到p2结点结点的后面的后面第一部分第一部分语法与语义语法与语义115例例1:设设h1和和h2分别为两个单链表的头指针,链表中分别为两个单链表的头指针,链表中结点的数据结构为:结点的数据结构为:typedefstructnodeintdata;structnodenext;NODE;sea_del函数的功能是:删除函数的功能是:删除h
84、1指向的链表中首次指向的链表中首次出现的与出现的与h2指向的链表中数据完全匹配的若干个连指向的链表中数据完全匹配的若干个连续结点,函数返回续结点,函数返回h1指向链表的头指针。指向链表的头指针。例例如如,初初态态下下,h1指指向向链链表表和和h2指指向向链链表表如如下下图图所示:所示:第一部分第一部分语法与语义语法与语义116试完善函数试完善函数seadel以达到要求的功能。以达到要求的功能。117NODE sea_del(NODE *h1,NODE *h2) NODE *p,*ph,*q,*s;ph=NULL;p=q=h1;s=h2;if(h1=NULL|_h2=NULL_)return h
85、1;while(p!=NULL&s!=NULL) while(q-data=s-data&q&s)q=q-next;s=_s-next_;if(s!=NULL) /*失配时,h1起始结点后移,h2从首结点开始。*/ph=p;p=q=p-next;s=_h2_;else if(ph=NULL) h1=q;else ph-next=q;_return h1_;118例例2:设结点的数据结构定义如下:设结点的数据结构定义如下:structPNODEintx,y;PNODE*next;函数函数padd的功能是:根据的功能是:根据pa,pb指向的指向的两个链表(按节点的两个链表(按节点的y值升序排列)生
86、成一个值升序排列)生成一个新链表(新链表(pc为链表首指针)新生成链表仍按升为链表首指针)新生成链表仍按升序排列。生成新链表的规则是:当在序排列。生成新链表的规则是:当在pa和和pb链链表中发现表中发现y值相同的结点时,则在值相同的结点时,则在pc链表中增链表中增加一个新节点,新节点的加一个新节点,新节点的x取值为两链表对应取值为两链表对应的两个节点的的两个节点的x值之和,新节点的值之和,新节点的y指为指为pa或或pb链表中对应节点的链表中对应节点的y值。值。第一部分第一部分语法与语义语法与语义119PNODE *padd(PNODE *pa,PNODE *pb) PNODE *pcr,*pt
87、,*pc=0; while( pa&pb ) /pa!=0&pb!=0 if(pa-y=pb-y) pt=new PNODE ; pt-x=pa-x+pb-x;pt-y=pa-y; pt-next=NULL; if(pc=NULL)pc=pcr=pt; else pcr-next=pt; pcr=pt ; pa=pa-next;pb=pb-next; else if( pa-ypb-y ) pb=pb-next; else pa=pa-next; return pc;120第一部分第一部分语法与语义语法与语义八、八、文件文件 1. 文件类型指针文件类型指针 缓冲文件系统中,关键的概念是缓冲文件
88、系统中,关键的概念是“文件指针文件指针”。每个被使用的文件都在内存中开辟一个区,。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息用来存放文件的有关信息(如文件的名字、文件状如文件的名字、文件状态及文件当前位置等态及文件当前位置等)。 FILE *fp;121第一部分第一部分语法与语义语法与语义2. 文件的打开与关闭文件的打开与关闭 和其他高级语言一样,对文件读写之前应该和其他高级语言一样,对文件读写之前应该“打开打开”该文件,在使用结束之后应关闭该文件。该文件,在使用结束之后应关闭该文件。fopen函数的调用方式通常为函数的调用方式通常为:FILE *fp;fp=fopen(文件
89、名,使用文件方式文件名,使用文件方式);例如:例如:fp=fopen(a1,r);122第一部分第一部分语法与语义语法与语义3. 文件的关闭文件的关闭(fclose函数函数) 在使用完一个文件后应该关闭它,以防止它再被在使用完一个文件后应该关闭它,以防止它再被误用。误用。“关闭关闭”就是使文件指针变量不指向该文件。就是使文件指针变量不指向该文件。例如:例如:fclose(fp);123第一部分第一部分语法与语义语法与语义4. 文文 件件 的的 读读 写写 文件打开之后,就可以对它进行读写了。常用文件打开之后,就可以对它进行读写了。常用的读写函数如下的读写函数如下:printf函数和函数和fsc
90、anf函数函数 fprintf函数、函数、fscanf函数与函数与printf函数、函数、scanf函函数作用相仿,都是格式化读写函数。数作用相仿,都是格式化读写函数。124第二部分:程序构造方法第二部分:程序构造方法一、一、C语言的程序结构语言的程序结构C语言程序文件是以函数为单位叠加起来语言程序文件是以函数为单位叠加起来的,任何一个的,任何一个C+项目必须有且只能有一个项目必须有且只能有一个main()函数。函数。main()函数是函数是C语言程序执行时的入语言程序执行时的入口,其他函数都是具有独立功能的一部分程序,口,其他函数都是具有独立功能的一部分程序,由由main()函数或其他函数调
91、用。函数或其他函数调用。125在程序设计过程中,对于功能相对独立在程序设计过程中,对于功能相对独立且重复的功能,可以通过一个自定义函数来实且重复的功能,可以通过一个自定义函数来实现。函数定义需要先定义后调用,但函数调用现。函数定义需要先定义后调用,但函数调用在前,函数定义在后时,需要使用函数原型说在前,函数定义在后时,需要使用函数原型说明。在函数定义过程中,特别注意形参和实参、明。在函数定义过程中,特别注意形参和实参、返回值类型和返回值类型和retutn语句后的表达式、有无返语句后的表达式、有无返回值和函数调用形式等之间的配合。回值和函数调用形式等之间的配合。 函数是由语句、利用三种基本结构、
92、按函数是由语句、利用三种基本结构、按一定要求组合而成。一定要求组合而成。第二部分:程序构造方法第二部分:程序构造方法126函数定义与调用的三个要点函数定义与调用的三个要点:(1).检查实参与形参是不是对应检查实参与形参是不是对应(包括顺序、个包括顺序、个数和数据类型数和数据类型);(2).函数定义中,函数的返回值类型与函数定义中,函数的返回值类型与return语句中的表达式类型是不是对应?语句中的表达式类型是不是对应?(包括(包括void情况)情况)(3).函数如何调用?如果函数定义时,没有返函数如何调用?如果函数定义时,没有返回值,则调用函数时,只能用函数调用语句实回值,则调用函数时,只能用
93、函数调用语句实现。现。第二部分:程序构造方法第二部分:程序构造方法127 计算机语言有三种基本结构语句:顺序、计算机语言有三种基本结构语句:顺序、分支、循环,这是构成函数的主要语句分支、循环,这是构成函数的主要语句 。 在程序实现过程中,这三种基本结构不会在程序实现过程中,这三种基本结构不会单独存在,总是相互结合的。特别需要注意:单独存在,总是相互结合的。特别需要注意:在满足条件需要通过多条语句实现功能时,需在满足条件需要通过多条语句实现功能时,需要使用复合语句。要使用复合语句。 第二部分:程序构造方法第二部分:程序构造方法128 简单程序构造的基本方法:简单程序构造的基本方法:l数据准备:包
94、括变量、数组等说明语句,给变数据准备:包括变量、数组等说明语句,给变量、数组提供初始值等。量、数组提供初始值等。l数据处理:分析问题,找到解决问题可行的方数据处理:分析问题,找到解决问题可行的方法,利用三种基本结构的组合、函数调用等,法,利用三种基本结构的组合、函数调用等,对数据进行处理,最终得到结果。对数据进行处理,最终得到结果。l输出结果:把结果按一定格式输出。输出结果:把结果按一定格式输出。第二部分:程序构造方法第二部分:程序构造方法129例:例:【程序功能程序功能】在给定范围内查找在给定范围内查找k使得用公式使得用公式k2+k+17生成的整数满足以下条件:该数的十进制生成的整数满足以下
95、条件:该数的十进制表示中低表示中低3位数字相同,去掉低位数字相同,去掉低3位后的整数是回文位后的整数是回文数。例如,当数。例如,当k=461时用公式生成的整数是时用公式生成的整数是212999,该数满足所给条件。,该数满足所给条件。【编程要求编程要求】1编写函数编写函数intfindnum(intn1,intn2,longa2)实现以下功能:实现以下功能:k依次取依次取n1n2范围范围内的每个整数,分别用每个内的每个整数,分别用每个k及公式及公式k2+k+17生成整生成整数数y,若若y满足给定条件,则将满足给定条件,则将k值及值及y值保存到值保存到a指向指向的数组中,函数返回的数组中,函数返回
96、a数组中数组中k的个数。的个数。2编写函数编写函数main实现以下功能:声明二维数组实现以下功能:声明二维数组a和变和变量量n1、n2,输入两个整数并保存到输入两个整数并保存到n1、n2中,用中,用n1、n2及及a数组作实参调用数组作实参调用findnum函数,按所给格式输函数,按所给格式输出出a数组中的数据到屏幕及文件数组中的数据到屏幕及文件myf2.out中。最后将中。最后将考生本人的准考证号输出到文件考生本人的准考证号输出到文件myf2.out中。中。130 分析问题:分析问题:k依次取依次取n1n2范围内的每个整数,范围内的每个整数,则需要循环语句,由于循环次数固定,首选则需要循环语句
97、,由于循环次数固定,首选for循环结构;在循环提中循环结构;在循环提中(重复部分重复部分)分别用分别用每个每个k及公式及公式k2+k+17生成整数生成整数y,若若y满足给满足给定条件,则将定条件,则将k值及值及y值保存到值保存到a指向的数组中,指向的数组中,函数返刚函数返刚a数组中数组中k的个数。的个数。数字分离分离方法:数字的分离采用求数字分离分离方法:数字的分离采用求10的余数再除以的余数再除以10的方法进行;的方法进行;第二部分:程序构造方法第二部分:程序构造方法131判定是否是回文:先计算反序的数值,然后判判定是否是回文:先计算反序的数值,然后判定正序和反序数是否相等。求定正序和反序数
98、是否相等。求n的反序数可采用如下的反序数可采用如下方法:方法:假设假设m1=123,则反序数则反序数m=321intm=0;while(m1)m=m*10+m1%10;m1/=10;第二部分:程序构造方法第二部分:程序构造方法132 数据准备:该程序需要的变量有数据准备:该程序需要的变量有n1、n2表示表示k的取值范围,从键盘输入;循环控制变量的取值范围,从键盘输入;循环控制变量k用用来表示来表示n1n2的每一个取值;变量的每一个取值;变量y用来计算用来计算k2+k+17生成的整数;生成的整数;a,b,c用来保存低三位数用来保存低三位数字,字,n、m分别用来表示正序数和反序数;分别用来表示正序
99、数和反序数;m1用来表示处理过程中的临时数据。用来表示处理过程中的临时数据。输出结果:该题目的是边查找边输出,所以输输出结果:该题目的是边查找边输出,所以输出应在循环中。出应在循环中。第二部分:程序构造方法第二部分:程序构造方法133数据处理:数据处理:for(k=n1;k=n2;k+) y=k*k+k+17;b=y%10;c=y/10%10;d=y/100%10;n=y/1000;intm=0;while(m1)m=m*10+m1%10;m1/=10;if(b=c&c=d&n=m)printf(“%dt%dn”,k,y);第二部分:程序构造方法第二部分:程序构造方法134l第一步:建立程序框
100、架第一步:建立程序框架#includeintfindnum(intn1,intn2,longa2)voidmain()第二部分:程序构造方法第二部分:程序构造方法135main()函数设计:函数设计:voidmain() intn1,n2,m;longa102;scanf(%d,%d,&n1,&n2);m=findnum(n1,n2,a);FILE*fp;fp=fopen(myf2.out,w);for(inti=0;im;i+)fprintf(fp,%d,%dn,ai0,ai1);printf(%d,%dn,a0i,a1i);fprintf(fp,%sn,00112233);fclose(fp);136#includeint findnum(int n1,int n2,long a2) int k,b,c,d,i=0;long y,n,m,m1;for(k=n1;k=n2;k+)y=k*k+k+17;b=y%10;c=y/10%10;d=y/100%10;m1=n=y/1000;m=0;while(m1)m=m*10+m1%10;m1/=10;if(b=c&c=d&n=m)printf(%dt%dn,k,y);a0i=k;a1i=y;i+;return i;137