当前位置:文档之家› C语言习题

C语言习题

第一部分 习题篇
第一章 C语言概述
一.单选题

1.以下说法中正确的是( C )。

A)C语言程序总是从第一个函数开始执行

B)在C语言程序中,要调用函数必须在main( )函数中定义

C)C语言程序总是从main( )函数开始执行

D)C语言中的main( )函数必须放在程序的开始部分

2.一个C语言程序是由( B )。

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

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

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

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

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

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

A)一个C源程序可由一个或多个函数组成

B)一个C源程序必须包含一个main函数

C)C程序的基本组成单位是函数

D)在C程序中,注释只能位于一条语句的后面

5.下列关于C语言的说法不正确的是( D )。

A)C语言既有高级语言的功能,也具有低级语言的一些功能

B)C语言中的一条执行语句都必须用分号结束

C)注释可以出现在程序中任意合适的地方

D)include命令行后面必须加分号

6.用C语言编写的代码程序( B )。

A)可以立即执行 B)是一个源程序

C)经过编译即可执行 D)经过编译解释才能执行

7.用高级语言(如C语言)编写的程序称为( A )

A)源程序 B)目标程序 C)可执行程序 D)编译程序

8.一个函数的组成有( A )。

A)函数首部和函数体 B)函数名和函数的声明部分

C)主函数和子函数 D)声明部分和执行部分

9.在C语言中,用来表示“取地址”的符号是( B )。

A) # B) & C) * D) @

10.C语言是计算机高级语言,它适合于作为系统描述语言,它( A )。

A)既可用来写系统软件,也可用来写应用软件

B)只能写系统软件,不能用来写应用软件

C)不能写系统软件,只能用来写应用软件

D)既不能写系统软件,也不能写应用软件

二.填空题

1.C语言用 函数 作为程序的模块单位,便于实现程序的模块化。

2.C语言允许直接访问物理地址,能进行 位 操作。

3.用C语言编写的程序,每一个语句和数据定义的结尾必须要有一个 分号 。

4.每个C程序中必须有一个 main() 函数。

5.C程序中的函数体由 { } 括起来。

6.C程序中的“\n” 表示在程序运行中 换行 。

7.C程序中,“/*……*/”表示 注释 部分。

8.C程序中,一个函数由 函数

首部 和 函数体 组成。

9.一个C程序总是从 main() 函数开始执行的,不论该函数在整个程序中的位置如何。

10.在纸上编好一个C源程序后,要经过 编辑 、 编译 、 连接 、 运行 这几个步骤进行上机运行。

三.判断题

1.C语言不具有低级语言的特性。 ( 错 )

2.C语言之所以也被称为中级语言,是因为它比高级语言的功能要少,而比低级语言的功能多。 ( 错 )

3.C语言与其他高级语言一样具有结构化的控制语句。 ( 对 )

4.C语言允许直接访问物理地址。 ( 对 )

5.每一个C程序必须有一个main函数。 ( 对 )

6.C程序的语句最后应有一个分号。 ( 对 )

7.C程序中的main函数必须放在整个程序的最前头。 ( 错 )

8.计算机高级语言对源程序进行翻译有两种方式:编译和解释。 ( 对 )

四.编程题

1.编写一个C程序,输出以下信息:

* * * * * * * * * * * *

I am a student.

* * * * * * * * * * * *

#include /*包含头文件,为了使用printf和scanf语句,注意句末无分号*/

void main()

{

printf(“* * * * * * * * * * * \n”); /*\n的作用相当于回车*/

printf(“ I am a student.\n”);

printf(“* * * * * * * * * * * \n”);

}

2.编写一个C程序,输入a、b两个数,输出其中大的数。(只用一个主函数)

#include

void main()

{ int a,b;

printf(“Please input a,b:\n”);

scanf(“%d,%d”,&a,&b); /*注意输入两个数之间用逗号分隔*/

if(a>b) printf(“%d”,a);

else printf(“%d”,b);

}

3.编写一个C程序,输入a、b、c三个数,输出其中最大数。(只用一个主函数)

#include

void main()

{

int a,b,c,max;

printf(“Please input a,b,c:\n”);

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

max=a;

if(a
if(max
printf(“The largest number is %d”,max);

}




第二章 数据与运算
一.单选题

1.C语言中最简单的数据类型包括( B )。

A)整型、实型、逻辑型 B)整型、实型、字符型

C)整型、字符型、逻辑型 D)字符型、实型、逻辑型

2.C语言中运算对象必须是整型的运算符是( D )。

A) * B) / C) = D) %

3.在C程序中,以下不正确的叙述是( D )。

A)逗号运算符的优先级最低

B)ABC和abc是两个不同的变量

C)若a和b类型相同,

在执行了赋值表达式a=b后,b中的值将放入a中,而b的值不变

D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数据

4.设有int x=8,表达式x++*1/3的值是( A )。

A) 2 B) 3 C)8 D)9

5.若m, x, y, z都是整型变量,则计算表达式m=(x=5, y=10,z=25)执行后,m的值为( C )。

A) 5 B) 10 C)25 D)40

6.设变量i是int 类型,f 是float型,d是double型,执行表达式5+’i’-f*d,其结果的数据类型为( B )。

A) int型 B) double型 C)float型 D)非法表达式

7.设变量i是int 类型,执行语句i=’A’+2.5后,正确的叙述是( C )。

A) i的值是字符D B) i的值是字符A的ASCII值加上2.5

C) i的值是字符A的ASCII值加上2 D)非法表达式

8.下列是用户自定义标识符的是( B )。

A) int B) _xy C)2xy D)3-xy

9.下面与x=y++完全等价的表达式是( A )。

A) x=y,y=y+1 B) x=x+1,y=x C)x=++y D)x+=y+1

10.已知各变量的类型说明如下:

int k,a,b;

long w=8;

float x=2.56;

以下不符合C语言语法的表达式是( A )。

A)x%5 B)w-=5 C)k=(a=8,b=6,a-b) D)a+=a-=(b=2)*(a=5)

11.运行以下程序段时编译出错,其原因是( D )。

char c1 = 'a', c2 = '123';

printf( "%c,%d\n", c1, c2 );

A)字符串要用"123"表示

B)'123'只能赋值给字符数组

C)c2是字符变量,不能用%d格式输出

D)c2是字符变量,只能赋以字符常量

12. 若定义 float a;,现要从键盘输入a数据,其整数位为3位,小数位为2位,则选用( A )。

A)scanf( "%6f", &a ); B)scanf( "%5.2f", a );

C)scanf( "%6.2f", &a ); D)scanf( "%f", a );

13.若定义double t;,则表达式 t=1, t+5, ++t的值为( B )。

A)1.0 B)2.0 C)6.0 D)7.0

14. 已知各变量的类型说明如下,则C语言中错误的表达式是( A )。

int k, a, b;

