计算机二级考试C语言辅导课件_第1页
计算机二级考试C语言辅导课件_第2页
计算机二级考试C语言辅导课件_第3页
计算机二级考试C语言辅导课件_第4页
计算机二级考试C语言辅导课件_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

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

文档简介

1、国家计算机二级考试C语言辅导课件,一、C语言程序的结构,1.程序的构成,main函数和其他函数。 2.头文件,数据说明,函数的开始和结束标志以及程序中的注释。 3.源程序的书写格式。 4.C语言的风格。 5.相关题目,C语言程序是由函数构成,即函数是C程序的基本组成单位. 每一个C语言源程序可以包含多个程序文件,但必须而且只能具有一个main函数作为程序的主控函数,称为主函数.位置虽然不确定,但程序的运行都是从主函数开始到主函数结束. 一个源程序的不同程序文件之间通过调用来使用,但main函数不能被调用,只有一个程序文件中具有main函数,其它程序文件没有. 一个函数中不能定义另一个函数,函数

2、不能嵌套定义.,int f1(int k) int w; w=k*k; return(w); void main() int i,j; long s1,s2; for(i=1;i=10;i+) s1=s1+f1(i); for(j=1;j=10;j+) s2=s2+f2(j); printf(“%ld,%ld”,s1,s2); int f2(int m) int z; z=m*m*m; return(z);,1)头文件的作用,使用方法,扩展名.h 2)注释部分的格式/* */,位置,作用 3)大括号 表示函数体的开始和结束 #include #include”math.h” main() fl

3、oat x; scanf(“%f”,x);/*输入一个实数*/ printf(“%f”,sin(x); ,1)分号是语句的结束符 2)一行可以容纳多条语句,而一条语句可以在多行 3) 源程序(.c)-目标程序(.obj)-可执行程序(.exe) 编译 连接 main() int a,b; a=10;b=20; printf(“a=%d,b=%d”, a,b); ,1)标识符语法规则: C语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 区分大小写,变量习惯上用小写,符号常量用大写。 对长度无统一规定。一般为8位,Turbo C则允许32个字符。 标识符不能跨

4、行书写,不能与关键字同名。_12 a1 1s s%2 2)32个关键字,总结:主要在第一章,涉及选择题1112 1)以下叙述中正确的是(07 9) A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以命名任意一个函数作为主函数 2)以下叙述中正确的是(08.4) A)C程序中的注释只能出现在程序的开始位置和语句的后面 B)C程序书写格式严格,要求一行内只能写一个语句 C)C程序格式自由,一个语句可以写在多行 D)用C语言编写的

5、程序只能放在一个程序文件中 3)以下选项中合法的标志符是(09.3) A)1_1 B)1-1 C)_1 D)1_ _,C,C,C,4)以下叙述中正确的是(08.9) A)C程序的基本组成单位是语句 B)C程序中的每一行只能写一条语句 C)简单C语句必须以分号结束 D)C语句必须在一行内写完 5)计算机能直接执行的程序是(08.9) A)源程序 B)目标程序 C)汇编程序 D)可执行程序 6)以下叙述正确的是(10.3)A)C语言程序是由过程和函数组成的B)C语言函数可以嵌套调用,例如:fun(fun(x)C)C语言函数不可以单独编译D)C语言中除了main函数,其他函数不可作为单独文件形式存在

6、,C,D,B,二、数据类型及其运算,1.C的数据类型(基本类型,构造类型,指针类型,无值类型void)及其定义方法。 2.C运算符的种类、运算优先级和结合性。 3.不同类型数据间的转换与运算。 4.C表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。 5.相关习题,1)常量各自类型的表现形式 (1)整型常量 :十进制(123),八进制(0123),十六进制(0X123),57L (2)实型常量:十进制(12.3, 12. , .3),指数形式 (2.0e+5) (2.0e+1.5,e+2) (3)字符常量(a,1, 023,xa7,n,t) (4)

