20xx二级C语言知识点全部总结

好好加油 各位学弟学妹

计算机二级考试C语言知识点总结

(完全针对考试大纲)

总体上必须清楚的:

1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。

3)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址.

4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位. 00011110

5)一定要记住 二进制 与 十进制互化。

概念常考到的:

1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

2、每个C语言程序中main函数是有且只有一个。

3、在函数中不可以再定义函数。

4、算法的是一定要有输出的,他可以没有输入。

5、break可用于循环结构和switch语句。

6、逗号运算符的级别最低。

第一章

1)合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。

关键字不可以作为用户标识符号。main define scanf printf if都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

2)实型数据的合法形式:

2.333e0.1 就是合法的,且数据是2.333×10-1。

考试口诀:e前e后必有数,e后必为整数。.

3)字符数据的合法形式::

'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。

'0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。

4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:

考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。

5)转义字符的考查:

在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。 在程序中 int a = 067, 是一个八进制的形式。

在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。

‘\141’ 是合法的。

‘\108’是非法的,因为不可以出现8。

转义字符 意义 ASCII码值(十进制)

\a 响铃(BEL) 007

\b 退格(BS) 008

\f 换页(FF) 012

\n 换行(LF) 010

\r 回车(CR) 013

\t 水平制表(HT) 009

\v 垂直制表(VT) 011

\\ 反斜杠 092 \\

\? 问号字符 063

\' 单引号字符 039

\" 双引号字符 034

\0 空字符(NULL) 000

\ddd 任意字符 三位八进制

\xhh 任意字符 二位十六进制

6)算术运算符号的优先级别:

同级别的有的是从左到右,有的是从右到左。

7)强制类型转换:

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b)和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。 a=2.5 b=3.6

8)表达式的考查:

是表达式就一定有数值。

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。 自加、自减表达式:假设a=5,++a(是为6), a++(为5);

运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,

再放到变量a中。 进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。 a=5,b=6

c=a-- c= --a

考试口诀:++在前先加后用,++在后先用后加。

逗号表达式:优先级别最低 ;表达式的数值是逗号最右边的那个表达式的数值。 (2,3,4)的表达式的数值就是4。

9)位运算的考查:

会有一到二题考试题目。

总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

例1: char a = 6, b;

b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。 例2: 一定要记住,

例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。 10)018的数值是非法的,八进制是没有8的,逢8进1。

11)%符号两边要求是整数。不是整数就错了。

12) 两种取整丢小数的情况:

1、int a =1.6;

2、(int)a;

第二章

1)printf函数的格式考查:

%d对应整型;%c对应字符;%f对应单精度等等。宽度的,左对齐等修饰。 %ld对应 long int;%lf 对应double。

2)scanf函数的格式考察:

注意该函数的第二个部分是&a 这样的地址,不是a;

Scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。

3)putchar ,getchar 函数的考查:

char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。 putchar(‘y’)把字符y输出到屏幕中。

4)如何实现两个变量x ,y中数值的互换(要求背下来)

不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。

5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)

x=(int)(x*1000+0.5)/1000.0

这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉。

第三章

特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。

1)关系表达式:

表达式的数值只能为1(表示为真),或0(表示假)

当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1;

2)逻辑表达式:

只能为1(表示为真),或0(表示假)

a) 共有&& || ! 三种逻辑运算符号。

b) !>&&>|| 优先的级别。

c) 注意短路现象。考试比较喜欢考到。

d) 要表示 x 是比0大,比10小的方法。0<x<10是不可以的(一定记住)。是先计算0<x 得到的结果为1或则0;再用0,或1与10比较得到的总是真(为1)。所以一定要用 (0<x)&&(x<10)表示比0大比10小。

3)if 语句

else 是与最接近的if且没有else的相组合的。

4)条件表达式:

表达式1 ?表达式2 :表达式3

注意是当非0时候是表达式2的数值,当为0是就是表达式2的数值。

考试口诀:真前假后。

5)switch语句:

a)一定要注意 有break 和没有break的差别,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swich语句。

b)switch只可以和break一起用,不可以和continue用。

第四章

1)三种循环结构:

a)for() ; while(); do- while()三种。

b)for循环当中必须是两个分号,千万不要忘记。

c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。 d) do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错)

2) break 和 continue的差别

记忆方法:

break:是打破的意思,(破了整个循环)所以看见break就退出真个一层循环。

continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。

3)嵌套循环

就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。

4) while((c=getchar())!=’\n’) 和 while(c=getchar() !=’\n’)的差别

先看a = 3 != 2 和 (a=3)!=2 的区别:

(!=号的级别高于=号 所以第一个先计算 3!=2) 第一个a的数值是得到的1;第二个a的数值是3。

考试注意点: 括号在这里的重要性。

第五章

函数:是具有一定功能的一个程序块;

1) 函数的参数,返回数值(示意图):

main()

{

int a = 5,b=6,c;

c = add(a,b);

printf(“%d”,c);

}

调用函数

a,b是实参

整个函数得到一个数值就是

Add函数的返回数值。

int add ( int x, int y)

{

int z;

z=x+y;

return z;

}

被调用函数

x,y是形式参数

函数返回数值是整型

z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。

程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂

时中断等待返回数值。当得到了返回数值后,再顺序的往下执行

2)一定要注意参数之间的传递

实参和形参之间 传数值,和传地址的差别。(考试的重点)

传数值的话,形参的变化不会改变实参的变化。

传地址的话,形参的变化就会有可能改变实参的变化。

3)函数声明的考查:

一定要有:函数名,函数的返回类型,函数的参数类型。

不一定要有:形参的名称。

第六章

指针变量的本质是用来放地址,而一般的变量是放数值的。

int *p 中 *p和p的差别:

*p可以当做变量来用;*的作用是取后面地址p里面的数值

p是当作地址来使用。

*p++ 和 (*p)++的之间的差别:改错题目中很重要

*p++是 地址会变化。

(*p)++ 是数值会要变化。

三名主义:(考试的重点)

数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次) 函数名:表示该函数的入口地址。

字符串常量名:表示第一个字符的地址。

第七章

1一维数组的重要概念:

对a[10]这个数组的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。

3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。

对a[3][3]的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。

3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。

4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。

5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。

二维数组做题目的技巧:

如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。

步骤一:把他们写成: 第一列 第二列 第三列

a[0]à 1 2 3 ->第一行

a[1]à 4 5 6 —>第二行

a[2]à 7 8 9 ->第三行

步骤二:这样作题目间很简单:

*(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以

是1。

*(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。

一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写

int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。 二维数组中的行指针

int a[1][2];

其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针

a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用 还有记住脱衣服法则:

a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3) 这个思想很重要!

第一章C语言概述

一、选择题:

1、一个C程序的执行是从( A )。

A本程序的main函数开始,到main函数结束

B本程序文件的第一个函数开始,到本程序文件的最后一个函数结束

C本程序的main函数开始,到本程序文件的最后一个函数结束

D本程序文件的第一个函数开始,到本程序main函数结束

2、 在 C 语言中,每个语句必须以( D )结束。

A. 回车符 B. 冒号 C. 逗号 D. 分号

3、C 语言规定:在一个源程序中,main函数的位置( C )。

A. 必须在最开始 B. 必须在系统调用的库函数的后面

C. 可以任意 D. 必须在最后

4、一个C 语言程序是由( B )。

A. 一个主程序和若干子程序组成 B. 函数组成

C. 若干过程组成 D. 若干子程序组成

5、下列说法中错误的是( D )。

A. 主函数可以分为两个部分:主函数说明部分和主函数体

B. 主函数可以调用任何非主函数的其他函数

C. 任何非主函数可以调用其他任何非主函数

D. 程序可以从任何非主函数开始执行

6、用 C 语言编写的源文件经过编译,若没有产生编译错误,则系统将( C )。

A. 生成可执行目标文件 B. 生成目标文件

C. 输出运行结果 D. 自动保存源文件

二、填空题:

1、C 语言只有 32 个关键字和 9 种控制语句。

2、每个源程序有且只有一个 main 函数,系统总是从该函数开始执行C语言程序。

3、C 语言程序的注释可以出现在程序中的任何地方,它总是以 \* 符号作为开始标记,以 */ 符号作为结束标记。

4、C 语言中,输入操作是由库函数 scanf 完成的,输出操作是由库函

数 printf 完成的。

5、系统默认的C 语言源程序文件的扩展名是 .c ,经过编译后生成的目标文件的扩展名是 .obj ,经过连接后生成的可执行文件的扩展名是 .exe 。

6、C 语言的标识符只能由字母、数字和 下划线 三种字符组成。

第三章数据类型、运算符和表达式

一、选择题:

1、以下选项中,不正确的 C 语言浮点型常量是( C )。

A. 160. B. 0.12 C. 2e4.2 D. 0.0

2、以下选项中,( D )是不正确的 C 语言字符型常量。

A. 'a' B. '\x41' C. '\101' D. "a"

3、 在 C 语言中,字符型数据在计算机内存中,以字符的( C )形式存储。

A. 原码 B. 反码 C. ASCII 码 D. BCD码

4、若x、i、j和k都是int型变量,则计算下面表达式后,x的值是( C )。

x=(i=4,j=16,k=32)

A. 4 B. 16 C.32 D.52

5、算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为( B )。

A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算

C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算

6、若有代数式 ,则不正确的C语言表达式是( C )。

A.a/b/c*e*3 B. 3*a*e/b/c C.3*a*e/b*c D. a*e/c/b*3

7、表达式!x||a==b 等效于( D )。

A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b)

8、设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是( A)。

A. 0,0 B. 0,1 C. 1,0 D. 1,1

9、 设有语句 int a=3;,则执行了语句 a+=a-=a*=a;后,变量 a 的值是( B )。

A. 3 B. 0 C. 9 D. -12

10、在以下一组运算符中,优先级最低的运算符是( D )。

A. * B. != C. + D. =

11、设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是( B )。

A. 6 B. 12 C. 15 D. 表达式出错

12、若已定义 x 和 y为double 类型,则表达式 x=1,y=x+3/2 的值是( C )。

A. 1 B. 2 C. 2.0 D. 2.5

13、sizeof (double)的结果值是( A )。

A. 8 B. 4 C. 2 D. 出错

14、设a=1,b=2,c=3,d=4,则表达式:a<b? a : c<d? a : d的结果为( D )。

A. 4 B. 3 C. 2 D. 1

15、设a 为整型变量,不能正确表达数学关系:10<a<15的 C 语言表达式是( A )。

A. 10<a<15 B. a= =11|| a= =12 || a= =13 || a= =14

C. a>10 && a<15 D. !(a<=10) && !(a>=15)

16、设 f是实型变量,下列表达式中不是逗号表达式的是( D )。

A. f= 3.2, 1.0 B. f>0, f<10 C. f=2.0, f>0 D. f=(3.2, 1.0)

17、 表达式18/4*sqrt(4.0)/8值的数据类型是( C )。

A. int B. float C. double D. 不确定

18、已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句

C2=’A’+’6’-‘3’;后c2中的值是( A )。

A. D B. 68 C. 不确定的值 D. C

19、以下用户标识符中,合法的是( B )。

A. int B. nit C. 123 D. a+b

20、C 语言中,要求运算对象只能为整数的运算符是( A )。

A. % B. / C. > D. *

21、若有说明语句:char c='\72';则变量c在内存占用的字节数是( A )。

A. 1 B. 2 C. 3 D. 4

22、字符串"ABC"在内存占用的字节数是( B )。

A. 3 B. 4 C. 6 D. 8

23、要为字符型变量 a赋初值,下列语句中哪一个是正确的( B )。

A. char a="3"; B. char a=?3?; C. char a=%; D. char a=*;

24、下列不正确的转义字符是( C )。

A. \\ B. \' C. 074 D. \0

二、填空题:

1、C 语言中的逻辑值“真”是用 1 表示的,逻辑值“假”是用 0 表示的。

2、若x和n都是int型变量,且x的初值为12,n的初值为5,则计算表达式x%=(n%=2)后x的值为 0 。

3、设 c='w',a=1,b=2,d=-5, 则表达式 'x'+1>c, 'y'!=c+2, -a-5*b<=d+1, b==a=2的值分别为 1 、 0 、 1 、 1 。

4、设 float x=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4的值为 2.5 。

5、判断变量 a、b 的值均不为 0 的逻辑表达式为a!=0&&b!=0 。

6、求解赋值表达式 a=(b=10)%(c=6),表达式值、a、b、c 的值依次为 4,4,10,6 。

7、求解逗号表达式 x=a=3,6*a 后,表达式值、x、a 的值依次为18,3,3 。

8、数学式a/(b*c)的 C 语言表达式 a/b/c 。

三、编程题:

1、 设长方形的高为 1.5,宽为 2.3,编程求该长方形的周长和面积。

2、 编写一个程序,将大写字母 A转换为小写字母 a。

1.

main()

{float x=1.5,y=2.3;printf(“area is %6.2f\n”,x*y);}

2.

main()

{char c=?A?;printf(“%d”,c+32);}

顺序结构答案

一、单项选择题

AADAB CCBBD

二、 程序改错题

1.正确的程序为

# include "stdio.h"

main( )

{ char c ;

getchar(c);

putchar('\007') ; /*鸣笛*/

putchar( );

}

2. 正确的程序为

main( )

{ int a,b,s,l;

scanf("%d,%d",&a,&b);

s=a*b; l=2*(a+b);

printf("l=%d,s=%d\n", l ,s);

}

三、写出程序运行结果

1. 68

2. x=4

y=11

四、编程题

1. main( )

{ int a,b,c,sum;

float ave;

scanf(“%d%d%d”,&a,&b,&c);

sum=a+b+c; ave=sum/3.0;

printf(“sum=%d,ave=%.2f\n”,sum,ave); }

五、选做题

1.void main( )

{ float a,b,temp;

printf("input a and b:");

scanf("%d,%d",&a ,&b); temp = a; a = b; b = temp;

printf("a=%d , b=%d\n", a , b); }

选择结构答案

一、单项选择题

1.B 2.A 3.D 4.C 5.D 6.B 7.C

二、填空题

1. 5 5 4

5 5 4

3 3 4

2. 4 0

3. VeryGood

Good

VeryGood

Fail

Pass

Pass

三、 阅读程序,写出运行结果

1. 10, 4, 3;

-1

3

6

1

四、程序设计题

1. main( )

{ int a,b,x,y;

scanf(“%d %d”,&a,&b);

x=a*a+b*b;

if(x>100)

{y=x/100; printf(“%d”,y);}

else printf(“%d”,a+b); }

2. if结构

main()

{ float t;char c;

printf(“input score,max as 100:\n”); scanf(“%f”,&t);

if(t>=90) ch=?A?;

else if(t>=80) ch=?B?;

else if(t>=70) ch=?C?;

else if(t>=60) ch=?D?;

else ch=?E?;

printf(“Grade=%d\n”,ch); }

switch结构

main()

{float t;char c;

printf(“input score,max as 100:\n”); scanf(“%f”,&t);

switch(t/10)

{ case 10:

case 9: ch=?A?;break;

case 8: ch=?B?;break;

case 7: ch=?C?;break;

case 6: ch=?D?;break;

case 5: ch=?E?;

}

printf(“Grade=%d\n”,ch); }

五、选做题

1. main()

{ int a,b,c,t;

scanf(“%d%d%d”,&a,&b,&c); if(a<b){t=a;a=b;b=t;}

if(a<c){t=a;a=c;c=t;}

if(b<c){t=b;b=c;c=t;}

printf(“%d,%d,%d\n”,a,b,c); }

2. switch((s>0)&&(s<=10))