unsigned long w = 5;

double x = 1.42;

A)x % (-3) B)w += 2

C)k = ( a=2, b=3, a+b) D)a += a -= ( b=4*(a=3) )

15. 以下程序段的运行结果是( C )。

int a=0, b=0, c=0;

if ( a && ++b ) c++;

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

A)1,1 B)1,0 C)0,0 D)0,1

二.填空题

1.在C语言中,一个float型数据在内在中所占的字节数为4,一个double型数据在内在中所占的字节数是 8 。

2.下面程序的输出结果是 28 。

main( )

{

int a=2, b=3, c=4;

a*=16+(b++)-(++c);

printf(“%d”, a);

}

3.下面程序的输出结果是 5 。

main( )

{

int x=17, y=26;

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

4.执行下面程序段后,c3中的值是 0 。

int c1=1, c2=2, c3;

c3=1.0/c2*c1;

5.进行下列变量定义后,表达式a*b+d-c的类型是 double 。

char a;

int b;

float c;

double d;

6.下面程序的输出结果是 8,10 。

main( )

{

int x=010, y=10;

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

}

7.下面程序的输出结果是 12 。

main( )

{

int x=3, y=5;

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

}

8.已知字母A的ASCII码是十进制数65,设c为字符型变量,则表达式c=’A’+’5’-’2’的值为 D 或68 。

9.下面程序的输出结果是 52 。

main( )

{

int x=065;

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

}

10.下面程序的输出结果是 25,21,37 。

main( )

{

int a, b, c;

a=25;

b=025;

c=0x25

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

}

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

main( )

{

int x=0110;

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

}

12.下面程序的输出结果是 20 200.000000 。

main( )

{

char c ;

int n=100;

float f=10;

double x;

x=f*=n/=(c=5);

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

}

13.写出下面程序的运行结果。(请用∪表示空格)

main()

{

char c1=’a’,c2=’b’,c3=’c’,c4=’\101’,c5=’\116’;

printf(“a%c∪b%c\t c%c\tabc\n”,c1,c2,c3);

printf(“\t \b%c∪%c\n”,c4,c5);

}

程序的运行结果是:aa∪bb∪∪∪cc∪∪∪∪∪∪abc

A∪N

14.下面程序的运行结果是 9,11,9,10 。

main()

{int i, j, m, n;

i=8;

j=10;

m=++i;

n=j++;

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

}

15. 以下程序的运行结果是 11.50 。

#include

void main()

{ int i=5, j=9;

float x=2.3, y=4.5;

printf("%8.2f\n", i%(int)(x+y)*j/2/3+y );

}

三.判断题

1.C语言中,字符常量可以用单引号或双引号括起来。 ( 错 )

2.C语言中,字符常量只能包含一个常量(字符)。 ( 对)

3.在C语言中,字符串常量隐含处理成以‘\0’结尾。 ( 对)

4.下面程序段的输出结果是9。 (错 )

int a=9;

printf(“%o\n”,a); (注意:%o中的o是字母o,不是数字0)

5.C语言中,用户所定义的标识符允许使用关键字。 (错 )

6.C语言中,用户所定义的标识符中,大、小字母代表不同标识。 ( 对 )

7.C语言中,符号常量的值在程序运行过程中可以改变。 (错 )

8.C语言中,不要求对程序中所用到的变量进行强制定义。 (错 )

9.C语言中,一个整数如

果其值在-323768~32767范围内,认为它是int 型,只能赋值给int型变量。 (错 )

10.设一个C系统的float型有效数字是7位,则超过7位数的运算是不准确的。 (对)

四.计算题

1.求下面表达式的值。

1)x+a%3*(int)(x+y)%2/4 设x=2.5, a=7, y=4.7

第1步:(int)(x+y)=(int)(7.2)=7

第2步:a%3*7%2/4=7%3*7%2/4=1*7%2/4=1/4=0

第3步:x+0=x=2.5(计算机显示为2.500000)

2)(float)(a+b)/2+(int)x%(int)y 设a=2, b=3, x=3.5, y=2.5

第1步:(float)(a+b)/2=(float)(2+3)/2=(float)(5)/2=5.0/2=2.5

第2步:(int)x%(int)y=(int)(3.5)%(int)(2.5)=3%2=1

第3步:2.5+1=3.5(计算机显示为3.500000)

2.写出下面赋值表达式运算后a的值,设原来a=12,n=5。

1)a+=a a=a+a=12+12=24

2) a-=2 a=a-2=12-2=10

3) a*=2+3 a=a*(2+3)=12*5=60

4) a/=a+a a=a/(a+a)=12/24=0 注意a是整型

5)a%=(n%=2) 已知:n=5 a=0

6)a+=a-=a*=a 从右向左解:a=a*a=144;a=a-a=0;a=a+a=0

五.编程题

1.要将“China”译成密码,规律是:用原来的字母后面第4个字母代替原来的字母。例如,“A”用字母“E”来替代。因此,“China”应译为“Glmre”。编程:用赋初值的方法使c1.c2.c3.c4.c5这五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,这五个变量分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。

#include

void main()

{char c1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;

c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;

printf(“password is %c%c%c%c%c\n”,c1,c2,c3,c4,c5);

}

运行结果:password is Glmre

也可以用循环和数组:

#include

void main()

{

char c[]={“China”};

printf(“password is “);

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

printf(“%c”,c[i]+=4);

printf(“\n”);

}

2.请编程,要求用赋初值的方法使c1.c2这两个变量的值分别为97和98,然后分别按整型和字符型输出。

#include

void main()

{

char c1=97,c2=98;

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

printf(“%c,%c\n”,c1,c2);

}

3.编写程序,从键盘输入三个单精度数a、b、c,计算总和、平均值、x=a2+b2+c2的值,并计算x平方根的值。所有运行数据保留三位小数,第四位四舍五入。

#include

#include

void main()

{ double a, b, c, total, average, square, squareroot;

printf("请输入三个单精度实数:");

scanf("%f%f%f", &a, &b, &c);

total = a + b + c;

average = total/3.0;

square = a*a + b*b + c*c;

squareroot = sqrt(square);

printf("三个数的和=%-15.3f,三个数的平均值=%-15.3f\n", total, average);

printf("三个数的平方和x=%.3f,x的平方根=%.3f\n", squar

e, squareroot);

}

运行结果:

请输入三个单精度实数:1.23 4.56 7.89

三个数的和=13.680 ,三个数的平均值=4.560

三个数的平方和x=84.559,x的平方根=9.196




4.输入三角形的三个边长,计算并输出三角形的面积。

#include

#include

void main()