7、字符串常量(“a”,”ab123”) 注意:字符常量与字符串常量的不同(定界符字符个数占据内存长度) 2)各种数据类型 整型(short int 2 ,int 2 ,long int 4, unsinged ) 实型(float 4 7,double 8 15) 字符型 (char 1),3)变量的定义 掌握格式,含义,特点(一次只能对应一个值 新值覆盖旧值) int a; float b=4.5; (1)同种类型变量用一个类型标志符定义之间用逗号隔开 int a=20;b=10; (2)不同种类型变量定义之间用分号隔开 int a=20,float b=2.0; (3)变量定义时不允许出现连

8、续赋值 int a=b=20;,1)除法:当被除数和除数均为整数,则商一定为整数( 3/2 , 3.0/2) 2)求余:被除数和除数必须均为整数( 3.2%2) 方法: (1)被除数和除数取绝对值,求余(2)余数的符号与被除数相同 3)自增自减运算(1)操作数只能是变量(3+) (2)x+,+x的区别(先做再变,先变再做) (设x的原值等于3) y=x+; y=+x; printf(“%d”,x+); printf(“%d”,x+); 6+(x+) 6+(+x) x+3 +x3 4)赋值运算符: (1)赋值号左边只能出现变量名(y=x+1=0,x=9=10) (2)复合赋值运算符的写法及含义(

9、 a-=a+=a*a a为2) (3)结合性 5)逗号运算符优先级最低:掌握运算顺序,注意一个逗号表达式只有一个结果 printf(“%d”,x+,x+6,x+=7); 6)条件运算符: (1)唯一的一个三目运算符(2)结合性(3)规则( (w)?x+:y+ 找等价 表达式1的值非0或0),1)赋值转换:以变量类型为准 int a ; a = 2.3; float b; b=7; 2)计算时自动转换:低精度向高精度转换,特别的是单精度数运算一定转为双精度数,以提高运算速度(25页) 表达式:a+b-a+20 3)强制类型能够转换:格式 (类型名)表达式 (int)3.7/2 (int)x+2

10、(int) (x+2) 注意:强制类型转换不改变变量自身的类型,变量类型一旦定义在程序运行阶段是无法改变的,1)关系表达式: (1)优先级:所有相同,比算术运算符低 3+29=!4 (2)不同类型数据之间也可以用关系运算符比较大小 a=30 12.31 (3)关系表达式结果0或1 (4)注意=和=的区别 x=3 x=3 x+1=3; x+1=3; (5)数学中的式子22 c1=A+8-4;c2=A+8-5;printf(“%c,%dn”,c1,c2);已知字母A的ASCII码为65,程序运行后的输出结果是(09.9)A) E,68 B) D,68 C) E,D D)输出无定值 5)若有定义:d

11、ouble a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是(10.3) A)a=a+,i+;B)i=(a+k)=(i+k);C)i=a%11; D)i!a; 6)设x为int型变量,请写出一个关系表达式 【6】 ,用以判断x同时为3和7的倍数时,关系表达式的值为真。(10.3),A,A,X%3=0 3+5,6+8; a=3 ; 2)函数调用语句: printf(“This is a C statement.”); sqrt( x ); 3)空语句:即只有一个分号的语句。 if ( max y ) ; else max = y; 4)复合语句:用 把多个语句括起来称为复合语

12、句,又称分程序 (1)while ( x y ) t =x ; x = y; y = t;,1)字符输入函数: putchar( ) (功能,参数及其类型,返回值及其类型) putchar(a); putchar(023);putchar(x1a);putchar(30+35); char x; int y; float z; putchar(x); putchar(y); putchar(z); 2)字符输入函数:getchar()(功能,返回值及其类型) x=getchar(); putchar(getchar(); 3)格式输出函数printf() (1)输出类型(在格式控制字符串中加入

13、类型说明符): %d,%ld,%o,%x,%u,%f,%e,%c,%s 说明:(1)输出项与格式描述符个数相等,类型匹配 (2) 输出时,格式限制符中的普通字符按原样输 出 printf(“x=%d,%f”,x); printf(“x=%d”,x,y); printf(“x=%d,y=%f”,x,y); (3)输出时,注意数值的符号(负号)和小数点占据的位 数 printf(“%3d,%3d,%3.2f”,-456,456,3.27); printf(“%+3d,%_3d,%3.2f”,456,456,3.27);,(2)输出长度(在类型限定前加上数字) %3d,%8d,%-8d,%5.3f,