{case 1: switch ((s>=3)&&(s<=6))

{ case 1: x=2; break;

case 0: switch (s>1)||(s>8))

{ case 1: x=3; break;

case 0: x=1; break;

}

} break;

case 0: x=0; break;

}

循环结构答案

一、选择题

1.B 2.A 3.A 4.C 5.A 6.B 7.A 8.C 9.D 10.D

二、填空题

1. x1 x1/2-2

2. ch=getchar() ch>=?A?&&ch<=?Z?

3. s=s+t*i t=-t

三、阅读下列程序,写出程序运行的输出结果

1.852

2. 8921

3. 5

4. SUM=2468

四、程序改错

1.main()

{ int i=200,n=0; /*n用来记录每行已打印数的个数*/ while(i<=300)

{if(i%7==0)

{ //break;

printf("%5d",i); n=n+1;

if(n==5) /*满5个换行*/

{ printf("\n"); n=0; }

}

i++; } }

2). main( )

{ int i,s=0,t=1;

for(i=1;i<=7;i++)

{ t=t*i; s=s+t; } printf("sum=%d\n",s);

}

五、程序设计题

1. main()

{int x,g,s,b;

for(x=100;x<1000;x++)

{ b=x/100;s=x%100/10;g=x%10; if((g*g*g+s*s*s+b*b*b)==x) printf(“%d\n”,x); }

}

2. main()

{ int i,s=0,f=1;

for(i=2;i<80;i++)

{s=s+f*(i-1)/i; f=-f;}

printf(s=%f\n”,s);

}

六、选做题

1. main()

{ float s=0,m=2.0,n=1.0,p; int i;

for(i=1;i<=20;i++)

{s=s+m/n; p=m; m=m+n; n=p;} printf(s=%f\n”,s);

}

2.#include <stdio.h>

main( )

{ int i,j,k,s=1;

for(i=1;i<=20;i++)

for(j=1;j<=50;j++)

{ k=100-i*5-j*2;

if(k>=0)

{ printf(“%2d %2d %2d”,i,j,k); s=s+1;

if(s%5==0) printf(“\n”);

}

}

}

第7章 数组习题

A卷

1. 单项选择题

(1) int a[4]={5,3,8,9};其中 a[3]的值为( )。D

A. 5 B. 3 C. 8 D. 9

(2) 以下 4 个字符串函数中,( )所在的头文件与其他 3 个不同。A

A. gets B. strcpy C. strlen D. strcmp

(3) 以下 4 个数组定义中,( )是错误的。 D

A. int a[7]; B. #define N 5 long b[N]; C. char c[5]; D. int n,d[n];

(4) 对字符数组进行初始化,( )形式是错误。 B

A. char c1[ ]={'1', '2', '3'}; B. char c2[ ]=123; C. char c3[ ]={ '1', '2', '3', '\0'}; D. char c4[ ]="123";

(5) 在数组中,数组名表示( )。 A

A. 数组第 1 个元素的首地址 B.数组第 2 个元素的首地址

C. 数组所有元素的首地址 D.数组最后 1 个元素的首地址

(6) 若有以下数组说明,则数值最小的和最大的元素下标分别是( )。 B

int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12};

A. 1,12 B. 0,11 C. 1,11 D. 0,12

(7) 若有以下说明,则数值为 4 的表达式是( )。 D

int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12}; char c=?a?, d, g ;

A. a[g-c] B. a[4] C. a['d'-'c'] D. a['d'-c]

(8) 设有定义:char s[12] = "string" ; 则printf( "%d\n",strlen(s)); 的输出是( )。 A

A. 6 B. 7 C. 11 D. 12

(9) 设有定义:char s[12] = "string"; 则printf("%d\n ", sizeof(s)); 的输出是( )。 D

A. 6 B. 7 C. 11 D. 12

(10) 合法的数组定义是( )。 A

A. char a[ ]= "string " ; B. int a[5] ={0,1,2,3,4,5}; C. char a= "string " ; D. char a[ ]={0,1,2,3,4,5}

(11) 合法的数组定义是( )。 D

A. int a[3][ ]={0,1,2,3,4,5}; B. int a[ ][3] ={0,1,2,3,4};

C. int a[2][3]={0,1,2,3,4,5,6}; D. int a[2][3]={0,1,2,3,4,5,};

(12) 下列语句中,正确的是 ( )。D

A. char a[3][ ]={'abc', '1'}; B. char a[ ][3] ={'abc', '1'};

C. char a[3][ ]={'a', "1"}; D. char a[ ][3] ={ "a", "1"};

(13) 下列定义的字符数组中,输出 printf("%s\n", str[2]) ;的输出是( )。 C

static str[3][20] ={ "basic", "foxpro", "windows"};

A. basic B. foxpro C. windows D. 输出语句出错

(14) 下列各语句定义了数组,其中哪一个是不正确的( )。 C

A. char a[3][10]={"China","American","Asia"}; B. int x[2][2]={1,2,3,4};

C. float x[2][ ]={1,2,4,6,8,10}; D. int m[][3]={1,2,3,4,5,6};

(15) 数组定义为 int a[3][2]={1,2,3,4,5,6},值为6的数组元素是( )。 B

A. a[3][2] B. a[2][1] C. a[1][2] D. a[2][3]

(16) 下面的程序中哪一行有错误( )。D

#include <stdio.h>

main()

{

float array[5]={0.0}; //第A行

int i;

for(i=0;i<5;i++)

scanf("%f",&array[i]);

for(i=1;i<5;i++)

array[0]=array[0]+array[i];//第B行

printf("%f\n",array[0]); //第C行

}

A. 第A行 B. 第B行 C. 第C行 D. 没有

(17) 下面哪一项是不正确的字符串赋值或赋初值的方式( )。 C

A. char *str; str="string";

B. char str[7]={'s','t','r','i','n','g'};

C. char str1[10];str1="string";

D. char str1[]="string",str2[]="12345678";

(18) 若有以下说明和语句,则输出结果是哪一项( )。C

(strlen(s)为求字符串s的长度的函数)

char s[12]="a book!";

printf("%d",strlen(s));

A. 12 B. 8 C. 7 D. 11

(19) 若有以下说明和语句,则输出结果是( )。B

(strlen(s)为求字符串s的长度的函数)

char sp[]="\t\v\\\0will\n";

printf("%d",strlen(sp));

A. 14 B. 3 C. 9 D. 字符串中有非法字符

(20) 若有以下说明和语句,则输出结果是( )。 C

char str[]="\"c:\\abc.dat\"";

printf("%s",str);

A. 字符串中有非法字符 B. \"c:\\abc.dat\" C. "c:\abc.dat" D. "c:\\abc.dat"

2. 填空题

(1) C 语言中,数组的各元素必须具有相同的 ,元素的下标下限为 ,下标必须是正整数、0、或者 。但在程序执行过程中,不检查元素下标是否 。 数据类型,0,符号常量,越界

(2) C 语言中,数组在内存中占一片 的存储区,由 代表它的首地址。数组名是一个 常量,不能对它进行赋值运算。连续,数组名,地址

(3) 执行 static int b[5], a[ ][3] ={1,2,3,4,5,6}; 后,b[4] = ,a[1][2] = 。 0,6

(4) 设有定义语句 static int a[3][4] ={{1},{2},{3}}; 则 a[1][0]值为 ,a[1][1] 值为 ,a[2][1]的值为 。 2,0,0

(5) 如定义语句为 char a[ ]= "windows",b[ ]= "95";,语句 printf("%s",strcat(a,b));的输出结果为 。Windows95

(6) 根据以下说明,写出正确的说明语句:men是一个有10个整型元素的数组。 step是一个有4个实型元素的数组,元素值分别为1.9, -2.33, 0, 20.6。 grid是一个二维数组,共有4行,10列整型元素。

int mesh[10]; float step[4] = {1.9, -2.33, 0, 20.6}; int grid[4][10];

(7) array是一个一维整形数组,有10个元素,前6个元素的初值是9,4,7,49,32,-5,正确的说明语句为:

。该数组下标的取值范围是从___到___(从小到大)。用scanf函数输入数组的第二个元素表示为: 。用赋值语句把39存入第一个元素表示为: 。

把第六个和第四个元素之和存入第一个元素表示为: 。

int array[10] = {9,4,7,49,32,-5}; 0 9 scanf("%d",&array[1]); array[0] = 39; array[0]= array[5]+array[3];

(8) 写出以下初始化数组的长度:①int chn[3];数组chn的长度为___。②float isa[]={1.0,2.0,3.0,4.0,5.0};

数组isa的长度为___。③int doom[8];数组doom的长度为___。④float pci[4][2];数组pci的长度为___。

⑤int ast[3][3];数组ast的长度为___。⑥int att[3][4];数组att的长度为___。

⑦float dell[][3]={{1,4,7},{2,5},{3,6,9}};数组dell的长度为___。 6 20 16 32 18 24 36

(9) 若有以下整型的a数组,数组元素和它们得值如下所示:

数组元素: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

元素的值: 9 4 12 8 2 10 7 5 1 3

①请写出对该数组的说明,并赋以上初值。

②该数组的最小下标值为___,最大下标值为___。

③写出下面各式的值:a[a[9]]的值为___ ;a[a[4]+a[8]]的值为___。

int a[10]={9,4,12,8,2,10,7,5,1,3}; 0 9 8 8

(10) 字符串"ab\n\\012/\\\""的长度为___。10

3. 判断题

( × )(1) C允许对数组的大小作动态定义,即可用变量定义数组的大小。

( × )(2) 字符数组不要求它的最后一个字符为‘\0’,甚至可以不包含‘\0’。

( × )(3) 数组定义 int a[10]; 也可以写成 int a(10); 。

( √ )(4) 在对全部数组元素赋初值时,可以不指定数组长度。

( × )(5) 定义s为5×6(5行6列)的数组可写成 float a[5,6];

( √ )(6) 数组定义 int a[10]; 表示数组名为a,此数组有10个元素。

( × )(7) 数组定义 int a[10]; 表示数组名为a,此数组有10个元素,第10个元素为a[10]。 ( √ )(8) static char c[]={“a book”}; 与static char c[]=“a book”; 等价。

( × )(9) static char c[]={'a' ,' ','b','o','o','k','\0'};与 static char c[]={'a' ,' ' ,'b','o','o','k'}; 等价。

( × )(10) 设已有说明:static char c1[10],c2[10]; 下面程序片段是合法的。c1={“book”}; c2=c1;

4. 程序填空题

(1) 输入 20 个数,输出它们的平均值,输出与平均值之差的绝对值为最小的数组元素。请填空。

#include <stdio.h>

void main( )

{

float a[20],pjz=0,s,t; int i,k;

for(i=0;i<20;i++) pjz+=a[i];

s=fabs(a[0]-pjz);

for(i=1;i<20;i++)

if(fabs(a[i]-pjz)<s)

{

s=fabs(a[i]-pjz); t=a[i];

}

}

--------------------------------------------------------------------------------

for(i=0;i<20;i++) scanf(“%f”,&a[i]); pjz/=20; printf(“%f,%f\n”,piz,t);

(2) 以下程序以每行 10个数据的形式输出 a 数组,请填空。

void main( )

{

int a[50],i;

printf("输入50个整数:");

for(i=0; i<50; i++) scanf( "%d", );

for(i=1; i<=50; i++)

{ if( )

printf( "%3d\n" , ) ;

printf( "%3d",a[i-1]);

}

}

&a[i] i%10==0 a[i-1]

(3) 下面程序的功能是输出数组 s 中最大元素的下标,请填空。

void main( )

{

int k, p;

int s[ ]={1,-9,7,2,-10,3};

for(p=0,k=p; p<6; p++)

if(s[p]>s[k]) ;

printf("%d\n" ,k);

}

k=p

(4) 这个程序输入了20个数存放在一个数组中,并且输出其中最大者与最小者、20个数的和及它们的平均值。请填空。

void main()

{

char array ;

int max,min,average,sum;

int i;

for(i=0;i< ;i++)

{

printf("请输入第%d个数:",i+1);

scanf("%d", );

}

max=array[0];

min=array[0];

for(i=0;i<= ;i++)

{

if(max<array[i])

if(min>array[i])

sum= ;

}

average = ;

printf("20个数中最大值是%d,",max);

printf("最小值是%d,",min);

printf("和是%d,",sum);

printf("平均值是%d.\n",average);

}

[20]

20

&array[i]

19

max=array[i];

min=array[i];

sum+array[i]

sum/20

B卷

5. 阅读程序,分析程序的功能。

(1)

#include <stdio.h>

#include <string.h>

void main( )

{

char s[80];

int i ;

for(i=0; i<80; i++)

{

s[i]=getchar( );

if(s[i]=='\n') break;

}

s[i]='\0'; i=0;

while(s[i]) putchar(s[i++]);

putchar(?\n?);

}

从键盘输入一个字符串,并逐一输出

(2)

#include <stdio.h>

#include <string.h>

void main( )

{

char str[10][80], c[80];

int i;

for(i=0; i<10; i++) gets(str[i]);

strcpy(c, str[0]) ;

for(i=1; i<10; i++) if(strlen(c) <strlen(str[i])) strcpy(c,str[i]); printf( "%s\n", c);

printf( "%d\n", strlen (c));

}

从键盘输入若干字符串,找到其中最长的一个输出及它的长度

(3)

#include <stdio.h>

#include <string.h>

void main( )

{

char a[10][80], c[80];

int i, j, k;

for(i=0; i<10; i++) gets(a[i]);

for(i=0; i<9; i++)

{

k=i ;

for(j=i+1; j<10; j++)

if(strcmp (a [j], a[k])<0) k=j;

if(k!=i )

{strcpy(c,a[i]) ; strcpy(a[i], a[k]); strcpy(a[k],c);} // 字符串交换

}

for(i=0; i<10; i++) puts (a[i]);

}

从键盘输入若干字符串,并将它们按大到小顺序排好再输出

(4) 阅读程序,写出运行结果

#include <stdio.h>

void main( )

{

int a[6]={12,4,17,25,27,16},b[6]={27,13,4,25,23,16},i,j; for(i=0;i<6;i++)

{

for(j=0;j<6;j++) if(a[i]==b[j])break;

if(j<6) printf("%d ",a[i]);

}

printf("\n");

}

4 25 27 16

(5) 阅读程序,写出运行结果。

#include <stdio.h>

void main( )

{

char a[8],temp; int j,k; for(j=0;j<7;j++) a[j]='a'+j; a[7]='\0';

for(j=0;j<3;j++)

{

temp=a[6];

for(k=6;k>0;k--) a[k]=a[k-1];

a[0]=temp;

printf("%s\n",a);

}

}

gabcdef

fgabcde

efgabcd

(6) 阅读下列程序,写出程序运行的输出结果。 #include <stdio.h>

#include <string.h>

void main( )

{

char str1[ ]="*******";

for(int i=0;i<4;i++)

{

printf("%s\n",str1);

str1[i]=' ';

str1[strlen(str1)-1]='\0';

}

}

*******

*****

***

*

(7) 该程序的运行结果是: min=

void main()

{

float array[4][3]={

{3.4,-5.6,56.7},

{56.8,999.,-.0123},

{0.45,-5.77,123.5},

{43.4,0,111.2}

};

int i,j;

int min;

int m,n;

min = array[0][0];

m=0;n=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(min > array[i][j]) ,m= ,n= 。

{

min = array[i][j];

m=i;n=j;

}

printf("min=%d,m=%d,n=%d\n",min,m,n);

}

-5.77 2 1

(8) 写出下面这个程序的输出结果:

void main()

{

char str[]="ABCDEFGHIJKL";

printf("%s\n",str); 屏幕上显示

printf("%s\n",&str[4]); 屏幕上显示 str[2]=str[5];

printf("%s\n",str); 屏幕上显示

str[9]='\0';

printf("%s\n",str); 屏幕上显示

}

