C语言教学课件:C语言期末考试复习资料

上传人:公**** 文档编号:589853811 上传时间:2024-09-11 格式:PPT 页数:122 大小:702.50KB
返回 下载 相关 举报
C语言教学课件:C语言期末考试复习资料_第1页
第1页 / 共122页
C语言教学课件:C语言期末考试复习资料_第2页
第2页 / 共122页
C语言教学课件:C语言期末考试复习资料_第3页
第3页 / 共122页
C语言教学课件:C语言期末考试复习资料_第4页
第4页 / 共122页
C语言教学课件:C语言期末考试复习资料_第5页
第5页 / 共122页
点击查看更多>>
资源描述

《C语言教学课件:C语言期末考试复习资料》由会员分享,可在线阅读,更多相关《C语言教学课件:C语言期末考试复习资料(122页珍藏版)》请在金锄头文库上搜索。

1、2009级级20092009年年1212月月为了同学们集中精力复习为了同学们集中精力复习特编制了本大纲特编制了本大纲大纲包含了需要牢牢掌握的基大纲包含了需要牢牢掌握的基本概念和重点内容本概念和重点内容. .考试的主要题型和分数分布:1 1 单项选择题单项选择题(20(20小题小题, ,每题每题2 2分分, ,共共4040分分) )2 2 填空题填空题( (每空每空1 1分分, ,共共3030分分) )3 3 改错和看程序写结果改错和看程序写结果( (共共1010分分) )4 4 编写和完成程序编写和完成程序(5(5小题小题, ,每题每题4 4分分, ,共共2020分分) )第一章第一章 第第1

2、 1章章 C C语言概述语言概述本章包含本章包含4 4项目重点内容项目重点内容: :1 简单的C语言程序#include void main()printf (This is a C program.n); 2 VC+ 6.0 环境:(1)编辑C语言源程序 后缀是 .c 或 .cpp(2)经过编译产生目标文件,后缀是 .obj(3)再经过连接成为可执行文件,后缀 是 .exe3 C语言是结构化程序,有三种结构(1)顺序结构;(2)选择结构;(3)循环结构;4 C语言是由函数组成的,其中必须有一个并且只有一个主函数 main,程序的执行从main 函数开始,到main 函数结束. .第二章第二章

3、 C C的数据类型的数据类型C语言提供了以下一些数据类型。 数据类型数据类型构造类型构造类型指针类型指针类型空类型(空类型(无值类型)无值类型) voidvoidvoidvoid枚举类型枚举类型枚举类型枚举类型 enumenumenumenum数组类型数组类型数组类型数组类型结构类型结构类型结构类型结构类型 structstructstructstruct联合类型联合类型联合类型联合类型 unionunionunionunion基本类型基本类型整型整型整型整型 intintintint字符型字符型字符型字符型 charcharcharchar实型(浮点型)实型(浮点型)实型(浮点型)实型(浮点

4、型)单精度实型单精度实型单精度实型单精度实型 floatfloatfloatfloat双精度实型双精度实型双精度实型双精度实型 doubledoubledoubledouble 常量与变量常量与变量 常量和符号常量常量和符号常量在程序运行过程中在程序运行过程中, ,其值不能被改变的量称为常量其值不能被改变的量称为常量常量区分为不同的类型:常量区分为不同的类型:整型整型 100100,125125,-100-100,0 0实型实型 3.14 3.14 , 0.1250.125,-3.1e3-3.1e3字符型字符型 a a, ,057057,x3cx3c字符串字符串 “a a”, , “a ab

5、b”,”12321232”定义常数:定义常数:#define PI 3.1415926#define PI 3.1415926#define N 20#define N 20 变量命名的规定:变量命名的规定:语言规定标识符语言规定标识符: :1 1 只能由字母、数字和下划线三种字符组成只能由字母、数字和下划线三种字符组成; ; ( (注意不要混淆下划线注意不要混淆下划线_ _和杠号和杠号( (减号)减号)-)-)2 2 第一个字符必须为字母或下划线第一个字符必须为字母或下划线; ;3 3 不能使用关键字不能使用关键字. . 例:例:sumsum,_123 , m123, Student_nam

6、e1_123 , m123, Student_name1 12a,Jo-hn, 12a,Jo-hn, ¥123,a#b, 123,a#b, intint 整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数整型常量即整常数。在语言中,整常数可用以下三种形式表示:可用以下三种形式表示:(1)(1)十进制整数。十进制整数。 如:如:123, -456123, -456(2)(2)八进制整数。以八进制整数。以0 0开头的数是八进制数。开头的数是八进制数。 如:如:01230123表示八进制数表示八进制数123123,等于十进制数,等于十进制数8383 0129 0129 非法(每