14、%.3f,%5c,%5.3s 说明:1)实数输出时,默认是6位小数 2)截取小数时需四舍五入 (3)输出表达式时,先按从右到左运算,在从左至右输出 n = 1; printf(“%d,%d,%d”,n,n+,+n); 基本原则:不能使输出数据失真,当限制长度比实际长度短,按实际长度输出 printf(“%3s,%2d,%2.3”,”abcd”,123,23.5678); 4)格式输入函数scanf() (1) “格式控制”后面应当是变量地址,而不应是变量名。int n; scanf(“%d”,(2)如果在“格式控制”字符串中除了格式说明符以外还有其他普通字符,则在输入数据时应输入与这些字符相同

15、的字符。 scanf(“n1=%d,n2=%d”, (3)在输入数值数据时,遇以下情况时该认为结束。 a.遇空格,或按“回车”或“跳格”(Tab)键。 b.按指定的宽度结束。 c.遇非法输入。,scanf(“%d%d”,总结:基本内容在第三章,重点是scanf()函数和printf()函数的应用,选择题一般各占一题1819,还有后面的综合应用 1)若变量已正确定义为int型,要通过语句scanf(“%d,%d,%d”, printf(“%d%8.6f”,x,y);的输出结果是(09.3) A)123.141593 B)12 3.141593 C)12,3.141593 D)123.141593

16、0,B,A,3) 若整型变量a和b中的值分别为7和9,要求按以下格式输出a和b的值: (08.4) a=7 b=9 请完成输出语句:printf(“_”,a,b); 4)有以下程序 main() int a =0,b=0; a=10;/*给a赋值 b=20; 给b赋值*/ printf(“a+b=%dn”,a+b) /*输出结果*/ 程序运行后的输出结果是(06.9) A)a+b=10 B)a+b=30 C)30 D)出错,a=%dnb=%d,B,5) 有以下程序includemain() char a,b,c,d;scanf(“%c%c”,当执行程序时,按下列方式输入数据(从第1列开始,代表

17、回车,注意:回车也是一个字符)1234则输出结果是(10.3) A)1234 B)12C)12 D)12 3 34,C,四、选择结构程序设计,1.用if语句实现选择结构。 2.用switch语句实现多分支选择结构。 3.选择结构的嵌套。 4.相关习题,1)关系表达式( = =2 3=2 aA Aa (1)优先级:前四个比后两个高,比算术运算符低 3+29=!4 (2)不同类型数据之间也可以用关系运算符比较大小 a=30 12.31 (3)关系表达式结果0或1 (4)注意=和=的区别 x=3 x=3 x+1=3; x+1=3; (5)数学中的式子22 ,(2)双分支(ifelse): if (x

18、2) printf(“ok”); else printf(“no”);,假(0),(3)多分支(ifelse if else if. else),if(x10) printf(“1”); else if(x=9) printf(“2”); else if(x=8) printf(“3”); else printf(“4”);,隐含条件 x=9 printf(%d,2); else printf(%d,3); (3)If中的条件表达式可以是各种类型的,只需通过判断表达式结果为0或非0,决定执行什么语句 char x; int y; float k; if(x).else if(y+)else i

19、f(k+10)else if(yx)else if(ya=b;b=t; 2.2如果a不大于b,则不能交换 3、输出a,b,源程序: main() float a,b,t; scanf(“%f,%f”, ,2.输入3个数a,b,c,要求按由小到大的顺序输出,算法: (1)if ab 将a和b对换 (a是a,b中的小者) (2)if ac 将a和c对换 (a是a,c中的小者,因此a是三者中最小者) (3)if bc 将b和c对换 (b是b,c中的小者,也是三者中次小者) (4)顺序输出a,b,c,源程序:main() float a,b,c,t; scanf(“%f ,%f,%f”, ,将上if语

20、句改为: main() float a,b,c,t; scanf(“%f ,%f,%f”, ,switch结构与if多分支结构的区别: 1)switch结构只能表示等于关系,即 switch后的表达式是否与case 后的常量相等,而if可表示大于小于等于 switch(a/b) case 0: ; case 1: ; break; default: ;(可省) 2)当前面条件均不成立时,switch执行default后的语句而if执行else后的语句,两个关键字均可省;但default的位置可调整,放到case之前运行结果不会不同;而else则不可. int a=6; switch(a) ca

21、se 1:printf(“1”);break; default :printf(“2”);break; case 6:printf(“3”);,main() int a=6; if (a=1)printf(1); else printf(2); else if(a=6)printf(3); 3)If结构中至多只能执行一条语句,执行完即结束,而对于switch结构,找到符合条件的位置即找到入口,如不遇break语句则从入口处按从上至下的顺序,执行到该结构结束 int a=6; switch(a) case 1:printf(“1”);break; case 6:printf(“3”); defa

22、ult :printf(“2”);break; 4)break语句在if结构中不能使用,1)If与else的匹配原则(就近,else之上,没有其它if与之匹配):由上至下,从第一个else找匹配的 2)If嵌套的读题顺序:匹配、从外向内执行 #include void main() unsigned int year,leap; printf(“enter year:”); if(year%400=0) leap =1; else if(year%4=0,程序1: main() float x; int y; scanf(“%f”, ,程序2:将上if语句改为: y=-1; if(x!=0)

