大学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 main() { int m; scanf(\ if (m >= 0) { if (m%2 == 0)printf(\ else printf(\} else

{ if (m % 2 == 0) printf(\

else printf(\} }

若键入-9,则运行结果为: -9 is a negative odd 7.

#include main()

{ 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 main( )

{ 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 main()

{ 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 main()

{ 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 main() { char c;

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 main()

{ 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 main( ) { char ch;

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 main( )

{ 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 main()_

{ 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 main() { int y=9;

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 main()

{ int i,sum=0; i=1;

do{ sum=sum+i; i++; }while(i<=10); printf(“%d”,sum); }

运行结果为: 55 19.

#include #define N 4 main() { int i;

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 main( )

{ 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 #define N 4 main( ) { int i,j;

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 Sub(int a, int b) {return (a- b);} main()

{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 func(int x) { x=10;

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 m=4;

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 int fun(int a, int b)

{ 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 int fac(int n) { int f=1,i;

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 int max(int x, int y); main() { int a,b,c; a=7;b=8; c=max(a,b);

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 main( )

{ 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 main ( )

{ 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 main()

{ 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 main( )

{ 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 main( )

{ 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 char s[]=”ABCD”; main() { char *p;

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 struct st { int x; int y;

} 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的值

本文来源:https://www.bwwdw.com/article/lgf.html

Top