7、位非法(每位0-70-7合法合法) )(3)(3)十六进制整数。以十六进制整数。以0x0x开头的数是开头的数是1616进制数。进制数。 如:如:0x1230x123,代表,代表1616进制数进制数123,123,等于十进制数等于十进制数291291 而而 0x12g 0x12g 非法(每位非法(每位0-f0-f合法合法) 字符型数据字符型数据 字符常量(1)用单引号包含的单个字符(2)用单引号包含的由开始的转义字符a a, ,A A, , 1 1, ,037037, ,x2dx2dabcabc,“a a”,082082, ,x5gx5g 字符串常量字符串常量字符串常量是一对字符串常量是一对双引

8、号双引号括起来的字符序列括起来的字符序列. .合法的字符串常量合法的字符串常量: :“How do you do.How do you do.”, , “CHINACHINA”, “a a” , “$123.45$123.45”可以输出一个字符串,如可以输出一个字符串,如printf(printf(“HowHow do you do. do you do.”) );运算符简介运算符简介 的运算符有以下几类:的运算符有以下几类:(1)(1)算术运算符算术运算符 (+ - * / %+ - * / %)(2)(2)关系运算符关系运算符 ( ! !)(3)(3)逻辑运算符逻辑运算符 (!(! |)(

9、4)(4)位运算符位运算符 ( | | )(5)(5)赋值运算符赋值运算符 (及其扩展赋值运算符)(及其扩展赋值运算符)(6)(6)条件运算符条件运算符 (?:)(?:)算术运算符和算术表达式算术运算符和算术表达式 基本的算术运算符基本的算术运算符: : (加法运算符或正值运算符如(加法运算符或正值运算符如: :、)、) (减法运算符或负值运算符(减法运算符或负值运算符, ,如如: :、)、)* * (乘法运算符。如(乘法运算符。如: :* *) (除法运算符(除法运算符, ,如果是两边是整数则是求商)如果是两边是整数则是求商) (求余运算符,两侧必须为整型数据(求余运算符,两侧必须为整型数据

10、) ) 自增、自减运算符自增、自减运算符 作用是使变量的值增或减作用是使变量的值增或减如如: ,(在使用之前,使,(在使用之前,使+1 +1 或或-1) -1) ,(在使用之后,使,(在使用之后,使+1 +1 或或-1)-1) 就是使用就是使用 i i 的原值执行本条语句的原值执行本条语句, , 而在执行下条语句前将而在执行下条语句前将 i+1 i+1 或或-1-1 intint m=5,n=10; m=5,n=10; printf(%d,%dn,m+,-nprintf(%d,%dn,m+,-n);); 显示显示5,9 5,9 若再有:若再有: printf(printf(“%dn%dn”,m

11、,m); ); 显示显示6 6赋值运算符赋值运算符 赋值符号赋值符号“”就是赋值运算符,它的作用是就是赋值运算符,它的作用是将一个数据赋给一个变量将一个数据赋给一个变量, ,如如a=5;a=5;(单等号)(单等号)而而 a=5 a=5 是判断是判断 a a是否等于是否等于 5; 5; (双等号)(双等号)如如 intint a=3; a=3; if(aif(a=2) =2) 为假,为假, 而而 if(aif(a=5) =5) 为真。为真。第三章第三章 C C语句概述语句概述C程序源程序文件1源程序文件2源程序文件n预处理命令函数n函数1数据声明函数首部函数体数据声明执行语句 C C语句概述语句

12、概述 控制语句 完成一定的控制功能1 if() else 条件条件语句语句 6 break 间断语句间断语句 2 for() 循环循环语句语句 7 switch() 开关语句开关语句3 while()循环循环语句语句 8 goto 转向语句转向语句 4 do while();循环循环语句语句 9 return 返回语句返回语句5 continue 继续继续语句语句 格式输入与输出格式输入与输出(一).格式输出函数函数作用:向终端(或系统隐含指定的输出设备)函数作用:向终端(或系统隐含指定的输出设备)输出输出若干个任意类型若干个任意类型的数据。的数据。一般格式:一般格式:printfprintf

13、(格式控制,输出表列)(格式控制,输出表列)%d%d: :以带符号的十进制形式输出整数以带符号的十进制形式输出整数%o%o: :以八进制无符号形式输出整数以八进制无符号形式输出整数%x%x: :以十六进制无符号形式输出整数以十六进制无符号形式输出整数 格式输入与输出格式输入与输出 %u%u: :以无符号十进制形式输出整数以无符号十进制形式输出整数%c%c: :以字符形式输出,只输出一个字符以字符形式输出,只输出一个字符%s%s: :输出字符串输出字符串%f%f: :以小数形式输出单,双精度数,隐含输出六位小数以小数形式输出单,双精度数,隐含输出六位小数%e%e: :以指数形式输出实数以指数形式

14、输出实数%g%g: :选用选用%f%f或或%e%e格式中输出宽度较短的一种格式,不输格式中输出宽度较短的一种格式,不输 出无意义的出无意义的0 0 格式输入与输出格式输入与输出 用printf 和scanf函数输出和输入数据。#includevoid main()int a,b,c;scanf(“%d,%d,%d”,&a,&b,&c);printf(“%d,%d,%dn”,a,b,c); 运行情况:运行情况:3 3,4 4,5 (5 (输入输入a,b,ca,b,c的值的值) )3 3,4 4,5 5 (输出(输出a,b,ca,b,c的值)的值)a a在内存中的地在内存中的地址址& &是地址运算

15、符是地址运算符 在格式输入与输出中在格式输入与输出中格式控制是用双引号包括的格式控制是用双引号包括的, ,其中一般带有其中一般带有% %d,%c,%f,%sd,%c,%f,%s等各种对数据类型的要求等各种对数据类型的要求. .第四章第四章 关系运算符和关系表达式关系运算符和关系表达式1.关系运算符及其优先次序1. (小于)2. (大于)4.= (大于或等于)5.= (等于)6.!= (不等于)优先级相同(高)优先级相同(高)优先级相同(低)优先级相同(低)说明:说明:关系运算符的优先级低于算术运算符关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符关系运算符的优先级高于赋值运算符

16、 关系运算符和关系表达式关系运算符和关系表达式 2.关系表达式关系表达式用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或 关系表达式,逻辑表达式,赋值表达式,字符表达式)关系表达式,逻辑表达式,赋值表达式,字符表达式) 接起来的式子,称关系表达式接起来的式子,称关系表达式例:例:ab,a+bb+c,(a=3)(b=5),ab,a+bb+c,(a=3)(b=5),a a b)(bb)(bbab”的值为的值为“真真”,表达式的值为,表达式的值为1 1。C C语言中没有专用语言中没有专用的逻辑值,的逻辑值,1 1代表代表真,真,0 0代表假代表假 逻辑运算符和

17、逻辑表达式逻辑运算符和逻辑表达式1.1.逻辑运算符及其优先次序逻辑运算符及其优先次序(1)& (1)& (逻辑与逻辑与) ) (2)| (2)| (逻辑或逻辑或) ) (3)! (3)! (逻辑非逻辑非) ) 优先次序:优先次序: 逻辑非逻辑非! ! 算术运算符算术运算符 关系运算符关系运算符 逻辑与或逻辑与或 赋值运算符赋值运算符 或运算中有或运算中有1 1,值为,值为1 1,与运算中有,与运算中有0 0,值为,值为0 0 ifif语句语句 2.If2.If语句的嵌套语句的嵌套在在ifif语句中又包含一个或多个语句中又包含一个或多个ifif语句称为语句称为ifif语句的嵌套。语句的嵌套。形式