ABCDEFGHIJKL

EFGHIJKL

ABFDEFGHIJKL

ABFDEFGHI

(9) 读懂下面的程序并填空。

void main()

{

char str[80];

int i=0;

gets(str);

while(str[i]!=0)

{

if(str[i]>='a'&&str<='z')

str[i]-=32;

i++;

}

puts(str);

}

程序运行时如果输入 upcase, 屏幕显示 程序运行时如果输入 Aa1Bb2Cc3, 屏幕显示 UPCASE

AA1BB2CC

第8章 函数习题

A卷

1. 单项选择题

(1)C 语言总是从 函数开始执行。 A

A. main B. 处于最前的 C.处于最后的 D. 随机选一个

(2)函数在定义时,省略函数类型说明符,则该函数值的类型为 。A

A. int B. float C. long D. double

(2)以下 函数,真正地没有返回值。 B

A. int a(){int a=2;return (a);} B. void b(){printf("c");}

C. int a(){int a=2;return a;} D. 以上都是

(3)在 C 语言中,有关函数的说法,以下正确的是 。 A

A. 函数可嵌套定义,也可嵌套调用 B. 函数可嵌套定义,但不可嵌套调用

C. 函数不可嵌套定义,但可嵌套调用 D. 函数不可嵌套定义,也不可嵌套调用

(4)以下函数调用语句中,含有实参的个数为 。C

fun((2,3),(4,5+6,7));

A. 1 B. 2 C. 5 D. 6

(5)函数调用可以在 。 D

A. 函数表达式中 B. 函数语句中 C. 函数参数中 D. 以上都是

(6)被调函数返回给主调函数的值称为 。C

A. 形参 B. 实参 C. 返回值 D. 参数

(7) ,可以不进行函数类型说明。 D

A. 被调函数的返回值是整型或字符型时 B. 被调函数的定义在主调函数定义之前时

C. 在所有函数定义前,已在函数外预先说明了被调函数类型 D. 以上都是

(8)被调函数通过 语句,将值返回给主调函数。 D

A. if B. for C. while D. return

(9)被调函数调用结束后,返回到 。 D

A.主调函数中该被调函数调用语句处

B.主函数中该被调函数调用语句处

C.主调函数中该被调函数调用语句的前一语句

D.主调函数中该被调函数调用语句的后一语句

(10)以下对 C语言函数的有关描述中,正确的是 。A

A. 在 C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参

B. C函数既可以嵌套定义又可递归调用

C. 函数必须有返回值,否则不能使用函数

D. C程序中有调用关系的所有函数必须放在同一个源程序文件中

(11)C 语言中函数的隐含存储类型是 。 C

A. auto B. static C. extern D. 无存储类型

(12)能把函数处理结果的两个数据返回给主调函数,在下面的方法中不正确的是 。A

A. return 这两个数 B. 形参用两个元素的数组

C. 形参用两个这种数据类型的指针 D. 用两个全局变量

(13)C语言可执行程序从什么地方开始执行 ( )。 C

A. 程序中第一条可执行语句 B. 程序中第一个函数

C. 程序中的main函数 D. 包含文件中的第一个函数

(14)有一个函数原型如下所示,则该函数的返回类型为( ) 。 C

abc(float x,float y);

A. void B. double C. int D. float

2. 填空题

(1) 变量的作用域主要取决于变量 ,变量的生存期既取决于变量 ,又取决于变量 。 所处的位置,所处的位置,存储类型

(2) 说明变量时,若省略存储类型符,系统默认其为 存储类别,该存储类别的类型符为: 。动态,auto

(3) 静态型局部变量的作用域是 ,生存期是 。它所在的局部,整个程序

(4) 函数中的形参和调用时的实参都是数组名时,传递方式为 ,都是变量时,传递方式为 。 址传递,值传递

(5) 函数的形式参数的作用域为 ,全局的外部变量和函数体内定义的局部变量重名时, _________变量优先。 该函数中,局部

(6) 若自定义函数要求返回一个值,则应在该函数体中有一条 语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符 。 return,void

(7) 若函数的形式参数是指针类型,则实参可以是 或 。指针,数组名

(8) 函数的参数为 char *类型时,形参与实参结合的传递方式为 。址传递

(9) 函数的实参为常量时,形参与实参结合的传递方式为 。值传递

(10) 下面这个函数的功能是求两个整数的积,并通过形参传回结果,请填空。int int int* *result

void mul(___x,___y,___result)

{

___=x*y;

}

3. 判断题

( × )(1) 函数说明指的是在程序中设定一个函数模块。

( √ )(2) 形参只有在被调用时才分配存储空间。

( × )(3) 在C的函数中,最好使用全局变量。

( × )(4) 在调用函数时,实参传值给形参,调用结束时,形参值传给实参。

( √ )(5) 所有函数定义都是并行的,相互独立的。

( × )(6) 函数的隐含存储类型是extern。

( × )(7) 形参可以是常量、变量或表达式。

( × )(8) 函数调用可以作为一个函数的形参。

( √ )(9) C语言规定,实参应与其对应的形参类型一致。

( × )(10) 定义函数时,形参的类型说明可以放在函数体内。

4. 程序填空题

(1) 对数组按值从大到小的顺序排序后输出,请填空。

#include <stdio.h>

void main()

{

float a[7]={2,6,3,8,3,12,9};

int i ;

void sort(float*,int);

;

for(i=0;i<7;i++) printf("%f ",a[i]);

printf("\n");

}

void sort( )

{

int i,j,k; float t;

for(i=0;i<n-1;i++)

{

k=i;

for(j=i+1;j<n;j++)

if( ) k=j;

{ t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; }

}

}

sort(a,7) float* p,int n *(p+k)<*(p+j) if(k!=i)

(2) 下列函数在 n 个元素的一维数组中,找出最大值、最小值并传送到调用函数,请填空。 #include <stdio.h>

void find(float *p, int max, int min, int n)

{

int k;

*max=*p;

for(k=1;k<n;k++)

{

t=*(p+k);

if( ) *max=t;

if(t<*min) *min=t;

}

}

float t; *min=*p; *max<t

B卷

5. 写出下列程序运行结果

(1)

main()

{

int i=1,p;

p=fun(i,i+1);

printf("%d\n",p);

}

int fun(int a,int b)

{

int f;

if(a>b)

f=1;

else if(a==b)

f=0;

else

f=-1;

return f;

}

-1

(2)键盘输入 abcdef<CR>

#include <stdio.h>

void fun( )

{

char c ;

if((c=getchar( ))!='\n')

fun( ) ;

putchar(c);

}

void main( )

{ fun( ); }

fedcba

(3)

#include <stdio.h>

#define C 5

int x=1,y=C;

void main( )

{

int x;

x=y++; printf("%d %d\n", x,y);

if(x>4) { int x ; x=++y; printf("%d %d\n",x,y) ; x+=y--;

printf("%d %d\n",x,y); }

}

5 6

7 7

12 6

(4)

#include <stdio.h>

int c , a=4 ;

func(int a , int b)

{ c=a*b ; a=b-1 ; b++ ; return (a+b+1) ; } void main( )

{

int b=2 , p=0 ; c=1 ;

p=func(b , a) ;

printf("%d,%d,%d,%d\n", a,b,c,p) ; }

4,2,8,9

(5)

unsigned fun6(unsigned num)

{

unsigned k=1;

do { k*=num%10; num/=10; } while(num);

return k;

}

void main( )

{

unsigned n=26;

printf("%d\n", fun6(n));

}

12

(6)

#include <stdio.h>

int max(int a,int b);

main()

{

int x,y,z,t,m;

scanf("%d,%d,%d",&x,&y,&z); t=max(x,y);

m=max(t,z);

printf("%d",m);

}

int max(int a,int b)

{

if(a>b)

return(a);

else

return(b);

}

运行时若输入:10,15,9 则输出:___ 15 运行时若输入:300,129,300 则输出:___