{ float a, b, c, k, area;

printf("请输入三角形三条边的边长:");

scanf("%f%f%f", &a, &b, &c);

if ((a+b <= c) || (a+c <= b) || (b+c <= a))

printf("您输入的三条边无法构成三角形。\n");

else

{

k = (a+b+c)/2;

area = sqrt( k*(k-a)*(k-b)*(k-c) ); /* 函数sqrt(x)是求 x 的平方根 */

printf("该三角形的面积是%6.2f\n", area);

}

}




5.输入两个长整型数,输出它们(整数除的)商和余数。

#include

void main()

{ long a1, a2, a3, a4;

printf("请输入两个整数:");

scanf("%ld%ld", &a1, &a2);

a3 = a1/a2;

a4 = a1%a2;

printf("两数进行整数除的商是%ld, 余数是%ld\n", a3, a4);

}

运行结果:

请输入两个整数: 654321 789

两数进行整数除的商是829, 余数是240




6.输入两个整数,输出它们(实数除)的商,并输出商的第二位小数位(例如:15/8.0=1.875, 1.875的第二位小数位是7)。

#include

void main()

{ int a, b, c;

float f;

printf("请输入两个整数:");

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

f = 1.0*a/b ;

c = (int)(f*100)%10;

printf("两数进行实数除,商是%f, 商的第二位小数位是%d\n", f, c);

}

运行结果:

请输入两个整数: 15 8

两数进行实数除,商是1.875000, 商的第二位小数位是7

7.输入一个(unsigned类型)无符号整数,分别输出它的低四位和高四位。

#include

void main()

{ unsigned u, high4, low4;

printf("请输入一个无符号整数:");

scanf("%u", &u);

low4 = (u & 0xf); /* u的低四位保留原值,其余位置0 */

high4 = (u & 0xf000)>>12; /* u的高四位保留原值,其余位置0,并右移12位 */

printf("%u 的十六进制是%x\n" , u, u);

printf("十六进制表示%u的低四位是%x,高四位是%x\n", u, low4, high4);

}

运行结果:

请输入一个无符号整数:54332

54332 的十六进制是d43c

十六进制表示54332的低四位是c,高四位是d




8.输入两个小写字母分别赋值给字符变量ch1与ch2,将它们转换成大写字母,并交换ch1与ch2的值,最后输出ch1与ch2的值。

#include

void main()

{ char c1, c2, t;

printf("请输入两个半角的小写英文字母

:");

c1=getchar();

c2=getchar();

c1 -= 32;

c2 -= 'a'-'A'; /*与32等价*/

t = c1;

c1 = c2;

c2 = t;

printf("%c%c\n", c1, c2);

}

运行结果:

请输入两个半角的小写英文字母:db

BD




9.输入秒数,将它转换,用小时、分钟、秒来表示。例如输入7278秒,则输出:2小时1分18秒。

#include

void main()

{ int k;

int hour, minute, second;

printf("请输入秒数:");

scanf("%d", &k);

hour = k/3600;

k %= 3600;

minute = k/60;

second = k%60;

printf("%d小时%d分钟%d秒。\n", hour, minute, second);

}

运行结果:

请输入秒数: 7278

2小时1分钟18秒。




10.输入两个复数的实部和虚部,输出这两个复数积的实部和虚部。两复数的积按下面的公式计算:(a+bi)·(c+di)=(ac-bd)+(ad+bc)i。

#include

void main()

{ float a, b, c, d, real, imag;

printf("请输入第一个数的实部和虚部:");

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

printf("请输入第二个数的实部和虚部:");

scanf("%f%f", &c, &d);

real = a*c-b*d;

imag = a*d+b*c;

printf("两个复数积的实部和虚部分别是%f, %f\n", real, imag);

}

运行结果:

请输入第一个数的实部和虚部:1.1 2.2

请输入第二个数的实部和虚部:3.3 4.4

两个复数积的实部和虚部分别是-6.050000, 12.100000

第三章 C程序的基本控制结构
一.单选题

1.若变量已经正确定义为float型,要通过语句scanf(“%f %f %f ”, &a,&b,&c)。

给a输入10.0,n输入20.0,c输入30.0,下列不正确的输入形式是( B )。

A) 10<回车>20<回车>30<回车> B) 10.0,20.0,30.0<回车>

C) 10.0<回车>20.0 30.0<回车> D) 10 20<回车>30<回车>

2.若有说明语句:char c=’65’; 则变量c( D )。

A) 包含1个字符 B) 包含2个字符

C) 包含3个字符 D) 说明不合法,c的值不确定

3.若w=1,x=2,y=3,z=4,则条件表达式w
A)1 B)2 C)3 D)4

4.x、y、z被定义为int型变量,若从键盘给它们输入数据,正确的输入语句是( B )。

A) input x,y,z; B) scanf(“%d%d%d”, &x,&y,&z);

C) scanf(“%d%d%d”, x,y,z); D) read(“%d%d%d”, &x,&y,&z);

5.有以下程序。

#include

void main( )

{

char a1=’A’, a2=’a’;

printf(“%c\n”, (a1, a2));

}

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

A) 程序输出大写字母A B) 程序输出小写字母a

C) 格式说明符不足,编译出错 D) 程序运行时产生出错信息

6.以下程序的输出结果是( A )。


#include

void main( )

{

int a=2,b=3,c=0,d;

d=!a&&!b||!c;

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

A)1 B)0 C)非0的数 D)-1

7.以下程序的输出结果是( B )。

#include

void main( )

{

int a=6,b=5;

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

}

A) 8 B)9 C)10 D)11

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

#include

void main( )

{int a=55,b=50,c=60,d;

d=a>20?b:c;

switch(d)

{case 40: printf(“%d,”,a );

case 50: printf(“%d,”,b );

case 60: printf(“%d,”,c );

default: printf(“$\n” );}}

A)50,60 B)50,$ C)60,$ D)50,60,$

9.如果从键盘输入数据666,下面程序输出的结果是( C )。

#include

void main( )

{ int x;

scanf(“%d”,&x);

if(x>300) printf(“%d”,x);

if(x>200) printf(“%d”,x);

if(x>100) printf(“%d”,x);

}

A)666 B)666666 C)666666666 D)以上都不对

10.有如下程序。

#include

void main( )

{

int a=5,b=6,c=1;

switch (c)

{

case 0:b++;

case 1:a++;

case 2:a++;b++;

}

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

}

该程序的输出结果是( C )

A)a=5,b=6 B)a=6,b=7 C)a=7,b=7 D)a=7,b=8

11、下面的程序中:

int i=9;

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

则下列描述正确的是( C )

A)while循环执行9次 B)循环体语句执行一次

C)循环体语句一次也不执行 D)循环是无限循环

(注意:i=0是赋值语句,不是对i中值和0进行比较,因此程序执行后i的值是0而不是9)

12、下面的程序中:

int i=-1;

do

{i=i*i;} while(!i);

则下列描述正确的是( B )

A)循环体一次也不执行 B)循环体执行一次

C)循环体执行两次 D)是无限循环