18、:形式:if()if()if() if() 语句语句1 1else else 语句语句2 2elseelseif() if() 语句语句3 3else else 语句语句4 4内嵌内嵌ifif ifif语句语句 如如 intint a=3,b=4,c=5; a=3,b=4,c=5;if(aif(ab) b) b) a=a=b b;b;b= =c;cc;c=a;=a;那么那么a,b,ca,b,c 是是 3 3,5 5,3 3第第1 1个,因为个,因为ab,amax=(ab?a:bb?a:b; ;min=(amin=(ab)a:bb)a:b; ; ifif语句语句 例例: : 输入一个字符,判别它

19、是否大写字母,如果是,将输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。得到的字符。 #include #include void main ( ) void main ( ) char char chch; ; scanf(“%cscanf(“%c”,& ”,& chch);); chch= =(A=(A=ch&chch&ch=Z)?(ch+32):ch;=Z)?(ch+32):ch; printf(“%cn”,chprintf(“%cn”,ch);); /注意注意: :不能用不能用 A=

20、A=chch=Z,=Z,它永远为真它永远为真如果字符变量ch的值为大写字母,则条件表达式的值为(),即相应的小写字母。如果ch的值不是大写字母,则条件表达式的值为,即不进行转换。 几个典型的判断几个典型的判断: :判断大写字母:判断大写字母:if(if(A A=c & c=c & c=Z Z) )判断小写字母:判断小写字母:if(if(a a=c & c=c & c=z z) )判断数字:判断数字:if(if(0 0=c & c=c & c=9 9) )判断闰年:判断闰年:if(year%4=0&year%100!=0)|year%400=0)if(year%4=0&year%100!=0)|

21、year%400=0)注意:例如在判断数字中:注意:例如在判断数字中:if(if(0 0=c & c=c & c=9 9) )不可以没有不可以没有 & & ,也不能没有,也不能没有 即不能用即不能用 if(if(0 0= c= c=9 9) )也不能用也不能用 if( 0=c & c=9 )if( 0=c & c=9 )但可以用但可以用 if( 48=c & c=57 )if( 48=c & c=57 )(想想为什么?(想想为什么? )第五章第五章 用用whilewhile语句实现循环语句实现循环whilewhile语句用来实现语句用来实现“当型当型”循环结构。循环结构。一般形式:一般形式:

22、while (while (表达式表达式) ) 语句语句 当表达式为非当表达式为非0 0值时,执行值时,执行whilewhile语句中的语句中的内嵌语句。其特点是内嵌语句。其特点是: :先判断表达式,后执行先判断表达式,后执行语句。语句。 求正整数求正整数m m和和n n的最大公约数和最小公倍数:的最大公约数和最小公倍数:#include #include void main()void main() intint p,r,n,mp,r,n,m; ; printfprintf(请输入两个正整数请输入两个正整数n,mn,m:);:); scanf(%d,%d,&n,&mscanf(%d,%d,&

23、n,&m); ); p=n*m; p=n*m; while(mwhile(m!=0)!=0) r= r=n%mn%m; n=m; m=r; n=m; m=r; printfprintf(它们的最大公约数为它们的最大公约数为:%:%dn,ndn,n);); printf(printf(它们的最小公倍数为它们的最小公倍数为:%dn,p/n:%dn,p/n);); 其中用下面的辗转相除法求出最大公约数其中用下面的辗转相除法求出最大公约数n n while(mwhile(m!=0)!=0)r=r=n%mn%m; n=m; m=r; n=m; m=r; 把它独立出来就是一个函数把它独立出来就是一个函数i