23、if(x0) y=1; else y=0;,总结:第四章,选择题20-25中1-2题,填空题1-2题,1)有以下程序 #include main() int a=1,b=2,c=3,d=0; if (a=1 程序运行后的输出结果是(09.3) A) 1,2,3 B) 1,3,2 C) 1,3,3 D ) 3,2,1,C,2)以下程序段中,与语句:k=ab?(bc?1:0):0;功能相同的是(09.9)A)if(ab),A,3)以下选项中与if(a=1)a=b; else a+;语句功能不同的switch语句是(10.3)A)switch(a) case 1:a=b;break;default:

24、a+;B)switch(a=1) case 0:a=b;break;case 1:a+;C)switch(a) default:a+;break;case 1:a=b;D)switch(a=1) case 1:a=b;break;case 0:a+;,B,4)没有定义:int a=1,b=2,c=3;以下语句中执行结果与其它三个不同的是(09.9)A)if(ab) c=a,a=b,b=c; B)if(ab) c=a,a=b,b=c;C)if(ab) c=a;a=b;b=c; D)if(ab) c=a;a=b;b=c;,C,5)有如下嵌套的if语句if (ab)if(ac)k=a;else k=

25、c;elseif(bc) k=b;else k=c; 以下选项中与上述if语句等价的语句是(10.3) A)k(ab)?a:b; k(bc)?b:c; B)k(ab)?(bc)?a:b):(bc)?b:c); C)k(ab)?(ac)?a:c):(bc)?b:c); D)k(ab)?a:b;k=(ac)?a:c;,C,编程:1)输入两个字符,若这两个字符的ASCII码之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符 2)输入某个点A的平面坐标(x,y), 判断(输出)A点是在圆内,圆外还是在圆周上,其中圆心的坐标为(2,3),半径为1; 3)有一函数:,五、循环结构程序设计,1.for

26、循环结构。 2.while和do-while循环结构。 3.continue语句和break语句。 4.循环的嵌套。 5.相关习题,1)while 格式,实例: main() int x=1; s=0; while(x5) s=s+x; x+; printf(“%dn”,s);,流程图:,2)dowhile,dowhile的先执行与while的先判断结果可能会有所不同注意区别 main() int x=1; s=0; while(x5) do s=s+x; s=s+x; x+; x+; printf(“%dn”,s); while(x5); printf(“%dn”,s); 区别: (1)格式