(7)

#include <stdio.h>

long sum(int a,int b);

long factorial(int n);

main()

{

int n1,n2;

long a;

scanf("%d,%d",&n1,&n2);

a=sum(n1,n2);

printf("a=%1d",a);

}

long sum(int a,int b)

{

long c1,c2;

c1=factorial(a);

c2=factorial(b);

return(c1+c2);

}

long factorial(int n)

{

long rtn=1;

int i;

for(i=1;i<=n;i++)

rtn*=i;

return(rtn);

}

运行时若输入:2,3 则输出:___ 8 运行时若输入:0, 5 则输出:___ 121

(8) 300

#include <stdio.h>

int s();

int x,y;

main()

{

int n;

x=1;y=2;

n=s();

printf("x=%d,y=%d,n=%d",x,y,n);

}

int s()

{

int z;

x=3;y=4;

z=x+y;

return(z);

}

程序运行后输出:___ 3,4,7

(9) 以下程序的输出结果是a=___,b=___,c=___。 #include <stdio.h>

int func(int a,int *p);

void main()

{

int a=1,b=2,c;

c=func(a,&b);

b=func(c,&a);

a=func(b,&c);

printf("a=%d,b=%d,c=%d",a,b,c); }

int func(int a,int *p)

{

a++;

*p=a+2;

return(*p+a);

}

36 16 19

第九章 预处理

A部分(本、专科必做)

一、选择题

以下不正确的叙述是(D)

A、宏替换不占用运行时间。 B、宏名无类型。

C、宏替换只是字符替换。 D、宏名必须用大写字母表示。

C语言的编译系统对宏命令的处理(D)

A、在程序运行时进行的。 B、在程序连接时进行。

C、和C程序中的其它语句同时进行编译的。

D、在对源程序中其它语句正式编译之前进行的。

3、以下程序的输出结果是(C)。

A、15 B、100 C、10 D、150

#define MIN(x,y) (x)<(y)?(x):(y)

void main()

{

int I,j,k;

i=10;j=15;k=10*MIN(i,j);

printf(“%d\n”,k);

}

4、以下叙述中正确的是(D)

用#include包含的文件的后缀必须是“.h”。

若一些源程序中包含某个头文件;当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。

宏命令行可以看作是一行C语句。

预处理是在编译之前进行的。

5、以下叙述中正确的是(C)

A、源程序中所有的行都参加编译。

B、宏定义常量与const定义常量是一样的。

C、宏定义可以嵌套定义,即在宏定义中的字符串可以引用另一个宏定义的标识符。

D、以上都不正确。

二、填空题

以下程序中for 循环执行的次数是 6 。

#define N 2

#define M N+1

#define NUM (M+1)*M/2

void main()

{

int i;

for(i=1;i<=NUM;i++);

printf(“%d\n”,i);

}

2、以下程序的输出结果是 x=93 。

#define A 3

#define B(a) ((A+1)*a)

void main()

{

int x;

x=3*(A+B(7));

printf(“x=%d\n”,x);

}

B部分(本科必做)

编程:请写出一个宏定义MYALPHA(c),用以判断c是否是字母字符,若是,得1,否则,得0。

解:#define MYALPHA(c) ((c>=’A’&&c<=’Z’)||( c>=’a’&&c<=’z’)?1:0)

第十章 指针

A部分(本、专科必做)

一、选择题

1、若有定义:int x,*pb;则以下正确的表达式是(A)

A、pb=&x B、pb=x C、*pb=&x D、*pb=*x

2、以下程序的输出结果是(B)

A、因变量无定义输出不定值 B、0 C、-1 D、1

#include<stdio.h>

void main()

{printf(“%d\n”,NULL);}

3、以下程序的输出结果是(B)

A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7

#include<stdio.h>

void sub(int x,int y,int *z)

{*z=y-x;}

void main()

{

int a,b,c;

sub(10,5,&a); sub(7,a,&b); sub(a,b,&c);

printf(“%d,%d,%d\n”,a,b,c);

}

4、以下程序的输出结果是(C)

A、4 B、6 C、8 D、10

#include<stdio.h>

void main()

{

int k=2,m=4,n=6;

int *pk=&k,*pm=&m,*p;

*(p=&n)=*pk*(*pm);

printf(“%d\n”,n);

}

5、已知指针p的指向(图一)的a[1],则执行语句*p++;后,*p的值是(B)。

A、20 B、30 C、21 D、31

a[0] a[1] a[2] a[3] a[4]

10

20

30

40

50

(图一)

6、已知指针p的指向(图一)的a[1],则表达式*++p的值是(B)。

A、20 B、30 C、21 D、31

7、已知指针p的指向(图一)的a[1],则表达式++*p的值是(C)。

A、20 B、30 C、21 D、31

8、以下程序的输出结果是(D)。

A、23 B、24 C、25 D、26

#include<stdio.h>

void prtv(int *x)

{printf(“%d\n”,++*x);}

void main()

{

int a=25;prtv(&a);

}

9、以下程序的输出结果是(B)。

A、运行出错 B、100 C、a的地址

#include<stdio.h>

void main()

{

int **k,*a,b=100;

a=&b;k=&a;

printf(“%d\n”,**k);

}

10、以下程序运行后,输出结果是(D)。

A) 8 B) 7 C) 6

#include<stdio,h>

ss(char *s)

{ char *p=s;

while(*p) p++;

return(p-s);

}

main()

{ char *a="abded";

int i;

i=ss(a);

printf("%d\n",i);

}

D、b的地址 D) 5

二、填空题

1、若有定义:char ch;

(1)使指针p指向变量ch的定义语句是 char *p=&ch; 。

(2)若已定义char *p;,使指针p指向变量ch的赋值语句是 p=&ch; 。

(3)在(1)的基础上,通过指针p给变量ch读入字符的scanf调用语句是 scanf(“%c”,p); 。

(4)在(1)的基础上,通过指针p给变量ch赋字符’a’的语句是*p=’a’; 。

(5)在(1)的基础上,通过指针p用格式输出函数输出ch中字符的语句是printf(“%c”,*p); 。

2、以下程序输出的是 C 。

void main( )

{ int i=3, j=2;

char *a="DCBA";

printf("%c%c\n",a[i],a[j]);

}

3、以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。请填空。 void exchange(int *x, int *y)

{ int t;

t=*y; *y= *x ; *x= t ;

}

B部分(本科必做)

程序填空:

1、下面程序的输出结果是 A B C D B C D C D D 。

char b[]="ABCD";

void main()

{ char *chp;

for(chp=b; *chp: chp+=2) printf("%s",chp);

printf("\n");

}

下面是一个字符串连接函数,请补充完整。

void mystrcat(char *s1,char *s2)

{

char *p,*q;

for(p=s1; *p ; p++ );

for( q=s2 ;*q;q++) *p++=*q ;

*p=?\0? ;

}

第十一章 结构体与共用体

A部分(本、专科必做)

一、选择题

1、设有如下定义:

struct sk

{int a;float b;}data,*p;

若有p=&data;,则对data中的a域的正确引用是(B)。

A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a

2、根据以下定义,能输出字母M的语句是(D)。

A、printf(“%c\n”,class[3].name); B、printf(“%c\n”,class[3].name[1]);

C、printf(“%c\n”,class[2].name[1]); D、printf(“%c\n”,class[2].name[0]);

struct person{char name[9];int age;};

struct person class[10]={“John”,17,”Paul”,19,”Mary”,18,”Adam”,16,};

3、以下程序的输出结果是(D)。

A、0 B、1 C、3 D、6

#include<stdio.h>

void main()

{

struct emplx{int x;int y;}enum[2]={1,3,2,7};

printf(“%d\n”,enum[0].y/enum[0].x*enum[1].x);

}

4、若有以下说明及语句,则值为6的表达式是(D)。

A、p++->n B、p->n++ C、(*p).n++ D、++p->n

struct st{int n;struct st *next;};