24、ntint hcf(inthcf(int m,intm,int n) n) intint r; r;w while(mhile(m!=0)!=0)r=r=n%mn%m; n=m; m=r; n=m; m=r; return (n); return (n);用用 p/np/n 得到得到最小公倍数最小公倍数 用用do-whiledo-while语句实现循环语句实现循环 do-whiledo-while语句的特点语句的特点: :先执行循环体,然后判断循先执行循环体,然后判断循环条件是否成立。环条件是否成立。 一般形式一般形式: : do do 循环体语句循环体语句 while ( while (表达

25、式表达式) );执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。例如例如: :为了保证输入成绩的正确为了保证输入成绩的正确, ,可以使用语句可以使用语句: : printfprintf(请输入学生成绩请输入学生成绩a(0-100):);a(0-100):); scanf(%d,&ascanf(%d,&a););while (a100)while (a100) printf(nprintf(n 输入有误输入有误, ,请重输请重输: );: );scanf(%d,&ascanf(%d,

26、&a);); 我们更简洁地用我们更简洁地用do-whiledo-while语句语句do do printfprintf( (“请输入成绩请输入成绩 a a(0-1000-100): :”);); scanf(scanf(“%d%d”,&a,&a);); while(awhile(a100);100); 注意注意 while(awhile(a100);100);的含义和的含义和; ;号号 用用do-whiledo-while语句计算语句计算 1010!i=1;s=1; do s=s*i=1;s=1; do s=s*i;i+;while(ii;i+;while(i=10);=10);不是:不是:i

27、=1;s=0; do s=s*i=1;s=0; do s=s*i;i+;while(ii;i+;while(i=10);=10);也不是:也不是:doidoi=1;s=1; s=s*=1;s=1; s=s*i;i+;while(ii;i+;while(i=10);=10);doidoi=1;s=0; s=s*=1;s=0; s=s*i;i+;while(ii;i+;while(i=10); =10); 用用switchswitch语句实现语句实现 ( (若若a a是整数是整数) )按照考试成绩输出等级百分制分数段按照考试成绩输出等级百分制分数段switch(switch(a a/10)/10)

28、 case 10:case 10:case 9: grade=case 9: grade=A;breakA;break; ;case 8: grade=case 8: grade=B;breakB;break; ;case 7: grade=case 7: grade=C;breakC;break; ;case 6: grade=case 6: grade=D;breakD;break; ;defaultdefault: grade=E;: grade=E; whilewhile语句和用语句和用do-whiledo-while语句的比较语句的比较: :while while 是先判断条件,再决

29、定是否执行是先判断条件,再决定是否执行, ,所以可所以可能一次也不执行能一次也不执行; ; do-while do-while 是先执行再判断条件,决定是否还执是先执行再判断条件,决定是否还执行行, ,所以至少执行一次所以至少执行一次. . 用用for for 语句实现循环语句实现循环C C语言中的语言中的forfor语句使用最为灵活,不仅可以语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的于循环次数不确定而只给出循环结束条件的情况,它完全可以代替情况,它完全可以代替whilewhile语句。语句。一般

30、形式一般形式: : for(for(表达式表达式1 1;表达式;表达式2 2;表达式;表达式3) 3) 语句语句注意注意: :forfor中用两个分号隔开中用两个分号隔开, ,不能省略不能省略; ;forfor只对其后第一个语句有效只对其后第一个语句有效, ,如果要求对多如果要求对多条语句有效条语句有效, ,必须用花括号括之成为复合语必须用花括号括之成为复合语; ;for( )for( )后通常没有分号后通常没有分号, ,有分号将不执行任有分号将不执行任何语句何语句, ,只执行自己的循环只执行自己的循环; ; 下面是下面是用用forfor语句语句显示数组显示数组a a中的最小值的程序中的最小值

31、的程序 #include #include void main( )void main( ) intint a5=4,2,8,9,5,i,min; a5=4,2,8,9,5,i,min;min=a0;min=a0;for(ifor(i=1;i5;i+)=1;i aiai) min=) min=aiai; ; printf(%dn,minprintf(%dn,min);); breakbreak语句和语句和continuecontinue语句语句 breakbreak语句语句 breakbreak语句可以用来从循环体内跳出循环体,语句可以用来从循环体内跳出循环体, 即提前结束循环即提前结束循环.

32、 . 一般形式:一般形式: break;break;注意注意: :breakbreak语句只能用于循环语句或语句只能用于循环语句或switchswitch语句中。语句中。 continue语句 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次循环的判定.一般形式: continue;例例 把把100200之间的不能被之间的不能被3整除的数输出。整除的数输出。 #include #include void main()void main() intint n; n; for (n=100;n=200;n+) for (n=100;n=200;n+) if (n%3=0) co

33、ntinue; if (n%3=0) continue; printf(%dprintf(%d,n);n); 注意是把能被3整除的跳过.不能用 n%3!=0 判断判断m是否素数。是否素数。 #include #include #include #include void main() void main() intint m m,i i,k;k; scanf(%dscanf(%d,&m);&m); k= k=sqrt(msqrt(m);); for (i=2;i= for (i=2;ik) k) printf(%dprintf(%d is a prime number is a prime n

34、umbernn,m);m);else else printf(%dprintf(%d is not a prime number is not a prime numbernn,m);m); 也可以是也可以是: :#include #include #include #include void main() void main() intint m,I,k,flagm,I,k,flag=1;=1; scanf(%dscanf(%d,&m);&m); k= k=sqrt(msqrt(m);); for (i=2;i= for (i=2;i1字符串字符串2 2,函数值为,函数值为1 1。(3)(3

