大学C语言期末考试练习题(带详解答案)
更新时间:2024-07-09 07:51:01 阅读量: 综合文库 文档下载
一、 单项选择题
1.( A )是构成C语言程序的基本单位。
A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从 C 开始执行。
A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数 3、以下说法中正确的是( C )。
A、C语言程序总是从第一个定义的函数开始执行
B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行
D、C语言程序中的main( )函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是( B ) 。
A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。
C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行 5.下列正确的标识符是(C )。
A.-a1 B.a[i] C.a2_i D.int t 5~8题为相同类型题 考点:标识符的命名规则
(1) 只能由字母、数字、下划线构成 (2) 数字不能作为标识符的开头 (3) 关键字不能作为标识符
选项A中的“-” ,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3)
6.下列C语言用户标识符中合法的是( B )。 A)3ax B)x C)case D)-e2 E)union
选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1);
7.下列四组选项中,正确的C语言标识符是( C )。
A) %x B) a+b C) a123 D) 123
选项A中的“%” ,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2)
8、下列四组字符串中都可以用作C语言程序中的标识符的是( A )。 A、print _3d db8 aBc B、I\\am one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age
选项B中的“\\”,”$” ,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键
字,不满足(3)
9.C语言中的简单数据类型包括(D )。
A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是 C 。 A)2.5 B)2 C)1 D)3 详见教材P52~53.
%为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1; 5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1;
/为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=2 11.如果int a=3,b=4;则条件表达式\的值是__A__。
A) 3 B) 4 C) 0 D) 1 详见教材P97.
表达式1?表达式2:表达式3 先计算表达式1,
若表达式1成立, 则选择计算表达式2,并表达式2的值作为整个大表达式的值; 若表达式1不成立,则选择计算表达式3,并将表达式3的值作为整个大表达式的值 此题中的a
a为3,b为4。a
12.若int x=2,y=3,z=4 则表达式x 13.C语言中,关系表达式和逻辑表达式的值是( B ) 。 A) 0 B) 0或1 C) 1 D) ?T?或?F? 14. 下面( D )表达式的值为4. A) 11/3 B) 11.0/3 C) (float)11/3 D) (int)(11.0/3+0.5) 14~16题为同一类型 详见教材P54~56. (1)相同数据类型的元素进行数学运算(+、-、*、/)得到结果还保持原数据类型。 (2)不同数据类型的元素进行数学运算,先要统一数据类型,统一的标准是低精度类型转换为高精度的数据类型。 选项A,11与3为两个整数,11/3结果的数据类型也应为整数,因此将3.666666的小数部分全部舍掉,仅保留整数,因此11/3=3. 选项B,11.0为实数,3为整数,因此首先要统一数据类型,将整型数据3转换为3.0,转换后数据类型统一为实型数据,选项B变为11.0/3.0,结果的数据类型也应为实型数据,因此选项B 11.0 /3=3.666666 选项C,先将整数11强制类型转换,转换为实型11.0,因此选项C变为11.0/3,其后计算过程、结果与选项B同 选项D,首先计算11.0/3,其计算过程、结果与选项B同,得到3.666666;再计算3.666666+0.5=4.166666,最后将4.166666强制类型转换为整型,即将其小数部分全部舍掉,结果为4 15.设整型变量 a=2,则执行下列语句后,浮点型变量b的值不为0.5的是( B ) A.b=1.0/a B.b=(float)(1/a) C.b=1/(float)a D.b=1/(a*1.0) 16. 若“int n; float f=13.8;”,则执行“n=(int)f%3”后,n的值是(A) A.1 B.4 C.4.333333 D.4.6 “(int)f“表示将f中的值强制类型转换为整型,即将13.8的小数部分舍掉,转换为13;然后计算13%3,结果为1,再将结果赋给变量n,因此n的值为1 17. 以下对一维数组a的正确说明是: D A) char a(10); B) int a[]; C)int k=5,a[k]; D)char a[3]={?a?,?b?,?c?}; 详见教材P143~144,一维数组的定义、初始化 类型符 数组名 [常量表达式] 类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;常量表达式是指数组的长度(数组中包含元素的个数),其值只能是整数,不可以是变量,而且从1开始计数。 选项A,常量表达式只能放在中括号 [ ]中 选项B,只有在对数组初始化(即赋值)的时候才可以省略数组的长度,B中并未对a进行初始化。 选项C,常量表达式不能为变量。 18.以下能对一维数组a进行初始化的语句是: ( C ) A. int a[5]=(0,1,2,3,4,) B. int a(5)={} C. int a[3]={0,1,2} D. int a{5}={10*1} 详见教材P145,一维数组的定义、初始化 选项B,D,常量表达式只能放在中括号 [ ]中 选项A,数组可以看做是若干个相同数据类型元素的有序集合,因此以集合的形式对其初始化,使用{ }对其初始化,选项A用了(). 19.在C语言中对一维整型数组的正确定义为 D 。 A)int a(10); B)int n=10,a[n]; C)int n;a[n]; D)#define N 10 int a[N]; 20、已知:int a[10]; 则对a数组元素的正确引用是( D )。 A、a[10] B、a[3.5] C、a(5) D、a[0] 详见教材P144,数组元素的引用 数组名[下标] 引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数 int a[10]表示定义了一个包含10个整型数据的数组a,数组元素的逻辑地址下标范围为0~9,即a[0] 表示组中第1个元素; a[1] 表示组中第2个元素; a[2] 表示组中第3个元 素; ......;a[9] 表示组中第10个元素. 选项A,超过了数组a的逻辑地址下标范围; 选项B,逻辑地址下标只能为整数 选项C,逻辑地址下标只能放在[ ]中 21.若有以下数组说明,则i=10;a[a[i]]元素数值是(C )。 int a[12]={1,4,7,10,2,5,8,11,3,6,9,12}; A.10 B.9 C.6 D.5 先算a[a[i]]内层的a[i],由于i=10,因此a[i]即a[10]. a[10]对应下面数组中的元素为9. 因此a[a[i]]即为a[9] a[9]对应下面数组中的元素为6. 因此a[9]即为6 22.若有说明:int a[][3]={{1,2,3},{4,5},{6,7}}; 则数组a的第一维的大小为: ( B ) A. 2 B. 3 C. 4 D.无确定值 5 7 D) 3 6 9 二维数组的一维大小,即指二维数组的行数,在本题中,按行对二维数组赋值,因此内层有几个大括号,数组就有几行 23.对二维数组的正确定义是( C ) 详见教材P149~152,二维数组的定义、初始化 类型符 数组名 [常量表达式][常量表达式] 二维数组可以看做是矩阵 类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;第一个常量表达式是指数组的行数;第二个常量表达式是指数组的列数;常量表达式的值只能是整数,不可以是变量,而且从1开始计数。 一维数组初始化时可以省略数组长度 二维数组初始化时可以省略行数,但不能省略列数 选项A,B,都省略了列数 选项D,不符合二维数组定义的一般形式,行、列常量表达式应该放在不同的[]中 A.int a[ ] [ ]={1,2,3,4,5,6}; B.int a[2] [ ]={1,2,3,4,5,6}; C.int a[ ] [3]={1,2,3,4,5,6}; D.int a[2,3]={1,2,3,4,5,6}; 24.已知int a[3][4];则对数组元素引用正确的是__C___ A)a[2][4] B)a[1,3] C)a[2][0] D)a(2)(1) 详见教材P150,数组元素的引用 数组名[下标] [下标] 引用数组元素时,[ ]中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数 第一个[下标]表示行逻辑地址下标,第二个[下标]表示列逻辑地址下标。 本题图示详见P149图6.7 因此a的行逻辑地址范围0~2;a的列逻辑地址范围0~3; 选项A,列逻辑地址下标超过范围 选项B,D,的引用形式不正确。 25.C语言中函数返回值的类型是由 A 决定的. A)函数定义时指定的类型 B) return语句中的表达式类型 C) 调用该函数时的实参的数据类型 D) 形参的数据类型 26. 在C语言中,函数的数据类型是指( A ) A 函数返回值的数据类型 B. 函数形参的数据类型 C 调用该函数时的实参的数据类型 D.任意指定的数据类型 27. 在函数调用时,以下说法正确的是( B ) A.函数调用后必须带回返回值 B.实际参数和形式参数可以同名 C.函数间的数据传递不可以使用全局变量 D.主调函数和被调函数总是在同一个文件里 28. 在C语言中,表示静态存储类别的关键字是: ( C ) A) auto B) register C) static D) extern 29.未指定存储类别的变量,其隐含的存储类别为( A )。 A)auto B)static C)extern D)register 30. 若有以下说明语句: struct student { int num; char name[ ]; float score; }stu; 则下面的叙述不正确的是: ( D ) A. struct是结构体类型的关键字 B. struct student 是用户定义的结构体类型 C. num, score都是结构体成员名 D. stu是用户定义的结构体类型名 31.若有以下说明语句: struct date { int year; int month; int day; }brithday; 则下面的叙述不正确的是__C___. A) struct是声明结构体类型时用的关键字 B) struct date 是用户定义的结构体类型名 C) brithday是用户定义的结构体类型名 D) year,day 都是结构体成员名 32. 以下对结构变量stul中成员age的非法引用是 B struct student { int age; if ( c>d ) c=5.0; else if ( c==d ) c=6.0; else c=7.0; printf ( “%.1f\\n”,c ) ; } 运行结果为:7.0 此题为if...else...语句的嵌套,第二if...else...作为第一个if...else...语句else部分的复合语句。 若表达式c>d成立,则执行c=5.0; 否则(表达式c>d不成立) 若表达式c==d成立,则执行c=6.0; 否则,执行c=7.0; 输出c中的值 3.0小于4.0,因此表达式c>d不成立,执行第二个if…else…。 3.0不等于4.0,因此表达式c==d不成立,执行c=7.0,将7.0赋给c, 覆盖掉c中的3.0,此时c中的值为7.0 输出此时的c中的值 6. #include { if (m % 2 == 0) printf(\ else printf(\} } 若键入-9,则运行结果为: -9 is a negative odd 7. #include { int num=0; while(num<=2){ num++;printf(\;} } 运行结果为: 1 2 3 详见教材p115循环结构 当循环条件num<=2成立的时候,执行循环体{ num++;printf(\;}中的语句。 循环初值num为0; 循环条件num<=2成立 第1次循环:执行num++;即将num中的值加1,执行后num为1; 执行printf(\;在屏幕上输出num中的值,即输出1,之后换行 此时num中的值为1,循环条件num<=2成立 第2此循环:执行num++;即将num中的值加1,执行后num为2; 执行printf(\;在屏幕上输出num中的值,即输出2,之后换行 此时num中的值为2,循环条件num<=2成立 第3此循环:执行num++;即将num中的值加1,执行后num为3; 执行printf(\;在屏幕上输出num中的值,即输出3,之后换行 此时num中的值为3,循环条件num<=2不成立,结束循环。 8. #include { int sum=10,n=1; while(n<3) {sum=sum-n; n++; } printf(“%d,%d”,n,sum); } 运行结果为:3,7 当循环条件n<3成立的时候,执行循环体{sum=sum-n; n++; }中的语句。 循环初值sum为10,n为1; 循环条件n<3成立 第1次循环:执行sum=sum-n=10-1=9; 执行n++,即将n中的值加1,执行后n为2; 此时n中的值为2,sum中的值为9,循环条件n<3成立,继续执行循环 第2次循环:执行sum=sum-n=9-2=7; 执行n++,即将n中的值加1,执行后n为3; 输出此时n,sum中的值,即为3,7。需要注意,在printf(“%d,%d”,n,sum); 中要求输出的数据彼此间用逗号间隔,因此结果的两个数据间一定要有逗号 9. #include { int num,c; scanf(\ do {c=num; printf(\ }while((num/=10)>0); printf(\ } 从键盘输入23,则运行结果为:32 详见教材p117循环结构;p60复合的赋值运算符 do{ }while(表达式); 先无条件执行循环体,再判断循环条件。注意while(表达式)后有分号 定义整型变量num,c; 为num赋一个整型值; 执行{c=num; printf(\ }直到循环条件(num/=10)>0不成立; 输出换行 已知为num赋值23 第1次执行循环体 执行c=num=23=3; 执行printf(\输出3 判断循环条件 num/=10等价于num=num/10; 因此num=23/10=2, 2大于0,因此循环条件(num/=10)>0成立,继续执行循环体。执行完第1次循环时,num为2,c为3 第2次执行循环体 执行c=2=2; 执行printf(\再输出2 判断循环条件num=2/10=0,0等于0,因此循环条件(num/=10)>0不成立。结束循环 10 #include { int s=0,a=5,n; scanf(\ do { s+=1; a=a-2; }while(a!=n); printf(\,%d\\n\ } 若输入的值1,运行结果为: 2,1 详见教材p117循环结构;p60复合的赋值运算符 执行{ s+=1; a=a-2; }直到循环条件a!=n不成立; 已知为n赋值1,s为0,a为5 第1次执行循环体 执行s+=1;等价于s=s+1=0+1 执行a=a-2; a=5-2=3 判断循环条件,3不等于1,因此循环条件a!=n成立,继续执行循环体。 执行完第1次循环时,s为1,a为3 第2次执行循环体 执行s+=1;等价于s=s+1=1+1=2 执行a=a-2; a=3-2=1 判断循环条件,1等于1,因此循环条件a!=n不成立,结束循环。 执行完第2次循环时,s为2,a为1 输出此时s,a中的值,结果为2,1 11. #include \ main() {char c; c=getchar(); while(c!='?') {putchar(c); c=getchar(); } } 如果从键盘输入abcde?fgh(回车) 运行结果为:abcde 12. #include while((c=getchar())!=?$?) { if(?A?<=c&&c<=?Z?) putchar(c); else if(?a?<=c&&c<=?z?) putchar(c-32); } } 当输入为ab*ABí#CD$时,运行结果为:ABABCDCD 13. #include { int x, y =0; for(x=1;x<=10;x++) { if(y>=10) break; y=y+x; } printf(“%d %d”,y,x); } 运行结果为:10 5 详见教材p120 for语句 详见教材p126~128 break,continue语句 for( 表达式1;表达式2;表达式3) { } (1) 先求解表达式1 (2) 求解表达式2,若其值为真,执行循环体,然后执行 (3). 若为假,则结束循环,转到(5) (3) 求解表达式3 (4) 转回上面 (2)继续执行 (5) 循环结束,执行for语句下面的一个语句 break ,跳出循环体;continue,结束本次循环(第i次循环),继续执行下一次循环(第i+1次循环) 此题 表达式1为x=1,表达式2(循环条件)为x<=10,表达式3为x++ 初值x为1,y为0,循环条件(即表达式2)x<=10成立,进入循环体 第1次循环 执行if语句。0小于10,if语句的条件表达式不成立,不执行break; 执行y=y+x; y=0+1=1 转向表达式3,执行x++, x=x+1=1+1=2。循环条件x<=10成立,进入第2次循环 第2次循环 执行if语句。1小于10,if语句的条件表达式不成立,不执行break; 执行y=y+x; y=1+2=3 转向表达式3,执行x++, x=x+1=2+1=3。循环条件x<=10成立,进入第3次循环 第3次循环 执行if语句。3小于10,if语句的条件表达式不成立,不执行break; 执行y=y+x; y=3+3=6 转向表达式3,执行x++, x=x+1=3+1=4。循环条件x<=10成立,进入第4次循环 第4次循环 执行if语句。6小于10,if语句的条件表达式不成立,不执行break; 执行y=y+x; y=6+4=10 转向表达式3,执行x++, x=x+1=4+1=5。循环条件x<=10成立,进入第5次循环 第5次循环 执行if语句。10等于10,if语句的条件表达式成立,执行break,跳出循环。 从break跳出至for语句的下一条语句。执行printf(“%d %d”,y,x); 输出当前的y与x.结果为10 5 14. #include ch=getchar( ); switch(ch) { case ?A? : printf(“%c”,?A?); case ?B? : printf(“%c”,?B?); break; default: printf(“%s\\n”,”other”); } } 当从键盘输入字母A时,运行结果为:AB 详见教材p103,switch语句 switch(表达式) { case 常量1 :语句1 case 常量2 :语句2 ┇ ┇ ┇ case 常量n :语句n default : 语句n+1 } 其中表达式,常量1,…,常量n都为整型或字符型 case相当于给出执行程序的入口和起始位置,若找到匹配的常量,则从此处开始往下执行程序,不再匹配常量,直至遇到break或switch结束 本题过程: 首先从键盘接收一个字符?A?并将其放在变量ch中。 执行switch语句。Switch后面的条件表达式为ch,因此表达式的值即为字符?A?. 用字符?A?依次与下面的 case中的常量匹配。 与第1个case后的常量匹配,则从其后的语句开始往下执行程序(在执行过程中不再进行匹配。)因此先执行printf(“%c”,?A?),屏幕上输出A;再往下继续执行printf(“%c”,?B?),屏幕上输出B;再继续执行break, 此时跳出switch语句。 15. #include { int a=1,b=0; scanf(“%d”,&a); switch(a) { case 1: b=1;break; case 2: b=2;break; default : b=10;} printf(\; } 若键盘输入5,运行结果为:10 本题过程: 首先用scanf函数为变量a赋值为5。 执行switch语句。switch后面的条件表达式为a,因此表达式的值即为5. 用5依次与下面 case中的常量匹配。没有找到匹配的常量,因此两个case后的语句都不执行。执行default后面的语句b=10;将10赋给变量b。 输出变量b,结果为10 16. #include { char grade=?C?; switch(grade) { case ?A?: printf(“90-100\\n”); case ?B?: printf(“80-90\\n”); case ?C?: printf(“70-80\\n”); case ?D?: printf(“60-70\\n”); break; case ?E?: printf(“<60\\n”); default : printf(“error!\\n”); } } 运行结果为: 70-80 60-70 本题过程: 首先从键盘接收一个字符?C?并将其放在变量grade中。 执行switch语句。switch后面的条件表达式为grade,因此表达式的值即为字符?C?. 用字符?C?依次与下面的 case中的常量匹配。 与第3个case后的常量匹配,则从其后的语句开始往下执行程序(在执行过程中不再进行匹配。)因此先执行printf(“70-80\\n”);,屏幕上输出70-80,并换行;再往下继续执行printf(“60-70\\n”),屏幕上输出60-70,并换行;再继续执行break, 此时跳出switch语句。 17. #include for(;y>0;y- -) if(y%3==0) { printf(%d”,- -y); } } 运行结果为: 852 详见教材p53,自增自减符号 此题 表达式1被省略,表达式2(循环条件)为y>0,表达式3为y-- 初值y为9,循环条件(即表达式2)y>0成立,进入循环体 第1次循环 执行if语句。9%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为8,然后在输出,因此屏幕上输出8 转向表达式3,执行y--, y=y-1=8-1=7。循环条件y>0成立,进入第2次循环 第2次循环 执行if语句。7%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y) 转向表达式3,执行y--, y=y-1=7-1=6。循环条件y>0成立,进入第3次循环 第3次循环 执行if语句。6%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为5,然后在输出,因此屏幕上输出5 转向表达式3,执行y--, y=y-1=5-1=4。循环条件y>0成立,进入第4次循环 第4次循环 执行if语句。4%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y) 转向表达式3,执行y--, y=4-1=3。循环条件y>0成立,进入第5次循环 第5次循环 执行if语句。3%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为2,然后在输出,因此屏幕上输出2 转向表达式3,执行y--, y=y-1=2-1=1。循环条件y>0成立,进入第5次循环 第6次循环 执行if语句。1%3不为0,if语句的条件表达式不成立,不执行printf(%d”,- -y) 转向表达式3,执行y--, y=1-1=0。循环条件y>0不成立,循环结束。 18. #include { int i,sum=0; i=1; do{ sum=sum+i; i++; }while(i<=10); printf(“%d”,sum); } 运行结果为: 55 19. #include int x1=1,x2=2; printf(\ for(i=1;i<=N;i++) { printf(\if(i%2==0) printf(\x1=x1+x2; x2=x2+x1; } } 运行结果为: 1 2 3 5 8 13 21 34 此题 首先为整型变量赋初值x1=1,x2=2 表达式1为i=1,表达式2(循环条件)为i<=N即i<=4,表达式3为i++ 循环变量初值i为1,循环条件(即表达式2)i<=4成立,进入第1次循环 第1次循环 执行printf(\因此屏幕上输出1 2 执行if语句。1%2不为0,if语句的条件表达式不成立,不执行printf(\执行x1=x1+x2=1+2=3;此时x1中的值已变为3 执行x2=x2+x1=2+3=5。 转向表达式3,执行i++, i为2。循环条件i<=4成立,进入第2次循环 第2次循环 执行printf(\因此屏幕上输出3 5 执行if语句。2%2==0,if语句的条件表达式成立,执行printf(\换行 执行x1=x1+x2=3+5=8;此时x1中的值已变为8 执行x2=x2+x1=5+8=13。 转向表达式3,执行i++, i为3。循环条件i<=4成立,进入第3次循环 第3次循环 执行printf(\因此屏幕上输出8 13 执行if语句。3%2不为0,if语句的条件表达式不成立,不执行printf(\执行x1=x1+x2=8+13=21;此时x1中的值已变为21 执行x2=x2+x1=21+13=34。 转向表达式3,执行i++, i为4。循环条件i<=4成立,进入第4次循环 第2次循环 执行printf(\因此屏幕上输出21 34 执行if语句。4%2==0,if语句的条件表达式成立,执行printf(\换行 执行x1=x1+x2=21+34=55;此时x1中的值已变为55 执行x2=x2+x1=34+55=89。 转向表达式3,执行i++, i为5。循环条件i<=4不成立,结束循环 20 #include { int x, y; for(x=30, y=0; x>=10, y<10; x--, y++) x/=2, y+=2; printf(“x=%d,y=%d\\n”,x,y); } 运行结果为: x=0,y=12 21. #include for(i=1;i<=N;i++) { for(j=1;j 运行结果为: * * * * 详见教材P41符号常量 用宏处理指令定义符号常量N为4,在编译过程中,遇到N即视为整数4。 外层for循环,表达式1为i=1,表达式2(循环条件)为i<=N,表达式3为 i++ 内层for循环,表达式1为j=1,表达式2(循环条件)为j } main() {int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3); printf(“%d\\n”,x); } 运行结果为: 24 13. #include\main() {int j,k; static int x[4][4],y[4][4]; for(j=0;j<4;j++) for(k=j;k<4;k++) x[j][k]=j+k; for(j=0;j<4;j++) for(k=j;k<4;k++) y[k][j]=x[j][k]; for(j=0;j<4;j++) for(k=0;k<4;k++) printf(\} 运行结果为: 0,0,0,0,1,2,0,0,2,3,4,0,3,4,5,6 函数 1. #include {int x, y, result = 0; scanf(\ result = Sub(x,y ) ; printf(\} 当从键盘输入:6,3运行结果为: result =3 2. #include int min( int x, int y ) { int m; if ( x> y ) m = x; else m = y; return(m); } main() { int a=3,b=5,abmin ; abmin = min(a,b); printf(“min is %d”, abmin); } 运行结果为: min is 5 3. #include printf(“%d, ”,x); } main( ) { int x=20; func(x); printf(“%d”, x); } 运行结果为: 10, 20 在main函数中调用函数func,main函数将20作为实参穿给func,并转向开始执行func. main()对应的内存 func()对应的内存 20 x 20 x func()执行x=10;,其内存中x变为10. 10 x func()执行printf(“%d, ”,x); 即输出func函数对应内存中x的值,输出的是10. 至此,func函数执行结束,返回main函数。 main函数执行printf(“%d”, x);此时输出main函数对应内存中的x,即20 4. #include int func(int x,int y) { int m=1; return(x*y-m); } main() {int a=2,b=3; printf(\ printf(\ } 运行结果为: 4 1 整型变量m在函数外定义,因此m为全局变量,其作用于范围为其定义位置开始,一直到整个程序结束。因此func与main函数都可以访问m 程序首先执行main函数 执行printf(\即输出m中的值4,并换行。 执行printf(\即输出表达式func(a,b)/m的值,为了计算该表达式, 需要调用函数func。此时main将a,b中的2和3值作为实参传递给func的x和y 程序开始转向执行func函数,此时func中的x为2,y为3 执行int m=1; 此句定义了一个局部变量m并赋值为1 。m的作用域为其所在的复合 语句,即func的函数体,因此在func的函数体重,有限访问局部变量m。 执行return(x*y-m); 即return(2*3-1) ;返回的是整数5. func函数返回至main函数中的被调用处 main函数中func(a,b)的值为5,func(a,b)/m=5/4=1,注意,在main函数中访问的m为全局变量m,此时main函数无法访问func中的m,因为不在func中m的作用域。 5. #include { if(a>b) return(a); else return(b); } main() { int x=15, y=8, r; r= fun(x,y); printf(\} 运行结果为:r=15 程序首先执行main函数 执行r= fun(x,y);即将func(x,y)的值赋给r,为了计算该表达式,需要调用函数func。此时main将x,y中的15和8值作为实参传递给func的a和b 程序开始转向执行func函数,此时func中的a为15,b为8 执行if语句;判断if后面的表达式,a>b成立,因此执行相应的操作return(a);即返回 a的值 。 func函数返回至main函数中的被调用处 main函数中func(x,y)的值为15,即将15赋给r。 执行printf(\即输出r=15 6. #include for(i=1;i<=n;i++) f=f * i; return(f); } main() { int j,s; scanf(“%d”,&j); s=fac(j); printf(\} 如果从键盘输入3, 运行结果为: 3!=6 程序首先执行main函数 执行r= fun(x,y);即将func(x,y)的值赋给r,为了计算该表达式,需要调用函数func。此时main将x,y中的15和8值作为实参传递给func的a和b 程序开始转向执行func函数,此时func中的a为15,b为8 执行if语句;判断if后面的表达式,a>b成立,因此执行相应的操作return(a);即返回 a的值 。 func函数返回至main函数中的被调用处 main函数中func(x,y)的值为15,即将15赋给r。 执行printf(\即输出r=15 7. #include unsigned fun6(unsigned num) { unsigned k=1; do { k*=num; num/=10; }while(num); return k; } main() { unsigned n=26; printf(“%d\\n”,fun6(n)); } 运行结果为:12 程序首先执行main函数 执行printf(“%d\\n”,fun6(n)); 即输出表达式func(6)的值,为了计算该表达式,需要调用 函数func。此时main将n中的26作为实参传递给func的num 程序开始转向执行func函数,此时func中的num为26 执行do-while语句 第1次循环 执行k*=num,即k=k*(num)=1*(26)=6 执行num/=10;即num=num/10=26/10=2 while后面循环条件为num,此时num为2,是非0值,即表示循环条件成立, 继续执行循环体。此时k为6 第2次循环 执行k*=num,即k=k*(num)=6*(2)=12 执行num/=10;即num=num/10=2/10=0 while后面循环条件为num,此时num为0,表示循环条件不成立, 结束循环 执行return k; 即返回至main函数中的被调用处 执行main函数 继续执行printf(“%d\\n”,fun6(n)); 即输出12 8. #include printf(\ } max(int x, int y) { int z; z=x>y? x : y; return(z) ; } 运行结果为: Max is 8 指针 1. # include < stdio .h > main ( ) { int x[ ] = {10, 20, 30, 40, 50 }; int *p ; p=x; printf ( “%d”, *(p+2 ) ); } 运行结果为: 30 首先定义一个整型数组x,x的长度为5;然后定义一个指针变量p;对p进行初始化,将数组x的地址赋给p。因此此时p中存放的数组x的首地址,即数组中第一个元素x[0]的地址。 然后执行printf语句,输出表达式*(p+2)的值。p+2表示以p当前指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值30,因此输出30 2. #include { char s[]=”abcdefg”; char *p; p=s; printf(“ch=%c\\n”,*(p+5)); } 运行结果为: ch=f 首先定义一个字符型数组s,并用字符串abcdefg对s进行初始化; 然后定义一个字符型指针变量p; 对p进行初始化,将数组s的地址赋给p。因此此时p中存放的数组s的首地址,即数组中第一个元素s[0]的地址。 然后执行printf语句,输出表达式*(p+5)的值。p+5表示以p当前指向的位置起始,之后 第5个元素的地址,即a[5]的地址。*(p+5)则表示该地址内所存放的内容,即a[5]的值f, 因此输出ch=f 3. #include { int a[]={1, 2, 3, 4, 5} ; int x, y, *p; p=a; x=*(p+2); printf(\:%d \\n\; } 运行结果为: 1:3 首先定义一个整型数组a,并对a进行初始化; 然后定义整型变量x,y,整型指针变量p; 再将数组a的地址赋给p。因此此时p中存放的数组a的首地址,即数组中第一个元素a[0]的地址。执行x=*(p+2);p+2表示以p当前所指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值3,然后再把3赋给x 然后执行printf语句,先输出表达式*p的值。此时*p表示的是p所指向变量的内容,即a[0]的值1。再输出一个冒号。然后再输出x中的值3。 4. #include { int arr[ ]={30,25,20,15,10,5}, *p=arr; p++; printf(“%d\\n”,*(p+3)); } 运行结果为:10 首先定义一个整型数组arr,并对arr进行初始化; 然后定义整型指针变量p; 再将数组arr的地址赋给p。因此此时p中存放的数组arr的首地址,即数组中第一个元素a[0]的地址。 执行p++,即p=p+1。p+1表示以p当前所指向的位置起始,之后第1个元素的地址,即arr[1]的地址,然后再将arr[1]的地址赋给p,执行完此语句后,p不再指向arr[0],而是指向arr[1]。 然后执行printf语句,输出表达式*(p+3)的值。p+3表示以p当前指向的位置起始(此时p指向arr[1]),之后第3个元素的地址,即arr[4]的地址。*(p+3)则表示该地址内所存放的内容,即arr[4]的值10, 因此输出10 5. #include { int a[ ]={1, 2, 3, 4, 5, 6}; int x, y, *p; p = &a[0]; x = *(p+2); y = *(p+4); printf(“*p=%d, x=%d, y=%d\\n”, *p, x, y); } 运行结果为: *p=1, x=3, y=5 首先定义一个整型数组a,并对a进行初始化; 然后定义整型变量x,y,整型指针变量p; 再将数组元素a[0]的地址赋给p。 执行x=*(p+2);p+2表示以p当前所指向的位置起始,之后第2个元素的地址,即a[2]的地址。*(p+2)则表示该地址内所存放的内容,即a[2]的值3,然后再把3赋给x 执行y = *(p+4); p+4表示以p当前所指向的位置起始,之后第4个元素的地址,即a[4]的地址。*(p+4)则表示该地址内所存放的内容,即a[4]的值5,然后再把5赋给y 执行printf语句,先输出表达式*p的值。此时*p表示的是p所指向变量的内容,即a[0]的值1。再输x的值3。再输出y的值5。 6. #include { static char a[ ]=”Program”, *ptr; for(ptr=a, ptr 运行结果为: Porm 首先定义一个字符型数组a,并对a进行初始化; 然后定义字符型指针变量p; 执行for语句 ptr=a为表达式1,将数字a的地址赋给ptr;表达式2(循环条件)ptr 执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第1个元素,即 a[0],因此*ptr表示a[0]中的值,即?P?. 执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位 置起始,之后第2个元素的地址,即a[2]的地址,然后将a[2]的地址赋给ptr。a[2]的地 址等价于a+2,因此循环条件ptr 执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第3个元素,即 a[2],因此*ptr表示a[2]中的值,即?o?. 执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位 置起始,之后第2个元素的地址,即a[4]的地址,然后将a[4]的地址赋给ptr。a[4]的地 址等价于a+4,因此循环条件ptr 执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第5个元素,即 a[4],因此*ptr表示a[4]中的值,即?r?. 执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位 置起始,之后第2个元素的地址,即a[6]的地址,然后将a[6]的地址赋给ptr。a[6]的地址等价于a+6,因此循环条件ptr 执行putchar(*ptr); 即输出*ptr所对应的字符。此时ptr指向数组中的第7个元素,即 a[6],因此*ptr表示a[6]中的值,即?m?. 执行完循环体,转向执行表达式3,即ptr= ptr+2。ptr+2表示以ptr当前所指向的位 置起始,之后第2个元素的地址,即a[8]的地址,然后将a[8]的地址赋给ptr。a[6]的地址等价于a+8,因此循环条件ptr #include for(p=s;p printf(“%c %s\\n”,*p,p); } 运行结果为: A ABCD B BCD C CD D D 首先定义一个字符型数组s,并对s进行初始化; 数组s是全局变量,其有效范围从其定义开始至整个程序结束。 执行main函数 定义一个字符型指针p。 执行for语句 p=s为表达式1,将数字s的首地址赋给p;表达式2(循环条件)p 第1次执行循环体 执行printf(“%c %s\\n”,*p,p);即以字符%c形式输出*p所对应的字符。此时p指 向数组中的第1个元素,即s[0],因此*p表示a[0]中的值,即?A?. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,即输出ABCD 执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的 位置起始,之后1个元素的地址,即s[1]的地址,然后将a[1]的地址赋给p。 s[1]的地址等价于s+1,因此循环条件p 向数组中的第2个元素,即s[1],因此*p表示s[1]中的值,即?B?. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[1],即 从s[1]开始,依次输出后面的字符串,因此又输出BCD 执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的 位置起始,之后1个元素的地址,即s[2]的地址,然后将a[2]的地址赋给p。 s[2]的地址等价于s+2,因此循环条件p 向数组中的第3个元素,即s[2],因此*p表示s[2]中的值,即?C?. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[2],即 从s[2]开始,依次输出后面的字符串,因此又输出CD 执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的 位置起始,之后1个元素的地址,即s[2]的地址,然后将s[2]的地址赋给p。 s[2]的地址等价于s+3,因此循环条件p 向数组中的第4个元素,即s[3],因此*p表示s[3]中的值,即?D?. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,即输出D 执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的 位置起始,之后1个元素的地址,即s[3]的地址,然后将s[3]的地址赋给p。 s[3]的地址等价于s+4,因此循环条件p 结构体 1. #include } a[2]={5, 7, 2, 9} ; main() { printf(\} 运行结果是: 14 首先是定义结构体st,st中共有两个整型成员x,y。 然后定义一个st类型的数组a,a的长度为2,即数组中含有两个st类型的元素,分别是a[0]和a[1]. 对a进行初始化,此题是按照储存顺序进行初始化,即将5赋给a[0]中的x(即a[0].x=5); 将7赋给a[0]中的y(即a[0].y=7); 将2赋给a[1]中的x(即a[1].x=2); 将9赋给a[1]中的y(即a[1].y=9); 执行main函数,输出表达式a[0].y*a [1].x的值,即7*2的值
正在阅读:
大学C语言期末考试练习题(带详解答案)07-09
《大气污染控制工程》课程教学大纲资料07-09
企业网络搭建之VPN技术10-18
论自然资源国家所有权行使的基本原则06-11
三年级阅读理解之概括段落大意06-23
个体化治疗是控制老年高血压的重要对策05-27
三国演义作者简介02-19
2009年常德市高中数学竞赛获奖情况03-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 练习题
- 期末
- 详解
- 答案
- 语言
- 考试
- 大学
- 关于加强车用燃气业务管理的通知
- 《资源与运营管理》期末复习机考单选题库(100%重点题)
- 交际用语复习指导(一)
- 2014 2015 2016上海落户研究生评分标准(凡是总分达72分直接转为
- 涂料习题
- 阅读材料3-4:中国海洋事业的发展
- 临时出国人员费用开支标准和管理办法
- 基因敲除技术研究新进展2011
- 调查问卷
- IPMP-D级认证考试试题及答案
- 铁路车务技师实作题库
- 优秀教育工作者先进事迹材料:俯首甘为孺子牛
- 市场定位案例解析
- CNG气瓶充装质量管理手册
- 安全培训教育记录季节性施工安全教育
- 六大纪律、十不吊、十不烧、十不登
- 毕业设计换热器概述
- 金针菇种植的注意事项
- 2016年逻辑与批判性思维期末考试高分答案
- 我国压铸行业市场现状及前景分析