13、下面的程序中:

int i=0;

while(i=1)

{…}

则下列描述正确的是( C )

A)循环控制表达式不合法 B)循环控制表达式为0

C)循环控制表达式为1 D)以上都不对

14、下面的程序中:

int x=0,total=0;

while(!x!=0) total+=++x;

printf(“%d”, total);

则下列描述正确的是( D )

A)程序段的控制表达式是非法 B)程序段是无限循环

C)运行程序段后输出0 D)运行程序段后输出1

15、若变量已正确定义,要求以下程序段完成6!的运算,不能完成的程序段是( D )。

A) B)

i=1; i=1;

x=1; x=1;

while (i﹤=6) do

{ x=x*i; {x=x*i;

i++;} i++; }

while (i﹤=6);

C) D)

for (x=1,i=1;i﹤=6;i++) for (i=1;i﹤=6;i++)

x=x*i; { x=1; x=x*i;}

16、设n为整型变量,则for(n=10 ;n>=0 ;n--)循环次数为( C )

A)9

B)10 C)11 D)12

17、对表达式for(表达式1; ; 表达式3)可以理解为( B )

A)for(表达式1;0;表达式3) B)for(表达式1;1;表达式3)

C)for(表达式1;表达式1;表达式3) D)for(表达式1;表达式3;表达式3)

18、下面的程序运行结果是( B )

#include

void main( )

{

int x=10;

do

x--;

while(--x);

printf("%d\n", x--);

}

A)-1 B)0 C)1 D)8




二.填空题

1.下面程序的输出结果是16.00,请填空。

#include

void main( )

{ int a=9, b=2;

float x= 6.6 , y=1.1, z;

z=a/2+b*x/y+1/2;

printf(“%5.2f \n”, z);

}

2.下面程序输出的结果是 Z 。

#include

void main( )

{char c=’A’;

printf(“%c”,c+25);

}

3.有以下程序。

#include

void main( )

{char a, b, c, d;

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

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

}

若从键盘上输入5,6,65,66<回车>。则输出结果是 5,6,A,B 。

4.已知字母A的ASCII值是65,运行下面程序时输入B35<回车>,输出结果是 1F 。

#include

main( )

{ char a, b;

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

a=a-‘A’+’0’; b=b*2;

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

}

5.下面程序的输出结果是 22 。

#include

void main( )

{

int x=13,y=22;

printf(“%d”,y/=(x%=6));

}

6.下列程序的功能是把从键盘上输入的整数取绝对值后输出。

#include

void main( )

{int x;

scanf(“%d”,&x);

if(x<0)

x=-x ;

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

}

7.下面程序的输出结果是 9 。

#include

void main( )

{int a=3,b=6,c=9;

a=a>b?a:b;

a=a>c?a:c;

printf(“%d ”,a);

}

8.从键盘用数字输入月份,然后用英文单词输出显示月份。

#include

void main( )