35、) 如果字符串如果字符串11str2) if(str1str2) 只能用只能用if(strcmp(str1if(strcmp(str1,str2)0) str2)0) 6. 6. strlenstrlen函数函数 其一般形式为:其一般形式为:strlenstrlen ( (字符数组字符数组) ) strlenstrlen是是测测试试字字符符串串长长度度的的函函数数。函函数数的的值值为为字字符符串中的实际长度串中的实际长度( (不包括不包括00在内在内) )。例如:例如:char char strstr1010=China;=China; printf(%dprintf(%d,strlen(st

36、rstrlen(str););输出结果不是输出结果不是1010,也不是,也不是6 6,而是,而是5,5,即有效字符数即有效字符数. .strlwrstrlwr ( (字符串字符串) ) strlwrstrlwr函数函数7. 7. strlwrstrlwr函数函数 其一般形式为:的作用是将字符串中大写字其一般形式为:的作用是将字符串中大写字母换成小写字母。母换成小写字母。 8. 8. struprstrupr函数函数 其一般形式为:其一般形式为:struprstrupr ( (字符串字符串) ) struprstrupr函函数数的的作作用用是是将将字字符符串串中中小小写写字字母母换换成大写字母。

37、成大写字母。 使用字符串函数时,必须包括字符串函数库:使用字符串函数时,必须包括字符串函数库:#include #include 我们可以不使用字符串函数编写程序:我们可以不使用字符串函数编写程序:例如例如: :不使用不使用strcatstrcat 连接两个字符串;连接两个字符串;不使用不使用strcpystrcpy 拷贝字符串;拷贝字符串;不使用不使用strcmpstrcmp 比较字符串;比较字符串;不使用不使用strcpystrcpy 拷贝字符串拷贝字符串: :1 1 用数组用数组: :For(iFor(i=0;i=strlen(s2);i+) S1i=s2i;=0;i=strlen(s2

38、);i+) S1i=s2i;2 2 用指针用指针:p1=s1;p2=s2;:p1=s1;p2=s2;while(*p1+=*p2+); while(*p1+=*p2+); 寻找字符串尾:寻找字符串尾:while(s1i) i+;while(s1i) i+; i i 就是字符串尾的下标,再拷贝就是连接。就是字符串尾的下标,再拷贝就是连接。第七章第七章 简单的简单的C C语言函数语言函数#include #include /*/*文件包含文件包含*/*/void void main( ) main( ) /*/*主函数主函数 */ */ /*/*函数体开始函数体开始*/*/ printf (pri

39、ntf (“This is a C program.nThis is a C program.n”););/*/*函数体语句函数体语句*/*/ /*/*函数体结束函数体结束*/*/ 说明:说明:mainmain是主函数名是主函数名,void,void 是是函数类型函数类型每个每个C C程序是由若干函数组成的程序是由若干函数组成的, ,其中必其中必有一个并且只能有一个有一个并且只能有一个主函数主函数 mainmain( )( )每个每个C C程序从程序从mainmain函数开始执行函数开始执行, ,到到mainmain函数函数结束结束, ,即执行的是主函数的函数体即执行的是主函数的函数体, ,与

40、主函数与主函数mainmain在程序中的位置无关在程序中的位置无关; ; 是函数开始和结束的标志是函数开始和结束的标志, ,不可省略不可省略; ;每个每个C C语句以分号结束语句以分号结束; ;在主函数中直接或间接调用其他函数在主函数中直接或间接调用其他函数; ;使用标准输入出库使用标准输入出库函数时函数时应写:应写: #include #include 使用数学库使用数学库函数和字符串函数时函数和字符串函数时应写:应写:#include #include #include #include 一个函数由两部分组成一个函数由两部分组成: : 函数的首部:函数的首部:例例1.31.3中的中的max

41、max函数首部函数首部 intint max(intmax(int x,intx,int y ) y ) 函数体:函数体:花括号内的部分。若一个函数有多个花括号内的部分。若一个函数有多个花括号花括号, ,则最外层的一对花括号为函数体的范则最外层的一对花括号为函数体的范围。围。 函数定义的一般形式函数定义的一般形式 类型标识符类型标识符函数名函数名(形式参数表列)(形式参数表列) 声明部分声明部分 语句部分语句部分 其中类型标识符是函数返回值的数据类型其中类型标识符是函数返回值的数据类型, ,如如: :int,charint,charfloat,doublefloat,double 等等, ,也