struct st a[3],*p;

a[0].n=5;a[0].next=&a[1];a[1].n=7;a[1].next=&a[2];

a[2].n=9;a[2].next=?\0?;p=&a[0];

5、已知字符0的ASCII码的十进制的值是48,且数组的第0个元素在低位,以下程序的输出结果是(B)。

A、39 B、9 C、38 D、8

void main()

{

union{int i[2];long k;char c[4];}r,*s=&r;

s->i[0]=0x39;s->i[1]=0x38;

printf(“%x\n”,s->c[0]);

}

6、以下程序输出的结果是(C)。

A、32 B、16 C、8 D、24

typedef union{long x[2];int y[4];char z[8];}MYTYPE;

MYTYPE them;

void main()

{

printf(“%d\n”,sizeof(them));

}

7、设有以下语句

typedef struct S

{ int g; char h;} T;

则下面叙述中正确的是(B)。

A) 可用S定义结构体变量 B)可以用T定义结构体变量

C)S是struct类型的变量 D)T是struct S类型的变量

8、有以下说明和定义语句

struct student

{ int age; char num[8];};

struct student stu[3]={{20,"200401"},{21,"200402"},{10\9,"200403"}};

struct student *p=stu;

以下选项中引用结构体变量成员的表达式错误的是(D)。

A) (p++)->num B) p->num C) (*p).num D) stu[3].age

二、填空题

1、为了建立结构体(含有两个成员,data是数据成员,next是指向自身结构体的指针成员),请填空:

Struct link

{

char data;

struct link *next ;

}

2、把类型int另取一个类型名称INT,则以下应填:

typedef int INT;

3、以下程序的运行结果是2002Shangxian 。

# include <string.h>

typedef struct student{

char name[10];

long sno;

float score;

}STU;

main( )

{

STU a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},

c={“Anhua”,2003,95},d,*p=&d;

d=a;

if(strcmp(a.name,b.name)>0) d=b;

if(strcmp(c.name,d.name)>0) d=c;

printf(“%ld%s\n”,d.sno,p->name);

}

B部分(本科必做)

程序填空:

以下程序的功能是:处理由学号和成绩组成的学生记录,N名学生的数据已在主函数中放入

结构体数组s中,它的功能是:把分数最高的学生数据放在b所指的数组中,注意:分数最高的学生可能不只一个,函数返回分数最高学生的人数。请填空。

#include<stdio.h>

#define N 16

typedef struct

{

char num[10];

int s;

}STREC;

int fun(STREC *a,STREC *b)

{

int i,j=0,max=a[0].s;

for(i=0;i<N;i++)

if(max<a[i].s) max=a[i].s;

for(i=0;i<N;i++)

if( a[i].s==max ) b[j++]=a[i];

return j;

}

void main()

{

STREC s[N]={{“GA005”,85},{“GA003”,76},{“GA002”,69},{“GA004”,85},

{“GA001”,91},{“GA007”,72},{“GA008”,64},{“GA006”,87},{“GA0015”,85},

{“GA0013”,91},{“GA0012”,64},{“GA0014”,91},{“GA0011”,66},{“GA0017”,64},

{“GA0018”,64},{“GA0016”,72},};

STREC h[N];

int i,n;

n=fun(s,h);

printf(“The %d highest score:\n”, n );

for(i=0;i<n;i++)

printf(“%s %4d\n”,h[i].num,h[i].s);

printf(“\n”);

}

?

用C程序实现的算法可以没有输入但必须要有输出

? C语言源程序文件名的后缀是 .c经过编译后生成的文件(目标

文件)的后缀是 .obj经过连接后生成的文件的后缀是 .exe

? 结构化程序由顺序 选择 循环三种基本结构组成

? 标识符 字母数字下划线 字母不能打头 不能调用关键字(int double等)能调用预定义标识符(printf define等)

? 实型常量:小数和指数 指数e或E后面必须跟整数 零和小数都不行

? 整型常量:

? %取余符号两边必须是整数 3%7=3因为除不动就取被除数 ? 整型除以整型为整型 5/2=2 5.0/2=2.5

? 在所有的运算符中,逗号的用算符最低。

? 复制表达式中前面不能是组合 比如 a+7=b+c是错的

? K=8;Printf(“%d,%d/n”,k,++k);输出结果不是89 而是99 ? 在逗号用算符中,虽然取最后一个值 ,但前面的表达式也执行。区别于三目运算符?? :?则不需要计算另一个不取值的表达式

Bmain()

{ int x=1,y=2,z;

z=x>y?++x:++y;

printf("%d,%d,%d\n",x,y,z);}

A)1,2,3 B)1,3,3 C)2,3,3 D)2,2,3

在三目运算符?? :?中,x>y不成立,取++y的值,而++x不需要计算,所以x为原值1,y为3,z也为3。

? 输入数据时逗号紧跟其后 scanf(?%d,%d?,&a,&b); 1 空,2不对 1,2对 1,空2对

? 优先级从高到低 !(逻辑非)算术用算符、关系用算符、&&(逻辑与)、||(逻辑或)、赋值用算符。

? 用break语句可以是流程跳出switch语句体,也可用break语句在循环结构中终止本层循环体,从而提前结束本层循环。

? Continue语句的作用是跳过本次循环体中余下尚未执行的语句,立刻进行下一次的循环体判断,可以理解为仅结束本次循环 ? !B已知

#int t=0;

while (t=1)

{...}

则以下叙述正确的是

A循环控制表达式的值为0

B循环控制表达式的值为1

C循环控制表达式不合法

D以上说法都不对

? 循环控制表达式的值为1 t=1是将t赋值为1,所以循环控制表达式的值为1。判断t是否等于1时,应用t==1,注意"="与"=="的用法。

? C语言中,在定义并初始化二维数组时,可以省略数组第一维的长度,但是不能省略第二维的长度x[4][]错的

? %c字符型 接受空格 回车 例:scanf(?%c%c%c?,&a,&b,&c);若输入TH<enter>E<ENTER> 则a读T b读H c读回车符。 若在格式说明符之间家空格则空格回车符 跳格符都将被认作 间隔符读入

? %d不接受空格 回车

? %s字符串的输入和输出,不接受空格回车

? C语言的简单数据类型有:整型 实型 字符型

? 函数定义:1在同一程序中函数名必须唯一,2形参只有在统一函数中唯一即可。3不能在函数内部定义函数4若函数名没有定义类型则默认为int型5除了返回值类型为int和char型的函数外,函数必须先定义后调用6如果没有函数值,则必须把函数定义成void型

? 若输出NULL \0 0则都输出为0

? 一位数组中*p++的意思 先取出指针p所指示储存单元值 然后让指针p向后移 *(P++)也一样

? 二维数组中 **p++是先取出指针p指示储存单元值 然后让指针p向下移一行

以下程序的运行结果是c

main()

{ int i;

char aa[][3]={'a','b','c','d','e','f'};

char (*p)[3]=aa;

for(i=0;i<2;i++)

if(i==0) aa[i][i+1]=**(p++);

printf("%c\n",**p);}

A)a B)b C)d D)c

? Double x【8】由于定义x数组有8个元素,因此下标表达式的值必须大于或等于0 并且小于8切必须是整数

? 数组名中存放的是地址常量,它代表整个数组的首地址!不可以给数组名重新赋值 语句a=&x a++都是非法的,因为不能给a重

新赋地制值 s【10】 ,s=?hello?赋值不合法

? 在函数内部不要把函数内部的变量作为返回值??

? 二维数组 a【3】【2】 m=a【3】【2】赋值不合法 因为只有两行 ? 在二维数组里a【0】++这样的赋值不合法 若有表达式a【0】+1,表达式中一的单位应当是4个字节

? char str【10】={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’,‘\0’};字符数组共有十个元素 但作为字符串,其长度是7

? char str【】={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’};定义了一个有七个元素的字符数组,因为没有串结束的标志,所以这时不能把他当作字符串来使用