{ int month;

char ch;

while(1)

{ printf(“\n please input month (1-12): ”);

scanf(“%d”,&month);

switch( month )

{ case 1: printf(“January\n ”);break;

case 2: printf(“February\n ”);break;

case 3: printf(“March\n ”);break;

case 4: printf(“April\n ”);break;

case 5: printf(“May\n ”);break;

case 6: printf(“June\n ”);break;

case 7: printf(“July\n ”);break;

case 8: printf(“August\n ”);break;

case 9: printf(“September\n ”);break;

case 10: printf(“October\n ”);break;

case 11: printf(“November\n ”);break;

case 12: printf(“December\n ”);break;

default: printf(“input data error\n ”);

}

getchar( );

printf(“\ncontinue?(Y/N):");

ch=getchar( );

if(ch!='y'&&ch!='Y') break;

}

}

9.下面程序的输出结果是 !!! 。

#include



void main( )

{ int x=1, y=0;

switch(x)

{ case 1 :

switch(y)

{ case 0 : printf(“!!!\n”); break;

case 1 : printf(“@@@\n”); break;

}

break;

case 2 : printf(“###\n”); }

}

10.下面程序的输出结果是 27 。

#include

void main( )

{ int sum=0,i;

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

{ switch(i)

{case 0:

case 1: sum=sum+2;

case 2:

case 3: sum=sum+3;

default: sum=sum+4;}}

printf (“%d”,sum ); }

11.下面程序的输出结果是 3,3,3 。

#include

void main( )

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

if((j++||k++)&&i++)

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

12.若从键盘输入15,则下面程序输出的结果是 151515 。

#include

void main( )

{ int x;

scanf(“%d”,&x);

if(x>10)printf(“%d”,x);

if(x>8)printf(“%d”,x);

if(x>6)printf(“%d”,x);

}

13、下面程序的输出结果是 0 。

#include

void main( )

{

int i, t=1;

for (i=5;i>=0;i--)

t=t*i;

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

}

14、下面程序的输出结果是 D 。

#include

void main( )

{ char ch ;

while((ch=getchar( ))!= '\n')

{if(ch>='a'&& ch<='z') ch=ch-32 ;

printf ("%c",ch ); }

}

输入内容:d

15、下面的程序为大写字母转换为小写字母。

#include

void main( )

{ char ch ;

while ((ch=getchar( ))!= '\n')

{ if (ch>='A'&& ch<='Z') ch=ch+32 ;

printf ("%c\n ", ch ); }

}

16、输入某班级10名同学5门课程的成绩,分别统计每个学生5门课程的平均成绩。

#include

void main( )

{ int i,j;

float grade, sum,average;

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

{ sum=0;

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

{ scanf("%f",&grade);

sum=sum+grade ;

}

average=sum/5;

printf("No.%d average=%5.2f\n", i, average);

}

}

17、输入若干字符数据,分别统计其中A,B,C的个数。

#include

void main( )

{ char c;

int k1=0,k2=0,k3=0 ;

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

{ switch(c)

{case 'A': k1++;break;

case 'B': k2++;break;

case 'C': k3++;break;

}

}

printf("A=%d,B=%d,C=%d\n",k1,k2,k3);

}

18、下面程序是将从键盘输入的小写字母转变成大写字母。

#include

void main( )

{int c;

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

{if( c>=’a’&&c<=’z’ )

putchar(c-'a'+'A');

else

putchar(c); }

}

19、输出如下方阵。

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

#include

void main( )

{ int i,j,x;

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

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

{ x=(i-1)*4+j ;

printf("%4d", x); }

printf("\n");

}

}

/*第一行输出j加0的值,第二行输出的是j加4,第三行输出的是j加8,第四

行输出的是j加12,

0、4、8、12由(i-1)*4求得 */

三.改错题

1、下面程序的功能是判断某一年是否闰年。

#include

void main()

{int year, leap;

scanf(“%d”,&year);

if (year%4==0)

{if (year%100==0)

{if (year%400!=0)

leap=1;

else

leap=0;

}

else

leap=1;

}

else

leap=0;

if (leap)

printf(“%d is ”,year);

else

printf(“%d is not ”,year);

printf(“a leap year.\n”);

}

错误语句:if (year%400!=0)

正确语句:if (year%400= =0)

2.下面的功能是输出一个4位整数的后两位数值,例如输入1234,输出34。

#include

void main()

{ int x,y;

printf(“\ninput a integer<1000--9999>:”);

scanf(“%d”,x);

y=x%100;

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

}

错误语句:scanf(“%d”,x);

正确语句:scanf(“%d”,&x);

3.输入三个整数,输出其中最大的数。
#include
void main()
{int a,b,c,temp,max;
scanf(“%d,%d,%d”,&a,&b,&c);
temp=(a>b)?a:b ;

max=(temp
printf(“max=%d\n”, max); }

错误语句:max=(temp
正确语句:max=(temp>c)?temp:c ;

4.下面程序判断输入的一个整数是否能被5和7同时整除,若能整除,输出“YES”,否则,输出“NO”。

#include
void main()
{int x;

scanf(“%d”,&x);

if( x%5= =0||x%7= =0 )

printf(“YES”);

else

printf(“NO”); }

错误语句:if( x%5= =0||x%7= =0 )

正确语句:if( x%5= =0&&x%7= =0 )

5、求10到100之间能被3整除的数的个数。

#include

void main( )

{ int i,num;

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

if(i%3= =0) num++;

printf("\nThere are %d numbers! ",num);

}

错误语句:int i,num;

正确语句:int i,num=0;

6、用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于10-6为止。

#include
#include
void main()
{ int s;

float n,t,pi;
t=1;

pi=0;

n=1.0;

s=1;
while (fabs(t)>10-6)
{pi=pi+t;

n=n+2;

s=-s;

t=s/n;

}
pi=pi*4;
printf("pi=%10.6f\n",pi);

}

错误语句:while (fabs(t)>10-6)

正确语句:while (fabs(t)>1e-6)

7、求Fibonacci数列前40个数。 这个数列有如下特点:第1,2两个数为1,1。从

第3个数开始,该数是其前面两个数之和。
#include
void main()
{int f1,f2;
int i;
f1=1;f2=1;
for(i=1; i<=40; i++)
{ printf("%15ld %15ld",f1,f2);
if(i%2= =0) printf("\n");
f1=f1+f2;
f2=f2+f1;

}
}

错误语句:for(i=1; i<=40; i++)

正确语句:for(i=1; i<=20; i++)




四.编程题

1.从键盘输入一个圆的半径,输出圆的面积。输出

时要有文字说明,取小数点后2位。

#include

void main()

{ float r,s;

scanf(“%f”,&r);

s=3.14*r*r;

printf(“s=%.2f”,s);}




2.输入一个整数,判断是奇数还是偶数。

#include

void main()

{int i;

scanf (“%d”,&i);

if (i%2= =0)

printf(“%d 是一个偶数”,i);

else

printf(“%d 是一个奇数 ”,i);

}




3.从键盘输入一个三角形的边长,输出三角形面积,取2位小数。当三角形不成立时输出“它不是一个三角形”。

#include

#include

void main()

{ float a,b,c,s,area;

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

if (a+b>c && b+c>a && c+a>b)

{s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“area=%.2f\n”,area);}

else

printf(“它不是一个三角形”);

}




4.从键盘输入一个字符,判断其是否是大写字母,如果是大写字母,则转换为小写字母,否则不转换。

#include

void main()

{ char c;

c=getchar( );

if ( c>=’A’&&c<=’Z’)

c=c+32;

printf(“%c”,c);

}




5.从键盘输入一个百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。其中‘A’对应的是90分(含90分)以上的成绩,‘B’对应的是80~89分的成绩,‘C’对应的是70~79的成绩分,‘D’对应的是60~69分的成绩,‘E’对应的是小于60分的成绩。如果输入的数值小于0或大于100要有“输入成绩错误”的信息显示。

#include

void main()

{ int score,c;

scanf (“%d”,&score);

c=score/10;

switch (c)

{

case 0:

case 1:

case 2:

case 3:

case 4:

case 5: printf(“E”);break;

case 6: printf(“D”); break;

case 7: printf(“C”); break;

case 8: printf(“B”); break;

case 9:

case 10: printf(“A”); break;

default: printf(“error”);

}

}

6、编写程序,求1+2+3+…+200。

#include

void main( )

{

int i, s;

i=1;

s=1;

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

s=s+i;

printf("1+2+3+…+200=%d\n",s);

}

运行结果:20101

7、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和。

#include

void main()
{int i,temp;
float f2=2,f1=1,sum=0;
for(i=1;i<=20;i++)
{sum=sum+f2/f1;
temp=f2;

f2=f2+f1;

f1=temp;
}
printf("sum=%9.6f\n",sum);
}

运行结果:32.660259

8、求1!+2!+3!+4!+…+20!

#include

void main()
{int i;

float sum=0,f=1;
for(i=1;i<=20;i++)
{f= f*i;
sum= sum+f;
}
printf("sum=%e\n",sum);
}

运行结果:2.561327e+018

9、用牛顿迭代法求方程4x3-8x2+6x-12=0在1.5附近的根。

#include
#include

void main()
{float x=1.5,x0,y,f1;

do
{x0=x;
y=((4*x0-8)*x0+6)*x0-12;
f1=(12*x0-16)*x0+6; (f1是导数)

x=x0-y/f1;
}
whi

le(fabs(x-x0)>=1e-6);
printf("x=%10.2f\n",x); }

运行结果:x= 2.00

10、编写程序,打印出以下图案。

*

***

*****

*******

*****

***

*

#include

void main( )
{int i,j,k;
for(i=1;i<=4;i++) /* 输出上面四行*号 */

{for(j=1;j<=4-i;j++) /* 输出*号前面的空格 */
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*"); /* 输出每行*号 */
printf("\n"); /*输出每行*号后换行 */
}
for(i=1;i<=3;i++) /* 输出下面三行*号 */
{for(j=1;j<=i;j++)
printf(" "); /* 输出*号前面的空格 */
for(k=1;k<=5-2*(i-1);k++)
printf("*"); /* 输出每行*号 */
printf("\n"); /* 输出每行*号后换行 */
}
}

第四章 数 组
一.选择题

1.以下能正确定义一维数组的选项是(B )。

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

C)char a={'A','B','C'}; D)int a[5]="0123";

2.已有定义 int x[3][2];以下能正确引用数组元素的选项是( C )。

A) x[2][2] B) x[1][2] C) x[2][1] D) x[0][2]

3.有以下语句:int x;char c[10];,则正确的输入语句是( D )。

A) scanf("%d%s",x,&c); B) scanf("%d%s",&x,&c);