27、 ,特别是分号 (2)判断条件的先后,有时会影响程序的结果 (若上题中x的值被赋为6,结果是否有不同),流程图:,2)for(赋初值;循环结束的条件;控制变量的变 化),(2)三个表达式可省,但分号不能省 for ( ; i = 100 ; i + +) for ( i = 1; ; i + +) for ( i = 1; i = 100 ; ) for ( ; i = 100 ; ) for ( ; ; ; ) for(k=0,m=1;i=1;i+,j+ ),main() int x=1; s=0; while(x5) for(x=1,s=0;x5;x+) s=s+x; s=s+x; x+;

28、 printf(“%d”,s); printf(“%dn”,s); (1)注意for循环执行顺序,实例:main() float x=1,s=0; for(;x3;) s=s+1/x; x+; printf(“%d”,s); ,4)循环的嵌套 注意:(1)读程序的顺序,从外层循环进入内层循环,进入内层循环后,把内层循环执行完后,才能进入下一次的外层循环.(2)在内层循环中执行时要注意外层循环控制变量的值是否有变化.,main() int x=8,y,s=0; while(x6) for(y=1;y=2;y+) s=s+x; x-; printf(“%d”,s); ,3)continue结束本次

29、循环,break结束个循环,但注意在循环嵌套中只结束本层循环.,for(i=1;i=3;i+) for(j=1;j=2;j+) if(i=1) break; printf(“%dn”,j);,for(i=1;i=3;i+) for(j=1;j=2;j+) if(j =2) continue; printf(“%dn”,j);,for(i=1;i=3;i+) if(i=3) break; printf(“%dn”,i);,for(i=1;i=3;i+) if(i=3) continue; printf(“%dn”,i);,5)常用算法: (1)累加求和题 (2)图形输出题 (3)查找题 (4)取