? char str【】=?string!?;系统将按字符串中实际的字符个数来定义数组的大小,在此数组包含八个元素(含系统自动加的/0) ? gets puts函数在终端输入或输出一行字符串 gets函数认空格不认回车 用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止 puts函数遇到第一个/0的时候结束输出,并自动输出一个换行符(与printf的区别)

? 所有的/和后面的任一字符都能组成一个转义字符 /012的话以大范围为主

? Register变量将变量的值保留在cpu的寄存器里 有助于提高程序的运行速度

? Static变量静态储存变量在内存的静态存储变量中占据着永久性的存储单元 遂于未赋初值的静态局部变量,c编译程序自动

给他赋初值0

? 宏定义:1当宏定义在一行中写不下时,需要在下一行继续时;

只需在最后一个字符后紧接着加/ 2替换文本不能替换双引号中与宏名相同的字符串。

3用作宏名的标识符通常用大写字母表示,这并不是语法规定,只是一种习惯,以便与程序中的其他标识符相区别

4在c程序中,宏定义的定义位置一般写在程序的开头

5宏替换和函数调用的区别,宏替换对参数没有类型的要求

6宏替换在编译前由预处理程序完成的,因此宏替换不占运行的时间 7如果宏定义是表达式,则在调用的时候应整体搬下来

C#define N 2

#define M N+1

#define NUM (M+1)*M/2

main()

{ int i,n=0;

for(i=0;i<NUM;i++)

n++;

printf("%d\n",n); }

A)5 B)6 C)8 D)9

? Typedef 类型名 标识符 typedef int a 则a成为了一个int类型的类型名 使用typedef说明一个结构体类型名 typedef stuct{}STUCT;

? 对于结构体变量后面未赋值的成员,系统自动为数值型和字符型数据赋初值0

? 以"wt"方式写入的是字符文件,转义字符'\n'被看作两个字符来处理。而"wb"方式写入的是二进制文件,转义字符'\n'是一个字

符。B对于下述程序,在方式串分别采用"wt"和"wb"运行时,两次生成的文件TEST的长度分别是

#include<stdio.h>

void main()

{ FILE *fp=fopen("TEST",);

fputc(′A′,fp);fputc(′\n′,fp);

fputc(′B′,fp);fputc(′\n′,fp);

fputc(′C′,fp);

fclose(fp); }

A)7字节、7字节

B)7字节、5字节

C)5字节、7字节

D)5字节、5字节

? 链表的数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址。D若有以下定义: struct link

{ int data;

struct link *next;

} a,b,c,*p,*q;

且变量a和b之间已有如下图所示的链表结构:

20xx二级C语言知识点全部总结

? 指针p指向变量a,q指向变量c。则能够把c插入到a和b 之间并形成新的链表的语句组是:

A)a.next=c; c.next=b;

B)p.next=q; q.next=p.next;

C)p->next=&c; q->next=p->next;

D)(*p).next=q; (*q).next=&b;

? a=5 b=4 c=3 d=(a>b>c) d=0 因为是先判断a>b为真 所以为1 1大于3不成立 所以为0

? 文件:1 FILE *P1 *P2;P1,P2均被定义为指向文件类型的文件指针变量 称为文件指针 ; 2打开文件fopen(文件名,文件使用方式);fopen(?file?,?r?) ?r? :为读打开文本文件 ?w?为写而打开文本文件 ?a?为在文件后面添加数据而打开文件; 3关闭文件 fclose(文件指针);当成功的执行了关闭操作,函数返回0 否则返回非0

? 函数

? Fputc(putc)函数输出一个字符 puts(ch,fp)的功能是将字

符ch写到文件指针fp所指的文件指针去 ? Fgetc(getc)函数输入一个字符 ch=gets(pf)的功能是从pf指定的文件中读入一个字符。

? 判断文件结束函数feof 如果遇到文件结束 函数feof(fp)的值为1,否则为0

? Fscanf函数只能是从文本文件中按格式输入。Fscanf函数和scanf函数的区别是 fscanf函数输入的对象是磁盘上文本文件

中的数据 函数的调用形式fscanf(fp,?%d?,&a)

? Fprintf函数按格式将内存中的数据转换成对应的ASCII代码形式输出到文本文件中fprintf函数与printf函数的区别 f输出

的内容将按格式存放在磁盘的文本文件中 。函数的调用形式

fscanf(fp,?%d?,a)

? Fgets函数用来从文件中读入字符串。调用形式fgets(str,n,fp);fp是文件指针 str是存放字符串的起始地址,n是一个int

型变量,长度限制最多接受n-1个;函数的功能是从fp所指文件

中读入n-1个字符放入以str为起始地址的空间内;

? Fputs函数用来把字符串输入到文件中,调用形式如下 fputs(str,fp);

? Fread函数 fwrite函数分别用来读写二进制文件。调用形式如下:fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);buffer是数据块的指针 size

是数据块的字节数 count用来指定每读写一次

? 文件定位函数

? fseek函数用来移动文件位置指针到指定的位置上 调用形式:fseek(pf,offset,origin);从origin开始往后挪offset个字节

? ftell函数用以获得文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数。调用形式:t= ftell(fp); ? 当打开一个文件时,通常并不知道该文件的长度,通过以下函数调用可以求出文件的字节数

? Fseek(fp,oL,SEEK_END);

? T=ftell(fp);

? Rewind函数此函数没有返回值 ,函数的功能是使文件的位置指针回到文件开头。

C有以下程序 #include

main()

{ FILE *fp;char str[10];

fp=fopen("myfile.dat","w");

fputs("abc",fp);fclose(fp);

fpfopen("myfile.data","a++");

fprintf(fp,"%d",28);

rewind(fp);

fscanf(fp,"%s",str); puts(str);

fclose(fp);

}程序运行后的输出结果是

A)abc B) 28c C) abc28 D)因类型不一致而出错

C以下程序的功能是。

#include <stdio.h>

main()

{ FILE *fp;

long int n;

fp=fopen("wj.txt","rb");

fseek(fp,0,SEEK_END);

n=ftell(fp);

fclose(fp);

printf("%ld",n);}

A)计算文件wj.txt的起始地址 B)计算文件wj.txt的终止地址

D)将文件指针定位到文件末尾 C)计算文件wj.txt的长度

? B 以下程序运行结果是main()

{ char a[][5]={ "ABCD","1234","abcd","5678","EFGH"};int i; for(i=0;i<3;i++) printf("%s",a[i]);}

A)A1a B)ABCD1234abcd C)ABC D)ABCD1234abcd5678EFGH ? 分析:对于二维数组,其元素为一维数组,它表示行地址,根据

行地址可输出该行的字符串。

? 给数组赋值 x[8]="Turbo C"错;x[]="Turbo C"错 ; char

x[8]="Turbo C"对

? C语言语法规定,按其输入格式从键盘输入数据时,只能以空格、

回车及Tab间隔各数据项。

? 设int a,b;,用语句scanf('%d%d",&b);输入a、b值时,不

能作为输入数据分隔符的是B

A)空格 B) , C)回车 D)[Tab] ? 位用算符的优先级:~,<<,>>,&,^,|

? 如果定义的函数无返回值则只有指针的形参接收的实参改变了值,其他实参没有改变值。指出以下程序所指处的运行结果。

void f1(int x,int y,int *sum)

{ *sum=x+y; ++x; ++y;}

void f2(int a,int b,int *product)

{ *product=a*b; a+=b; b-=a;}

main()

{ int a=10,b=20,c=100,(*f)();

f=f1;

(*f)(a,b,&c);

printf("%d,%d,%d\n",a,b,c); /* 运行结果是【34】*/ f=f2;

(*f)(a,b,&c);

printf("%d,%d,%d\n",a,b,c); /* 运行结果是【35】*/} C【34】 A)11,21,100

D)11,21,33

D【35】 A)30,-10,300 B)30,-10,200

B)11,21,30 C)10,20,30 C)33,-12,231 D)10,20,200

相关推荐