第一部分 习题篇
第一章 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
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.定义一个函数,根据给定的三角形三条边长,函数返回三角形