30、某个数或某组数的每位数字,累加求和题,基本思路:找规律,找加数变化规律 1)找出相邻加数之间值的变化规律 2)或者加数与项数之间值的变化规律,经典例题: 1+3+5+7+9+.+101 (s = 0) for(i=1;i2/1-3/2+5/3-8/5+13/8-. flag = 1;a=2;b=1; for(i=1;i=20;i+) s = s+flag*a/b t=a; a=a+b;b=t; flag=-flag;,main() double f,k;int m,i,j; scanf(%d,main() double f,k;int m,i,j; scanf(%d,s=1+1/(1+2)+1

31、/(1+2+3)+.+1/(1+2+3+4+.+n),若把f的初值改为0,main() double f,k;int m,i,j; scanf(%d,fn=1+1/1!+1/2!+1/3!+.+1/m!,#include double fun(int m) main() int m;double f; FILE *out; printf(“Input m:”); scanf(“%d”, ,请编写程序,它的功能是计算下列级数和,和值等于 s=x/1+x2/2!+x3/3!+xn/n! 当n=10、x=0.3时,函数值为1.349859,下列给定程序中,函数fun()的功能是:根据整型形参m的值,

32、计算如下公式的值: 1-1/4-1/9-1/16.-1/(n*n) 请改正函数fun()中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include #include double fun(int m) double y=1.0; int I; /*found*/ for(I=2;Im;I+) /*found*/ y-=1/(I*I); return(y); void main() int n=5; system(CLS); printf(nThe result is %1fn, fun(n);,图形输出题

33、, * * *,main() int i,j; for(i=1;i=3;i+) for(j=1;j=3-i;j+) printf( ); for (j=1;j=2*i-1;j+) printf(*); printf(n);,基本思路:1)确定行数,从而确定外层循环的次数; 2)找出每行列数与行号之间的规律,从而写出内层循环;3)找出每行空格数与行号之间的规律,从而确定每行起始位置。,输出九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6

34、=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=24 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,for(i=1;i=9;i+) for(j=1;j=i;j+) printf(“%d*%d=%d ”,j,i,i*j); printf(“n”);,查找题,基本思路:穷举法,通常外层循环表示查找

35、范围,而内层用选择结构表示查找条件,但有时,测试时也需要使用循环.,输入所有的1100之间的偶数,并求出它们的平均数,main() int x,ave=0,num=0; for(x=1;x=100;x+) if(x%2!=0) continue; printf(“%d ”,x); ave = ave+x; num+; printf(“ave=%d”,ave/num);,编程:输出1到m(含m)之内能被7或11整除的所有整数,并计算个数。 例如,若赋值给m的值为50,则程序输出: 7 11 14 21 22 28 33 35 42 44 49,判断一个数是否是素数,计算并输出3到n(包括3和n)

36、之间的素数的平方根之和,main() int i,j; float s; scanf(“%d”,main() int i,j; float s; scanf(“%d”,main() int i,j,flag; float s; scanf(“%d”,实现求1000以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果,main() int i,k,s,num=0; for(i=2;i=1000;i+) s=0; for(k=1;k=i/2;k+) if(i%k=0) s=s+k; if(s=i) printf(%

37、d,i);num+; printf(nnum=%d,num); ,取数字,任意输入一个数,请把它的每位数字逆序输出 例如:356 输出 6 5 3,main() int x,m; scanf(“%d”, ,基本思路:通过与10相除,逐次降低每位的位权,找出三位数中所有的”水仙花数”,输出并统计个数;水仙花数是指3位数的各位数字的立方和等于这个数本身.例如,153=1*1*1+5*5*5+3*3*3,main() int i,m,k,s,num=0; for(i=100;i=999;i+) s=0;m=i; while(m!=0) k=m%10; m=m/10; s=s+k*k*k; if(i=

38、s) printf(%d,i);num+; printf(nnum=%d,num); ,编程:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如当原来的数为87653142时,新的数为7531。,下列给定程序中函数fun的功能是:计算正整数num各位上的数字之积。例如,若输入252,则输出应该是20。若输入202,则输出应该是0。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include long fun(long num) /*found*/ lo

39、ng k; do k *=num%10; /*found*/ num =10; while(num); return(k); main() int n; printf(Please enter a number: ); scanf(%ld,(1)有以下程序 #include main( ) char c1,c2; scanf(“%c”, 程序运行输入65回车后,能否输出结果、结束运行(请回答能或不能)【 】(09.3),不能,2)有以下程序include(stdio.hmain()int al;b2;for(;a8;a+) b+=a;a+=2;printf(%d,%dn,a,b);程序运行后的

40、输出结果是(10.3)A)9,18 B)8,11 C)7,11D)10,14,D,3)有以下程序 #include main() int i,j; for(i=3;i=1;i-) for(j=1;j=2;j+) printf(“%d”,i+j); printf(“n”); 程序运行结果是(08.9) A)2 3 4 B)4 3 2 C) 2 3 D)4 5 3 4 5 5 4 3 3 4 3 4 4 5 2 3,D,4)有以下程序includestdio.h main()in i,j,m=1;for(i=1;i3;i+)for(j=3;j0;j-) if(i*j)3)break; m=i*j;

41、printf(m=%dn,m);程序运行后的输出结果是(10.3)A)m=6 B)m=2 C)m=4D)m=5,A,5)以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。请填空。(10.3) #include main() int x=256; printf(%d-%d-%dn, 【 】 x/10%10,x/100);,X%10,结束,七、函数,1.库函数的正确调用。 2.函数的定义方法。 3.函数的类型和返回值。 4.形式参数与实在参数,参数值传递。 5.函数的正确调用,嵌套调用,递归调用。 6.局部变量和全局变量。 7.变量的存储类别(自动,静态,寄存

