程序设计基础练习题(全部有答案版) 下载本文

一、单项选择题(每小题2分,共20分)

第一章

D 1.下列说法中错误的是( )。

A、程序的执行总是从主函数开始

B、主函数可以调用任何非主函数的其它函数 C、任何非主函数可以调用其它任何非主函数 D、程序可以从任何非主函数开始执行

C 2.若a=4,b=7,则输出4*7=28的语句是( )。 A、printf(“a*b=%d\\n”a+b); B、 printf(“a*b=%d\\n”,a*b);

C、printf(“%d*%d=%d\\n”,a,b,a*b); D、 printf(“%d*%d=%d\\n”,a+b); 第三章

C 1. C语言中int型数据占2个字节,则long型数据占(C )个字节。

A、1 B、2 C、4 D、8 D 2.若C中int型数据占2个字节,则double型数据占(D )个字节。

A、1 B、2 C、4 D、8 B 3.若a为整型变数,则以下语句(B )。 a=-2L;

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

A、赋值不合法 B、输出-2 C、输出不确定值 D、输出2

D 4. 若int型数据占2个字节,则下列语句的输出为(D )。

int k=-1;

printf(“%d,%u\\n”,k,k); A、-1,-1 B、-1,32767 C、-1,32768 D、-1,65535 B 5. 下列程序的输出是(B )。

#include main()

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

A、0 B、变量无定义 C、-1 D、1 C 6.若x为float型变数,则以下语句: x=223.82748;

printf(\ 运行结果为(C )。

1

A、223.8 B、223.82 C、223.83 D、223.827 D 7. 设有语句int a=3;则执行语句a+=a-=a*a后,变量a 的值是(D )。

A、3 B、0 C、9 D、-12 第四章

A 1. 执行语句:a=5,b=8;printf(“%d\\n”, c=a/b); 后输出的值为(A )。

A、0 B、0.6 C、0.625 D、0.625000 B 2. 下列语句(B )。

int k=8567;

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

A、输出格式描述符不合法 B、输出为|008567| C、输出为|8567 | D、输出为|-08567| C 3. 下列语句(C )。

int k=8567;

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

A、输出格式描述符不合法 B、输出为|008567| C、输出为|8567 | D、输出为|-08567|

C 4. 若ch为字符型,k为整,则执行下列语句后的输出为(C )。 ch=’a’; k=12;

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

A、因变量类型与格式描述符的类型不匹配,输出无定值; B、输出项与格式描述符个数不符,输出为0或不定值; C、61,141,k=%d; D、61,141,k= D 5. 若k,g为int型变数,则下列语句的输出为(D )。

k=017; g=111;

printf(“%d,%x\\n”,++k,g++); A、15,6f B、16,70 C、15,71 D、16,6f B 6. 有以下程序I和II,判断它们的输出(B )。 I #include main()

{int a=4,b=7;

printf(“%d\\n”,(a=a+1,b+a,b+1));

2

}

II #include main()

{int a=1,b=2;

printf(“%d\\n”,a=a+1,a+b,b+1)); }

A、I输出5,II输出2 B、I输出8,II输出2 C、I输出5,II输出3 D、I输出8,II输出3 A 7. 下列程序的输出为(A )。 #include main()

{int m=7,n=4;

float a=38.4,b=6.4,x; x=m/2+n*a/b+1/2; printf(“%f\\n”,x); }

A、27.000000 B、27.500000 C、28.000000 D、28.500000 第五章

D 1. 在C语言中,能代表逻辑值“真”的是(D )。 A、true B、大于0的数 C、非0整数 D、非0的数 C 2. 若给定表达式(M)?(a++):(a--),则其中表达式M(C )。

A、和(M= =0)等价 B、和(M= =1)等价 C、和(M!=0)等价 D、和(M!=1)等价 D 3. 在C语言的if语句中,用作判断的表达式为(D )。

A、关系表达式 B、逻辑表达式 C、算术表达式 D、任意表达式 D 4. 以下程序的输出是(D )。

#include main()

{int i,j,k,a=3,b=2;

i=(--a= =b++)?-- a:++b; j=a++;k=b;

printf(“I=%d,j=%d,k=%d\\n”,i,j,k); }

A、i=2,j=1,k=3 B、i=1,j=1,k=2 C、i=4,j=2,k=4 D、i=1,j=1,k=3

3

