《C语言强化训练》PPT课件.ppt_第1页
《C语言强化训练》PPT课件.ppt_第2页
《C语言强化训练》PPT课件.ppt_第3页
《C语言强化训练》PPT课件.ppt_第4页
《C语言强化训练》PPT课件.ppt_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言强化训练 第一部分 语法与语义 第二部分 程序构造方法,C+语言程序设计,2,强化训练目的:,加强程序设计基础知识掌握与C语言基本编程能力的培养。包括基本语法、数据结构和基本算法。 内容重点突出,注重实用的原则。,3,关于计算机基础部分:,计算机基础涉及范围广,第一靠平时的积累;第二关注计算机领域的新发展和我国在计算机方面的新成就。,4,关于C语言学习方法:,学习计算机语言的目的是为了程序设计,因此计算机语言的学习不仅仅是掌握知识,更注重于应用能力的培养,因此学习过程中,应从两方面着手: 掌握知识:熟记相关的语法、语义; 应用能力培养:程序设计方式、方法的学习;通过实验、总结,把知识转变为应用能力。,5,C语言难点:,C语言是众多计算机高级语言中最难学的语言之一。 C语言有很强的特性,数据类型丰富,语法语义变化繁多、既严谨又灵活。要消化这些,需要投入大量的时间和精力。 学习C语言,一方面学生缺乏这方面的学习经验,对于这门全新、枯燥、庞大的课程,心有余而力不足。 更重要的是经过一段时间学习缺乏应有的信心。,6,学习计算机语言时的思维:,学习计算机语言的思维是一种自顶向下的思维方式,可用八个字来形容:自顶而下,逐步细化。也就是从宏观到微观,从整体到局部。这种思维符合我们大学计算机的教学。这种思维强调的是“纲举目张”,强调的是分层次思考。,7,关于该讲义内容说明:,该讲义的大部分例题来自C语言等级考试真题。但也有部分题目来自其他语言等级考试真题或自拟的题目。,8,第一部分 语法与语义,一、C语言最基本部分 1. 保留字与标识符 标识符是指常量、变量、语句标号以及用户自定义函数的名称。作为标识符必须满足以下规则: 标识符必须由字母、下划线或数字(09)组成; 标识符的第一个字符可以是字母(az, AZ)或下划线(_); 保留字不能作标识符。,9,第一部分 语法与语义,特别提示:C语言是一种大小写敏感的语言。 如:Test、test是2个不同的标识符。 例:以下选项中,_是C语言关键字。 A. printf B. include C. fun D. default,10,第一部分 语法与语义,2. 常量 整数:注意八和十六进制数; 实数:用指数形式表示小数时,方幂e(或E)前后必须是数字,e的前面可以是整数也可以是小数,但e后面只能为13位整数。如:1.24e3、-4.3e-2是合法的实数。但1.3e、e2、1.2e3.1等是不合法的实数。,11,第一部分 语法与语义,字符数:字符常量是用单引号括起来的一个字符,如e、E;或“”开始,后跟一个字符或一个整型常量(字符的ASCII码值)的方法来表示另一个字符。 如:0、n、20等。 字符串常量:用一对双引号将0个或若干个字符括起来。注意中间0字符、字符串长度和占用内存字节数。 如:”1231230abc”,12,第一部分 语法与语义,符号常量: #define a 10 const int b=20; 字符常量是用单引号括起来的一个字符,如e、E;或“”开始,后跟一个字符或一个整型常量(字符的ASCII码值)的方法来表示另一个字符。符号常量在程序中不能被改变。,13,第一部分 语法与语义,例:1. 设有定义和声明如下: #define d 2 int x=5;float y=383; char c=d; 以下表达式中有语法错误的是 。 Ax+ By+ Cc+ Dd+ 2. 以下语句中有语法错误的是 。 Aprintf(“%d“,0e); Bprintf(”%f“,0e2); Cprintf(”%d”,0x2); Dprintf(”%s”,“0x2”);,14,第一部分 语法与语义,3.表达式 算术运算符与表达式 运算符有:+、-、*、/、%。 特别关注:/和%运算。 对于除法运算,如果运算符两边的操作数都是整数,其运算结果也是整数,即两数整除;如果两个操作符中有一个是实数,其运算结果就是实数。 4/5 运算结果为0 4.0/5或4.0/5或4.0/5.0运算结果为0.8 5/4 运算结果为1 5.0/4或5/4.0运算结果为1.25。,15,第一部分 语法与语义,例:1. 已知有声明“int a=3,b=4,c;”,则执行语句“c=1/2*(a+b);”后,c的值为_。 A. 0 B. 3 C. 3.5 D. 4 2. 以下双目运算符中要求两个操作数均为整型的运算符是_ 。 A| B& C D,16,第一部分 语法与语义,关系运算符与表达式 运算符有:、=、=、=、!=。 特别关注:1. 把=理解=或把=写成=。重点在上机改错题。 2. 注意类似式子:设有定义 int x=3;计算5x10的值。 例:int k=0;while(k=1)k+;问while的循环次数。,17,逻辑运算符与表达式 运算符有:!、&、|。 特别关注:逻辑表达式优化所带来的影响(也称副作用)。 例:已知有声明“int a=12,b=15,c;”,则执行表达式“c=(a|(b-=a)”后,变量b和c的值分别为_。,第一部分 语法与语义,18,赋值运算符与表达式 运算符有:=和与算术、位的复合赋值。 特别关注:多重赋值的实现形式。 例:已知有声明“int n;float x,y;”,则执行语句“y=n=x=3.89;”后,Y的值为_。 A3 B3.0 C3.89 D4.0,第一部分 语法与语义,19,赋值运算符左边必须是内存中一个可以访问且可以合法修改的对象,可以是变量名、引用名、数组的元素、指针变量所指向的合法空间,而不能是常量或表达式。 看下面的赋值运算: 3.1415926=pi; x+y=z; const int N=30; N=40;,第一部分 语法与语义,20,逗号运算符与表达式 逗号也称顺序求值表达式,最后一个表达式的值作为整个逗号表达式的结果。 例:设有语句: int i=1,s=1; for(;s+i6,i=5;i+)s+=i; 以下for循环语句的循环次数为_。 位运算符,第一部分 语法与语义,21,类型转换-自动类型转换 类型转换有自动类型转换和强制类型转换。 关注转换原则。 例:1. 若有声明“float y=3.14619;int x;”,则计算表达式“x=y*100+0.5,y=x/100.0”后y的值是 。 2. 已知有声明“char ch=g;”,则表达式ch=ch-a+A的值为字符_的编码。,第一部分 语法与语义,22,类型转换-强制类型转换 例:设有声明“int a=3,b=4;float x=4.5,y=3.5;”,则表达式“(float)(a+b)/2+(int)x(int)y”的值是 。,第一部分 语法与语义,23,+与- 特别关注:前置与后置的问题,圆括号不能改变后置的问题。 例:有如下程序段: int a5=1,3,5,7,9,*p=a; printf(“%dn“,*(p+); 则执行的结果是_。,第一部分 语法与语义,24,二、输入/输出 输入和输出是计算机语言的重要组成部分。 常用输入/输出函数 putchar():把变量中的一个字符常量输出到显示器屏幕上; getchar():从键盘上输入一字符常量,此常量是该函数的值; printf():把各类数据,加以格式控制输出到显示器屏幕上; scanf():从键盘上输入各类数据,并存放到程序变量中; puts():把一个字符串常量输出到显示器屏幕上; gets():从键盘上输入一个字符串常量并放到程序的数组中。,第一部分 语法与语义,25,最常用的“格式控制字符串”说明如下。 (1)%d:是按十进制整型数据格式输出,数据长度为实际长度。%与d之间可以加正数m,控制输出宽度。 (2)%s:控制输出一个字符串。 (3)%f:按小数形式输出十进制实数(包括单、双精度),实数的整数部分全部输出,并输出6位小数。“%m.nf”表示输出实数共占m个字符位置,其中n位小数,多余位左端补空格。,第一部分 语法与语义,26,注意事项: (1) 掌握常用的一些格式控制字符; (2)格式说明中%与后面格式符之间不能有空格,除了X,E,G格式符外,其他格式符必须用小写字母。 (3) 若要输出%可在格式控制字符串中使用两个连续的%。例如: printf(“%d%n”,5); 输出结果:5%,第一部分 语法与语义,27,例:已知有声明和语句“int a;scanf(”a=d”,a);”,欲从键盘上输入数据使a中的值为3,则正确的输入应是_。,第一部分 语法与语义,28,三、C语言程序结构 1. 程序的三种基本结构 顺序结构:是指程序按照语句在程序的先后顺序逐句运行。没有分支、跳转。 分支(或选择)结构:是指程序根据不同的条件执行不同的分支的语句,如C语言中的if、switch语句、条件运算符语句。 循环结构:是指程序在满足一定的条件下循环执行的相关语句,如C语言中的while、do while、for语句。 由这3种基本结构可以组成任何复杂逻辑的程序。,第一部分 语法与语义,29,2. C语言的语句有以下六大类: 说明语句:在C+中,实现对数据结构的定义和描述、对变量的定义性说明的语句被称为说明语句。如:int a; 表达式语句:在合法的表达式后面加上分号,即形成了表达式语句。a=10; 控制语句:控制改变程序运行顺序的语句被称为控制语句。包括:选择语句、循环语句、流程跳转语句等。如:break;,第一部分 语法与语义,30,函数调用语句:在函数的调用后面加上分号,即形成函数调用语句。如:about(); 空语句:只有一个分号组成的语句称为空语句,它不做任何操作。 复合语句:当用将若干条语句括起来,C+将其作为一条语句进行处理,被称为复合语句。,第一部分 语法与语义,31,3. C语言程序组成 任何一个复杂的C语言程序是由一个main()函数和若干个用户自定义函数组成的。main()函数是整个程序执行时的入口,必须有且只能有一个,可放在程序的任何地方。 4. 简单的设计方法,第一部分 语法与语义,32,例:C语言规定,在一个源程序中main函数的位置_。 A. 必须在最开始 B. 必须在最后 C. 必须在预处理命令的后面 D. 可以在其他函数之前或之后,第一部分 语法与语义,33,四、流程控制语句 C语言流程控制语句有: 选择语句:if语句、switch语句、条件运算符语句; 循环语句:while语句、do_while语句、for语句; 控制语句:break语句、continue语句。,第一部分 语法与语义,34,1.条件语句 单分支的if语句 if (表达式) 语句 if后面的表达式一般是一个逻辑表达式,如果表达式的计算结果为逻辑真(非0),则执行语句;反之,则不执行这个语句。 【提示】:if后面只能跟一条语句,若if后面需要跟多条语句,则需用“”将其变成一条复合语句。 注意:条件和循环结构中要注意=和=混淆。,第一部分 语法与语义,35,双分支的if语句 if (表达式) 语句1 else 语句2 这种if 语句格式的含义是:如果if后面的表达式求值结果为非0,则执行语句1,否则执行语句2。同样要求语句1和语句2是一条语句。,第一部分 语法与语义,36,if语句的嵌套 if条件语句嵌套时,else语句总是与最近的、同一块内的,没有与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. 以下程序段的输出结果是_。 int a=1,b=3,c=5; if(c=a+b)cout“yes” else cout“no”;,第一部分 语法与语义,37,2.开关语句(switch) switch语句也称开关语句、多重选择语句。一般用于“根据一个量的多种不同取值实现程序的执行流程的多个分支”。用switch语句可以避免if-else多层嵌套造成的书写错误,方便程序阅读。 注意:语句格式、语法和break语句的作用。,第一部分 语法与语义,38,【提示】:a.各个case(包括default)分支出现的次序可以任意; b. case分支是开关语句的入口,其后面的语句序列可以是一条语句,也可以是多条语句。 c. break语句是可选的,当所执行的case分支没有break,则继续往下执行其他分支的语句序列,直到遇到break语句或switch语句的关括号“”为止。 d. case后的常量表达式需为整型常量,取值可为整型、字符型或枚举型。,第一部分 语法与语义,39,例:执行语句序列 int n; scanf(“%d”, 时,若键盘输入1,则屏幕显示 A)1 B)2 C)3 D)12,第一部分 语法与语义,40,3.循环结构语句 C语言循环结构语句有:while()、dowhile()、和for()三种循环语句。,第一部分 语法与语义,41,while循环语句 while语句格式为:while (表达式) 语句 其中,表达式可以是任意合法的表达式,是循环的控制条件,语句是重复执行的循环体,可以是C语言的一条语句,也可以是C语言的一条复合语句。 while语句的执行过程是:先判断表达式的值,若表达式的值为逻辑真(非0),则进入循环执行循环体,然后自动回到循环控制条件的判断点,计算表达式的值,并重复以上的过程,直到表达式的值为假(或为0)为止。,第一部分 语法与语义,42,学习循环的方式方法: 循环的三个要素: 寻找重复执行部分; 循环的条件; 进入循环前的初始化。,第一部分 语法与语义,43,do while 循环语句 do while语句的格式为: do 语句 while (表达式) do while循环的执行过程是先执行循环体语句,后判断循环条件表达式的值。表达式的值为真,继续执行循环,表达式的值为假,则结束循环。因此,do_while循环保证了循环体语句至少执行一次。,第一部分 语法与语义,44,for循环语句 for循环语句的格式为: for (表达式1;表达式2;表达式3) 语句 其中表达式1称为循环初值表达式,表达式2称为控制表达式(循环终值表达式),表达式3称为增量表达式,语句序列为任意合法的一条C语言语句或复合语句。 【提示】:for语句中3个表达式都可以省略,但两个分号不能省略。表达式1可以放在for语句之前,表达式3可以放在循环体中。表达式2也可省略。如果表达式2省略,表示循环条件恒成立。,第一部分 语法与语义,45,例:1. 下列关于“for(e1;e2;e3)s1;”的描述中不正确的是_。 A存在“for(;)s1;”的情况 B表达式e1和e3可为空,但e2不能为空 C表达式e2的值可增可减 D循环体s1可以为空,但分号(;)必须有 2. 以下循环语句的循环体的执行次数为_。 for(int s=0,j=1;j=10;s+=j);j+; 3.循环语句:“for(int x=0,y=0;y!=100|x10;)x+;”, 执行的循环次数是_。 A. 无限次 B. 10 C. 11 D. 100,第一部分 语法与语义,46,4. 分析程序的运行结果: #include void main(void) int n=0,m=0; for(int i=0;i=i)n+;m+; printf(“%dn%dn”,n,m); ,第一部分 语法与语义,47,break语句 在switch语句中,break语句终止当前所在的case语句表,从而也就终止了整个switch语句。 在循环语句中,break语句可以提前结束该语句所在的循环。在嵌套循环中,break终止的是其所在的循环语句,而并非终止所有的循环。,第一部分 语法与语义,48,continue 语句 continue语句用来终止本次循环。当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环,并根据循环控制条件决定是否再次执行循环。 在循环语句的循环体中如果执行到continue语句,则跳过循环体中continue语句的后续语句,将控制转移到下一轮循环。,第一部分 语法与语义,49,例:1. 有如下程序段: int sum=0,i; for(=1;10;+) if(i%3=0)break; sum+=i; printf(“sum=%dn”,sum); 把break改为continue分析结果。,第一部分 语法与语义,50,2. 以下程序运行后的输出结果是_。 #include void main() int k=4,n=0; for(;nk;) n+; if(n%3!=0)continue; k-; coutk,n; ,第一部分 语法与语义,51,3.在给定范围内查找k使得用公式k2+k+17生成的整数满足以下条件:该数的十进制表示中低3位数字相同,去掉低3位后的整数是回文数。例如,当k=461时用公式生成的整数是212999,该数满足所给条件。,第一部分 语法与语义,52,五、数组 在结构化程序设计中,数组是组织数据的最重要、最有效手段。很多算法和编程技巧都是建立在数组的基础之上的。 数组是有序的相同类型数据的集合。数组的特征是:数组名;数组类型(也就是数组各元素的类型);维数(即标识数组元素所需的下标个数);数组大小(即可容纳数组元素的个数)。,第一部分 语法与语义,53,1. 一维数组 一维数组的定义与初始化 一维数组也称向量,它是由具有一个下标的数组元素组成的数组,它的定义形式为: ; 数组定义时,说明数组大小的表达式必须是常量表达式。数组定义时,没有初始化时,静态或全局数组为0,其他的是不确定的值。当只对部分元素初始化时,其余元素为0。初始化时,初始化值个数不能多于数组元素个数。,第一部分 语法与语义,54,第一部分 语法与语义,例: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”,55,第一部分 语法与语义,例:3. 下列数组定义中错误的是_。 A. int a4=0,1,2,3; B. int a=0,1,2,3,4; Cint a4=0,1,2,3,4; Dint a4=0;,56,一维数组的引用 引用数组元素的语法格式为: 其中,是非负的整型表达式,也就是数组的下标,数组下标是用来指定所要访问的数组中的元素的位置。提示:数组下标范围是从0开始的到数组的大小-1。 如:int a10;则数组下标范围是09。 数值数组不能整体输入/输出,也不能整体引用,包括数组之间的赋值。,第一部分 语法与语义,57,2. 二维数组 二维数组的定义与初始化 二维数组对应数学中的行列式或矩阵。定义二维数组的一般格式为: ; 二维数组中的每个元素要用两个下标来表示,规定表示为二维数组的行下标的大小,表示为二维数组的列下标的大小。,第一部分 语法与语义,58,二维数组元素的表示方法为: ; 提示:两个下标的取值范围都从0开始。在C语言中,二维数组在计算机中的存储顺序是按行顺序存储的,即先存储第1行元素,然后再存储第2行元素,依次类推。,第一部分 语法与语义,59,例:1.对二维数组a进行正确初始化的是 。 Aint a23=1,2,3,4,5,6; Bint a3=1,2,3,4,5,6; Cint a2=1,2,3,4,5,6; Dint a2=1,2,3,4; 2. 设int b5=1,2,3,4,5,6,7;,则元素b12的值是 。 A. 0 B. 2 C. 6 D. 7,第一部分 语法与语义,60,3.数组应用-排序和查找 排序和查找是建立在数组基础上的最重要的算法。排序的算法很多,最基本而常用的算法是选择排序法和冒泡排序法。 查找是在排序的基础上进行的。基本的查找方法有顺序查找和折半查找两种方法。,第一部分 语法与语义,61,【例】 :在一个有10个元素的数组a中找出值最大的元素及其位置。 分析:这里采用“打擂台”算法。 1、设置一个擂台(变量max),先将一个数(通常是a0)放在擂台上(max=a0); 2、用下一元素(a1)与擂台上的数(max)进行比较,大者留台上。 3、将第三个元素(a2)再与台上的数比较,同样是大者留台上。 4、如此比下去直到所有的数(a1a9)都上台比过为止。最后留在台上的就是大者。,62,#include void main() int i,j,max,a10=6,9,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); ,63,【例】用冒泡排序法对n个整数进行升序排序。 注意:元素的序号从0开始,程序如下: for (i=0; ii; j-) if (ajaj-1) t=aj; aj=aj-1; aj-1=t; ,64,#include void main() int a10=12,5,34,26,18,8,4,22,9,15; int n=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”); ,65,【例】用选择排序法对10个整数进行升序排序。 #include void main() int a10=12,5,34,26,18,8,4,22,9,15; int n=10,i,j,t; for (i=0; iaj) t=ai;ai=aj;aj=t; for (i=0; in-1; i+)printf(“%dt”,ai); printf(“n”); ,66,【例】用顺序查找法在数组中查找指定的元素。 #include void main() int a10=12,5,34,26,18,8,4,22,9,15; int x,i,n=10; scanf(“x=%d”, ,67,【例】在具有10个元素的数组中,用二分查找法(也称折半查找法)在数组中查找指定的元素。 分析:二分法查找要求数组元素是有序的。 二分法查找基本思路是(以升序为例):在一个区间l,r中计算中点位置m=(l+r)/2,如果am就是要查找的x,则查找成功!,68,#include void main() int y10=5,7,8,14,25,36,44,50,69,80; int i,n,m,x;scanf(“输入要查找的数:%d”, ,69,4.字符数组 字符数组可以整个字符串一次输入/输出(使用数组名),但在使用数组名整体一次输出时,注意字符串结束符0。 在实际操作时,要特别注意字符串中有无字符转义序列。,第一部分 语法与语义,70,例:1.以下程序运行后的输出结果是_。 main() char a7=“a00a00”;int i,j; i=sizeof(a);j=strlen(a); printf(“%d %d”,i,j); char a=“a1231230ef”;,第一部分 语法与语义,71,2.在自动类型数组初始化时,若初始化的元素比数组的元素少,则其余元素初始化为: ; “int a3=3;”则a2 ; “int a3=1,3,5,7;”则会 ; “int a3;”则a2的值 。 3.设有下列语句序列: 。 int x;scanf(“%d”, /B A.z的值为4 B.z的值为3 C.B行语句错 D. A行语句错,第一部分 语法与语义,72,4.要定义数组A,使得其中每个元素的数据依次为:3、9、4、8、0、0、0,错误的定义语句是: A. int A=3,9,4,8,0,0,0; B. int A7=3,9,4,8,0,0,0; C. int A=3,9,4,8; D. int A7=3,9,4,8;,第一部分 语法与语义,73,六、函数 1. 函数的基本知识 (1).函数定义 函数定义时,有返回值要注意函数的返回值类型与return语句后的表达式类型相一致,函数没有返回值时(void),则用 return ;语句。 函数可以嵌套调用,但不可以嵌套定义。在一个函数的函数体中定义另一个函数是非法的。,第一部分 语法与语义,74,(2).函数调用 调用函数时,实参和形参要求一一对应。 函数调用有两种:作为表达式的函数调用和函数调用语句。对于没有返回值的函数调用只能通过函数调用语句实现。 (3).函数调用参数传递 参数传递有三种:值传递、地址传递和引用传递。,第一部分 语法与语义,75,(4).作用域(难点)与存储类 在C+中,作用域共分为五类:块作用域;文件作用域;函数原型作用域;函数作用域;类作用域。 局部变量:在一个函数内部定义的变量或在一个块中定义的变量称为局部变量。 全局变量:在函数外定义的变量或用extern说明的变量称为全局变量。全局变量的作用域称为文件作用域,即在整个文件中都可以访问。,第一部分 语法与语义,76,(1)设有函数定义调用语句“f(e1,e2),(e3,e4,e5);”,则实参个数是 A 。 (A) 2 (B) 3 (C) 4 (D) 5 (2)下列函数中对调用它的函数没有起到任何作用的是 C 。 (A) void f1(double ,第一部分 语法与语义,77,(3)以下程序输出的第一行是 0 1 2 3 4 第二行是 15 。 #include (作用域) int k; void main(void) k=10; for(int i=0;i5;i+) int k;k+=i; /由于重新定义变量k,所以就有不同的作用域 coutk ;k+;:k+; coutnkn; ,第一部分 语法与语义,78,2. 递归函数 在利用递归方法求值时,必须注意三点: 1.递归的公式; 2.递归的结束条件; 3.递归的约束条件。 关键是找到递归公式和递归的结束条件。 递归函数在调用时分两部分:递推和回归。,第一部分 语法与语义,79,(1).以下程序的输出结果是(vrg )。 #include void func2(int i); char s=“verygood!” void func1(int i) coutsti;if(i3)i=+2;func2(i); void func2(int i) coutsti;if(i3)i=+2;func1(i); void main() int i=0;func1(i);,第一部分 语法与语义,80,(2).以下程序的输出结果是( 15 )。 #include long fib(int n) if(n2) return(fib(n-1)+fib(n-2); else return 5*n; void main() coutfib(3);,第一部分 语法与语义,81,(3)以下程序输出的第一行是 1 1 第二行是 4 1 最后一行是 x=10 。 #include void fun(int n,int *s) int f1,f2; if(n=1|n=2)*s=1; else fun(n-1,第一部分 语法与语义,82,(4)以下程序输出的结果是 dcba 。 #include void show(char *s) if(*s)show(s+1);cout*s; void main(void) show(“abcd0efg0hij”); coutn;,第一部分 语法与语义,83,(5)以下程序输出的第一行是 123 第二行是 321 第三行是 123 。 #include void p1(char s,int i) if(si!=0)p1(s,i+1); coutsi; void p2(char s,int i) coutsi; if(si!=0)p2(s,i+1); void main(void) char str=”123”;coutstrn; p1(str,0);coutn; p2(str,0);coutn;,第一部分 语法与语义,84,3.重载函数 定义的重载函数必须具有:相同的函数名但具有不同的参数个数或不同的参数类型。 调用重载该函数时,将根据实参的数据类型和重载函数的形参匹配,确定调用其中的一个重载函数。,第一部分 语法与语义,85,4.静态变量 静态类型变量有确定的初值。静态类型变量对全局变量和局部变量有不同的含义。 静态类型变量只能初试化一次。当局部变量使用静态类型变量时,其作用将保存函数的运行结果,以便下次调用函数时,能继续使用上次计算的结果。但不在变量的作用域时,不能直接使用,确需使用时,可通过变量的地址取值(即指针)。 当全局变量使用静态类型变量时,表示所说明的变量仅限于这个源程序文件内使用。,第一部分 语法与语义,86,(1)以下程序输出的结果是 i=105 i=110 。 #include int t() static int i=100; i+=5; return i; void main(void) cout“i=“t()n; cout“i=“t()n; ,第一部分 语法与语义,87,(2)以下程序输出的结果是 i=105 105 i=105 110 。 #include int t(int *p) static int i=100;*p= ,第一部分 语法与语义,88,(3)以下程序输出的第一行是 20 ,第二行是 400 。 #include int f(int x) static int u=1; x+=x;return u*=x; void main(void) int x=10; coutf(x)n;coutf(x)n;,第一部分 语法与语义,89,(4)以下程序输出的第一行是 21 ,第二行是 53 。 #include int f(void) static int a,b=10,c=1; a+=b;b+=c;return c=a+b; void main(void) coutf()n;coutf()n;,第一部分 语法与语义,90,5. 编译预处理指令 编译预处理指令包括三方面的内容:文件包含、宏指令和条件编译,其重点是宏指令-带参数的宏定义。 注意:在宏调用时,将不作任何语法检查,也不做任何计算,只作简单替换。,第一部分 语法与语义,91,(1)若有宏定义: #define N 2 #define Y(n) (N+1)*n) 则执行语句“z=2*(N+Y(N+2);”后,z的值为 20 。 (2)若有宏定义: #define T(x,y,z) x*y*z/4 则表达式“z=T(3+4,2*4,4+4);”后,z的值为 132 。,第一部分 语法与语义,92,(3)若有宏定义: 则 D 。 #define M(a,b) a*b; /E int x=M(3+4,5+6),y; /F y=M(3,4); /G A.编译时,E行语法错 B.编译时,F行语法错 C.编译时,G行语法错 D.编译时,F行和G行语法错 (4)若有宏定义: #define P(x,y) x/y #define PP(a,b) a*b int c=P(2+3,2+3)+PP(2+3,2+3);则c的值为 17 。,第一部分 语法与语义,93,(5).编译以下程序时,结果是 B 。 #include /第1行 #define aa 123; /第2行 void main(void) /第3行 coutaan; /第4行 A.编译时第2行出错 B.编译时第4行出错 C.编译时第2,4行出错 D. 编译时无错误,第一部分 语法与语义,94,六、指针、引用和函数 1.指针 指针变量的访问有两种形式:访问指针变量的值和访问指针的内容。 指针可执行的运算有三种:赋值运算、关系运算和算术运算。 指针变量+,-,*,&之间的混合运算, *p1+、*+p1、(*p1)+、+*p1 。,第一部分 语法与语义,95,2. 指针和一维数组 假设有:int a10,*point;point=总结: (1).数组名等同于数组的第0个元素的地址,也是数组的起始地址。 (2).当指针变量point指向数组a的第0个元素后,则point+i等同于a+i,为ai的地址。 (3).当指针变量point指向数组a的第0个元素后,则*(point+i)、*(a+i)、ai、pointi和*&ai都表示元素ai。 注意:point+允许,但a+不允许。,第一部分 语法与语义,96,3.指针与二维数组 要注意区分元素地址和行地址。 例:假设有数组:int a44,*point; 第0行第0列的元素地址:a0,&a00, *&a0,*a 等。 第0行的行地址:&a0,a 等。 Point指针变量只能存放元素地址值。,第一部分 语法与语义,97,(1)以下程序输出的第一行至第三行分别是 1 1 2 、 3 5 8 、 13 21 34 。 #include void f(int *q1,int *q2,int *q3) *q3=*q1+*q2; void main(void) int i,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; ,第一部分 语法与语义,98,4. 指向数组的指针 对于一个m列的二维数组,我们可以定义一个指向它的指针:“int (*p)m; ”。然后就有:“p=a; ”。这里的指针p称为“指向数组的指针”(也称指向数组的指针变量)。 定义指向数组的指针的一般形式为: (*),第一部分 语法与语义,99,【例】使用指向数组的指针输出数组中的元素。 void main() int a34=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;j4;j+) printf(“%dt”,*(*(p+i)+j); printf(“%dt”, *(pi+j); printf(“%dt”, *(*(a+i)+j); printf(“%dt”, *(ai+j); ,100,【例】将两个整数按从小到大的顺序输出。 void exchang(int *p1,int *p2) /指针作形参 int p; p=*p1;*p1=*p2;*p2=p; /p1、p2所指向的实参变量交换数据 void main() int a,b; cinab; if(ab)exchang( ,实参为地址,输入数据:9 4 运行结果:4 9,101,4.指针和字符串 当字符串和指针结合在一起,使用起来就特别灵活。在各类考试中经常会出现相关的题目。 (1)(完善程序题)以下程序的功能是:输入两个字符串,把这两个字符串拼成一个新的字符串,输出拼接后的字符串。,第一部分 语法与语义,102,第二部分 结构化程序设计,(1)(完善程序题)以下程序的功能是:输入两个字符串,把这两个字符串拼成一个新的字符串,输出拼接后的字符串。 #include char *stringcat(char *to,char *from)/实现拼接 char *p= to ; /把form拼接到to后面 while(*to+); to- ; while( *to+ =*from+) ;return p; ,103,(2)下列程序中函数insertstr的功能是:在字符串str中所有出现子串str1的后面插入子串str2。如本程序的输出为:“I am a student too.You are a student too.He is a student too.” #include #include char *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;,104,while(*p!=0) p1=p;q1=str1; while(*p1=*q1,105,5. 引用 引用是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 定义引用的一般格式: &=; “目标变量名”必须是已经定义过的变量或引用。符号“&”在不同的场合有不同的含义。在数据声明时(如int &a),“&”意为引用,若“&”前无类型符,则是取变量的地址(如int a,*p=&a)。,第一部分 语法与语义,106,6.参数传递 方式有值传递、地址传递和引用传递三种。怎么理解参数传递呢? 前期知识回顾 计算机内存单元、地址与数据,第一部分 语法与语义,107,理解C语言中,最简单的语句: int a=10;,第一部分 语法与语义,108,形参与实参的对应关系 假设:主调函数中有定义:int x=10,*p=,109,参数不同传递方式对结果的影响 #include int f1(int a) a+;return a; int f2(int *a)(*a)+;return *a; int f3(int *a)a+;return *a; int f4(int ,10,11 11,11 10,20 11,11,110,第一部分 语法与语义,七、 结构体 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。,111,第一部分 语法与语义,1. 结构体类型说明 声明一个结构体类型的一般形式为 struct 结构体名 成员表列 ;,112,第一部分 语法与语义,2. 结构体类型变量定义 定义结构体类型变量的方法 先声明结构体类型再定义变量名 struct student int num; char name20; char sex; ;,113,第一部分 语法与语义,声明结构体类型时定义变量名 struct student int num; char name20; char sex; stu1,stu2; 直接定义结构体变量 struct int num; char name20; char sex; stu1,stu2;,114,第一部分 语法与语义,3. 结构体类型变量引用 在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则: (1) 不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义student1和student2为结构体变量并且它们已有值。不能这样引用: printf (“%d,%s,%c,%d,%f,%sn“,student1); 只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为: 结构体变量名.成员名,115,4. 指针和链表 要掌握指针和链表,对相关语句所实现的功能必须非常明确。设有结构体说明: 需要黑板画图说明 struct Nodeint data,Node *next; Node *p1,*p2; p1=new Node;/产生一个新结点 p2=p2-next;/p2指针指向下一个结点 p2-next=p1; /把p1指向的新结点连到p2结点的后面,第一部分 语法与语义,116,例1:设h1和h2分别为两个单链表的头指针,链表中结点的数据结构为: typedef struct node intdata; struct nodenext; NODE; sea_del函数的功能是:删除h1指向的链表中首次出现的与h2指向的链表中数据完全匹配的若干个连续结点,函数返回h1指向链表的头指针。 例如,初态下,h1指向链表和h2指向链表如下图所示:,第一部分 语法与语义,117,试完善函数sea del以达到要求的功能。,118,NODE sea_del(NODE *h1,NODE *h2) NODE *p,*ph,*q,*s; ph=NULL;p=q=h1;s=h2; if(h1=NULL|_h2=NULL_)return h1; while(p!=NULL ,119,例2:设结点的数据结构定义如下: struct PNODE i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论