42、器,外部),变量的作用域和生存期。,调用格式 1)函数语句:把函数调用作为一个语句。 printf( ); 2) 函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。 这时要求函数带回一个确定的值以参加表达式的运算。 例如: c=2*sin(a); 3) 函数参数 函数调用作为一个函数的实参。 printf(“%d”,fabs(-1); 注意:头文件,定义格式 函数类型 函数名(参数类型 参数 名, , 参数类型 参数名),1、 无参函数的定义形式 类型标识符 函数名() 声明部分 语句 ,2、 有参函数的定义形式 类型标识符 函数名(形式参数表列) 声明部分 语句 ,print_m

43、essage( ) printf( “How do you do ! n” ); ,int max( int x,int y ) int z ; z = x y ? x : y ; return( z ) ; ,main() int x,y; scanf(“%d”, ,int fun(int a) int b; b=a*a; return(b); main() int x,y; scanf(“%d”, ,编写一个函数,由参数传入一个整数,计算该数的各位数字之积。,main() int x,y,z=1; scanf(“%d”, ,说明:1)定义时部分可省,请注意省略后默认的含义 2)自定义函数定

44、义的位置(任意位置) 3)不能嵌套定义(可以嵌套调用),int max(int x,int y) int min(int x,int y) return (xy?x:y) ,一.函数类型 函数类型主要指的是函数返回值的类型,定义时确定 1)如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型 2)在定义函数时对函数说明的类型一般应该和return语句中的表达式类型一致。如果不一致,则以函数类型为准。对数值数据,可以自动进行转换。即函数类型决定返回值的类型。 float f() int f() . return 1; return 1.5; 二.函数的返回值 1)函数的返回值是通过函

45、数中的return语句获得的。return 语句将被调用函数中的一个确定的值带回主调函数中去 格式: return (表达式);或 return 表达式; 例: max(int x,int y) return(xy?x:y); ,2)如果不需要从被调用函数带回函数值可以不要return语句或者return; 语 句。此时函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。 3)为了明确表示“不带回值”,可以用void(空类型或无类型) void printstar( ) void print_message( ) 则下面的用法就是错误的: a=printstar(); b=pri

46、nt_message(); 注意:如果出现多个 return 语句,且不是出现在选择结构的各个分支中,则系统会自动执行第一个return语句,其它的不被执行 main() main() . return 3; if (xy) return 1; return 6; else return 2;,1) 以下关于return语句的叙述中正确的是(10.3) A)一个自定义函数中必须有一条return语句B)一个自定义函数中可以根据不同情况设置多条return语句C)定义成void类型的函数中可以有带返回值的return语句D)没有return语句的自定义函数在执行结束时不能返回到调用处,B,2)以

47、下叙述中错误的是(08.9)A)用户定义的函数中可以没有return语句B)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值C)用户定义的函数中若没有return语句,则应当定义函数为void类型D)函数的return语句中可以没有表达式,B,3.参数 1)类型: 形参:各种基本类型变量、数组、指针变量 实参:各种基本类型变量、常量、数组、数组元素、指针变量 2)形参和实参必须个数相同、类型一致 3)方式 (1)值传递:形参变化不影响实参 int f(int a,int b) a=a*a; b=b*b; printf(“%d,%d”,a,b); main( ) int

48、 x=2,y=3; f(x,y); printf(“%d,%d”,x,y); (2)地址传递,2,3,2,3,x,y,a,b,4,9,1).有以下程序#include void fun(int p) int d=2 ;p=d+; printf(“%d”,p);main()int a=1;fun (a); printf(“%dn”,a);程序运行后的输出结果是(09.9) A) 32 B) 12 C) 21 D) 22,C,2)有以下程序 fun(int x,int y)return(x+y); main() int a=1,b=2,c=3,sum; sum=fun(a+,b+,a+b),c+)

49、; printf(“%dn”,sum); 执行后的输出结果是(06 9) A) 6 B) 7 C) 8 D) 9,C,3)若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是(07.9) A)函数的实参和其对应的形参共占同一存储单元 B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元 D)函数的形参和实参分别占用不同的存储单元,D,4)下面的函数调用语句中func函数的实参个数是 (08 9) func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8); A)3 B) 4 C) 5 D) 8,A,一.函数调用 函数调用的一般形式