42、可以是无返回值也可以是无返回值, ,写为写为void.void.也可以没有形式参数表列也可以没有形式参数表列, ,称为无参函数称为无参函数. .例如:例如:intint max max(intint ,intint )intint ; /*/*函数体中声明部分函数体中声明部分* *?; / *; / *函数体中语句部分函数体中语句部分* * returnreturn();(); /*/*返回值返回值 * */ / 函数参数和函数的值函数参数和函数的值形式参数和实际参数形式参数和实际参数 形式参数:形式参数:函数名后面括弧中的变量名称为函数名后面括弧中的变量名称为 “形式参数形式参数”(简称(简

43、称“形参形参”); ;实际参数:实际参数:主调函数中调用一个函数时,函主调函数中调用一个函数时,函数名后面括弧中的参数数名后面括弧中的参数( (可以是一个表达式可以是一个表达式) )称为称为“实际参数实际参数”(简称(简称“实参实参”); ;函数返回值:函数返回值:returnreturn后面的括弧中的值作为后面的括弧中的值作为函数带回的值(称函数带回的值(称函数返回值函数返回值)。)。 说明:说明: 1.1.函数的返回值是通过函数中的函数的返回值是通过函数中的returnreturn语句获语句获得的。得的。一个函数中可以有一个以上的一个函数中可以有一个以上的returnreturn语句,执语

44、句,执行到哪一个行到哪一个returnreturn语句,哪一个语句起作用。语句,哪一个语句起作用。 函数的调用函数的调用 对被调用函数的声明和函数原型对被调用函数的声明和函数原型1.1.首先被调用的函数必须是已经存在的函数(是库函首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。数或用户自己定义的函数)。3.3.如果使用用户自己定义的函数,而该函数的位置在如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明数中对被调用的函数作声明, ,即写上函数的原型。即写上函数的原

45、型。用函数首部加上用函数首部加上 ; ;号表示函数声明号表示函数声明. .2.2.如果使用库函数,还应该在本文件开头用如果使用库函数,还应该在本文件开头用#include #include 命令将调用有关库函数时所需用到的信息命令将调用有关库函数时所需用到的信息“包含包含”到到本文件中来。本文件中来。 如如 #include #include #include #include #include #include 函数调用的实例(求两整数的函数调用的实例(求两整数的最大公约数最大公约数):):#include #include void main()void main() intint hcf

46、(inthcf(int u u,int,int v v);); / /函数声明函数声明 intint u,v,hu,v,h; ; scanf(%d,%d,&u,&vscanf(%d,%d,&u,&v);); h= h=hcf(u,vhcf(u,v);); printf(%d,%dprintf(%d,%d的最大公约数是:的最大公约数是:%dn,u,v,h%dn,u,v,h);); / /函数定义函数定义intint hcf(inthcf(int u,intu,int v) v) / /函数首部函数首部 intint r; r; while (v!=0) while (v!=0) r= r=u%v

47、;uu%v;u= =v;vv;v=r;=r; return(ureturn(u); ); 局部变量和全局变量局部变量和全局变量 局部变量局部变量 在一个函数内部定义的变量是内部变量,它只在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这内才能使用它们,在此函数以外是不能使用这些变量的。这称为些变量的。这称为“局部变量局部变量”。 全局变量全局变量在函内定义的变量是在函内定义的变量是局部变量局部变量, ,而在函数外定义的而在函数外定义的变量称为外部变量变量称为外部变量, ,也称全局变量也

48、称全局变量. .静态局部变量是函数中保持最近值不释放的变量静态局部变量是函数中保持最近值不释放的变量在函数中用下面方式定义:在函数中用下面方式定义:static static intint c=7; c=7; 考察静态局部变量的值考察静态局部变量的值#include #include void mainvoid main()()intint (intint a a); ; ,;,; (;(;) ) ( ,();,();intint (intint ) intint ; ; 3 3; 2 2; ();();3 3次调用函数次调用函数f f 后,后,c c 的值是的值是 9 9第八章第八章 地址和

49、指针的概念地址和指针的概念内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内进行编译时,系统就会给这个变量分配内存单元。存单元。 一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。例如,地址例如,地址20002000是变量的指针。如果有一是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指个变量专门用来存放另一变量的地址(即指针),则它称为针),则它称为“指针变量指针变量”。指针和指针变量的定义:指针和指针变量的定义: 指针变量

50、的引用指针变量的引用 注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。 例例 通过指针变量访问整型变量通过指针变量访问整型变量#include #include voidvoidmain ( )main ( ) intint ; intint *p *p; ; p p; /*/*把变量的地址赋给把变量的地址赋给 p */ p */ printf(printf(“%d,%dn%d,%dn”,a,a,*p);,*p); 对对“”和和“* *”运算符说明:运算符说明:如果已执行了语句如果已执行了语句 p p 那么:那么:那么那么 a a 和和 *

51、*p p 是相同的值是相同的值所以,如果所以,如果 a=3a=3; ;Printf(Printf(“%d,%d%d,%d”,a,a,*p); ,*p); 显示是显示是 3 3,3 3 所以,如果所以,如果 * *p=6p=6; ;Printf(Printf(“%d,%d%d,%d”,a,a,*p); ,*p); 显示是显示是 6 6,6 6 指针变量作为函数参数指针变量作为函数参数例例10 . 3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出 #include #include void mainvoid main()()void swapvoid swap(intint *

52、*,intint * *); ;intint ,;,;intint *p *p,* *p p; scanfscanf(,);,);p p ; p2 p2 ; ifif() ) swapswap( p p , p2 p2 ););printfprintf(, ,);,); void swapvoid swap(intint * *,intint * *) intint temp temp; temptemp* *1 1; * * *; * *temptemp; 下面的函数下面的函数: :void swapvoid swap(intint a a,intint b b) intint temp t

53、emp; temptempa a; a=ba=b; b=tempb=temp; /* /* 只在函数中交换了局部变量只在函数中交换了局部变量 * */ / 同样不可用函数:同样不可用函数: void swapvoid swap(intint *p *p,intint b b)或或 void swapvoid swap(intint a a,intint *p *p)只能用函数只能用函数 void swapvoid swap(intint *p1 *p1,intint *p2 *p2)处理主调用函数中的变量处理主调用函数中的变量定义一个指向数组元素的指针变量的方法定义一个指向数组元素的指针变量的

54、方法例如:例如:intint a a1010,*p,*p; p=a; (ap=a; (a是数组的首地址是数组的首地址, ,注意注意a a前没有地址符前没有地址符) ) 或或 p=&a0; p=&a0; 虽然虽然a a和和p p都是地址都是地址, ,它们是不同的它们是不同的: :a a 是数组的首地址是数组的首地址, ,一旦由系统分配一旦由系统分配, ,就是一个固定的值就是一个固定的值; ;而而p p是指针变量是指针变量, ,是可以改变的是可以改变的. .所以所以 a+a+是错误的是错误的, ,而而p+p+是正确的是正确的. . 指向数组元素的指针指向数组元素的指针10.10. .通过指针引用数