C) scanf("%d%s",x,c); D) scanf("%d%s",&x,c);

4.以下叙述中错误的是( C )。

A) 对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B) 数组名代表的是数组所占存储区的首地址,其值不可改变

C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出"下标越界"的出错信息 (VC:可以运行但会显示:遇到问题需要关闭)

D)可以通过赋初值的方式确定数组元素的个数

5.已有定义:char a[ ]="xyz",b[]={'x','y','z'};,以下叙述中正确的是( C )。

A)数组a和b的长度相同 B)a数组长度小于b数组长度

C)a数组长度大于b数组长度 D)上述说法都不对

6.以下能正确定义一维数组的选项是( B )。

A)int num[]; B) #define N 100 int num[N];

C)int num[0..100]; D) int N=100; int num[N];

7.有以下程序

#include

void main()

{char a[ ]={'a','b','c','d','e','f','g','h','\0'};

int i,j;

i=sizeof(a); j=strlen(a);

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

}

程序运行后的输出结果是( D )。

A) 9,9 B) 8,9 C) 1,8 D) 9,8

8.下面程序的运行结果是( B )。

#include

void main()

{ char ch[7]={ "65ab"};

int i,s =0;

for(i=0;ch[i]>= '0'&&ch[i]< '9';i++)

s=10*s+ch[i]- '0';

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

}

A) 12ba56 B) 65 C) 6 D) 62

9.有以下程序

#include

void main()

{

int aa[4][4]={{1,2,3,4},{5,6,7

,8},{3,9,10,2},{4,2,9,6}};

int i,s=0;

for(i=0;i<4;i++) s+=aa[i][1]; /*求每行第1列的数的和*/

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

}

程序运行后的输出结果是( B )。

A) 11 B) 19 C) 13 D) 20

10.以下不能正确定义二维数组的选项是( A )。.

A)int a[2][]={{1,2},{3,4}}; B)int a[][2]={1,2,3,4};

C)int a[2][2]={{1},{2}}; D)int a[2][2]={{1},2,3};

二.填空题

1.C语言规定数组名代表数组的 首地址 。

2.C语言中二维数组中元素排列的顺序是: 按行存放 。

3.字符数组中的一个元素存放 一个字符 。

4.C语言规定了“字符串结束标志”,以字 ‘\0’ 来表示。

5.用"%s"格式符输出字符串时,printf函数中的输出项是 字符数组名 ,而不是数组元素名。

6. 若有以下定义:

float a[10];

则a数组元素下标的上限是 9 ,下限是 0 。

7.下列程序运行结果是 6 。

#include

#include

void main()

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

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

}

8.以下程序的功能是:使一个字符串按逆序存放,请填空。

#include

#include

void main()

{ char m;char str[]="abcdefg"; int i,j;’\

 for(i=0,j=strlen(str);i< j-1 ; i++,j--)

 { m=str[i];

str[i]= str[ j-1] ; /* str[i]与str[j-1]交换数据*/

str[j-1]=m;

}

printf("%s\n",str);
}

9.写出下面程序的运行结果 62 。

#include

void main( )

{

int a[2][3]={40,25,-8,6,62,39};

int i,j,max;

max=a[0][0];

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

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

if(a[i][j]>max)

max=a[i][j];

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

}

10.下面程序的功能是,将字符数组S2中的全部字符拷贝到字符数组S1中。不用strcpy函数。请填空

#include

#include

void main( )

{

char s1[80],s2[80];

int i;

scanf("%s",s2);

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

s1[i]=s2[i] ;

printf("复制字符串为:%s\n",s1);

}

三.改错题

1.下面程序求矩阵a的主对角线元素之和,请改错。

#include

void main( )

{

int a[3][ ]={2,4,6,8,10,12,14,16,18};

int sum=0,i,j;

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

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

if(i==j) sum=sum+a[i][j] ;

printf("sum=%d\n",sum);

}

错误语句:int a[3][ ]={2,4,6,8,10,12,14,16,18};

正确语句:int a[ ][3 ]={2,4,6,8,10,12,14,16,18};

2.有3个字符串,要求找出其中最大者,请改错。

#include

#include

void main ( )

{

char string[20];

char str[3][20];

int i;

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

gets (str[i]);

if (strcmp(str[0],str[1])>0) strcpy(string,str[0]);

else strcpy(string,str[1]);

if (str[2]>string) string=str[2];

printf("\n

the largest string is:\n%s\n",string);

}

错误语句:if (str[2]>string) string=str[2];

正确语句:if(strcmp(str[2],string)>0) strcpy(string,str[2]);

3.以下程序输出一个字符串:China,请改错。

#include

void main()

{

char c[5]={'C','h ','i','n','a '};

int i;

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

printf("%c",c[i]);

printf("\n");

}

错误语句:for(i=0;i<=5;i++)

正确语句:for(i=0;i<5;i++)

4.下面程序为数组输入数据并输出结果;判断下面程序的正误,请改错。

#include

void main ( )

{ int a[3]={3*0} ;

int i;

for (i=0; i<4; i++) scanf(“%d”,&a[i]);

for (i=0; i<4; i++) printf(“%d”,a[i]);

}

错误语句:int a[3]={3*0} ;

正确语句:int a[4] ;

5.下面程序为数组输入数据并输出结果,判断下面程序的正误,请改错。

#include

void main ( )

{ int a[3]={1,2,3} , i;

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

for (i=0; i<3; i++) printf(“%d”,a[i]);

}

错误语句: scanf(“%d%d%d”,&a);

正确语句: scanf(“%d%d%d”,&a[0],&a[1],&a[2]);

或者for(i=0;i<3;i++) scanf(“%d”,&a[i]);

四.编程题

1.用数组来处理,求解Fibonacci数列前40项:1,1,2,3,5,8,13,21…。

#include

void main()

{

int i;

int t[40]={1,1};

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

t[i]=t[i-2]+t[i-1];

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

{

if(i%5==0) printf("\n");

printf("%15d",t[i]);

}

}




2.用选择法对20个整数排序。

#include

void main()

{int i,j,min,t,x[20];

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

scanf("%d",&x[i]);

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

{min=i;

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

if(x[min]>x[j])min=j;

t=x[i];

x[i]=x[min];

x[min]=t;

}

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

printf("%6d",x[i]);

}

3.有一个3×5的矩阵,要求编程序求出其中值最小的那个元素的值,以及其所在的行号和列号。

#include

void main()

{

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

int a[3][5];

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

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

scanf("%d", &a[i][j]);

min=a[0][0];

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

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

if (a[i][j]
{min=a[i][j];

s=i;

t=j;

}

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

}




4.编一程序,将两个字符串连接起来,不要用strcat函数。

#include

void main()

{char str1[80],str2[20];

int i=0,j=0;

scanf("%s",str1);

scanf("%s",str2);

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

printf("str2:%s\n",str2);

while(str1[i]!='\0')

i++; /* 循环后i为最后一个字符之后 */

while(str2[j]!='\0')

{str1[i]=str2[j];

i++;

j++;}

str1[i]='\0';

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

}




5.求一个5×5矩阵对角线元素之和(左上至右下之对角线)。

#include

void main( )

{float a[5][5],sum=0

;

int i,j;

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

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

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

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

sum=sum+a[i][i];

printf("sum=%f",sum);

}

6.编一程序,求数列的前10项:1,5,14,30…,即

f[1]=1;…;f[i]=f[i-1]+i*i。

#include

void main()

{

int i;

int f[10]={0};

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

f[i]=f[i-1]+i*i;

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

{

if(i%5==0) printf("\n");

printf("%15d",f[i]);

}

}

第五章 函 数
一、选择题
阅读下面程序段,则执行后输出的结果是( C )。
#include “stdio.h”

main( )

{ char fun (char,int);

char a=‘A’;

int b=13;

a=fun(a,b);

putchar(a);

}

char fun(char a,int b)

{ char k;

k=a+b;

return k; }

A)A B)M C)N D)L

