《C语言程序设计习题与上机指南》答案

更新时间:2024-01-20 19:15:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一部分习题篇 第一章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程序,输出以下信息:

************ Iamastudent. ************

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

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

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

printf(“Pleaseinputa,b:\\n”); scanf(“%d,%d”,&a,&b); /*注意输入两个数之间用逗号分隔*/ if(a>b)printf(“%d”,a); elseprintf(“%d”,b); }

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

inta,b,c,max;

printf(“Pleaseinputa,b,c:\\n”); scanf(“%d,%d,%d”,&a,&b,&c);

max=a;

if(a

第二章数据与运算

一.单选题

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.设有intx=8,表达式x++*1/3的值是(A)。 A)2B)3C)8D)9

5.若m,x,y,z都是整型变量,则计算表达式m=(x=5,y=10,z=25)执行后,m的值为(C)。 A)5B)10C)25D)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的值是字符DB)i的值是字符A的ASCII值加上2.5 C)i的值是字符A的ASCII值加上2D)非法表达式 8.下列是用户自定义标识符的是(B)。 A)intB)_xyC)2xyD)3-xy

9.下面与x=y++完全等价的表达式是(A)。 A)x=y,y=y+1B)x=x+1,y=xC)x=++yD)x+=y+1 10.已知各变量的类型说明如下: intk,a,b; longw=8; floatx=2.56;

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

A)x%5B)w-=5C)k=(a=8,b=6,a-b)D)a+=a-=(b=2)*(a=5) 11.运行以下程序段时编译出错,其原因是(D)。 charc1='a',c2='123';

printf(\A)字符串要用\表示 B)'123'只能赋值给字符数组

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

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

12.若定义floata;,现要从键盘输入a数据,其整数位为3位,小数位为2位,则选用(A)。 A)scanf(\ B)scanf(\.2f\C)scanf(\.2f\D)scanf(\

13.若定义doublet;,则表达式t=1,t+5,++t的值为(B)。 A)1.0 B)2.0 C)6.0D)7.0

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

unsignedlongw=5; doublex=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)。 inta=0,b=0,c=0; if(a&&++b)c++;

printf(\A)1,1 B)1,0 C)0,0 D)0,1 二.填空题

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

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

main() {

inta=2,b=3,c=4; a*=16+(b++)-(++c); printf(“%d”,a); }

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