55、组元素通过指针引用数组元素如果如果 intint a6,*p=a; a6,*p=a;引用一个数组元素,可以用:引用一个数组元素,可以用:()() 下标法,如下标法,如aiai 形式;形式;()() 地址或指针法,如地址或指针法,如* *( (a+ia+i) )或或* *( (p+ip+i) )注意注意: a0-a5: a0-a5合法合法,a6,a6非法非法; ; *(a)-*(a+5) *(a)-*(a+5)合法合法,*(a+6),*(a+6)非法非法; ; *(p)-*(p+5) *(p)-*(p+5)合法合法,*(p+6),*(p+6)非法非法; ; 字符串与指针字符串与指针字符串的表示形

56、式字符串的表示形式 例例 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化, 然后输出该字符串然后输出该字符串 #include #include void mainvoid main()()char *schar *sabcdefgabcdefg; printfprintf(%nn,s s); 输出输出 abcdefgabcdefg(1) 用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。输出输出 cdefgcdefg 的语句是:的语句是:printfprintf(%nn,s+2s+2);); s+2 s+2 是指针是指针输出输出 efgefg

57、 的语句是:的语句是:printfprintf(%nn,s+4s+4);); s+4s+4是指针是指针输出字符输出字符 f f 的语句是:的语句是:printfprintf(%cncn,* *(s+5)(s+5));); * *(s+5)(s+5)是字符是字符注意:输出字符串用注意:输出字符串用%s %s 和指针;和指针; 输出字符用输出字符用%c %c 和和* *( (指针指针) )指针运算与数据:指针运算与数据:#include #include void main( ) void main( ) intint a5=2,4,6,8,10,*p; p=a; a5=2,4,6,8,10,*p