B 5. 执行下面的程序: main() {int x;

scanf(\

if (x++>5) printf(\ else printf(\ }

若输入5,则输出为(B )。 A、6 B、-6 C、5 D、-5 6. 有程序段: int a,b; a=9; b=10;

则表达式:(++a= =b--)?--a:++b的值为(B )。 A、8 B、9 C、10 D、11 ●7. 假设所有变量都是整型,则表达式: a=2,b=5,a>b?a++:b++,a+b 的值为(B )。

A、7 B、8 C、9 D、2 8. 下面程序的输出为(A )。

#include void main() {int a,b,c;

a=10;b=50;c=30; if(a>b) a=b, b=c;c=a;

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

A、a=10,b=50,c=10 B、a=10,b=30,c=10 C、a=50,b=30,c=10 D、a=50,b=30,c=50 C 9. 下面程序运行后输出的结果是( )。

main() { int n;

for(n=0;n<3;n++) switch(n)

{ case 1: printf(“%d”, n); case 2: printf(“%d”, n); default: printf(“%d”, n) }

4

}

A、012 B、120 C、011122 D、012020 10. 下面程序的输出是(B )。

#include void main()

{ int x=1,y=0,a=0,b=0; switch(x) { case 1:

switch(y)

{ case 0: a++;break; case 1: b++;break; }

case 2: a++;b++;break; case 3: a++;b++; }

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

A、a=1,b=0 B、a=2,b=1 C、a=1,b=1 D、a=2,b=2 第六章

1. 下面循环的执行次数是(4 )次。 n=0;

while(++n<5)

{ printf(\

2. C语言中,用于结构化程序设计的三种基本结构是(A )。

A、顺序结构、选择结构、循环结构; B、if、switch、break; C、for、while、do- while; D、if、goto、continue:

3. 在C语言中,为了结束while语句构成的循环,while后一对圆括号中表达式的值应该为(A )。 A、0 B、1 C、true D、非0

4. 在C语言中,为了结束do-while语句构成的循环,while后一对圆括号中表达式的值应该为(A )。 A、0 B、1 C、true D、非0 5. 若k为整型,则while循环执行(C )。 k=10;

5

while(k=0) k=k-1;

A、10次 B、无限次 C、0次 D、2次 6. 若k为整型,则while循环执行(B )。

k=2;

while(k= =0) printf(“%d”,k),k--; printf(“\\n”);

A、无限次 B、0次 C、1次 D、2次 7. 下面程序执行后,k的值是(C )。 #include main() {

int k=2; while(k==0)

printf(\ printf(\ printf(\}

A、0 B、1 C、2 D、-2 8. 下面程序的输出为(B )。

#include main()

{int i,j,x=0; for(i=0;i<2;i++) {x++;

for(j=0;j<=3;j++) {if(j%2) continue; x++; } x++; }

printf(\ }

A、x=4 B、x=8 C、x=6 D、x=12 第七章

1. 以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值,则在下划线处应填入的是(D )。 #define N 10

void arrin(int x[N])

6

{ int k=0; while(k

scanf (“%d”, ); }

A、x+k B、&x[k+1] C、x+(k++) D、&x[k++]

2. 以下能正确定义数组并正确赋值的语句是(D )。 A、int N=5,a[N][N]; B、int b[1][2]={{1},{3}}; C、int c[2][]={{1,2},{3,4}};6 D、int d[3][2]={{1,2},{34}};

3. 不正确的字符串赋值或赋初值方式是(C )。

A、 char *str; str=”string”; B、 char str[7]={‘s’,’t’,’r’,’i’,’n’,’g’};

C、 char str[10]; str[10]=”string”;

D、 char str1[]=”string”,str2[]=”12345678”; strcpy(str2,str1);

4. 若有以下定义和语句,则输出结果是(C )。

char s[12]=”a book!”; printf(“%d”, strlen(s));

A、9 B、8 C、7 D、6

5. 若有以下定义和语句,则输出结果是(B )。

char s[]=”a book!”; printf(“%d”, sizeof(s));

A、9 B、8 C、7 D、6 第八章

C 1. C语言可执行程序的开始执行点是( )。 A、第一条可执行语句 B、第一个函数

C、main函数 D、包含文件中的第一个函数 C2. C语言中规定,若对函数类型未加显示说明,则函数的隐含类型为( )。

A、void B、double C、int D、char C 3. C语言程序中,当调用函数时( )。(不确定) A、实参和形参各占一个独立的存储单元 B、实参和形参可以共享存储单元 C、可以由用户指定是否共享存储单元

D、由计算机系统自动确定是否共享存储单元 C 4. 下面程序的输出结果为( )。 #include

7

void main() {int f(); int i=2,k; k=f(i,++i);

printf(\}

int f(int a,int b) {int c; c=a;

if(a>b) c=1;

else if(a==b) c=0; else c=-1; return(c); }

A、2 B、1 C、-1 D、0 A 5. 下面程序的输出结果是( )。 #include main()

{int func(int a,int b); int k=4,m=1,p; p=func(k,m);

printf(\ p=func(k,m);

printf(\ }

int func(int a,int b) {static int m,n=2; n+=m+1; m=n+a+b; return(m); }

A、8,17 B、8,16 C、8,20 D、8,8 第九章

C 1.以下叙述正确的是( )。

A、在程序的一行上可以出现多个预处理命令行 B、预处理行是C的合法语句

C、被包含的檔不一定以 .h 作为后缀

8

D、在以下定义中C R是称为“宏名”的标识符 #define fc 4566 CR

B 2. 在“檔包含”预处理语句的使用形式中,当#include后面的文件名用“”(双引号)括起时,寻找被包含檔的方式是( )。

A、直接按系统设定的标准方式搜索目录

B、先在源程序所在目录搜索,再按系统设定的标准方式搜索 C、仅仅搜索源程序所在目录 D、仅仅搜索当前目录

C 3.以下叙述中不正确的是( )。 A、预处理命令行都必需以#开始

B、在程序中凡是以#号开始的语句行都是预处理命令行 C、程序在执行过程中对预处理命令行进行处理 D、在下是正确的宏定义

#define IBM_PC

C 4. 以下程序的运行结果是( )。 #define PT 3.5

#define S(x) PT*x*x main() {

int a=1,b=2;

printf(“%4.1f\\n”,S(a+b)); 3.5*a+b*a+b }

A、14.0 B、31.5 C、7.5 D、10.5 C 5.下面程序运行后输出的结果 )。

#include\

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

int a,b,c; a=10,b=20; c=8*MIN(a,b); printf(\}

A、10 B、20 C、80 D、120 A 6.下面程序运行后输出的结果是()。 #include\

9

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

int a,b,c; a=10,b=20;

c=8*MIN(a,b)-5; printf(\} A、75 B、15 C、20 D、155 C 7.下面程序运行后输出的结果是( )。

#include\

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

int a,b,c; a=10,b=20;

c=MIN(a+b,a-b)*8; printf(\} A、10 B、20 C、-80 D、-10 第十章

1.若有以下定义和语句,且0≤i≤10,则对数组元素的错误引用是(C )。

A、*(a+i) B、a[p-a] C、p+i D、p[i]

2. 若有以下定义和语句,且0≤i≤10,则对数组元素的正确引用是(D )。

A、&(a+1) B、a++ C、&p D、&p[i] 3.以下程序的输出结果是(A )。 char *alpha[6]=

{“ABCD”,”EFGH”,”IJKL”,”MNOP”,”QRST”,”UVWXYZ”}; char **p; main() {int k; p=alpha;

for(k=0;k<4;k++) printf(“%c”,*(p[k])); printf(“\\n”); }

A、AEIM B、BFJN C、ABCD D、DHLP

10

4.下面程序的输出结果是(D )。

#include main()

{int a[]={1,2,3,4,5,6},*p; p=a; *(p+3)+=2;

printf(“%d,%d\\n”, *p, *(p+3)); }

A、0,5 B、1,5 C、0,6 D、1,6 D 5.若由以下说明和语句,那么对C数组元素的正确引用是( )。

int c[4][5], (*cp)[5]; cp = c;

A、cp+1 B、(cp+3) C、*(cp+1)+3 D、*(*cp+2)

第十一章

1. 共享体变数中起作用的成员是(C )。 A、 第一次存放的成员; B、 中间存放的成员; C、 最后一次存放的成员; D、 所有的成员。 2. 若有以下程序段,则值为101的表达式是(C )。

struct wc {int a; int *b; }*p;

int x0[]={11,12},x1[]={31,32}; struct wc x[2]={100,x0,300,x1}; p=x;

A、*p->b B、p->a C、++p->a D、(p++)->a

D 3.如果在C程序中有main( float argc, char *argv[]),那么类型定义错误的参数是( )。

A、argv B、argv[] C、argc,argv[] D、argc

B 4.若程序中由下面的说明和定义:

struct stt

{ int x; char b; } struct stt a1, a2; 则会发生的情况是( )。

11

A、程序将顺利编译、连接、执行 B、编译出错

C、能顺利通过编译、连接,但不能执行 D、能顺利通过编译,但连接出错

C 5.下面程序的输出是( )。

#include void main()

{ unsigned int a=32,b=66; printf(“%c\\n”,a|b); }

A、66 B、98 C、b D、B

第十二章

1.下面程序的输出是(D )。

#include main()

{unsigned int a=3,b=10; printf(\}

A、1 B、5 C、12 D、13

3. 若int型是2个字节,下面程序运行后,输入331,则输出结果为(C )。

#include void main() {

unsigned a,b,c,d;

printf(\ scanf(\ b=a>>4;

c=~(~0<<4); d=b&c;

printf(\}

A、331,217 B、13,15 C、15,13 D、217,331 4.若int型是2个字节,下面程序段运行后,若输入:a=157653,n=3,则输出的值为(A )。 main() {

unsigned a,b,c,d;

12

int n;

scanf(\b=a<<(16-n); c=a>>n; d=c|b;

printf(\}

A、75765 B、35765 C、13765 D、30000 D 5. 表达式11&10的结果用二进制表示为( )。 A、11 B、3 C、1 D、10 B 6.表达式9|5 的结果十进制表示为( )。 A、12 B、13 C、14 D、15

第十三章

1. C语言中,文件由(D )。

A、记录组成 B、由数据行组成

C、由数据块组成 D、由字符(字节)序列组成 2. C语言中的文件类型只有(B )。

A、索引文件和文本文件 B、ASCII文件和二进制文件两种 C、文本文件一种 D、二进制文件一种 3. C语言中档的存取方式(C )。

A、只能顺序存取 B、只能随机存取 C、可以顺序存取,也可以随机存取 D、只能从檔开头进行存取

二、程序填空题 第三章

1.要使下面程序的输出形式为:12+10=22,-24+10=-14,请填空。 #include void main() {

int a,b,c,d; unsigned u;

a=12;b=-24;u=10; c=a+u;d=b+u;

printf(\【1】+【2】=%d,【3】+【4】=%d\\n\【5】); }

13

选择答案:【1】%d 【2】%d 【3】%d 【4】%d 【5】b,u,d 第四章

2. 下面程序不借助任务中间变量把a,b的值进行交换。请填空。

#include main() {int a,b;

printf(“Input a,b:”);

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

a+=【2】 b ;b=a- 【3】 b ;a- = 【4】 b ; printf(“a=%d,b=%d\\n”, 【5】 a,b ); } 第五章

3. 下面程序输入一个学生的生日(年:y0,月:m0,日:d0),并输入当前日期(年:y1,月:m1,日:d1)。求出该学生的实足年龄。请填空。 #include main()

{int age,y0,m0,d0,y1,m1,d1;

printf(\输入生日日期(年、月、日)\

scanf(\【1】 &y0,&m0,&d0 ); printf(\输入当前日期(年、月、日)\

scanf(\【2】 &y1,&m1,&d1 ); age=y1-y0;

if(m0 【3】 > m1) age--; if ((m0 【4】 = = m1)&&( 【5】 d0 > d1 )) age--; printf(\ }

4. 下面程序输出乘法九九表。 #include void main() {int i,j;

for(i=1;i<【1】 10 ;i++) printf(\

printf(\ for(i=1;i<【2】 10 ;i++) for(j=1;j<10;j++)

14

printf((j= =【3】 9 )?\【4】\\n \【5】i*j ); } 第六章

5. 下面程序从读入的整数据中,统计大于0的整数个数i和小于0的整数个数j,当输入0时,程序运行结束。请填空。 #include

{【1】 int n,i,j;

printf(“Input int numbers,with 0 to end:”); i=j=0;

scanf (“%d”,&n);

while (【2】 n!=0 ) { if (n>0) i=【3】 i+1 ;

if (n<0) j=【4】 j+1 ;

【5】 scanf (“%d”, &n) ; }

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

第七章

1. 设数组a和数组b中分别有an和bn个有序数,程序把数组a和数组b按由小到大的顺序合并到数组c中。请填空。 #include main()

{int a[10]={1,2,5,8,9,10},an=5; int b[10]={1,3,4,8,12,18},bn=5; int i,j,k,c[20],max=9999;

/*在a,b数组的后面都放上一个max(大于数组中所有的数),作为结束标志*/

a[an+1]=b[bn+1]=【1】 max ; i=j=k=0;

/*若a[i],b[j]中有一个不等于max,则尚有数未合并到c数组中,循环继续进行*/

while((a[i]!=max)||(b[j]!=max)) if(a[i]

/*如果a[i]

for(i=0;i

15

rintf(\printf(\}

2. 从键盘输入一个3行4列矩阵的数据,然后求其最大数。请填空: main()

{ int 【1】 i,j , max, a[3][4]; for(i=0;i<3;i++) for(j=0;j<4;j++)

scanf(\【2】 &a[i][j] ) ; 【3】 max=a[0][0] ; for(i=0;i<3;i++) for(j=0;j<4;j++)

if( max

3. 下面程序求出数组a中所有素数的和。请填空。

#include

#include 【1】 main()

{int isprime(int x); int i,a[10],sum=0;

printf (\:\

for(i=0;i<10;i++) scanf(\【2】 &a[i]) ; for(i=0;i<10;i++)

if(isprime( 【3】 a[i] )= =1) {printf(\ sum+=a[i]; }

printf(\ }

int isprime(int x) {int i,k; k=sqrt(x);

for(i=2;i<=k;i++) if(x%i= =0) break;

if( 【4】 x>=2 &&(i>=k+1)) return 【5】 1 ;

16

else return 0 ; }

第十章

4. 下面程序建立一个主次对角在线的元素为1,其余元素为0的5阶方阵并输出。请选择填空。 #include main()

{int a[5][5]={0},*p[5],i,j; for(i=0;i<5;i++) p[i]=【1】 &a[i][0] ; /*使指针数组p指向二维数组每行首地址*/

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

{*(p[i]+【2】 i )=1; /*使主对角在线元素为1*/ *(p[i]+5-【3】 (i+1) )=1;/*使次对角在线元素为1*/

}

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

{ for(j=0;j<5;j++)

printf(\【4】 p[i][j] ); 【5】 printf(\ } }

[1] A、&a[i][0] B、&a[i][1] C、&p[i] D、

&a[0][i]

[2] A、0 B、1 C、i D、(i+1) [3] A、0 B、1 C、i D、(i+1) [4] A、a[i][i] B、a[j][j] C、p[i][i] D、p[i][j]

[5] A、putchar(“\\n”); B、putchar(‘\\n’);

C、putchar(‘\\0’); D、printf(“’\\n’);

5. 下面程序交换a,b的值,请填空

#include \

void swap(int *p1,int *p2) {int temp ;

【1】 temp =*p1; *p1=*p2;

*p2=【2】 temp ;

17

}

void main() {int a,b; int *p_1,*p_2;

printf(\ scanf(\

p_1=【3】 &a ; p_2=【4】 &b ; if(a

6. 若一个字符串顺读和倒读都一样,则此字符串是“回文”,如LEVEL,下面程序判断输入的字符串是否是“回文”。请填空。

#include #include main() {

char s[81],*pi,*pj; int n;

gets(s);n=strlen(s);

pi=【1】 s ;pj=【2】 s+n-1 ; /*pi指向串首,*pj指向串尾*/

while(*pi= =' ') 【3】 pi++ ; /*跳过字符串的前导空格*/

while(*pj= =' ') 【4】 pj-- ; /*跳过字符串最后面的空格*/

while((【5】 pi

if(pi

}

第十三章

7. 从键盘输入一些字符存贮到磁盘文件中,直到输入一个\为止。

#include \ main()

{FILE *fp;

18

char ch, filename[10]; scanf(\ if((fp=【1】 fopen (filename, 【2】 \=NULL) {printf (\ exit(0); }

ch=【3】 getchar(fp) ; while(ch!=【4】 '#' ) {fputc (ch, fp); ch=getchar(fp); }

【5】 fclose(fp) ; }

8. 从磁盘文件E:\\D.txt中顺序读入字符,并显示在屏幕上。

#include void main() {

FILE 【1】 *fp ; char ch;

fp=fopen(\【2】 E:\\\\D.txt\ ch=fgetc(fp);

while(ch!= 【3】 EOF ) {

putchar(ch);

ch=【4】 fgetc(fp) ; }

printf(\

【5】 fclose(fp ) ; }

三、判断题 第一章

1. √C语言可以直接访问物理位元元址。

2. √C语言既可以用来写系统软件,也可以用来写应用软件。

19

3. √C中的变量必须“先定义,后使用”,函数也不例外。

4. √一个C源程序只能有一个main()函数。

5. √一个C源程序可以由一个main()函数和若干个其它函数组成。

6. ×C程序中和每一行就是一个语句。

第三章

7. ×min和id-s都是合法的标识符。 8. √在某种意义上,char和int通用。

9. √若a=2,b=-4;则执行a||b++ 后,b为-4。 10. √在C程序中“%”是只能用于整数运算的运算符,而“/”是既可以用于整数运算又可以用于实数运算的运算符。 11. ×用户标识符中可以出现下划线和中划线(减号)。 12. ×在C中 变量不定义也可以使用。

13. √表达式 ’a’ 和 “a” 是不同的,前者长度为1,后者长度为2。

14. √自增自减运算符++,--可以用于int型、float型和double型资料。

15. √在某种意义上,char和int通用。

16. ×自增运算符和自减运算符的结合方向也是“自左向右”。

第四章

17. ×格式字符%md中的m只能为正,不能为负。 第五章

18. ×在C的if语句中,用作判断的表达式只能是关系表达式或逻辑表达式。

19. ×若有int a,b; 则a=(b*b>b)的值是1。 20. ×若a=2,b=-4; 则执行a||b++ 后,b为-3。 21. √若a=7,b=5; 则执行a&&b++ 后,b为6。 22. √在C中能代表逻辑值“假”的是0。

23. ×若有int x,y,z; x=y=z=1;则执行++x&&++y&&++z后,x,y,z的值分别为2,1,1。

第六章

24. ×continue语句可用于switch语句,也可用于for、while和do循环语句中。

20

25. √break语句可用于switch语句,也可用于for、while和do循环语句中。 第七章

26. √数组类型不是C的基本数据类型,而是一种构造类型 。 27. √数组名代表数组的起始地址。

28. ×若有int a[10]={1,2,3,4,5,6,7,8,9,10}; a=a+1; 则这时a代表元素2的位元元址。

第八章

29. ×C程序中,当调用函数时,由实参把值传递给形参,调用结束后,再由形参把值传回给实参。 30. √用数组名作为实参时,把实参数组的起始地址传递给形参数组,因此形参数组和实参数组占用同一段内存单元,改变形参数组的值,也就改变了实参数组的值。

31. √若有static int a[10]; 则a数组的10个元素的值都是0。

32. ×全局变量的作用域一定比局部变量的作用域范围大。 33. ×函数的实参可以传递给形参,形参也可以传递给实参。

第九章

34. √#define命令是在编译之前处理的。

35. ×一个包含命令include可以包含几个头檔。

第十章

36. √若定义char *str;则str=\是正确的。

37. ×若定义char str[]; 则str=\是正确的。 38. √数组名是指标常量,不需要也不能为其赋值;指针是变量,使用前需对其赋值。

39. ×C中*&a是取变量a的地址。

第十一章

40. √可以用typedef声明各种类型名,但不能用它来定义变量。

41. ×结构类型变量所占内存长度等于成员的长度;而共享体类型变量所占用的内存长度是各成员的内存长度之和,每个成员分别占用其自己的内存单元。

第十二章

21

42. √有unsigned int a=16;a=a>>2;则a的值是4。 43. √有unsigned int a=16;a=a<<2;则a的值是64。 44. ×一个无符号整数各数字往左移动2位后,一定是原数的4倍。

第十三章

45. ×C语言中,feof函数用来判断即将读入的是否是文件结束标志,它可用于二进制文件,但不能用于文本文件。 46. ×C语言的文件存取方式只能是顺序存取,不能随机存取。 47. √C语言中rewind函数使位置指针回到文件的开头位置,而fseek函数使位置指针移到指定的位置。

四、填空题

1. Turboc2中,程序运行后,按下 alt+F5键可以看到运行结果。 2. 做任何事情都有一定的步骤。为解决一个问题而采取的方法和步

骤,就称为 算法 。

3. 算法的特性中包含有 0或多个输入 输入和有一个或

多个输出。

4. C语言中,二维数组中的元素在内存中的排列优先级是:行优先。 5. 若想对一个存储单元清零,只要找一个二进制数,其中各个位符合以下条件:原来的数中为1的位新数中相应的数为0。然后使二者进行&运算,即可达到清零目。 6. 连接(linker):将目标模块和其它一些必要的功能模块装配在一起,生成可执行档,执行程

序文件后缀为 exe 。

7. 具体说,采取以下方法来保证得到结构化的程序:自顶向下,逐步

细化 ,模块化设计,结构化编码。 8. 071∧052 = 19 。(071 052 是8进制数)

9. 有一数01010100, 想把其中左面第3,4,5,7,8位保留下来,运算如下:

01010100(84) & 00111011(59) = 00010000(16)

|a|?bc10. 写出数学表达式的C语言表达式。

a?bsqrt(fabs(a)+b*c)/(a+b) 。

22

第一章

1.C程序总是从(主函数开始 )执行的,而不管其在程序的前面、中间或后面。

2.一个C源程序可以由一个(main )函数和若干个其它函数组成。

3.76U表示76是(无符号整数 ),而3F表示3是(浮点数 )。 4.若'a' 的ASCII码是97,则字符'D'的ASCII码是(68 )。 5.若int型是2个字节,unsigned a=65535,b;b=a+1;则按“%u”格式输出b的值为(0 )。

6.将一个字符常量放到一个字符变量中去,实际上并不是把该字符本身放到内存单元中去,而是把该字符的(ASCII码 )放到存储单元中。

7.C规定了各种运算符的结合方向,(自左至右 )的结合方向称为左结合性,(自右至左 )的结合方向称为右结合性。

8.逗号表达式:表达式1,表达式2,的求解过程是:(先求解表达式1,再求解表达式2 ),整个表达式的值是(表达式2 )的值。

第四章

9. putchar('b'+'M'-'m')的值是(’B’ )。 10.对字符变量,可以用格式符(%c )按字符输出,也可用(%d )按整数输出。

第五章

1.对逻辑表达式a&&b&&c,只要a为(假 ),就不必判别b和c,如果a为(真 ), b为(假 ),就不必判别c 。

第六章

2.下面循环的执行次数是(4 )次。 n=0;

while(++n<5)

{ printf(\第七章

23

9.对字符数组,可以用格式符(%c )将字符逐个输入输出,用格式符(%s )将整个字符串一次输入输出。

10.用语句scanf(“%s”,str); 输入字符串,(不能 )接收空格字符。

11.用语句gets(str )输入字符串,(能够 )接收空格字符。 12. C语言中,数组名代表数组的(起始地址 ),如果在scanf函数中的输入项是字符数组名,则(不能 )在数组名前加地址运算符&。

13.函数strcat(str1,str2)的作用是(把字符串str2连接到字符串str1的后面 ),结果存放在字符数组(str1 )中。 14. char str[]=”abc”,则strlen(str)的值是(3 ),sizeof(str)的值是(4 )。

15. char str[]=”abc\\0def”,则strlen(str)的值是(3 ),sizeof(str)的值是(8 )。

第八章

16.调用函数时,才给形参(分配 )存储单元,调用结束后,形参单元被(释放 ),而实参单元仍保留原值。

17.在C中调用函数前,对被调用的函数要作类型说明,但如果函数的类型是(整型 ), 则可以不加说明。

第十章

18.一个变量的(地址 )称为变量的指针,一个变量专门用来存放另一个变量的(地址 ),则称该变量为指针变量。

19.若有char *a=”Computer”,则a中存放的是( 字符串的起始地址 )。

第十一章

20.有下面的定义:

struct student {char name[8]; char sex; int age; }stu1, stu2;

则,sex占(1 )个字节, stu1占(11 )个字节。

第十二章

21. C语言中,2^4的值是(6 )。

24

第十三章 22. feof函数可用于(二进制 )文件和(ASCII码 )檔,它用来判断即将读入的是否为文件(结束 )标志,若是,函数值为真。

五、写出程序程序运行后的结果(每小题4分,共20分) 1.写出下面程序输出的结果 main()

{int n=0;

while(n++<=1) printf(\ printf(\}

结果:1 2 3

2. 写出下面程序运行后的结果 main()

{int i,s; s=0;

for(i=1;i<=10;i=i+2) s+=i;

printf(\}

结果:s=25

3.写出下面程序运行后的结果 main()

{int a,b,i; a=1; b=0;

for(i=1;i<=5;i++) {a*=i; b+=a; }

printf(\}

结果:a=120,b=153

第七章

4.写出下面程序运行后的结果: main()

{int i,j,t;

25

static int a[6]={1,3,4,5,2,6}; for(i=0, j=5; i

}

结果:6 2 5 4 3 1 5.写出下面程序运行后的结果: void px(int a[],int n) { int i,j,k,t; for(i=0;i

for(j=i+1;j

t=a[k];a[k]=a[i];a[i]=t; } }

void main()

{ int a[5]={1,4,-3,5,-8},i; px(a,5);

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

printf(\ printf(\}

结果:-8 –3 1 4 5 6.写出下面程序运行后的结果: #include

void main() {int i, j;

static int a[4][4]={{3,5,6},{2,1,4},{8,7,1}}; for(i=0; i<3; i++) for(j=0; j<3; j++) {a[i ][3]+=a[i][j]; a[3][j ]+=a[i][j]; a[3][3]+=a[i][j]; }

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

26

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

printf(\ printf(\ } }

结果: 3 5 6 14 2 1 4 7 8 7 1 16 13 13 11 37

7.写出下面程序运行后的结果:

main()

{int i, j, max, row, col;

static int a[3][3]={{7,5,6},{2,9,4},{4,1,3}}; for(i=0; i<3; i++)

{ max=a[i][0]; row=i; col=0; for(j=1; j<3; j++) if(a[i][j]>max)

{max=a[i][j]; row=i; col=j; } printf(\ } }

结果: a[0][1]=7 a[1][1]=9 a[2][0]=4

第十章

8.写出下面程序运行后的结果: #include \

void cp_str(char *q1,char *q2) { while(*q1) q1++; while(*q2)

*q1++=*q2++; *q1='\\0'; }

void main() { char a[80]=\ char b[]=\

27

char *p1,*p2; p1=a; p2=b;

cp_str(p1,p2);

printf(\}

结果:

a=TeacherStudent b=Student

第十一章

9.写出下面程序运行后的结果:

#include main() {union un {int a; char c[2]; }w;

w.c[0]='A';w.c[1]='a'; printf(\}

解:上面结构如下图:

‘a’(97) ‘A’(65)

01100001 01000001 w.c[1] w.c[0]

w.a

w.a是整型,占2个字节,其值为:01100001 01000001 从右往左3位一节,转换为八进制数,结果为:60501 10.写出下面程序运行后的结果:

#include main()

{ enum team{qiaut,cubs=4,pick,dodger=qiaut-2}; printf(“%d,%d,%d,%d\\n”,qiaut,cubs,pick,dodger); }

结果:0,4,5,-2

28

第十二章

11.写出下面程序的输出结果。

#include main()

{char a=9,b=020;

printf(“%o\\n”, ~a&b<<1); }

结果:040

12.阅读以下程序,给出正确的运行结果: #i nclude void main() {union example {struct

{int x; int y; }in; int a; int b; }e; e.a=1; e.b=2;

e.in.x=e.a*e.b; e.in.y=e.a+e.b;

printf(\printf(\}

该程序的运行结果是:4,8 4,4

六、编程序题 1.编一程序,求a=123,b=456的和sum,输出形式为:123+456=579。 main()

{int a,b,sum; a=123; b=456; sum=a+b;

printf(\}

29

2. 编一程序从键盘输入一个时间t,求h=1/2gt的值。输出格式2

为:t=?,h=?。要求保留一位小数。 #include #define G 9.8 main()

{float t,h;

printf(“Input t:”); scanf(“%f”, &t); h=1.0/2*G*t*t;

printf(“t=%.1f, h=%.1f\\n”,t,h); } 3.编一程序求1!+3!+5!+7!+9!。 #include main() {

int i,j,t,s; s=0;

for(i=1;i<=9;i=i+2) { t=1;

for(j=1;j<=i;j++) t=t*j; s=s+t; }

printf(\}

4.编一程序求1+(1+2)+(1+2+3)+?+(1+2+3+?10)。解法1:

#include main() {

int i,j,t,s; s=0;

for(i=1;i<=10;i++) { t=0;

30

for(j=1;j<=i;j++) t=t+j; s=s+t;

}

printf(\}

解法2:

#include main() {

int i,t,s; s=0;

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

t=t+j; s=s+t; }

printf(\}

5.一个三位的素数,若其个位和百位数字相同,则这个数叫做回文数,打印这些回文数。 解法1:不用函数 #include #include main() {

int n,i,j,x,y,z,loop; for(n=101;n<=999;n++) {

x=n/100;

y=(n-x*100)/10; z=n; j=sqrt(n);

for(i=2;i<=j;i++) if(n%i==0) break; if(i>=j+1) loop=1; else loop=0;

if( (x= =z)&&loop= =1 ) printf(\

31

}

printf(\

}

解法2:用函数 #include #include

int ZS(int n) /*判素数的函数*/ {

int z,i,j=sqrt(n),temp; for(i=2;i<=j;i++) if(n%i==0) break;

if(i>=j+1) temp=1; else temp=0; return temp; }

int HWS(int n) /*判回文数的函数*/ {

int x,y,z,loop,c; x=n/100;

y=(n-x*100)/10; z=n; c=ZS(n);

if( (x= =z)&& c ) loop=1; else loop=0; return loop; }

main() {

int n;

for(n=100;n<=999;n++)

if(HWS(n)) printf(\printf(\} 6.用递归方法编程序求解习题6.10—猴子吃桃子问题。#include int num(int n)

32

{

int c;

if(n==1) c=1;

else c=2*(num(n-1)+1); return c; }

void main() {

printf(\}

7.用选择法,对十个整数按从小到大的顺序排列(排序用函数实现)。

void sort(int a[],int n) {

int i,j,k,t;

for(i=0;i

k=i;

for(j=i+1;j

void main() {

int i,a[10]={1,3,2,4,5,6,9,0,8,7}; sort(a,10);

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

printf(\ printf(\}

8.编一程序,查找输入的N个字符串中最长的那个字符串。

#include #include #define N 3 main()

33

{char str[N][81],*sp; int k;

for(k=0;k

for(k=1;k

printf(\最长的那个字符串是:\\n%s\\n\

printf(\最长的那个字符串的长度是:%d\\n\}

9.编程序,设二进制数a=00101101,编程序使a的高4位取反,低4位不变,求出这个结果 。 #include

main()

{unsigned int a=055,b,c,d,e; b=~0<<4; c=a^b;

d=~(~0<<8); e=c&d;

printf(\ }

10.函数原型说明为int mystrlen(char *s);,其功能是测试字符串s的长度,编制该函数并用相应主函数对其进行测试。

#include void main()

{ int mystrlen(char *s); char str[80]; gets(str);

printf(“%d\\n”, mystrlen(str)); }

int mystrlen(char *s) { int len=0;

while (*s++) len++; return len; }

34

七、程序分析题 1. 程序1如下:

#include void main()

{ int i,j,k,t,a[10];

printf(\

for(i=0;i<10;i++) scanf(\

for(i=0;i<10;i++) { k=i; 【1】

for(j=i+1;j<10;j++) if(a[j]>a[k]) k=j; 【2】

if(k!=i) { t=a[i]; a[i]=a[k]; a[k]=t; } 【3】

}

for(i=0;i<10;i++) printf(\ printf(\}

语句【1】的所用是:假设无序序列中最大的数的下标为第一个数,其下标为i

语句【2】的所用是:找出无序序列中最大的数的下标 语句【3】的所用是:把最大的数与无序序列的第一个数交换 2. 程序2如下:

#include \void main() { int i;

int f[20]={1,1};【4】

for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; 【5】 for(i=0;i<20;i++)

{ if(i%5==0) printf(\ printf(\ } 【6】

printf(\}

语句【4】的所用是:初始化Fibonacci数列的前两个数为1 语句【5】指的for语句的所用是:循环求出Fibonacci数列的

35

每一项

语句【6】指的for语句的所用是:以每行5个整数每个整数占12格的格式输出Fibonacci数列

3. 程序3如下:

#include void main()

{ int a,b, temp; 【7】

printf(“input the data a and b:”); scanf(“%d %d”,&a,&b);

printf(“ %d %d”,a,b);【8】 printf(“change a and b: ”); temp=a; a=b; b=temp;

printf(“input the data a and b:”); printf(“%d %d”,a,b); 【9】 printf(“\\n”); }

【7】变数temp的所用是:中间变数

语句【8】和语句【9】的结果一样吗?:不一样 为什么?:因为8是原样输出9是在它们被交换了之后的输出 4. 程序4如下:

#include \

void funstr(char *q1,char *q2) { while(*q1) q1++; 【10】

while(*q2) *q1++=*q2++; 【11】 *q1='\\0'; 【12】 }

void main() { char a[80]=\ char b[]=\ char *p1,*p2; p1=a; p2=b; funstr(p1,p2);

printf(\【13】 }

语句【10】的所用是: 令q1指向字符串a的末尾

36

语句【11】的所用是: 把b字符串连接到a字符串后面 语句【12】的所用是:在连接后的字符串末尾加上结束符 语句【13】输出的结果是: a=Teacher.Student. b=Student.

5. 阅读程序,根据要求分析程序。

#include \void main()

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

{ a=x/100; 【1】

b=(x-a*100)/10; 【2】 c=x;【3】 }

printf(\}

语句【1】的所用是: 把x百位及以上的数赋值给a

语句【2】的所用是: 把x十位上的数赋给b 语句【3】的所用是: 把个位上的数赋给c 6. 阅读程序,根据要求分析程序。

#include \void main()

{ int a[11];

int i,j,t;

printf(\ for (i=1; i<11; i++) scanf (\ printf(\ for(j=1;j<=9;j++)

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

if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; }【4】 printf(\

for(i=1;i<11;i++) printf(\【5】 printf(\ getch(); }

语句【4】的作用是: 如果相邻两数前一个大于后一个则交换

37

它们

语句【5】输出的结果和输入数组a的有什么不同: 输出之后的数组是有序的

7. 阅读程序,根据要求分析程序。

#include #include void main()

{ char str1[80],str2[80]; int i,j;

printf(\输入字符串 str1: \gets(str1); printf(\输入字符串 str2: \gets(str2); i=0,j=strlen(str1);

while(str2[i]!='\\0') str1[j++]=str2[i++];【6】

str1[j]='\\0';【7】 puts(str1);【8】 }

语句【6】的所用是:把str2连接到str1的后面

语句【7】的所用是: 在连接后的字符串末尾加上结束符 语句【8】的所用是: 输出连接后的字符串

8. 阅读程序,根据要求分析程序。

#include #define N 80 void main()

{ int b[N],x,k,r,i;

printf(\ k=-1;

do { r=x%2; b[++k]=r; x/=2; }

while (x!=0); 【9】

for ( i=k; i>=0; i-- ) printf(\b[i]

【10】 );

printf(\}

【9】语句所指的整个do循环的含义是: 把十进制数x转化为2进制储存在b数组中

【10】语句中数组b的值为: x 的二进制数

38

9. 阅读程序,根据要求分析程序。

#include void main() { FILE *fp; char ch,filename[10];

printf(\输入文件名:\【11】 if ( ( fp = fopen (filename,\ { printf(\ exit(0); }

【12】

printf(\输入一行字符\ ch=getchar(); while(ch!='#')

{ fputc(ch,fp); putchar(ch); ch=getchar(); }

【13】

printf(\ fclose(fp); }

【11】语句所指的整个if语句的含义是:判断檔打开是否成功 【12】语句中的含义结果为:输出文件无法打开的提示,退出程序

【13】语句所指的整个while循环的含义是:把从键盘上输入的字符写入文件 当输入为‘#‘时结束

39