阅读下面程序段,则执行后的结果是( C )。
#include “stdio.h”

main( )

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

k=fun(m,n);

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

fun(int m,int n)

{return(m*m*m-n*n*n);}

A)64 B)8 C)56 D)0

3.阅读下面程序段,则执行后的结果是( A )。

#include “stdio.h”

long fun (int n)

{ if(n>2)

return(fun(n-1)+fun(n-2));

else return(2);}

main()

{printf(“%ld﹨n”,fun(5));}

A)10 B)15 C)20 D)以上3个答案都不正确

4. 阅读下面程序段,则执行后的结果是( D )。

#include “stdio.h”

fun( )

{ static int x=5; /*只赋一次*/

x++;

return x; }

main( )

{ int i,x;

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

x=fun();

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

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

5. 阅读下面程序段,则执行后的结果是( D )。

#include “stdio.h”

int fun(int x)

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

main( )

{fun(12+5);}

A)12 B)13 C)17 D)18

6. 阅读下面程序段,则执行后的结果是( A )。

#include “stdio.h”

int aa(int x,int y);

main( )

{ int a=24,b=16,c;

c=aa(a,b);

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

}

int aa(int x,int y)

{ int w;

while(y)

{ w=x%y;

x=y;

y=w;}

return x;}

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

7. 阅读下面程序段,则执行后的结果是( C )。

#include “stdio.h”

fun (int a)

{ int x=5;

x+=a++;

print(“%d”,x); }

main( )

{ int a=3,x=1;

fun(a);

x+=a++;

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

}

A)82 B)83 C)84 D)85

8. 阅读下面程序段,则执行后的结果是( D )。

#include “stdio.h”

int x=1;

main( )

{ int md=4;

fun(md);

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

fun(int k)

{ k+=x;

x+=k;

{ char x=’B’;

printf(“%d,”,x-‘A’); }

printf(“%d,%d,”,k,x); }

A)1,6,5,4,6 B)1,5,4,6,4 C)1,4,6,5,4 D)1,5,6,4,6

9. 阅读下面程序段,则执行后的结果是( C )。

#include “stdio.h”

main( )

{ fun3(fun1(

),fun2( ));}

fun2( )

{ int a=15;

return a;}

fun1( )

{ int k=20;

return k;}

fun3(int a,int b)

{ int k;

k=(a-b)*(a+b);

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

A)0 B)184 C)175 D)编译不通过

10.阅读下面程序段,则执行后的结果是( D )。

#include “stdio.h”

main( )

{ int a=4,b=6,c=7;

double d,fun(int,int,int);

d=fun(a,b,c);

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

double fun(int a,int b,int c)

{ double s;

s=a%b*c;

return s;}

A)27 B)27.000000 C)28 D)28.000000

11.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D )。

函数调用可以作为独立的语句存在
函数调用可以作为一个函数的实参
函数调用可以出现在表达式中
函数调用可以作为一个函数的形参

12.以下不正确的说法是( D )。

a)在不同的函数中可以使用相同名字的变量

b)函数中的形参是局部变量

c)在一个函数内定义的变量只在本函数范围内有效

d)在一个函数内的复合语句中定义的变量只在本函数范围内有效




13.以下正确的说法是( C )。

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

return后面的值不能为表达式
如果函数值的类型与返回值类型不一致,以函数值类型为准
如果形参与实参的类型不一致,以实参类型为准

14.以下正确的说法是( D )。

函数可以嵌套定义但不能嵌套调用
函数既可以嵌套调用也可以嵌套定义
函数既可以不嵌套调用也不可以嵌套定义
函数可以嵌套调用但不可以嵌套定义

15.C语言规定,函数返回值的类型是由( D )。

a)return语句中的表达式类型所决定的

b)调用该函数时的主调函数类型所决定

c)调用该函数时系统临时决定

d)在定义该函数时所指定的函数类型所决定




16.以下不正确的说法是( C,D )。

a)c程序中,函数可以直接或间接的调用自己

b)函数调用时,函数名必须与所调用的函数名一致

c)函数说明语句中的类型必须与函数返回值的类型一致

d)实参个数可以与形参个数不一致




17.以下不正确的说法是( C )。

a)C语言规定,不能在一个函数的内部再定义函数

b)在没有声明函数返回值类型的情况下,默认的函数返回值类型为int型

c)函数的类型可以是整型,实型,字符型,但不能是指针型

d)函数可以没有形参,但函数名后的一对括号不能省略




18.在函数调用过程中,如果如果funA调用了函数funB,函数funB又调用了函数funA,则( B )。

a)称为函数的直接递归调用

b)称为函数的间接递归调用

c)称为函数的循环调用

d)C语言中不

允许这样的递归调用

19.言中规定,若对函数类型未加显式说明, 函数的隐含类型为( C )。

(A)void (B)double (C)int (D)char

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

a)在c程序中,main函数位于程序的最前面

b)c程序的每一行只能写一个语句

c)c语言本身没有输入输出语句

d)在对c程序进行编译的过程中,可以发现注释中的错误




二.填空题

1.一个源程序文件由 一个或多个 函数以及其他有关内容(如命令行、数据定义等)组成。一个 源程序 是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以 函数 为单位进行编译的。




2.所有函数都是平行的,即在定义函数时是分别进行的,是互相 独立 的。一个函数并不从属于另一函数,即函数不能 嵌套 定义。函数间可以互相调用,但不能调用 main() 函数。main()函数是系统调用的。

3.从用户使用的角度看,函数有两种: 标准函数 、 用户定义的函数 用以解决用户的专门需要。

4.从函数的形式看,函数分两类: 无参函数 、 有参函数 。