58、; p=a;printf(%dprintf(%d,*(p+2);,*(p+2);printf(%dprintf(%d,*+p);,*+p);printf(%dprintf(%d,*p+);,*p+);printf(%dnprintf(%dn,*+p);,*+p);显示显示 6,4,4,86,4,4,8注意注意 1 p+2 1 p+2 没有改变没有改变p p 的值的值; ;注意注意 2 +p,2 +p,和和 p+p+的区别的区别. .调用函数实现数组的相反顺序存放:调用函数实现数组的相反顺序存放:#include #include void main()void main()void void

59、inv(intinv(int x , x ,intint n); n); /函数声明函数声明 intint i,a10=3,7,9,11,0,6,7,5,4,2; i,a10=3,7,9,11,0,6,7,5,4,2; printf(Theprintf(The original array:n); original array:n); for(ifor(i=0;i10;i+)=0;i10;i+) printf(%dprintf(%d , ,aiai);); printf(nprintf(n);); inv(a,10); inv(a,10); /调用函数调用函数 printf(Theprintf

60、(The array has been inverted:n); array has been inverted:n); for(ifor(i=0;i10;i+)=0;i10;i+) printf(%dprintf(%d , ,aiai);); printf(nprintf(n);); / / 用数组元素:用数组元素:void void inv(intinv(int x , x ,intint n) n) intint temp,i,j,mtemp,i,j,m=(n-1)/2;=(n-1)/2; for(ifor(i=0;i=0;i=m;im;i+)+) j=n-1-i; j=n-1-i; t

61、emp= temp=xi;xixi;xi=xj;xjxj;xj=temp;=temp; /或用指针:或用指针:void void inv(intinv(int * *x,intx,int n) n) intint * *p,tempp,temp,*i,*,*i,*j,mj,m=(n-1)/2;=(n-1)/2; i= i=x;jx;j=x+n-1;p=x+n-1;p=x+mx+m; ; for(;ifor(;i=p;i+,jp;i+,j-)-) temp=*i;*i=*j;*j=temp; temp=*i;*i=*j;*j=temp; 这时函数声明要改成:这时函数声明要改成:void void

62、 inv(intinv(int * *x,intx,int n); n); 用选择法实现数组从大到小排序的函数:用选择法实现数组从大到小排序的函数:void void sort(intsort(int x , x ,intint n) n) intint i,j,k,ti,j,k,t; ; for(ifor(i=0;in-1;i+)=0;in-1;i+) k=i; k=i; for(jfor(j=i+1;j=i+1;jxkxk) k=j;) k=j; if(kif(k!=i)!=i)t=t=xi;xixi;xi=xk;xkxk;xk=t;=t; 第九章第九章n问题定义:问题定义: 有时需要将不

63、同类型的数据组合成一个有机有时需要将不同类型的数据组合成一个有机的整体,以便于引用。的整体,以便于引用。如:如:一个学生有学号一个学生有学号/ /姓名姓名/ /性别性别/ /年龄年龄/ /地址等地址等intint num; num; char name20;char name20; char sex; char sex; intint age; age; char addr30;char addr30; n 声明一个结构体类型的一般形式为:声明一个结构体类型的一般形式为: struct 结构体名 成员表列;如:如:struct student int num;char name20;char

64、sex; int age;float score;char addr30; 结构体名类型名成员名 定义结构体类型变量的方法定义结构体类型变量的方法 n可以采取以下3种方法定义结构体类型变量:先声明结构体类型再定义变量名例如:struct student student1, student2; | | | 结构体类型名 结构体变量名 定义了student1和student2为struct student类型的变量,即它们具有struct student类型的结构. 图9-2student1100101 ZhangXin M 19 90.5 Shanghai100102 WangLi F 20 9

65、8 Beijingstudent2引用结构体变量中成员的方式为引用结构体变量中成员的方式为结构体变量名结构体变量名. .成员名成员名例如,例如, student1.numstudent1.num表表 示示 student1student1变变 量量 中中 的的 numnum成成 员员 , ,即即student1student1的的num(num(学学号号) )项项。可可以以对对变变量的成员赋值和运算量的成员赋值和运算 student1.num=10010student1.num=10010但不能用以下语句整体读入结构体变量,例如:例如: scanf(%d,s,c,d,f,s,student1)

66、; 结构体变量的地址主要用作函数参数,传递结构体变结构体变量的地址主要用作函数参数,传递结构体变量的地址。量的地址。 对结构体变量初始化对结构体变量初始化. .#include #include void mainvoid main()() structstruct student student long long intint num num; char name20;char name20; char sex char sex; char addr20char addr20; a=10101a=10101,LiLinLiLin,MM,123 Beijing 123 Beijing Roa

67、dRoad; /* /* 对结构体变量对结构体变量a a赋初值赋初值* */ /printf(No.:%ldprintf(No.:%ldnname:%snname:%snsex:%cnsex:%cnaddress:%snaddress:%snn,a.numa.num,a.namea.name,a.sexa.sex,a.addra.addr);); 结构体数组结构体数组 一个结构体变量中可以存放一组数据(如一一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应有个学生的数据需要参加运算,显然应该用数组

68、,这就是结构体数组。结构体数组该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。们都分别包括各个成员项。 定义结构体数组定义结构体数组 和定义结构体变量的方法相仿,只需说明和定义结构体变量的方法相仿,只需说明其为数组即可。其为数组即可。例如:例如:structstruct student student intint num;char name20; num;char name20;char char sex;intsex;int

69、age; age;float score;char addr30;float score;char addr30; ; ;structstruct student stu3; student stu3; 以上定义了一个数以上定义了一个数组组stu,数组有个元数组有个元素,均为素,均为struct student类型数据。类型数据。结构体数组的初始化结构体数组的初始化 与其他类型的数组一样,对结构体数组可以初始与其他类型的数组一样,对结构体数组可以初始化。化。例如:例如:structstruct student studentintint num;char name20 num;char nam

70、e20; char sexchar sex; intint age age; float score; char addr30float score; char addr30; ; ;stustu2 21010110101,LiLinLiLin,MM,1818,87.587.5,103 103 BeijingRoadBeijingRoad, 1010210102,Zhang FunZhang Fun,MM,1919,9999,130 Shanghai Road130 Shanghai Road; 例例 指向结构体变量的指针的应用指向结构体变量的指针的应用#include #include #i

71、nclude #include void main()void main() structstruct studentlong num;char name20; studentlong num;char name20; char sex; float score; char sex; float score; structstruct student s; student s; structstruct student *p; p=&s; student *p; p=&s; s.nums.num=89101;strcpy(s.name,”LiLin”);=89101;strcpy(s.name

72、,”LiLin”); s.sexs.sex=M;s.scoreM;s.score=89.5;=89.5; printf(No.:%ldprintf(No.:%ldnname:%snname:%snsex:%cnsex:%cnscore:%fnscore:%fnn,s.nums.num,s.names.name,s.sexs.sex,s.scores.score);); printf(No.:%ldprintf(No.:%ldnname:%snname:%snsex:%cnsex:%cnscore:%fnscore:%fnn,(*p).num(*p).num,(*(*p).namep).name

73、,(*(*p).sexp).sex, (*(*p).scorep).score);); 定义指针变量p,指向struct student 类型的数据指向的结构体变量中的成员 9.3.2 指向结构体数组的指针 11.6.2 11.6.2 指向结构体数组的指针指向结构体数组的指针例例9.4 9.4 指向结构体数组元素的指针的应用指向结构体数组元素的指针的应用 #include #include structstruct student student intint num;charnum;char name20;char name20;char sex;intsex;int age; age;st

74、ructstruct student stu3= student stu3=1010110101,Li LinLi Lin,MM,1818,1010210102,Zhang FunZhang Fun,MM,1919,1010410104,WangMingWangMing,FF,2020; ;void main()void main() structstruct student *p; student *p; printfprintf( No. Name sex age( No. Name sex age);); forfor(strstr;strstr;p p) printf(%5d %-20

75、s %2c %4dprintf(%5d %-20s %2c %4dnn,p-nump-num, p-namep-name, p-sexp-sex, p-age);p-age); 运行结果:运行结果: LiLin 18 Zhang Fun 19 WangMing 20所以所以 s.nums.num, (*, (*p).nump).num, p-num, p-num都表示学生都表示学生 s s 的学号,是正确的的学号,是正确的. .而而 (*(*s).nums).num, , p.nump.num,(*p)-num, p-.num ,(*p)-num, p-.num 都是错误的!都是错误的! 1

76、1 多写了分号多写了分号void main( );void main( );for(ifor(i=0;i10;i+);=0;i10;i+);while(mwhile(m!=0);!=0);2 2 把分号写成了逗号把分号写成了逗号for(ifor(i=0,i10,i+);=0,i10,i+);3 3 写错了写错了& &scanf(scanf(“%d%d”,a,a); /); /应该是应该是&a&a,少了,少了& &gets(&strgets(&str); / ); / 应该是应该是strstr, ,多了多了& & 4 4 缺少函数体前后的花括号缺少函数体前后的花括号 5 5 printf,scanfprintf,scanf 中把双引号中把双引号 ”写成写成 单引号单引号 6 6 语句后缺少分号语句后缺少分号c=c=a+ba+b7 7 数据声明中把逗号写成分号:数据声明中把逗号写成分号:把把 intint a,b,ca,b,c; ;写成:写成: intint a;b;ca;b;c; ;

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

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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