50、为 函数名(实参表列) 1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略, 如果实参表列包含多个实参,则各参数间用逗号隔开。 实参与形参的个数应相等,类型应一致。 实参与形参按顺序对应,一 一传递数据。 int f( int x,int y) . main() int a=5,b=4; f(a,b);,2)函数语句:把函数调用作为一个语句。 print_star( ); 3) 函数表达式 函数出现在一个表达式中,这种表达式称为函数表达式。 这时要求函数带回一个确定的值以参加表达式的运算。 例如: c=2*max(a,b); 4) 函数参数 函数调用作为一个函数的实参。 m=max

51、(a,max(b,c); 又如: printf(“%d”,max(a,b); 5)被调函数的特点 (1) 必须是已经存在的函数(是库函数或用户自己定义的函数)。,(2)如果使用库函数,一般还应该在本文件开头用#include命令 将调用有关库函数时所需用到的信息“包含”到本文件中来。 (3)如果使用用户自己定义的函数,而且该函数与调用它的函 数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。 6)函数声明 (1)格式: 函数类型 函数名(参数类型1,参数类型2) 在函数声明中也可以不写形参名,而只写形参的类型。

52、 例: float f(int a,int b); float f(int ,int ); (2)位置:在变量定义之前或之后,但必须在其它执行语句之前 (3)省略:函数类型为int或char; 函数定义在调用之前,1)下列叙述中错误的是(06.4) A)C 程序必须由一个或一个以上的函数组成 B)函数调用可以作为一个独立的语句存在 C)若函数有返回值,必须通过 return 语句返回 D)函数形参的值也可以传回给对应的实参,D,下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数的值为4622。 请改正程

53、序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include #include #include int fun(int k) int m=0,mc=0, j; while(k=2),试题程序: #include #include #include #include double fun(int n) void main() FILE *wf; system(CLS); printf(s=%fn, fun(1000); /*/ wf=fopen(out.dat,w); fprintf(wf,%f,fun(1000); fc

54、lose(wf); /*/ ,编写函数fun,它的功能是:求n以内(不包括n)同时能被5与11整除的所有自然数之和的平方根s,并作为函数值返回。 例如,n为1000时,函数值应为s=96.979379。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。,二.特殊调用 1)嵌套调用 函数定义都是互相平行、独立的,不能嵌套定义. 可以做嵌套调用函数, 在调用一个函数的过程中,又调用另一个函数。 求sum=1!+2!+3!+.+n! main( ) int x; scanf(“%d”,2)递归调用 嵌套调用的特殊情况,函数自身调用

55、自身; 程序中不应出现无终止的递归调用,而只应出现有限次数、有终止的递归调用。可以用条件语句(if)控制。 long fac(int n) if (n= =1) f = 1; else f = n*fac(n-1); return f; void main() long s; int n; scanf(“%d”, ,main 输入n=4 输出24 1.fact(int n 4) f=4*f(n-1 3) = 4*6 return 24 2.fact(int n 3) f=3*f(n-1 2) = 3*2 return 6; 3.fact(int n 2) f=2*f(n-1 1) = 2*1

56、return 2; 4.fact(int n 1) f=1; return 1;,Fibonacci(斐波那契数列 )兔子繁衍 (迭代) 设有一对新生兔子,从第三个月开始它们每个月生一对兔子;按此规律,并假设没有兔子死亡,每个月的兔子总数是多少,一年后共有多少对兔子。,f1 = 1 f2 = 1,f3 = 2 = f1 + f2,f4 = 3,= f2 + f3,f5 = 5,= f3 + f4,f6= 8 ,= f4 + f5,f1=1 ( n = 1 ) f2=1 ( n = 2 ) f n = f n-1 + f n-2 ( n = 3 ),Fibonacci 数列,运行结果: 1123

57、5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,long f(int n) if (n=1|n=2) return 1; else return(f(n-1)+f(n-2);) main() int months=6; printf(“%ld”,f(months); ,第一次调用 f(5) + f(4),f(4) + f(3),f(3) + f(2),f(3)+f(2),f(2)+f(1),f(2)+f(1),f(2)+f(1),main( ) long int f1,f2; int i; f1 =1;f2 =1; for (i=1;i=20;i+) printf(“%12ld%12ld”,f1,f2); if (i%2=

温馨提示

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

评论

0/150

提交评论