5.在C语言中,实参向形参的数据传递是 值传递 ,单向传递,只由 实参 传给 形参 ,而不能由 形参 传回来给 实参 。在内存中,实参单元与形参单元

是 不同 单元。

6.如果实参表列包含多个实参,则各参数间用逗号隔开。实参与 形参 的个数应相等, 类型 应匹配。实参与形参按顺序对应,一一传递数据。

7.声明的作用是把 函数名 、函数参数的 类型 和参数 个数 等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。

8.在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的 递归



9.在一个函数内部定义的变量是 内部变量 ,它只在 本函数 范围内有效,也就是说只有在 本函数 内才能使用它们,在此函数以外是不能使用这些变量的。这称为 局部变量 。

10.形式参数也是 局部 变量。

11.求两个数中较大的一个数。

#include

void main()

{

int max(int x, int y);

int a,b,c;

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

c=max(a,b);

printf(“max is %d”,c);

}




int max (int x, int y)

{

int z;

z=x>y? x:y;

return(z) ;

}

12.求两个数中较小的一个数。

#include

void main()

{

int min(int x, int y);

int a,b,c;

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

c= min(a,b) ;

printf(“min is %d”,c);

}




int min (int x, int y)

{

int z;

z=x
return(z);

}




13.求两个数的最大公约数。



#include “stdio.h”

int aa(int x,int y);

main( )

{ int a=24,b=16,c;

c=aa(a,b);

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

}




int aa(int x,int y)

{ int w;

while(y)

{ w=x%y;

x=y;

y=w;}

return( x);

}




14. 求两个数的最大公约数。

#include “stdio.h”

int aa(int x,int y);

main( )

{ int a=24,b=16,c;

c=aa(a,b);

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

}




int aa(int x,int y)

{ int w;

while(y)

{ w=x%y;

x=y ;

y=w;}

return( x);

}




三.改错题

1.下面程序输出1到10的阶乘。改正下面程序中的错误。

#include “stdio.h”

void main( )

{

float fac(int n);

int i;

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

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

int fac(int n)

{

int f=1;

f=f*n;

return(f); }

错误语句:float fac(int n); int f=1; f=f*n;

正确语句: int fac(int n); int i, f=1; for(i=1;i<=n;i++)f=f*i;




2.#include “stdio.h”

int func(int a,int b)

{

return(a+b);

}

main()

{int x=2,y=5,z=8,r;

r=func(func(x,),z);

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

}

错误语句:r=func(func(x,),z);

正确语句:r=func(func(x,y),z);

3. #include “stdio.h”

void (int k)

{

if(k>0)fun(k-1);

else return(2)

printf(“%d”,k);

}

main()

{

int w=5;

fun(w);

printf(“\n”);

}

错误语句:void (int k) else return(2)

正确语句:void fun (int k) else return(2);

4.#include “stdio.h”

void fun( i, j)

{

int x=7;

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

}

main()

{

int i=2,x=5,j=7;

fun(j,6);

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

}

错误语句:void fun( i, j) 运行结果:i=7;j=6;x=7

正确语句:void fun(int i, int j) i=2;j=7;x=5

5.#include “stdio.h”

int a,b;

void fun()

{ int a,b;

a=100;b=200;}

main()

{

int a=5,b=7;

fun(a,b);

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

}

错误语句:inta,b; fun(a,b); 运行结果:57

正确语句:int a,b; fun( );

6.#include “stdio.h”

main( )

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

k=fun(m,n,k);

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

}

fun(int m,int n)

{return(m*m*m-n*n*n);}

错误语句:k=fun(m,n,k); 运行结果:56

正确语句:k=fun(m,n);




7.#include “stdio.h”

main( )

{

char a=A;

int b=13;

a=fun(a,b);

putchar(a);

}

char fun(char a,int b)

{ char k;

k=a+b;

return( k);

}

错误语句:char a=A; 运行结果:N

正确语句:char a=’A’;




8.#include “stdio.h”

fun( )

{ static int x=5;

x++;

(x);

}

main( )

{ int i,x;

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

x=fun();

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

}

错误语句: (x); 运行结果:8

正确

语句:return(x);

9.#include “stdio.h”

fun (int a)

{ int x=5;

x+=a++;

printf(“%d”,x);

}

main( )

{ int a=3,x=1;

f(a);

x+=a++;

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

}

错误语句: f(a); 运行结果:84

正确语句: fun(a);




四.编程题

1.写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。

#include

void main()

{

int prime(int);

int n;

printf(“请输入一个整数:”);

scanf(“%d”,&n);

if(prime(n)) printf(“\n %d是一个素数。\n”,n);

else printf(“\n %d不是一个素数。\n”,n);

}

int prime(int n)

{int flag=1,i;

for(i=2;i
if(n%i==0) flag=0;

return(flag);

}

2.编一个函数求n!。主函数求6!+7!+8!

#include

int fac(int n)

{int c,i;

c=1;

if(n>=0)

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

c=c*i;

}

return( c);}

void main()

{int s;

s=fac (6) + fac (7) + fac (8);

printf ( “ %d”, s );}

运行结果:46080

3.编一个函数求n个数中最大值. 主函数求10个数中最大值.

#include

int maxm(int a[ ],int n)

{

int m,i;

m=a[0];

for (i=1;i
if(m
return(m);

}

void main()

{

int a[10],i,big;

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

scanf(“%d”,&a[i]);

big=maxm(a,10);

printf(“%d”,big);}




4.用递归法将一个整数n转换成字符串,例如输入483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数。

#include

void main()

{ void convert(int n);

int number;

printf(“请输入一个整数:”);

scanf(“%d”,&number);

printf(“输出:“);

if(number<0){putchar(‘-‘);number=-number;} /*负数时先输出一个‘-’号*/

convert(number);

putchar(‘\n’);

}

void convert(int n)

{ int i;

if((i=n/10)!=0) convert(i);

putchar(n%10+’0’); } /* 一个数+‘0’的ASCII码值为该数的ASCII码值*/

/*先输出个位,再通过递归输出十位,以此类推*/

5.编写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个整数由键盘输入。

#include

void main()

{ int hcf(int,int);

int lcd(int,int,int);

int u,v;

scanf(“%d,%d”,&u,&v);

printf(“最大公约数=%d\n”,hcf(u,v));

printf(“最小公倍数=%d\n”,lcd(u,v,hcf(u,v)));

}

int hcf(int u,int v)

{ int t,r;

if(v>u) {t=u;u=v;v=t;} /* 让u>v */

while((r=u%v)!=0) {v=r;} return(v); }

/*大数除小数的余数如果不为0,则将余数赋给v,否则如果大数整除小数时,v中是两个数中小的数。V中的数则为最大公约数。*/

int lcd(int u,int v,int h)

{ return(u*v/h);}




6.定义一个函数,根据给定的三角形三条边长,函数返回三角形

相关主题
文本预览
相关文档 最新文档