main() {

intx=17,y=26;

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

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

intc1=1,c2=2,c3; c3=1.0/c2*c1;

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

chara; intb; floatc; doubled;

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

main() {

intx=010,y=10; printf(“%d,%d\\n”,x,y); }

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

main() {

intx=3,y=5;

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

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

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

main() {

intx=065; printf(“%d\\n”,--x); / }

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

main() {

inta,b,c; a=25; b=025; c=0x25 printf(“%d,%d,%d\\n”,a,b,c); }

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

main() {

intx=0110; printf(“%x\\n”,x); }

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

main() { charc; intn=100; floatf=10; doublex;

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

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

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

main() {

charc1=?a?,c2=?b?,c3=?c?,c4=?\\101?,c5=?\\116?; printf(“a%c∪b%c\\tc%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() {inti,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

voidmain() {inti=5,j=9; floatx=2.3,y=4.5;

printf(\}

三.判断题

1.C语言中,字符常量可以用单引号或双引号括起来。(错) 2.C语言中,字符常量只能包含一个常量(字符)。(对) 3.在C语言中,字符串常量隐含处理成以‘\\0’结尾。(对) 4.下面程序段的输出结果是9。(错) inta=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+=aa=a+a=12+12=24 2)a-=2a=a-2=12-2=10

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

4)a/=a+aa=a/(a+a)=12/24=0注意a是整型 5)a%=(n%=2)已知:n=5a=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 voidmain()

{charc1=’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(“passwordis%c%c%c%c%c\\n”,c1,c2,c3,c4,c5); }

运行结果:passwordisGlmre 也可以用循环和数组: #include voidmain() {

charc[]={“China”}; printf(“passwordis“); for(inti=0;i<=4,i++)

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

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

charc1=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 voidmain()

{doublea,b,c,total,average,square,squareroot; printf(\请输入三个单精度实数:\scanf(\total=a+b+c;

average=total/3.0; square=a*a+b*b+c*c;

squareroot=sqrt(square);

printf(\三个数的和=%-15.3f,三个数的平均值=%-15.3f\\n\printf(\三个数的平方和x=%.3f,x的平方根=%.3f\\n\}

运行结果:

请输入三个单精度实数:1.234.567.89

三个数的和=13.680,三个数的平均值=4.560 三个数的平方和x=84.559,x的平方根=9.196

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

#include

#include voidmain()

{floata,b,c,k,area;

printf(\请输入三角形三条边的边长:\scanf(\

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\

}

}

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

#include voidmain()

{longa1,a2,a3,a4;

printf(\请输入两个整数:\scanf(\a3=a1/a2; a4=a1¢;

printf(\两数进行整数除的商是%ld,余数是%ld\\n\}

运行结果:

请输入两个整数:654321789

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

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

#include voidmain()

{inta,b,c; floatf;

printf(\请输入两个整数:\

scanf(\f=1.0*a/b;

c=(int)(f*100);

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

运行结果:

请输入两个整数:158

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

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

#include voidmain()

{unsignedu,high4,low4;

printf(\请输入一个无符号整数:\scanf(\

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

high4=(u&0xf000)>>12;/*u的高四位保留原值,其余位置0,并右移12位*/ printf(\的十六进制是%x\\n\

printf(\十六进制表示%u的低四位是%x,高四位是%x\\n\}

运行结果:

请输入一个无符号整数:54332 54332的十六进制是d43c

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

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

#include

voidmain() {charc1,c2,t;

printf(\请输入两个半角的小写英文字母:\c1=getchar(); c2=getchar(); c1-=32;

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

printf(\}

运行结果:

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

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

#include

voidmain()

{intk;

inthour,minute,second; printf(\请输入秒数:\scanf(\hour=k/3600; k%=3600; minute=k/60; second=k`;

printf(\小时%d分钟%d秒。\\n\}

运行结果:

请输入秒数:7278 2小时1分钟18秒。

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

#include voidmain()

{floata,b,c,d,real,imag;

printf(\请输入第一个数的实部和虚部:\scanf(\

printf(\请输入第二个数的实部和虚部:\scanf(\real=a*c-b*d; imag=a*d+b*c;

printf(\两个复数积的实部和虚部分别是%f,%f\\n\}

运行结果:

请输入第一个数的实部和虚部:1.12.2 请输入第二个数的实部和虚部:3.34.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.030.0<回车>D)1020<回车>30<回车> 2.若有说明语句:charc=?65?;则变量c(D)。 A)包含1个字符 B)包含2个字符 C)包含3个字符 D)说明不合法,c的值不确定

3.若w=1,x=2,y=3,z=4,则条件表达式w

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

A)inputx,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 voidmain() {

chara1=?A?,a2=?a?; printf(“%c\\n”,(a1,a2)); }

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

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

C)格式说明符不足,编译出错D)程序运行时产生出错信息 6.以下程序的输出结果是(A)。

#include voidmain() {

inta=2,b=3,c=0,d; d=!a&&!b||!c; printf(“%d\\n”,d);} A)1B)0C)非0的数D)-1

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

#include voidmain() {

inta=6,b=5;

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

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

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

#include voidmain()

{inta=55,b=50,c=60,d; d=a>20?b:c; switch(d)

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

case50:printf(“%d,”,b); case60:printf(“%d,”,c); default:printf(“$\\n”);}}

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

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

#include voidmain() {intx;

scanf(“%d”,&x);

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

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

A)666 B)666666C)666666666 D)以上都不对 10.有如下程序。

#include voidmain() {

inta=5,b=6,c=1; switch(c) {

case0:b++; case1:a++; case2:a++;b++; }

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

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

A)a=5,b=6B)a=6,b=7C)a=7,b=7D)a=7,b=8 11、下面的程序中:

inti=9;

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

则下列描述正确的是(C) A)while循环执行9次 B)循环体语句执行一次 C)循环体语句一次也不执行 D)循环是无限循环

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

12、下面的程序中:

inti=-1; do

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

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

A)循环体一次也不执行B)循环体执行一次 C)循环体执行两次D)是无限循环 13、下面的程序中:

inti=0; while(i=1) {…}

则下列描述正确的是(C) A)循环控制表达式不合法 B)循环控制表达式为0 C)循环控制表达式为1 D)以上都不对 14、下面的程序中:

intx=0,total=0;

while(!x!=0)total+=++x; printf(“%d”,total);

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

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

C)运行程序段后输出0D)运行程序段后输出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 voidmain() {

intx=10; do x--;

while(--x);

printf(\}

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

二.填空题

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

#include voidmain() {inta=9,b=2;

floatx=6.6,y=1.1,z; z=a/2+b*x/y+1/2; printf(“%5.2f\\n”,z); }

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

#include voidmain() {charc=?A?;

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

3.有以下程序。

#include

voidmain() {chara,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() {chara,b;

a=getchar();scanf(“%d”,&b); a=a-?A?+?0?;b=b*2; printf(“%c%c\\n”,a,b); }

5.下面程序的输出结果是22。 #include voidmain() {

intx=13,y=22;

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

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

#include voidmain() {intx;

scanf(“%d”,&x); if(x<0) x=-x; printf(“%d\\n”,x); }

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

#include voidmain()

{inta=3,b=6,c=9; a=a>b?a:b; a=a>c?a:c; printf(“%d”,a); }

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

#include voidmain() {intmonth; charch; while(1)

{printf(“\\npleaseinputmonth(1-12):”); scanf(“%d”,&month);

switch(month) {case1:printf(“January\\n”);break; case2:printf(“February\\n”);break; case3:printf(“March\\n”);break; case4:printf(“April\\n”);break; case5:printf(“May\\n”);break; case6:printf(“June\\n”);break; case7:printf(“July\\n”);break; case8:printf(“August\\n”);break; case9:printf(“September\\n”);break; case10:printf(“October\\n”);break; case11:printf(“November\\n”);break; case12:printf(“December\\n”);break; default:printf(“inputdataerror\\n”); }

getchar();

printf(“\\ncontinue?(Y/N):\ ch=getchar();

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

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

#include voidmain() {intx=1,y=0; switch(x) {case1:

switch(y)

{case0:printf(“!!!\\n”);break; case1:printf(“@@@\\n”);break; }

break;

case2:printf(“###\\n”);} }

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

#include voidmain()

{intsum=0,i; for(i=1;i<=4;i++) {switch(i) {case0:

case1:sum=sum+2; case2:

case3:sum=sum+3; default:sum=sum+4;}} printf(“%d”,sum); }

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

#include voidmain()

{inti=2,j=2,k=3; if((j++||k++)&&i++)

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

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

#include voidmain() {intx;

scanf(“%d”,&x);

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

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

#include voidmain() {

inti,t=1;

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

printf(\}

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

#include voidmain() {charch;

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

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

输入内容:d

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

#include voidmain() {charch;

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

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

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

#include voidmain() {inti,j;

floatgrade,sum,average;

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

for(j=1;j<=5;j++) {scanf(\sum=sum+grade; }

average=sum/5;

printf(\}

}

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

#include voidmain() {charc;

intk1=0,k2=0,k3=0; while((c=getchar())!='\\n') {switch(c)

{case'A':k1++;break; case'B':k2++;break; case'C':k3++;break; } }

printf(\}

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

#include voidmain() {intc;

while((c=getchar())!='\\n') {if(c>=?a?&&c<=?z?) putchar(c-'a'+'A'); else

putchar(c);} }

19、输出如下方阵。

1234 5678 9101112 13141516

#include voidmain() {inti,j,x;

for(i=1;i<=4;i++) {for(j=1;j<=4;j++) {x=(i-1)*4+j; printf(\

printf(\}

}

/*第一行输出j加0的值,第二行输出的是j加4,第三行输出的是j加8,第四行输出的是j加12, 0、4、8、12由(i-1)*4求得*/ 三.改错题

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

#include voidmain() {intyear,leap;

scanf(“%d”,&year); if(year%4==0)

{if(year0==0) {if(year@0!=0) leap=1; else leap=0; }

else leap=1; } else

leap=0; if(leap)

printf(“%dis”,year); else

printf(“%disnot”,year); printf(“aleapyear.\\n”); }

错误语句:if(year@0!=0) 正确语句:if(year@0==0)

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

#include voidmain() {intx,y;

printf(“\\ninputainteger<1000--9999>:”); scanf(“%d”,x); y=x0;

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

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

3.输入三个整数,输出其中最大的数。 #include voidmain()

{inta,b,c,temp,max;

scanf(“%d,%d,%d”,&a,&b,&c); temp=(a>b)?a:b;

max=(tempc)?temp:c;

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

#include voidmain() {intx;

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 voidmain() {inti,num;

for(i=10;i<100;i++) if(i%3==0)num++;

printf(\}

错误语句:inti,num; 正确语句:inti,num=0;

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

floatn,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(\\n\,pi);

}

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

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

第3个数开始,该数是其前面两个数之和。 #include voidmain() {intf1,f2; inti;

f1=1;f2=1;

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

{printf(\,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 voidmain() {floatr,s; scanf(“%f”,&r); s=3.14*r*r;

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

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

voidmain() {inti;

scanf(“%d”,&i); if(i%2==0)

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

printf(“%d是一个奇数”,i); } 3.从键盘输入一个三角形的边长,输出三角形面积,取2位小数。当三角形不成立时输出“它不是一个三角形”。 #include

#include

voidmain()

{floata,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

voidmain() {charc; 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 voidmain() {intscore,c;

scanf(“%d”,&score); c=score/10; switch(c) {

case0: case1: case2: case3: case4:

case5:printf(“E”);break; case6:printf(“D”);break; case7:printf(“C”);break; case8:printf(“B”);break; case9:

case10:printf(“A”);break;

default:printf(“error”); } }

6、编写程序,求1+2+3+?+200。 #include voidmain() {

inti,s; i=1; s=1;

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

printf(\+?+200=%d\\n\}

运行结果:20101

7、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和。 #include voidmain() {inti,temp;

floatf2=2,f1=1,sum=0; for(i=1;i<=20;i++) {sum=sum+f2/f1; temp=f2; f2=f2+f1; f1=temp; }

printf(\}

运行结果:32.660259 8、求1!+2!+3!+4!+…+20! #include voidmain() {inti;

floatsum=0,f=1; for(i=1;i<=20;i++) {f=f*i;

sum=sum+f; }

printf(\}

运行结果:2.561327e+018

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

{floatx=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; }

while(fabs(x-x0)>=1e-6); printf(\运行结果:x=2.00

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

* *** ***** ******* ***** *** * #include voidmain() {inti,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(\输出每行*号后换行*/ }

for(i=1;i<=3;i++)/*输出下面三行*号*/ {for(j=1;j<=i;j++)

printf(\输出*号前面的空格*/ for(k=1;k<=5-2*(i-1);k++) printf(\输出每行*号*/

printf(\输出每行*号后换行*/ } }

第四章数组

一.选择题

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

A)inta[5]={0,1,2,3,4,5}; B)chara[]={0,1,2,3,4,5}; C)chara={'A','B','C'}; D)inta[5]=\

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

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

3.有以下语句:intx;charc[10];,则正确的输入语句是(D)。 A)scanf(\B)scanf(\

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

A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B)数组名代表的是数组所占存储区的首地址,其值不可改变

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

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

5.已有定义:chara[]=\,以下叙述中正确的是(C)。

A)数组a和b的长度相同B)a数组长度小于b数组长度 C)a数组长度大于b数组长度D)上述说法都不对 6.以下能正确定义一维数组的选项是(B)。

A)intnum[]; B)#defineN100intnum[N]; C)intnum[0..100]; D)intN=100;intnum[N]; 7.有以下程序

#include voidmain()

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

i=sizeof(a);j=strlen(a); printf(\}

程序运行后的输出结果是(D)。 A)9,9B)8,9C)1,8D)9,8

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

#include voidmain()

{charch[7]={\inti,s=0;

for(i=0;ch[i]>='0'&&ch[i]<'9';i++) s=10*s+ch[i]-'0'; printf(\}

A)12ba56 B)65C)6 D)62 9.有以下程序

#include voidmain() {

intaa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}}; inti,s=0;

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

程序运行后的输出结果是(B)。 A)11 B)19 C)13 D)20

10.以下不能正确定义二维数组的选项是(A)。. A)inta[2][]={{1,2},{3,4}}; B)inta[][2]={1,2,3,4};

C)inta[2][2]={{1},{2}}; D)inta[2][2]={{1},2,3}; 二.填空题

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

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

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

5.用\格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。 6.若有以下定义:

floata[10];

则a数组元素下标的上限是9,下限是0。 7.下列程序运行结果是6。

#include #include voidmain()

{charstr[12]={'s','t','r','i','n','g'}; printf(\}

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

#include #include voidmain()

{charm;charstr[]=\?\\ for(i=0,j=strlen(str);i

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

printf(\}

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

#include voidmain() {

inta[2][3]={40,25,-8,6,62,39}; inti,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(\} 10.下面程序的功能是,将字符数组S2中的全部字符拷贝到字符数组S1中。不用strcpy函数。请填空

#include #include

main()

{inta=24,b=16,c; c=aa(a,b);

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

intaa(intx,inty) {intw; while(y) {w=x%y; x=y; y=w;} returnx;}

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

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

#include“stdio.h” fun(inta) {intx=5; x+=a++;

print(“%d”,x);} main()

{inta=3,x=1; fun(a); x+=a++;

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

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

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

#include“stdio.h” intx=1; main() {intmd=4; fun(md);

printf(“%d,%d\\n”,md,x);} fun(intk) {k+=x; x+=k;

{charx=?B?;

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

A)1,6,5,4,6B)1,5,4,6,4C)1,4,6,5,4D)1,5,6,4,6 9.阅读下面程序段,则执行后的结果是(C)。

#include“stdio.h” main()

{fun3(fun1(),fun2());} fun2() {inta=15;

returna;} fun1() {intk=20; returnk;}

fun3(inta,intb) {intk;

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

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

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

#include“stdio.h” main()

{inta=4,b=6,c=7;

doubled,fun(int,int,int); d=fun(a,b,c);

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

doublefun(inta,intb,intc) {doubles; s=a%b*c; returns;}

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

11.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是(D)。 a) 函数调用可以作为独立的语句存在 b)函数调用可以作为一个函数的实参 c) 函数调用可以出现在表达式中

d)函数调用可以作为一个函数的形参

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

a)在不同的函数中可以使用相同名字的变量 b)函数中的形参是局部变量

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

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

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

a)定义函数时,形参的类型说明可以放在函数体内 b) return后面的值不能为表达式

c) 如果函数值的类型与返回值类型不一致,以函数值类型为准 d) 如果形参与实参的类型不一致,以实参类型为准

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

a) 函数可以嵌套定义但不能嵌套调用 b)函数既可以嵌套调用也可以嵌套定义 c) 函数既可以不嵌套调用也不可以嵌套定义 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 voidmain() {

intmax(intx,inty); inta,b,c;

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

printf(“maxis%d”,c); }

intmax(intx,inty) { intz;

z=x>y?x:y; return(z); }

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

#include voidmain() {

intmin(intx,inty); inta,b,c;

scanf(“%d,%d”,&a,&b); c=min(a,b); printf(“minis%d”,c); }

intmin(intx,inty) { intz;

z=x

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

#include“stdio.h” intaa(intx,inty); main()

{inta=24,b=16,c;

c=aa(a,b);

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

intaa(intx,inty) {intw; while(y) {w=x%y; x=y; y=w;} return(x); }

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

#include“stdio.h” intaa(intx,inty); main()

{inta=24,b=16,c; c=aa(a,b);

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

intaa(intx,inty) {intw; while(y) {w=x%y; x=y; y=w;} return(x); }

三.改错题

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

#include“stdio.h” voidmain() {

floatfac(intn); inti;

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

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

intf=1; f=f*n; return(f);}

错误语句:floatfac(intn);intf=1;f=f*n;

正确语句:intfac(intn);inti,f=1;for(i=1;i<=n;i++)f=f*i;

2.#include“stdio.h” intfunc(inta,intb) {

return(a+b); }

main()

{intx=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(intk) {

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

printf(“%d”,k); }

main() {

intw=5; fun(w); printf(“\\n”); }

错误语句:void(intk)elsereturn(2) 正确语句:voidfun(intk)elsereturn(2); 4.#include“stdio.h”

voidfun(i,j) {

intx=7;

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

main() {

inti=2,x=5,j=7; fun(j,6);

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

错误语句:voidfun(i,j)运行结果:i=7;j=6;x=7 正确语句:voidfun(inti,intj)i=2;j=7;x=5 5.#include“stdio.h”

inta,b; voidfun()

{inta,b;

a=100;b=200;} main() {

inta=5,b=7; fun(a,b);

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

错误语句:inta,b;fun(a,b);运行结果:57 正确语句:inta,b;fun(); 6.#include“stdio.h”

main()

{intm=4,n=2,k; k=fun(m,n,k); printf(“%d\\n”,k); }

fun(intm,intn)

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

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

7.#include“stdio.h”

main() {

chara=A; intb=13; a=fun(a,b); putchar(a); }

charfun(chara,intb) {chark; k=a+b; return(k); }

错误语句:chara=A;运行结果:N 正确语句:chara=?A?;

8.#include“stdio.h” fun()

{staticintx=5; x++; (x); }

main() {inti,x;

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

x=fun();

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

错误语句:(x);运行结果:8 正确语句:return(x); 9.#include“stdio.h”

fun(inta) {intx=5; x+=a++;

printf(“%d”,x); }

main()

{inta=3,x=1; f(a); x+=a++;

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

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

四.编程题

1.写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。 #include voidmain() {

intprime(int); intn;

printf(“请输入一个整数:”); scanf(“%d”,&n);

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

intprime(intn) {intflag=1,i;

for(i=2;i

2.编一个函数求n!。主函数求6!+7!+8! #include intfac(intn) {intc,i; c=1; if(n>=0)

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

}

return(c);} voidmain() {ints;

s=fac(6)+fac(7)+fac(8); printf(“%d”,s);} 运行结果:46080

3.编一个函数求n个数中最大值.主函数求10个数中最大值. #include intmaxm(inta[],intn) {

intm,i; m=a[0];

for(i=1;ivoidmain() {

inta[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 voidmain()

{voidconvert(intn); intnumber;

printf(“请输入一个整数:”); scanf(“%d”,&number); printf(“输出:“);

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

voidconvert(intn) { inti;

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

putchar(n+’0’);}/*一个数+‘0’的ASCII码值为该数的ASCII码值*/ /*先输出个位,再通过递归输出十位,以此类推*/

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

voidmain()

{ inthcf(int,int); intlcd(int,int,int); intu,v;

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

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

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

inthcf(intu,intv) { intt,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中的数则为最大公约数。*/ intlcd(intu,intv,inth) { return(u*v/h);}

6.定义一个函数,根据给定的三角形三条边长,函数返回三角形面积。 #include“stdio.h” #include“math.h”

floatss(inta,intb,intc) {floats,p; p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c)); return(s); }

voidmain() {

floata,b,c,area;

scanf(“%f,%f,%f”,&a,&b,&c); if(a+b>c&&b+c>a&&c+a>b) {area=ss(a,b,c);

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

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

7.编写一个函数,输入一个4位数字,要求输出这4个数字字符,使每两个数字字符间空一个空格。如输入2008,则应输出“2008”。 #include\#include\voidmain() {charstr[80];

voidinsert(charstr[]);

printf(\

scanf(\insert(str);

printf(\}

voidinsert(charstr[]) {inti;

for(i=strlen(str);i>0;i--) {str[2*i]=str[i]; str[2*i-1]=''; }

}8.编写一个函数,其功能是判断给定的正整数是否是素数,若是素数则返回函数值1,否则返回函数值0。 #include\#include\sushu(intn) {intk,i,flag;

k=sqrt((double)n); i=2; flag=0;

while((i<=k)&&(flag==0)) {if(n%i==0)flag=1; i=i+1;}

return(!flag);} voidmain() {

inta,b;

printf(\请输入一个正整数:\scanf(\b=sushu(a); if(b)

printf(\是一个素数\\n\else

printf(\不是一个素数\\n\

}9.有五个人坐在一起,问第五个人多少岁,他说比第四个人大2岁,问第四个人多少岁,他说比第三个人大2岁,问第三个人多少岁,他说比第二个人大2岁,问第二个人多少岁,他说比第一个人大2岁,问第一个人多少岁,他说10岁,问第五个人多少岁? #include\intf(intn) {inta;

if(n==1)a=10; elsea=f(n-1)+2; return(a);} voidmain()

{printf(\}

第六章指针

一.选择题

1.一个变量的指针就是(B)。

A)变量的名称B)变量的地址C)变量的类型D)变量的值 2.两个指针变量不能(B)。

A)相减B)相加 C)比较D)指向同一地址 3.在C语言中,对变量的访问方式是(A)。

A)能直接访问,能间接访问B)能直接访问,不能间接访问

C)不能直接访问,能间接访问 D)不能直接访问,不能间接访问 4.在C语句:int(*pa)[5];中,pa表示的是一个(C)。 A)指针数组的名字 B)指向整型变量的指针

C)指向包含5个整型元素的一维数组的指针D)指向函数的指针 5.在C语句:int*function();中,function表示的是一个(A)。 A)返回值为指针的函数名字 B)指向整型变量的指针 C)指向数组的指针D)指向函数的指针 6.有以下程序(假设从键盘输入数据1,2)。

#include

voidswap(int*p1,intp2) {*p1=*p1+p2; p2=p2+*p1;} voidmain()

{inta,b,*pointer1;

scanf(\pointer1=&a; swap(pointer1,b);

printf(\

程序执行后的输出结果是(D)。 A)3,5 B)a=3,b=5 C)3,2 D)a=3,b=2 7.有以下程序。

#include main()

{intarray[]={1,2,3,4,5,6,7}; inti,j,*pointer1,*pointer2; pointer1=&array[1]; pointer2=&array[5]; i=*pointer1**pointer2;

j=*(pointer1+2)+*(pointer2+1); printf(\

程序执行后的输出结果是(C)。

A)5,9 B)9,5 C)12,11 D)11,12

8.有以下程序。

#include main()

{staticintarray[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int(*p)[4],i,j,sum[3]; p=array;

for(i=0;i<3;i++) {sum[i]=0;

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

sum[i]=sum[i]+*(*(p+i)+j); printf(\} }

程序执行后的输出结果是(A)。

A)16,48,80,B)164880 C)144 D)80 9.有以下程序。

#include

voidfun(intx,inty,int*z) {*z=x-y;} voidmain() {inta,b,c; fun(11,5,&a); fun(8,a,&b); fun(a,b,&c);

printf(\}

程序执行后的输出结果是(C)。

A)2,4,6B)2,6,4C)6,2,4 D)6,4,2 10.有以下程序。

#include #include main()

{chara[]=\char*ch_pointer=&a[9]; while(--ch_pointer>=&a[0]) putchar(*ch_pointer);}

程序执行后的输出结果是(D)。 A)ABCDEFGHIB)ABCDEFGH C)HGFEDCBA D)IHGFEDCBA 二.填空

1.在C语言中,指针++运算的意义是使指针指向下一个数据元素的位置。指针--运算的意义是使指针指向上一个数据元素的位置。在指针变量中具体增加或减少的字节数则是由系统自动根据指针变量的基类型决定。

2.单目运算符&后面跟上变量名字来表示该变量的地址。

3.在C语言中,对于int*pa[10],表示定义pa是一个指针数组。因为*比[]优先级低,所以pa先要与[]结合成为pa[10]的数组形式,它有10个数组元素;然后再与前面的int*结合来表示数组元素的类型是指向整型变量的指针,就是说,每个数组元素都可以指向一个整型变量。 4.在C语言中,对于int(*fun_p)(intx),表示定义fun_p为一个指向函的指针变量。因为fun_p首先要与*结合成为指针变量;然后再与后面的()结合,表示该指针变量指向函数,该函数的

返回值(即函数值)为整型。

5.指向函数的指针变量在使用之前必须要先定义,而且也必须进行初始化,使它指向某个函数。指向函数的指针变量定义中的返回值类型和参数表内容应该与该函数的返回值类型和参数表内容保持一致。同时注意,指向函数的指针变量只能指向函数的入口地址,而不能指向函数中间的某一条语句。

6.使用指针的方法编写程序,求两个浮点数的和以及差。

#include

voidsub_add(floatx,floaty,float*sub,float*add); main() {floata,b;

floatsub_result,add_result;

printf(\scanf(\

sub_add(a,b,&sub_result,&add_result); printf(\}

voidsub_add(floatx,floaty,float*sub,float*add)/*差、和的函数定义*/ {*sub=x-y;/*两个浮点数的差赋值给指针sub所指向的变量*/ *add=x+y;/*两个浮点数的和赋值给指针add所指向的变量*/ return; }

7.使用指针编写程序,从键盘输入一个字符串,然后统计字符串中字符的个数。

#include

intlength(char*p); main()

{charstring[30]; intl;

printf(\scanf(\l=length(string);

printf(\}

intlength(char*p)/*定义函数,统计字符串中字符的个数*/ {intlen=0; while(*p!='\\0') {len++; p++; }

return(len); }

8.使用指针编写程序,按照正反两个顺序打印一个字符串。

#include voidmain()

{char*p_string1,*p_string2;

p_string1=\定义字符指针变量并且指向一个字符串*/

p_string2=p_string1;

while(*p_string2!='\\0')/*正序输出字符串*/ putchar(*p_string2++); putchar('\\n');

while(--p_string2>=p_string1)/*反序输出字符串*/ putchar(*p_string2); putchar('\\n'); }

9.使用指向指针的指针的方法,完成对n个整数(例如10个整数)排序后输出。要求从键盘输入n个整数并且把排序单独编写成函数。

#include

voidbubble_sort(int**p,intn); voidmain()

{inti,n,number[30]; int**pp,*pointer[30];

printf(\scanf(\for(i=0;i

pointer[i]=&number[i];/*指针数组p存放n个整数的地址*/ printf(\for(i=0;i

scanf(\

pp=pointer;/*二级指针pp指向指针数组p的首地址*/ bubble_sort(pp,n);

printf(\for(i=0;i

voidbubble_sort(int**p,intn)/*冒泡法排序*/ {int*temp; inti,j;

for(i=0;i**(p+j+1))

{temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}/*交换整数的地址*/ } }

10.使用指针数组编写程序,从键盘输入一个星期几(例如7),则程序输出对应星期几的英文名字(Sunday)。

#include #include

char*day_name(intn);/*英文星期几函数的原型声明*/ voidmain()

{intn;

char*pointer;

printf(\scanf(\

pointer=day_name(n);

printf(\}

char*day_name(intn)/*英文星期几函数的定义*/

{staticchar*english_name[]={\\if(n<1||n>7)

return(english_name[0]); else

return(english_name[n]); }

三.程序改错

1.有一个班级有n个学生,开设m门课程。使用指针的方法编写程序,查找有课程不及格的学生,并且打印他们的成绩。

#include #defineN4 #defineM5

voidsearch_fail(int(*p)[M]);/*函数的原型声明*/ voidmain()/*主函数*/ {inti,j;

intscore[N][M];

printf(\for(i=0;i

scanf(\

search_fail(score);/*找成绩差的学生*/ }

voidsearch_fail(int(*p)[M])/*float(*p)[4]可以写成float[][4]的形式*/ {inti,j;

for(i=0;i

{if(*(*(p+i)+j)<60)break;}/*p[i][j]用*(*(p+i)+j)表示的形式*/ if(j

{printf(\输出有关学生的信息*/ for(j=0;j

printf(\ printf(\ } } }

错误语句:if(j

正确语句:if(j

2.使用指针编写程序,从键盘输入的n个整数中找出其中最大值和最小值。 调用一个函数只能得到一个返回值,要得到多个返回值则用全局变量在函数之间来“传递”数据。

#include #defineN10

intmax,min;/*全局变量*/

voidmax_min_value(intarray[],intn); main()

{inti,number[N];

printf(\for(i=0;i

scanf(\max_min_value(number,N);

printf(\用max、min在函数之间传回数据*/ }

voidmax_min_value(intarray[],intn) {int*p,array_end; max=min=*array; array_end=array+n;

for(p=array+1;p

{if(*p>max)max=*p;/*为全局变量max赋值*/ elseif(*p

错误语句:int*p,array_end; 正确语句:int*p,*array_end;

3.使用指针编写程序,从键盘输入一个字符串,然后统计字符串中字符的个数。

#include main()

{charstring[30],*pointer;

printf(\scanf(\pointer=string;

while(*pointer!='\\0') pointer++;

printf(\错误语句:scanf(\正确语句:scanf(\

4.使用指针编写程序,在输入的字符串中查找是否存在字符?x?。 #include main()

{charstring[30],*p; inti;

p=string;

printf(\

scanf(\

for(i=0;p[i]!='\\0';i++)/*p[i]等价与*(p+i)*/

if(p[i]=='x'){printf(\if(p[i]!='\\0')

printf(\错误语句:if(p[i]!='\\0') 正确语句:if(p[i]='\\0')

5.使用指针数组编写程序,从键盘输入一个星期几(例如7),则程序输出对应星期几的英文名字(Sunday)。

#include #include voidmain() {intn;

char*day_name[]={\\while(1)/*无限循环,由break语句退出*/ {printf(\scanf(\if(n<1&&n>7)

{printf(\break; }

printf(\} }

错误语句:if(n<1&&n>7) 正确语句:if(n<1||n>7)

四.编程

1.从键盘输入3个整数,按照从小到大的顺序输出。使用指针的方法并且用3种不同方式实现。

#include main() {inta,b,c;

int*pointer_1,*pointer_2,*pointer_3,*p; printf(\scanf(\

pointer_1=&a;pointer_2=&b;pointer_3=&c;

if(a>b){p=pointer_1;pointer_1=pointer_2;pointer_2=p;}/*指针交换*/ if(a>c){p=pointer_1;pointer_1=pointer_3;pointer_3=p;}/*指针交换*/ if(b>c){p=pointer_2;pointer_2=pointer_3;pointer_3=p;}/*指针交换*/ printf(\、b、c之间未交换*/

printf(\} 2.将数组中n个整数按相反的顺序存放后输出。使用指针的方法并用2种不同方式实现。

#include #defineN10

voidinverted(int*x,intn); main()

{inti,array[N];

printf(\for(i=0;i

scanf(\

printf(\for(i=0;i

printf(\

inverted(array,N);/*实参array为数组名*/ printf(\for(i=0;i

printf(\}

voidinverted(int*x,intn)/*形参x为指针变量*/ {int*front,*rear,*p,m,temp; m=(n-1)/2;

front=x;rear=x+n-1;p=x+m; for(;front<=p;front++,rear--)

{temp=*front;*front=*rear;*rear=temp;} return;}

3.从键盘输入3个字符串,按照从小到大的顺序输出。使用指针的方法实现。 #include

charswap(char*p1,char*p2); voidmain()

{charstring1[30],string2[30],string3[30];

printf(\scanf(\scanf(\scanf(\

if(strcmp(string1,string2)>0)swap(string1,string2);/*若string1>string2,则交换*/ if(strcmp(string1,string3)>0)swap(string1,string3);/*若string1>string3,则交换*/ if(strcmp(string2,string3)>0)swap(string2,string3);/*若string2>string3,则交换*/ printf(\输出排序后的结果*/ printf(\printf(\printf(\}

charswap(char*p1,char*p2)/*交换字符串的函数,采用传地址的方法传递函数参数*/ {char*p[30];

strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); }

4.使用指针编写程序,完成字符串的复制。要求不能使用strcpy函数。

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

Top