admin 管理员组

文章数量: 887019


2024年2月26日发(作者:后端代码生成器)

习题解析与答案

第1章C语言概述

一.简答题

1.概述C语言的主要特点。

【解答】

(1)语言简洁、紧凑,使用方便、灵活。

(2)数据类型丰富,表达能力强。

(3)运算符多样。C语言中的运算符包含的范围非常广泛。

(4)具有结构化的控制语句。如if…else语句、while语句、dowhile语句、switch语句、for语句。

(5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。

(6)所生成的目标代码质量高,可移植性好。

2.构成C语言程序的基本单位是什么?它由哪几部分组成?

【解答】函数是构成C语言程序的基本单位。一个完整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。

3.C语言程序的运行一般要经过哪几个步骤?

【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。

二.运行程序写结果

1.输入下面程序并运行。

main()

inta1,a2,x;

a1=100;

a2=50;

x=a1-a2;

printf(″x=%dn″,x);

【解答】运行结果为:x=50

2.输入下面程序并运行。

main()

{

inta1,a2,x;

a1=10;

a2=20;

x=a1*a2;

printf(″a1=%d,a2=%dn″,a1,a2);

printf(″x=%dn″,x);

【解答】运行结果为:a1=10,a2=20

x=200

3.输入下面程序并运行。

仅供个人学习参考

#include

main()

{

printf("******n");

printf("*****n");

printf("****n");

printf("***n");

printf("**n");

printf("*n");

}

【解答】运行结果为:******

*****

****

***

**

*

思考:可以修改程序,使之输出平行四边形,等腰三角形等图形。

三.编程题

1.参照本章例题,编写一个C程序,用于显示如下信息:

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

IloveCprograms!

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

【分析与提示】

①要有文件包含语句#include。C语言中没有数据的输入、输出等功能,数据的输入、输出都是通过调用系统提供的库函数scanf和printf等来实现的。这些函数的说明都包括在stdio.h文件中。

②main是主函数的名称。用{}括起来的内容是函数体,函数体由若干条语句组成,这是计算机要执行的部分,每条语句以分号“;”结束。

③注意显示的信息有三行,所以要用到换行符“n”。

参考代码:

#include

main()

{

printf("************************n");

printf("IloveCprograms!n");

printf("************************n");

}

第2章 数据类型及其运算

一.简答题

1.C语言中的数据类型主要有哪几类?

【解答】短整型(shortint)

整型整型(int)

长整型(longint)

基本类型字符型(char)单精度(float)

实型(浮点型)

双精度(double)

仅供个人学习参考

枚举类型(enum)

数组类型

构造类型结构体类型(struct)

共用体类型(union)

指针类型

空类型(void)

2.字符常量与字符串常量有什么区别?

【解答】字符常量用单括号括起,字符串常量用双括号括起;字符常量存储时占1个字节,字符串常量存储时除了n个字符外,还有系统加上的字符串终止符0,所以字符串常量存储时占n+1个字节。

3.C语言中的常量包括哪几类?各自是如何构成的?

【解答】C语言中的常量是一些其值预先定的量,并且在程序执行过程中其值不再发生变化。常量的分类遵循基本数据类型分类原则,C语言编译系统自动将其存放在于类型相应的内存单元中。其类别包含整形常量、浮点常量、字符常量、字符串常量和枚举常量。整形常量又分为十进制整形常量、八进制整形常量、十六进制整形常量。浮点常量分成十进制形式和指数形式。C语言中的,字符常量是用单括号括起来的一个字符或是字符序列,而字符串常量是用一对双括号括起来的零个或者多个字符组成的序列。

4.简述指针、变量的指针、变量的值、指针变量与指针变量的值的含义是什么?

【解答】C语言中将地址又称为“指针”。一个变量所分配的内存空间首字节地址,称为该变量的指针(地址),变量的值就被放入所分配的地址单元中。地址一旦被分配,就不会再改变,所以,指针是一个常量。既然是常量就可以把它赋给一个变量。用来存放指针的变量,被称为指针变量。一个指针变量的值是变量的地址,一个指针变量可以被赋予不同的指针值。

5.下面哪些是不合法的常量?说明不合法的理由。

123,3.1415926,0892,’M’,’n’,0xabc,0.618E-6,”Morning”,3.8e-3.14

【解答】非法常量有:

0892——含有非八进制数字8和9

3.8e-3.14——非法指数形式浮点常量:规定e后面的指数必须为整数。

6.下面对变量定义的语句哪些不正确?为什么?请改正。

(1)charc1,inta2;(2)INTa,b;FLOATx,y;(3)a,b:char;

(4)charif;(5)inta,b(6)Inta:b:c;

(7)inta,x;floatx,y;

【解答】

(1)charc1,inta2;

错误。定义不同类型的变量时,应用分号彼此分开。

改正为:charc1;inta2;

(2)INTa,b;FLOATx,y;

错误。C语言中表示类型名的关键字必须小写。

改正为:inta,b;floatx,y;

(3)a,b:char;

错误。C语言中变量定义格式为:类型名变量名;

改正为:chara,b;

(4)charif;

错误。变量名不能与C语言的关键字重名。

改正为:charf1;

(5)inta,b

错误。变量定义以语句形式出现,应以分号结尾。

仅供个人学习参考

改正为:inta,b;

(6)Inta:b:c;

错误。类型名不能有大写字母,相同类型名之间用逗号分隔。

改正为:inta,b,c;

(7)inta,x;floatx,y;

错误。在同一程序位置上,同一变量名不能重复定义充当两个不同的变量。

改正为:inta,x;floatx1,y;

7.下述字符串常量的长度是多少?在内存中存储时各自占用的单元数又是多少?

(1)“Hello!”(2)“ABCnTH064?”(3)“xAB*765+123=?”

【解答】

(1)“Hello!”字符串长度为6,占用内存字节数为7。

(2)“ABCnTH064?”字符串长度为9,占用内存字节数为10。因为其中n064?各自只占一个字符的位置。

(3)“xAB*765+123=?”该字符串不是合法的,因为765表示的值太大,超出合法的ASCII字符集的范围。

二.运行程序写结果

1.以下程序的执行结果是____。

main()

{

inti,j;

i=15;

printf(“%d,%d”,i++,i--);

}

【解答】14,15

2.以下程序的执行结果是。

main()

{

inta=20,b=10,c,*p1,*p2;

p1=&a;

p2=&b;

c=(-*p1)/(*p2)+6;

printf("a=%d,b=%dn",a,b);

printf("*p1=%d,*p2=%dn",*p1,*p2);

printf("c=%dn",c);

}

【分析与提示】

p1 a

a 20

P2b`

【解答】a=20,b=10

*p1=20,*p2=10

b 10

c=4

3.以下程序的执行结果是。

#include

main()

仅供个人学习参考

{

chara=’G’,b=’o’,c=’o’,d=’d’;

a=a+32;

b=b-6;

c=c+3;

d=d+8;

printf("%c%c%c%cn",a,b,c,d);

}

【分析与提示】从ASCII代码表可以看出,字符“G”、“o”、“o”、“d”的ASCII代码值为71、111、101,因此,’G’+32、’o’-6、’o’+3、’d’+8的值分别是103、105、114、108,它们所对应的字符分别是“g”、“i”、“r”、“l”。

常用结论:

(1)在C语言中,字符数据可以按其ASCII代码值参加整数运算。由于英文字母在ASCII代码表中是按顺序排列的,所以在计算’o’+3代表的字母时,可从字符’o’其顺序向后取3个字母,该字母是“r”。

(2)从ASCII代码表可以看出“小写字母”-“对应大写字母”的结果是32,因此可推算出如下等式:大写字母的ASCII值+32=对应小写字母的ASCII值;小写字母的ASCII值-32=对应大写字母的ASCII值。

【解答】girl

4.以下程序的执行结果是。

#include

main()

{

intx;

x=-3+4*5-6;

printf("x1=%dn",x);

x=3+4%5-6;

printf("x2=%dn",x);

x=-3*4%-6;

printf("x3=%dn",x);

}

【分析与提示】x1=11(4*5是20,-3+20是17,17-6等于11)

x2=1(4%5等于4,3+4等于7,7-6等于1)

x3=0(-3*4等于-12,-12%-6等于0)

【解答】x1=11

x2=1

x3=0

5.以下程序的执行结果是。

#include

main()

{

printf("%dn",NULL);

printf("%d,%cn",49,49);

printf("%d,%c,%on",48+10,48+10,48+10);

}

仅供个人学习参考

【分析与提示】

0(NULL的ASCII码值是0)

49,1(数字1的ASCII码值是49)

58,:,72(48+10等于58,正好是“:”的ASCII码值,八进制表示是72)

【解答】0

49,1

58,:,72

三、改错题

1.请修改下列程序,使其能够通过编译。

#include

VoidMain()

{

inta=6;b=8;

intc;

c=a*b;

printf(‘%d’,c);

}

【答案】错误的地方有3处:(1)第2行关键字应该小写;(2)定义b时前面应该用逗号;(3)打印语句的格式应该用双引号括起来。

正确的程序如下:

#include

voidmain()

{

inta=6,b=8;

intc;

c=a*b;

printf("%d",c);

}

2.请修改下列程序,使其能够正确运行。

#include

voidmain();

{

floatf=7.12;

charc=”c”;

printf(“%dn”,int(f%3));

printf(“%c”,c);

}

【答案】错误的地方有3处:(1)第2行main();不应该有分号;(2)定义charc=”c”;

时,字符常量应该用单引号;(3)打印语句printf(“%dn”,int(f%3));的格式有错,应该在f前的int用括号括起来,因为实型数据不能执行取余运算。

正确的程序如下:

#include

voidmain()

{

floatf=7.12;

charc='c';

仅供个人学习参考

printf("%dn",((int)f%3));

printf("%c",c);

}

第3章顺序结构程序设计

一.简答题

1.程序有哪三种基本结构?

【解答】程序的三种基本结构为:顺序结构、选择结构和循环结构。

2.C语言的语句有哪几类?表达式语句与表达式有什么不同?

【解答】C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句和空语句。其中表达式语句与表达式的区别在于表达式语句是表达式加上“;”组成。

二、填空题

1.符号’&’是_______运算符,&a是指_______。

2.C语言中的空语句就是_______。

3.Scanf函数中的“格式字符”后面应该是_______,而不应该是______。

4.若想输出字符%,则应该在“格式字符”的字符串中用_____表示。

5.intx=7;执行x+=x-=x+x;后x的值是_______。

6.inta=10,b=20;a+=b;b=a-b;a-=b;的功能是_______。

答案:1.地址、变量a的内存地址。

2.一个分号。

3.变量地址,变量名。

4.连续2个%号。

5.-14

6.交换变量a,b的值,打印出a=20,b=10。

三.运行程序写结果

1.以下程序的执行结果是。

#include

main()

{

doubled=3.2;intx,y;

x=1.2;y=(x+3.8)/5.0;

printf("%dn",d*y);

}

【解答】0

2.以下程序的执行结果是。

main()

{

doubled;floatf;longl;inti;

i=f=l=d=20/3;

printf("%d%ld%f%fn",i,l,f,d);

}

【解答】666.0000006.000000

3.以下程序的执行结果是。

main()

{

仅供个人学习参考

intk=17;

printf("%d,%o,%xn",k,k,k);

}

【解答】17,21,11

4.以下程序的执行结果是。

#include

main()

{

chara,b,c,d;

a='A',b='B',c='C',d='D';

printf("%1cn",a);

printf("%2cn",b);

printf("%3cn",c);

printf("%4cn",d);

}

【分析与提示】可以用%c格式输出的,也可以用%d格式输出,所以与%md近似,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。

【解答】A

B

C

D

5.以下程序的执行结果是。

#include

main()

{

charc1,c2;

scanf("%c%c",&c1,&c2);

printf("c1=%c,c2=%c,c3=%d,c4=%d",c1++,--c2,c1,c2);

}

【解答】运行输入:AB<回车>

运行结果为:c1=A,c2=A,c3=65,c4=66

6.以下程序的执行结果是。

#include

main()

{

charc1,c2;

scanf("%c,%c",&c1,&c2);

++c1;

--c2;

printf("c1=%c,c2=%cn",c1,c2);

}

【分析与提示】例如当输入B,C<回车>,B,C的ASCII码值为66,67,执行++c1;--c2;后,c1为66+1变成67即C,c2为67-1变成66即B。

【解答】运行输入:B,C<回车>,运行结果为:c1=C,c2=B

7.以下程序的执行结果是。

仅供个人学习参考

main()

{

charch='a';inta=98;

doubley=1.2345678;

printf("(1)a=%d,a=%c,ch=%d,ch=%cn",a,a,ch,ch);

printf("(2)b=%un",b);

printf("(3)c=%ldn",c);

printf("(4)x=%f,y=%fn",x,y);

printf("(5)x=%e,y=%en",x,y);

printf("(6)y=%-10.2fn",y);

}

【解答】(1)a=98,a=b,ch=97,ch=a

(2)b=1000

(4)x=3.140000,y=1.234568

(5)x=3.14000e+00,y=1.23457e+00

(6)y=1.23

8.以下程序的执行结果是。

#include

main()

{

inta,b;

floatx;

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

x=a/b;

printf("nx=%fn",x);

}

【解答】运行输入:2,2<回车>,运行结果为:1.000000

9.当输入12345,a时,给出程序的运行结果,执行结果是。

#include

main()

{

inta;charc;

scanf("%3d,%c",&a,&c);

printf("n%d,%dn",a,c);

}

【分析与提示】%md,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。a的ASCII码值是97。

【解答】12345,97

10.分析下面程序,在键盘上输入数据才能使得变量a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8。

程序如下:

#include

main()

{

inta,b;

仅供个人学习参考

floatx,y,z;

charc1,c2;

scanf("%5d%5d%c%c%f%f%*f,%f",&a,&b,&c1,&c2,&x,&y,&z);

printf("a=%d,b=%d,c1=%c,c2=%c,x=%f,y=%f,z=%f",a,b,c1,c2,x,y,z);

}

【分析与提示】按%5d格式输入a与b的值时,要先键入三个空格,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应%*f位置可以随意输入一个数(我们输入1.5,该数不会赋值给任何变量的)。

【解答】运行输入:└┘└┘└┘10└┘└┘└┘20Aa1.5└┘-3.75└┘1.5,67.8<回车>

11.一个程序中,使用了多个scanf函数输入数据,用a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’输入到每个变量,应该如何输入数据?

main()

{

inta,b;

floatx,y;

charc1,c2;

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

scanf("x=%f,y=%e",&x,&y);

scanf("c1=%cc2=%c",&c1,&c2);

printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%cn",a,b,x,y,c1,c2);

}

【分析与提示】在使用多个scanf函数输入数据时,第一个输入行末尾输入的回车被第二个scanf函数吸收,因此在第二、三个scanf函数的双引号后放置一个空格以抵消上行输入的回车键。若没有一个空格,则按上面输入的数据会出错。

【解答】运行输入:a=3,b=4<回车>

X=8,y=71.82<回车>

C1=AC2=a<回车>

运行结果:a=3,b=7,x=8.500000,y=71.820000,c1=A,c2=a

四.编程题

1.由键盘输入1个字母,输出其ASCII码值。

【分析与提示】将一个字符常数赋给一个字符变量,并不是把该字符本身放到内存单元中去,而是将该字符的ASCII代码放到内存单元中,因此,字符型数据也可以像整型数据那样使用,可以用来表示一些特定范围内的整数。所以int型与char型变量的值可以互换,分别用%c和%d不同格式输出就行了。

但是注意这种转换是有条件的。因为,char变量在内存占一个字节,而int整型变量占2个字节。当int型高位字节是0时,char与int可以互换;若不是0,则不可以互换。例如,用%c格式输出时,取低位字节,高位字节被舍弃。

参考代码:

#include"stdio.h"

main()

{

charch;

ch=getchar();

printf("%c,%d",ch,ch);

}

仅供个人学习参考

【解答】运行输入:B<回车>

运行结果:B,66

2.从键盘上输入一个大写字母,把它转换成小写字母,然后显示出来。

【分析与提示】大写字母转换小写时ASCII码值+32,相反的,小写字母转换成大写字母时ASCII码值-32。

参考代码:

#include

main()

{

charx1,x2;

printf("x1=?n");

scanf("%c",&x1);

x2=x1+32;

printf("%c,%cn",x1,x2);

}

【解答】运行输入:A<回车>

运行结果:A,a

3.从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。

【提示】结果要求保留2位小数,所以输出的结果格式为%.2f。

main()

{

floatx,y,a,b,c;

printf("pleaseinputx,y:");

scanf("%f,%f",&x,&y);

a=x+y;

b=x-y;

c=x*y;

printf("x=%f,y=%fn",x,y);

printf("x+y=%.2fnx-y=%.2fnx*y=%.2fn",a,b,c);

}

【解答】

运行输入:pleaseinputx,y:10,20<回车>

运行结果:x=10.000000,y=20.000000

x+y=30.00

x-y=-10.00

x*y=200.00

4.编写一个程序,求出给定半径r的圆以及内正n边形的面积,并且输出计算结果。r和n的值由用户输入。

【分析与提示】由数学知识得到:半径为r圆的面积sr,半径为r圆的内接正n边形的面2积Anrsin/2,其中2/n

2处理步骤:提示信息,接收参数值;计算圆的面积;计算正n边形的面积;输出结果。

参考代码:

#include

仅供个人学习参考

#include

#definePI3.14

main()

{

intn;

floatr,s,area;

printf("PleaseinputtheradiusandtheN.:n");

scanf("%f%d",&r,&n);

s=PI*r*r;

area=(n*r*r*sin(2*PI/n))/2.0;

printf("S=%.2ftA=%.2fn",s,area);

return(0);

}

运行结果如下:

PleaseinouttheradiusandtheN.;

1 5

S=3.14 A=2.38

5.已知华氏温度与摄氏温度之间的转换公式是:c5/9(F32),编写一个程序,将用户输入的华氏温度转换成摄氏温度,并予以输出。

【分析与提示】首先要定义输入输出温度为浮点型,且5/9两数相除结果为整数,5/9的值为0,故不能写成5/9,而应写成(5.0/9.0)*(f-32)。结果要求保留2位小数,所以输出的结果格式为%5.2f。

参考代码:

#include

main()

{

intf;

floatc;

printf("npleaseinputtheF:");

scanf("%d",&f);

c=5.0/9*(f-32);/*不能写成5/9,两数相除结果为整数,5/9的值为0*/

printf("atureis:%.2f",c);

return(0);

}

【解答】运行结果如下:

pleaseinputtheF:75<回车>

,[eratureis:23.89

6.由键盘输入5个学生的计算机成绩,计算他们的平均分并保留2位小数。

【分析与提示】方法与上题类似,同样是保留两位有效数字%6.2f。

参考代码:

main()

{

inta,b,c,d,e;

floattotal,aver;

仅供个人学习参考

printf("Pleseinput5students’scores:n");

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

total=a+b+c+d+e;

aver=total/5.0;

printf("Average:%6.2fn",aver);

}

【解答】运行输入:80,93,75,68,87<回车>

运行结果:Average:80.60

7.编写将输入的英里转换为公里,每英里等于5380英尺,每英尺等于12英寸,每英寸等于2.54厘米,每公里等于100000厘米。

main()

{

doublemile,k;

printf(“entermile:”);

scanf(“%lf”,&mile);

k=mile*5380*12*2.54/100000;

printf(“%lfmileis%lfkilometern”,mile,k);

}

【解答】运行:entermile:2↙

2.000000mileis3.279648kilometer

第4章选择结构程序设计

4.1习题

一.填空题

1.已知a=3,b=4,c=5。则逻辑表达式a+b>c&&b==c的值为,!(a>b)&&c||1的值为,!(a+b)+c-1&&b+c/2的值为。

【分析与提示】本题考查运算符的优先级别。

【解答】0;1;1

二、运行程序写结果

1.下列程序运行的运行结果为。

#include

main()

{

inta=3,b=8,c=9,d=2,e=4;

intmin;

min=(a

min=(min

min=(min

min=(min

printf("Minis%dn",min);

【分析与提示】本题程序的功能为:找出a,b,c,d,e中最小的值并输出。

【解答】Minis2

2.若输入3,4<回车>,下列程序运行的运行结果为;若输入4,3<回车>,下列程序运行的运行结果仅供个人学习参考

为。

#include

main()

{

inta,b,c;

printf("Inputa,b:");

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

if(a>=b)

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

else

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

【分析与提示】本题程序的功能为:从键盘输入变量a,b,计算c的值(若a>=b,则c=a*b,若a

【解答】3/4=0;4*3=12

3.下列程序运行的运行结果为。

#include

main()

intx=1,y=0,a=0,b=0;

switch(x)

case1:

switch(y)

{case0:a++;break;

case1:b++;break;

case2: a++;b++;break;

printf("a=%d,b=%dn",a,b);

【分析与提示】本题中case1:后面是一个switch语句,执行完该语句后,直接执行case2:后面的语句。

【解答】a=2,b=1

三.编程题

1.输入一个字母,若为小写,则把它变成大写输出。

【分析与提示】小写字母的ASCII码值与其对应的大写字母的ASCII码值相差32。

参考代码:

main()

{

charc;

printf("请输入一个字母n");

scanf("%c",&c);

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

c=c-32;

printf("%cn",c);

仅供个人学习参考

}

2.企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

【分析与提示】请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

参考代码:

main()

{

longinti;

intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;

scanf("%ld",&i);

bonus1=100000*0.1;bonus2=bonus1+100000*0.75;

bonus4=bonus2+200000*0.5;

bonus6=bonus4+200000*0.3;

bonus10=bonus6+400000*0.15;

if(i<=100000)

bonus=i*0.1;

elseif(i<=200000)

bonus=bonus1+(i-100000)*0.075;

elseif(i<=400000)

bonus=bonus2+(i-200000)*0.05;

elseif(i<=600000)

bonus=bonus4+(i-400000)*0.03;

elseif(i<=1000000)

bonus=bonus6+(i-600000)*0.015;

else

bonus=bonus10+(i-1000000)*0.01;

printf("bonus=%d",bonus);

}??

3.由键盘输入三个整数a、b、c,用条件运算符求出其中最大值和最小值。

【分析与提示】首先比较输入的a,b的大小,并把大数装入max,小数装入min中,然后再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min。因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。

参考代码:

main()

{

inta,b,c,max,min;

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

max=a>b?a:b;

max=max>c?max:c;

min=a

min=min

printf("最大值为:%d,最小值为:%dn",max,min);

}

仅供个人学习参考

4.有一函数:

x(x<1)

y=2x-1(1≤x<10)

3x-11(x≥10)

编一程序,输入一个x值,输出y值。

【分析与提示】本题考查if语句的嵌套,应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。

参考代码:

main()

{

floatx,y;

printf("请输入x的值n");

scanf("%f",&x);

if(x<1)y=x;

else

if(x>=10)y=3*x-11;

elsey=2*x-1;

printf("x=%6.2f,y=%6.2f",x,y);

}

5.从键盘上输入星期号,并显示该日期的英文名字。

【分析与提示】本实例知识点:switch语句。

switch语句的控制流程是:首先计算表达式的值,然后依次与每一个case中的常量值进行比较,一旦发现了某个能够匹配的值,就执行该case后面的语句组,直到遇到break语句为止。如果表达式的值与所有case中的常量都不匹配,则执行default后面的语句组。

参考代码:

main()

{

intxqh;

charywm;

printf("请输入星期号(1~7):n");

scanf("%d",&xqh);

switch(xqh)

{case1:printf("Monday");break;

case2:printf("Tuesday");break;

case3:printf("Wednesday");break;

case4:printf("Thursday");break;

case5:printf("Friday");break;

case6:printf("Saturday");break;

case7:printf("Sunday");break;

default:printf("error");

}

}

6.某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元/公里,3公里以外2.1元/公里;富康8元/公里,3公里以外2.4元/公里;桑塔纳9元,3公里以外2.7元/公里。编程:从键盘输入乘车的车型及行车公里数,输出应付车资。

仅供个人学习参考

【分析与提示】可设三个变量,分别表示乘车的车型、行车公里数和应付车资,根据乘车的车型和行车公里数,计算出应付的车资。

参考代码:

main()

{

intcx;/*定义乘车的车型变量cx*/

floatgl,cf;/*定义行车公里数变量gl、应付车资变量cf*/

printf("t1-夏利nt2-富康nt3-桑塔纳n");

printf("t请输入车型(1-3):");

scanf("%d",&cx);

printf("nt请输入行车公里数:");

scanf("%f",&gl);

switch(cx)

{case1:if(gl<=3)cf=7.0;

elsecf=7+(gl-3)*2.1;break;

case2:if(gl<=3)cf=8.0;

elsecf=8+(gl-3)*2.4;break;

case3:if(gl<=3)cf=9.0;

elsecf=9+(gl-3)*2.7;

}

printf("应付车资为%.1fn",cf);

}

7.给一个不多于5位的正整数,要求:①求出它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。如原数为12345,则逆序为54321。

【分析与提示】本题的思路是:设5个变量,分别代表个位、十位、百位、千位和万位。从个位起,依次将各个位取出来,按取出的顺序组合成新的数据,并记录当前取出的数字的个数。

参考代码:

#include"stdio.h"

main()

{

unsignedx,m,n=0,w=0;

unsignedge=0,shi=0,bai=0,qian=0,wan=0;

printf("请输入一个正整数");

scanf("%u",&x);

m=x;

ge=m%10;m=m/10;w=1;n=ge;

if(m)

{shi=m%10;m=m/10;w=2;n=n*10+shi;

if(m)

{bai=m%10;m=m/10;w=3;n=n*10+bai;

if(m)

{qian=m%10;m=m/10;w=4;n=n*10+qian;

if(m)

{wan=m;w=5;n=n*10+wan;}

}

仅供个人学习参考

}

}

printf("n%u为%u位数",n,w);

printf("n正整数的原序为:%u",x);

printf("n正整数的逆序为:%u",n);

}

注:当该程序输入一个较大的5位数时,输出结果就不正确了,思考为什么?动手试一下怎样修改该程序。

第5章循环结构程序设计

一、填空题

1.下面程序的功能是用“辗转相除法”求两个正整数的最大公约数。请填空。

#include

main()

intr,m,n;

scanf("%d%d",&m,&n);

if(m

r=m%n;

while(r){m=n;n=r;(2);}

printf("%dn",n);

【分析与提示】辗转相除法:两数相除,若不能整除,则以除数作为被除数,余数作为除数,继续相除,直到余数为0时,当前除数就是最大公约数。

【解答】(1)r=m;m=n;n=r;(2)r=m%n;

二.运行程序写结果

1.下列程序运行的运行结果为。

#include

main()

inty=10;

do

{y--;

}while(--y);

printf("%d",y--);

【分析与提示】注意y--与y--的运算顺序。

【解答】0

2.下列程序运行的运行结果为。

main()

{

intx=3,y=6,z=2;

while(x++!=(y-=1))

{

z+=1;

仅供个人学习参考

if(y

break;

printf(“%d,%d,%dn”,x,y,z);

}

}

【解答】4,5,3

3.下列程序运行的运行结果为。

main()

{

inta=1,b=0;

for(?;a<3?;a++)

switch(a++)

{

case1:b--;

case2:b++;

case3:b+=3;break;

}

printf(“%dn”,b);

}

【解答】3

4.下列程序运行的运行结果为。

main()

{

intx=10,y=10,i;

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

printf(“%4d%4d”,x--,y);

}

【解答】101090

三.编程题

1.求s=1+2+4+8+…+64的值。

【分析与提示】本题为数学项求和问题,数学项间的关系为:第n项的值为第n-1项的值2倍。参考代码:

main()

{

inti,s=0,t=1;

while(t<=64)

{s=s+t;

t=2*t;

}

printf("s=%dn",s);

}

2.求s=1+1/2+1/3+…+1/100的值。

【分析与提示】本题为分数数学项求和问题,要想得到每一项的正确结果,分式中的分子、分母至少要有一个为实型数据。

参考代码:

main()

仅供个人学习参考

{inti;

floats=0,t;

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

{t=1.0/i;

s=s+t;

}

printf("s=%.2fn",s);

}

3.求T=1!+2!+3!+…+10!的值。

【分析与提示】本题为数学项求和问题,数学项间的关系为:第n项的值为第n-1项的n倍。参考代码:

main()

{

longintt=0,tn=1;

inti;

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

{tn=i*tn;

t=t+tn;

}

printf("t=%ld",t);

}

4.求s=2/1+3/2+4/3+5/4+…+22/21的值。

【分析与提示】请抓住分子与分母的变化规律。

参考代码:

main()

{

intm;

floats=0,n=2.0;

for(m=1;m<=21;m++)

{s=s+n/m;

n=n+1;

}

printf("s=%.2fn",s);

}

5.输入一行字母,分别统计其中的英文字母、空格、数字和其他字符的个数。【分析与提示】利用while语句,条件为输入的字符不为'n'.

参考代码:

#include"stdio.h"

main()

{

charc;

intletters=0,space=0,digit=0,other=0;

printf("请输入一行字符:n");

while((c=getchar())!=’n’)

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

letters++;

仅供个人学习参考

elseif(c==’’)

space++;

elseif(c>=’0’&&c<=’9’)

digit++;

elseother++;

}

printf("字母数=%d空格数=?%d数字数=%d其它字符数=%dn",letters,space,digit,other);

}

6.求100以内能被8整除的数,并求它们的和。

【提示】判断一个数m能否被n整除的方法是:将m对n取余数,若余数为0,则为整除。

参考代码:

main()

{

intn,s=0;

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

if(n%8==0)

{s=s+n;

printf("%4d",n);

}

printf("ns=%dn",s);

}

7.打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其中各位数字的立方和等333于该数本身。例如153=1+5+3。

【分析与提示】利用for循环控制100~999个数,每个数分解出个位,十位,百位。

参考代码:

main()

{

inti,j,k,n;

printf("水仙花数是:");

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

{i=n/100;

j=n/10-i*10;

k=n%10;

if(n==i*i*i+j*j*j+k*k*k)

printf("%5d",n);

}

printf("n");

}

8.以下面的格式,输出九九乘法表。

1*1=1

1*2=22*2=4

1*3=32*3=63*3=9

………

1*9=92*9=183*9=27…9*9=81

【提示】分行与列考虑,共9行9列,利用双重for循环,外循环i控制行,内循环j控制列。参考代码:

仅供个人学习参考

main()

{inti,j;

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

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

printf("%d*%d=%-4d",j,i,j*i);

printf("n");

}

}

9.用for循环打印输出以下图案。

*****

*******

*********

***********

(图形a)(图形b)

输出图形a程序代码:

#include"stdio.h"

main()

{

inti,j,k;

for(i=0;i<4;i++)/*控制打印行数*/

{

for(j=0;j<10+i;j++)/*控制空格输出位置*/

printf("");

for(k=0;k<4;k++)/*控制每行*的输出个数*/

printf("*");

printf("n");

}

}

输出图形b序代码:

#include“stdio.h”

main()

{

inti,j,k;

for(i=0;i<4;i++)/*控制打印行数*/

{

for(j=0;j<3-i;j++)/*控制空格输出位置*/

printf(“”);

for(k=0;k<2*i+1;k++)/*控制每行*的输出个数*/

printf(“*”);

printf(“n”);

}

}

10.猴子吃桃子问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上再想吃时,见只剩一个桃子了。求第一天共摘了多少个桃子。

【提示】采取逆向思维的方法,从后往前推断。参考代码:

仅供个人学习参考

main()

{intday,x1,x2;

day=9;

x2=1;

while(day>0)

{x1=(x2+1)*2;

x2=x1;

day--;

}

printf("桃子总数=%dn",x1);

}

11.求出500以内所有素数。

【提示】判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表

明此数不是素数,反之是素数。

参考代码:

#include"math.h"

main()

{intm,k,i,n=0;

for(m=2;m<=500;m++)

{

k=sqrt(m);

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

if(m%i==0)break;

if(i>=k+1)

{printf("%-5d",m);

n=n+1;

if(n%10==0)

printf("n");

}

}

printf("n");

}

12.输入一个整数(0~99999),判断它的位数,并重新组合成同样位数的最大值。如,输入1345,输出5431。

【提示】先求出该整数的位数;其次分解出每一位数(个位、十位、百位、千位、万位);接着将5个位数进行排序;最后根据整数的位数重新组合成同样位数的最大值。

参考代码:

main()

{longintnum,t,d1,d2,d3,d4,d5,n;/*分别代表个位,十位,百位,千位,万位和位数*/

printf("请输入一个整数(0~99999):");

scanf("%ld",&num);

if(num>9999)n=5;

elseif(num>999)n=4;

elseif(num>99)n=3;

elseif(num>9)n=2;

仅供个人学习参考

elsen=1;

printf("n=%ldn",n);

d5=num/10000;

d4=(num-d5*10000)/1000;

d3=(num-d5*10000-d4*1000)/100;

d2=(num-d5*10000-d4*1000-d3*100)/10;

d1=num-d5*10000-d4*1000-d3*100-d2*10;

if(d5

{t=d5;d5=d4;d4=t;}

if(d5

{t=d5;d5=d3;d3=t;}

if(d5

{t=d5;d5=d2;d2=t;}

if(d5

{t=d5;d5=d1;d1=t;}

if(d4

{t=d4;d4=d3;d3=t;}

if(d4

{t=d4;d4=d2;d2=t;}

if(d4

{t=d4;d4=d1;d1=t;}

if(d3

{t=d3;d3=d2;d2=t;}

if(d3

{t=d3;d3=d1;d1=t;}

if(d2

{t=d2;d2=d1;d1=t;}

switch(n)

{case5:num=d5*10000+d4*1000+d3*100+d2*10+d1;break;

case4:num=d5*1000+d4*100+d3*10+d2;break;

case3:num=d5*100+d4*10+d3;break;

case2:num=d5*10+d4;break;

case1:num=d5;

}

printf("重组后的数为:%ldn",num);

}

13.求证100以内哥德巴赫猜想是成立的。即:100以内任何一个大的偶数(大于等于6)都可以表示成两个素数之和。

【分析与提示】我们先不考虑怎样判断一个数是否为素数,而从整体上对这个问题进行考虑,可以这样做:读入一个偶数n,将它分成p和q,使n=p+q。怎样分呢?可以令p从2开始,每次加1,而令q=n-p,如果p、q均为素数,则正为所求,否则再试。

参考代码:

#include

#include

main()

仅供个人学习参考

{

intj,n,p,q,flagp,flagq;

printf("pleaseinputn:n");

scanf("%d",&n);

if(((n%2)!=0)||(n<=4))

printf("inputdataerror!n");

else

{p=1;

do{

p=p+1;

q=n-p;

flagp=1;

for(j=2;j<=(int)(sqrt(p));j++)/*判断p是否为素数*/

{if((p%j)==0)

{flagp=0;

break;/*不是素数,退出循环*/

}

}

flagq=1;

for(j=2;j<=(int)(sqrt(q));j++)/*判断q是否为素数*/

{if((q%j)==0)

{flagq=0;

break;/*不是素数,退出循环*/

}

}

}while(flagp*flagq==0);

printf("%d=%d+%dn",n,p,q);

}

}

第6章数组与指针

一.简答题

1、什么是数组,为什么在C语言中引用数组?

【解答】数组是有序的、且具有相同性质类型的数据集合。引用数组来实现成批地处理数据。

2、在C语言中如何表示一个字符串?

【解答】运用字符型数组来表示字符串。

3、指针是指什么?

【解答】指针就是地址。

二.运行程序写结果

1.以下程序的执行结果是。

main()

{

intk,a[6]={1,2,3,4,5,6};

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

仅供个人学习参考

if(a[k]%2==0)

printf("%d",a[k]);

}

【提示】从后向前把能被2整除的数组元素输出。

【解答】642

2.以下程序的执行结果是。

#include

main()

{

charstr[]="SSSWLIA",c;

intk;

for(k=2;(c=str[k])!='0';k++)

{

switch(c)

{

case'I':++k;break;

case'L':continue;

default:putchar(c);continue;

}

putchar('*');

}

}

【提示】从字符串中第3个字符开始,把符合要求的字符运用输出字符函数putchar()输出;最后在其后输出一个"*"。

【解答】SW*

3.以下程序的执行结果是。

main()

{

charss[10]="12345";

strcat(ss,"6789");

gets(ss);

printf("%s",ss);

}

假设输入"ABC"

【分析与提示】运用字符串连接函数strcat(),把两个串"12345"和"6789"连接,对其重新赋值后,原有数值被刷新输出新值。

【解答】"ABC"

4.以下程序的执行结果是。

#include

main()

{

chara[]="Monday",b[]="day";

strcpy(a,b);

printf("%st%sn",a,b);

printf("%ct%cn",a[4],a[5]);

}

仅供个人学习参考

【分析与提示】把b字符串的内容拷贝到a字符串中,分别显示a和b串内容;再显示数组元素a[4]和a[5]的内容。

【解答】dayday

ay

5.以下程序的执行结果是。

main()

{

intx[8]={8,7,6,5,0,0},*s;

s=x+3;

printf("%d",s[2]);

}

【分析与提示】运用指针显示数组元素值。需要注意的是把数组x第3个元素的地址,赋给了指针变量s,所以s[2]里面存储的是x[5],即0。

【解答】0

6.以下程序的执行结果是。

main()

{

inta=7,b=8,*p,*q,*r;

p=&a;q=&b;

r=p;p=q;q=r;

printf("%d,%d,%d,%d",*p,*q,a,b);

}

【分析与提示】指针变量存储地址,而不是数值。

【解答】8,7,7,8

7.以下程序的执行结果是。

main()

{

chara[]="language",b[]="programe";

char*p,*q;

p=a;q=b;

while(*p&&*q)

{

if((*p)==(*q))printf("%c",*p);

p++;q++;

}

}

【分析与提示】程序功能是,输出两个字符串中相同的字符。

【解答】gae

8.以下程序的执行结果是。

#include

#include

main()

{

chara[80]="AB",b[80]="LMNP";

inti=0;

strcat(a,b);

仅供个人学习参考

while(a[i++]!='0')

b[i]=a[i];

puts(b);

}

【分析与提示】把b串内容连接到a串上,再通过循环对b串重新赋值。

【解答】LBLMNP

三.编程题

1.已有10个数,求它们当中的最大值。

【分析与提示】运用一维数组保存10个数,依次比较保存最大值。

参考代码:

main()

{

inti,a;

intn[10]={8,2,4,6,7,1,0,85,32,54};

a=n[0];

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

if(n[i]>a)a=n[i];

printf("a=%dn",a);

}

2.从键盘输入10个学生的成绩,建立一个一维数组,求学生的平均分。

【分析与提示】把10个学生的成绩保存在一维数组,运用一重循环计算所有成绩的总和,在此基础上计算平均值。

参考代码:

main()

{

inti;

floata[10],sum=0,ave;

printf("输入10个学生的成绩:");

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

{

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

sum=sum+a[i];

}

ave=sum/10;

printf("10个学生的平均成绩是%5.2f。",ave);

}

3.将两个一维整型数组中的对应元素相加后显示出来。

【分析与提示】把数组下标相同的元素值相加。

参考代码:

#include

main()

{

inti;

intx[5]={10,8,7,6,5};

inty[5]={-3,9,-10,-2,4};

仅供个人学习参考

intz[5];

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

z[i]=x[i]+y[i];

printf("n相加后一维数组为:");

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

printf("%d",z[i]);

}

4.线性查找。

【分析与提示】从数组的第一个元素开始,依次将要查找的数和数组中元素比较,直到找到该数或找遍整个数组为止。

参考代码:

main()

{

inttable[10]={2,4,6,8,10,12,14,16,18,20};

intfind=0,i,x;

printf("请输入要找的数:");

scanf("%d",&x);

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

if(x==table[i])

{find=1;break;}

if(find==1)

printf("%d在table[%d]中n",x,i);

else

printf("没有找到数%dn",x);

}

5.求一个4×4矩阵对角线元素之和。

【分析与提示】若设置矩阵行列坐标分别为i和j,则对角线元素下标满足以下条件:或i+j=3。

参考代码:

main()

{

inta[4][4],i,j,sum=0;

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

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

{

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

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

}

printf("对角线元素之和:%d",sum);

}

6.将两个二维数组对应元素加起来,存到另一个二维数组中。

【分析与提示】运用双重循环,把行列下标均相同的元素值相加。a=

1020

3040

b=

14

25

参考代码:5060

36

main()

{

仅供个人学习参考

i==j

inta[3][2]={10,20,30,40,50,60};

intb[3][2]={1,4,2,5,3,6};

intc[3][2];

inti,j;

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

{

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

{

c[i][j]=a[i][j]+b[i][j];

printf("%4d",c[i][j]);

}

printf("n");

}

}

7.找出一个二维数组中的鞍点。

【分析与提示】所谓鞍点指该位置上的数在该行上最大,在该列上最小。注意并不是所有的二维数组都有鞍点。

参考代码:

#defineN3

#defineM3

main()

{

inta[M][N],(*p)[N];/*p为指向一维数组的指针*/

intmax,maxi,maxj;

inti,j,k,m,n;

intflag1=0,flag2=0;

p=a;

printf("给数组输入数据:n");

for(i=0;i

for(j=0;j

scanf("%d",p[i]+j);

for(i=0;i

{

max=*p[i];

for(j=0;j

if(*(p[i]+j)>max)

{max=*(p[i]+j);maxj=j;}

for(k=0,flag1=1;k

if(max>*(p[k]+j))flag1=0;

if(flag1)

{

printf("n第%d行,第%d列的%d是鞍点!n",i,maxj,max);

flag2=1;

}

}

if(!flag2)

仅供个人学习参考

printf("n矩阵中无鞍点!");

}

8.用指针数组给一个整型二维数组输入数值,并求出各行元素的和。

【分析与提示】用二维数组a各行的首地址赋予指针数组p的各个元素,通过此循环嵌套,为各个数组元素赋值。

main()

{

inta[3][3],*p[3],i,j,sum;

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

p[i]=a[i];/*把二维数组a各行的首地址赋予指针数组p的各个元素*/

for(i=0;i<3;i++)/*通过此循环嵌套,为各个数组元素赋值*/

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

scanf("%d",p[i]+j);

printf("和分别为:");

for(i=0;i<3;i++)/*通过此循环嵌套,求各行数组元素的和*/

{

sum=0;

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

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

printf("%d",sum);/*分行输出每一行的和值*/

}

}

9.用指针实现合并两个字符串。

【分析与提示】把第二个字符串中字符逐个赋值给第一个字符串,需要注意的是两个字符数组下标变量的初值不同。

参考代码:

#include

#include

main()

{

chars1[40],s2[20],*p1,*p2;

inti,j,n;

p1=s1;p2=s2;

printf("输入第一个字串:");

gets(p1);

printf("n输入第二个字串:");

gets(p2);

n=strlen(p1);

for(i=n,j=0;*(p2+j)!='0';i++,j++)

*(p1+i)=*(p2+j);

*(p1+i)='0';

printf("n输出合并后字串为:");

puts(p1);

}

10.从输入的5个字符串中找出最长的一个字符串输出。

【分析与提示】运用测试字符串长度函数strlen,进行串比较。

仅供个人学习参考

参考代码:

#include

#include

main()

{

chara[5][80],*sp;

inti;

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

gets(a[i]);

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

if(strlen(sp)

printf("thelongeststringis%s",sp);

}

第7章函数与指针

一.运行程序写结果

1.下列程序运行的结果为。

intx1=30,x2=40;

main()

{

intx3=10,x4=20;

swap(x3,x4);

swap(x2,x1);

printf("%d,%d,%d,%dn",x3,x4,x1,x2);

}

swap(intx,inty)

{x1=x;x=y;y=x1;}

【提示】本题考查全局变量的作用范围。

【解答】10,20,40,40

2.下列程序运行的结果为。

#include

voidnum()

{

externintx,y;

inta=15,b=10;

x=a-b;y=a+b;

}

intx,y;

main()

{

inta=7,b=5;

x=a+b;y=a-b;

num();

printf("%d,%dn",x,y);

}

【分析与提示】用extern进行外部变量说明。

仅供个人学习参考

【解答】5,25

3.下列程序运行的结果为。

main()

{inta[5]={5,10,-7,3,7},i,j,t;

sort(a);

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

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

}

sort(inta[])

{inti,j,t;

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

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

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

}

【提示】该程序的功能是将5个数由小到大进行排序。

【解答】-735710

4.下列程序运行的结果为。

#defineSQR(x)2*x+1

main()

{inta,b,c;

a=3;b=2;c=1;

a*=SQR(b+c)/SQR(b+c);

printf("%dn",a);

}

【提示】a*=SQR(b+c)/SQR(b+c);宏展开为a*=2*b+c+1/2*b+c+1;

【解答】21

5.下列程序运行的结果为。

voidswap1(intx,inty)

{intt;

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

return;

}

voidswap2(int*x,int*y)

{intt;

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

return;

}

main()

{intx=3,y=5;

printf("%d,%dn",x,y);

swap1(x,y);

printf("%d,%dn",x,y);

swap2(&x,&y)?;

printf("%d,%dn",x,y);

}

仅供个人学习参考

【提示】注意指针变量做函数参数时,改变形参的值就等同与改变了实参的值。

【解答】3,5

3,5

5,3

6.下列程序运行的结果为。

longfib(intg)

switch(g)

Case0:return0;

case1:

case2:return1;

return(fib(g-1)+fib(g-2));

main()

{

longk;

k=fib(7);

printf("k=%ldn",k);

【提示】注意函数递归调用的条件。

【解答】k=13

二.编程题

1.已知圆的半径为R,求它的面积。

#include/*包含文件*/

#include/*包含数学库函数*/

#definePI3.14159/*宏定义*/

main()/*主函数*/

{

floatarea(float);/*函数area的原型,即函数说明*/

floatr,s;/*主函数中的局部变量定义*/

printf(“请输入半径:n”);

scanf(“%f”,&r);

s=area(r);/*调用area函数*/

printf(“圆的半径为:%fn”,r);

printf(“圆的面积为:%fn”,s);

}

floatarea(floata)/*定义函数area*/

{floatd;

d=PI*a*a;

return(d);/*返回计算结果*/

}

【提示】本程序由主函数main()和自定义函数area()组成。程序的前2句是文件包含语句,即把输入、输出标准函数和数学函数的文件包含到本程序中。第3句是宏定义语句,即用标识仅供个人学习参考

符PI来代替数字3.14159。

运行:请输入半径:1.1↙

显示:圆的半径为:1.1

圆的面积为:3.801324

2.编写一个函数输出三个数中的最大值。

【提示】在main()函数中输入数据,调用求3个数最大值函数。

intmax(intx,inty,intz)

{

intt;

if(x>=y)t=x;

elset=y;

if(t

return(t);

}

main()

{

intx,y,z;

printf("input3numbers:");

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

printf("max=%dn",max(x,y,z));

}

3.编写一个函数,将一个任意三位数n逆序输出。即若n=456,则输出654。

【提示】将一个三位数n分解为个位、十位和百位分别放入c,b,a中,然后逆序输出。

intrec(intx)

{

inta,b,c;

a=x/100;

b=x%100/10;

c=x%10;

return(c*100+b*10+a);

}

main()

{

intrec(intx);

inty,z;

printf("inputanumber(100-999):");

scanf("%d",&y);

z=rec(y);

printf("thechangednumberis:%dn",z);

}

4.编写比较两字符串是否相等的函数。

【提示】按ASCII码值大小比较,将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到'0'为止。如果全部字符相同,则认为相等,如果出现不同的字符,则以第一个不同的字符的比较结果为准。比较结果由函数值带回。

参考代码:

#include

仅供个人学习参考

intcmp();

main()

{

intresu;

chars1[100],s2[100];

printf("Pleaseinputs1:n");

gets(s1);

printf("Pleaseints2:n");

gets(s2);

resu=cmp(s1,s2);

printf("%s与%s的比较结果是%d.",s1,s2,resu);

}

intcmp(s1,s2)

chars1[],s2[];

{inti=0;

while((s1[i]==s2[i])&&(s1[i]!=0)&&(s2[i]!=0))

i++;

if(s1[i]==’0’&&s2[i]==’0’)

return0;

else

return(s1[i]-s2[i]);

}

5.编写求字符串长的函数。

【提示】字符串的长度不包括'0'在内。

参考代码:

#include

main()

{inttest();

intn;

charstr[100];

gets(str);

n=test(str);

printf("thenumbersis:%dn",n);

}

inttest(str)

charstr[];

{intn=0;

while(str[n]!=’0’)

n++;

return(n);

}

6.编写一个函数判定一个数是否是素数,在主函数中调用该函数,输入一个整数,输出是否是素数的信息。

【分析与提示】由主函数任意输入一个整数m,将其值传递给子函数isprime(m)由子函数判断这个数是否为素数,是return(1),否则return(0)。

参考代码:

仅供个人学习参考

#include

main()

{intm;

printf("Pleaseinputadatam=:");

scanf("%d",&m);

isprime(m);

}

isprime(intn)

{

inti,k;

k=n/2;

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

if(n%i==0)break;

if(i>=k+1)

printf("Thisisaprimenumber");

elseprintf("Thisisnotaprimenumber");

}

7.用指针写一个删除字符串中空格的函数。

【提示】用指针p1指向待处理的字符串,用*p1从串头到串尾逐一走动,每走到一个字符判断其是否为空格,若不是空格,则将其保存到指针*p2中。

参考代码:

#include

voiddele(char*str)

{

char*p1,*p2;

for(p1=p2=str;*p1!=’0’;p1++)

if(*p1==’’)continue;

else*p2++=*p1;

*p2='0';

}

main()

{

charstr[100];

gets(str);

dele(str);

puts(str);

}

8.用指针写合并两个字符串的函数。

【分析与提示】先将字符串str1从串头到串尾逐一拷贝到字符串str3中,接着将字符串str2从串头到串尾逐一拷贝到字符串str3中。

参考代码:

#include

charunitestring(char*str1,char*str2,char*str3)/*合并函数*/

{

inti=0;

while((*str1)!=’0’)

仅供个人学习参考

{*(str3+i)=*str1;

i++;

str1++;

}

while((*str2)!=’0’)

{*(str3+i)=*str2;

i++;

str2++;

}

*(str3+i)=’0’;/*不能自动加入0*/

}

main()

{

charp[50],q[50],r[100];/*r为连接后的字符串*/

printf("Pleaseenterthefirststring:n");

gets(p); /*输入字符串*/

printf("Pleaseenterthesecondstring:n");

gets(q);/*输入字符串*/

unitestring(p,q,r);

puts(r);/*输出结果*/

}

9.输入15个正整数,放在a数组中,要求:奇数放在a数组前部,偶数放在a数组后部。再分别对奇数和偶数排序。

【分析与提示】在main函数中将数组中的奇数放在a数组前部,偶数放在a数组后部。在分别两次调用sort函数将奇数和偶数进行排序。

参考代码:

voidsort();

main()

{

inta[15];

inti,j=14,n=0,t;

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

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

i=0;

while(j>=i)

{

if(a[i]%2!=0)

{i++;n++;}

else

{t=a[i];a[i]=a[j];a[j]=t;j--;}

}

sort(a,n);

sort(&a[n],15-n);

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

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

printf("n");

仅供个人学习参考

}

voidsort(a,n)

inta[];

intn;

{

inti,j,t;

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

for(i=0;i

if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}

}

10.编写一个程序完成“菜单”功能。提供三种选择途径:

(1)求水仙花数(narcissusnumber),找出100至999之间的所有水仙花数。

(2)求出素数(primenumber),找出2至n之间的所有素数。

(3)求Faibonacci数列前n项的值。

#include“math.h”

main()

{intm,xz;

voidnarcissus();

voidprime();

voidfaibonacci();

clrscr();

m=0;

while(m==0)

{printf(“nn”);

printf(“1findnarcissusnumbern”);

printf(“2findprimenumbern”);

printf(“3findFaibonaccinumbern”);

printf(“othernumberexit!n”);

printf(“inputnumberplease!n”);

scanf(“%d”,&xz);

switch(xz)

{case1:narcissus();break;

case2:prime();break;

case3:faibonacci();break;

default:m=1;

}m=1;

}

}

voidnarcissus()

{intk,a,b,c,d;

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

{a=k/100;

b=k%100/10;

c=k%10;

d=a*a*a+b*b*b+c*c*c;

仅供个人学习参考

if(d==k)printf(“%5dn”,k);

}

}

voidprime()

{inti,j,k,n,m=0;

printf(“inputnplease!n”);

scanf(“%d”,&n);

for(i=2;i

{j=sqrt(i);

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

if(k>j)

{m++;

printf(“%6d”,i);

if(m%10==0)printf(“n”);

}

}

}

voidfaibonacci()

{longf1,f2;

intk,n;

printf(“intnplease!n”);

scanf(“%d”,&n);

f1=1;f2=1;

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

{printf(“%8d%8d”,f1,f2);

if(k%20)printf(“n”);

f1=f1+f2;

f2=f1+f2;

}

}

【提示】程序共有4个函数,其中主函数提供了主菜单,允许选择三种情况之一,否则就退出。通过开关语句switch进行选择。为了不断的提供菜单,用while来永远循环。一开始给变量m赋值为0,m=0就继续循环,一旦选择了不存在的情况,则将m置1,循环就结束。

7.2补充习题

一.单选题

1.以下程序的输出结果是( )

fun(intx,inty,intz)

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

main()

{inta=31;

fun(5,2,a);

printf("%d",a);

}

A、0 B、29 C、31 D、无定值

【分析与提示】变量作参数时,形参值的改变不会影响实参的值。

仅供个人学习参考

【解答】答案:C

2.当调用函数时,实参是一个数组名,则向函数传送的是( )

A、数组的长度 B、数组的首地址

C、数组每一个元素的地址 D、数组每个元素中的值

【解答】答案:B

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

intf()

{staticinti=0;

ints=1;

s+=i;i++;

returns;

}

main()

{inti,a=0;

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

printf("%dn",a);

}

A、20 B、24 C、25 D、15

【分析与提示】自动变量在函数每次调用时,都进行初始化,而静态变量只在编译阶段初始化一次。

【解答】答案:D

4.以下程序运行后的输出结果是( )

f(intb[],intm,intn)

{inti,s=0;

for(i=m;i

returns;

}

main()

{intx,a[]={1,2,3,4,5,6,7,8,9};

x=f(a,3,7);

printf("%dn",x);

}

A、10 B、18 C、8 D、15

【分析与提示】数组名作参数时传送的是数组的首地址。

【解答】答案:A

5.当执行下面的程序时,如果输入ABC,则输出结果是( )

#include"stdio.h"

#include"string.h"

main()

{charss[10]="1,2,3,4,5";

gets(ss);strcat(ss,"6789");printf("%sn",ss);

}

A、ABC6789 B、ABC67 C、12345ABC6 D、ABC456789

【分析与提示】注意库函数gets()、strcat()的用法。

【解答】答案:A

6.以下程序运行后的输出结果是( )

仅供个人学习参考

voidfun(char*c,intd)

{*c=*c+1;d=d+1;

printf("%c,%c,",*c,d);

}

main()

{chara='A',b='a';

fun(&b,a);

printf("%c,%cn",a,b);

}

A、B,a,B,aB、a,B,a,BC、A,b,A,bD、b,B,A,b

【分析与提示】注意指针作参数与普通变量作参数的“值传递”。

【解答】答案:D

7.以下程序运行后的输出结果是( )

voidsort(inta[],intn)

{inti,j,t;

for(i=0;i

for(j=i+1;j

if(a[i]

{t=a[i];a[i]=a[j];a[j]=t;}

}

main()

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

sort(&aa[3],5);

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

printf("%d,",aa[i]);

printf("n");

}

A、1,2,3,4,5,6,7,8,9,10,

B、10,9,8,7,6,5,4,3,2,1,

C、1,2,3,8,7,6,5,4,9,10,

D、1,2,10,9,8,7,6,5,4,3,

【分析与提示】注意实参的“值”。

【解答】答案:C

8.以下程序运行后的输出结果是( )

intf(intn)

{if(n==1)return1;

elsereturnf(n-1)+1;

}

main()

{inti,j=0;

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

j+=f(i);

printf("%dn",j);

}

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

【分析与提示】本题为递归调用。

仅供个人学习参考

【解答】答案:B

二.运行程序写结果

1.下列程序运行的运行结果为。

#include"stdio.h"

main()

{

inti,num;

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

{num=2;

printf("nThenumequal:%dn",num);

num++;

{

staticintnum=1;

printf("nTheinternalblocknumequal:%dn",num);

num++;

}

}

}

【分析与提示】注意static的用法。

【解答】Thenumequal:2

Theinternalblocknumequal:1

Thenumequal:2

Theinternalblocknumequal:2

Thenumequal:2

Theinternalblocknumequal:3

2.下列程序运行的运行结果为。

#include"stdio.h"

inta,b,c;

voidadd()

{externinta;

c=a+b;

}

voidmain()

{a=b=4;

add();

printf("Thevalueofcisequalto%dn",c);

}

【分析与提示】注意xternal的用法。

【解答】Thevalueofcisequalto8

3.下列程序运行的运行结果为。

voidswap(int*a,int*b)

{int*t;

t=a;a=b;b=t;

}

main()

{intx=3,y=5,*p=&x,*q=&y;

仅供个人学习参考

swap(p,q);

printf("%3d%3dn",*p,*q);

}

【分析与提示】指针作参数时,形参指针的改变不会影响实参。

【解答】35

三.改错题

1.下列给定程序中,函数fun的功能是计算正整数num的各位上的数字之平方和。

例如,输入352,则输出应该是38;若输入328,则输出应该是77。

请改正程序中的错误,使它能得出正确的结果。

注意,不要改动main函数,不得增行或删行,也不得更改程序的结构。两处错误分别在/**********found************/的下一行。

程序代码:

#include

#include

longfun(longnum)

{

/**********found************/

longk=1;

do

{

k+=(num%10)*(num%10);

num/=10;

/***********found***********/

}while(num)

return(k);

}

main()

{

longn;

clrscr();

printf("n Pleaseenteranumber:");

scanf("%ld",&n);

printf("n %ldn",fun(n));

}

【分析】错误1:k用来存放各位数字的平方和,初值应为0。错误2:语法错误。

【解答】(1)longk=0;(2)while(num);

2.下列给定程序中,函数fun的功能是:在字符串str中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。

例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH

请改正程序中的错误,使它能得出正确的结果。

注意,不要改动main函数,不得增行或删行,也不得更改程序的结构。两处错误分别在/**********found************/的下一行。

参考代码:

#include

voidfun(char*p)

{

仅供个人学习参考

charmax,*q;

inti=0;

max=p[i];

while(p[i]!=0)

{

if(max

{

max=p[i];

/**********found************/

p=q+i;

}

i++;

}

/***********found***********/

while(q

{

*q=*(q-1);

q--;

}

p[0]=max;

}

voidmain()

{

charstr[80];

printf("enterastring:");

gets(str);

printf("ntheoriginalstring:");

puts(str);

fun(str);

printf("nthestringaftermoving:");

puts(str);

}

【分析与提示】本例考查指针指向字符串的操作。第一个错误出在p=q+i;这一行,经过观察发现,q是没有赋初值的指针,这样的指针指向不明确,是野指针,所以必须给q赋初值,这一语句更改为q=p+i;就对了,作用是把q定位在字符e所在的位置。因此在程序中,q的作用总是指向当前最大的字符。第二个错误比较隐蔽,单从语法上检查不出来,但是分析程序的作用后可发现p是数组的首地址,所以它总是小于或等于q的,而第二个while循环的作用是把e前面的字符顺次往后挪动,所以,这里的循环条件应该是q>p。

【解答】(1)q=p+i;(2)while(q>p)

四.编程题

1.已知e=1+1/1!+1/2!+1/3!+…+1/n!,试用公式求e的近似值,要求累加所有不小于10-6的项值。用函数fun完成任何数的阶乘。

【分析与提示】用主函数完成1与1/1!到1/n!的相加,直到1/n!的值小于10-6,通过形参传递给子函数fun,用1×2×3×…×n求n的阶乘。

参考代码:

#include

仅供个人学习参考

intfun();

main()

{

inti;

floate,n;

e=1.0;

i=1;

n=1.0;

while(n>1.0e-6)

{n=1.0/fun(i);

i++;

e=e+n;

}

printf("%fn",e);

}

intfun(inti)

{intj,k;

k=1;

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

k=k*j;

return(k);

}

输出结果:2.718215

2.请编写函数fun(),该函数的功能是:将两个两位的正整数a,b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。

例如,当a=45,b=12时,调用到该函数后,c=5142。

注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中添入所编写的若干语句。

部分源程序:

#include

#include

voidfun(inta,intb,long*c)

{

*c=a%10*1000+b/10*100+a/10*10+b%10;

}

main()

{inta,b;

longc;

clrscr();

printf("Inputa,b:");

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

fun(a,b,&c);

printf("Theresultis:%ldn",c);

}

3.请编写函数fun(),该函数的功能是:将s所指字符串中ASCII码值为偶数的字符删除,仅供个人学习参考

串中剩余字符形成一个新串放在t所指的数组中

例如,若s所指字符串中的内容为ABCDEFG12345,最后t所指的数组中的内容应是ACEG135。

注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中添入所编写的若干语句。

部分源程序:

#include

#include

#include

voidfun(char*s,chart[])

{

………

}

main()

{

chars[100],t[100];

clrscr();

printf("nleaseenterstrings:");

scanf("%s",s);

fun(s,t);

printf("nTheresultis:%sn",t);

}

参考代码:

inti=0;

for(;*s!='0';s++)

if(*s%2==1)

t[i++]=*s;

t[i]='0';

4.Hanoi汉诺塔问题。

【分析】这是一个典型的用递归方法解决的问题。问题是这样的:有三根针A、B、C,A针上有64个盘子,盘子大小不等,大的在下,小的在上。要求把这64个盘子从A针移到C针,在移动的过程中可以借助B针,每次只允许移动一个盘子,而且在移动过程中三根针上都保持大盘在下,小盘在上。编写程序并打印出移动的步骤。

将n个盘子从A针移到C针可以分解为以下三个步骤:

①将A上n-1个盘子借助C针先移到B针上。

②把A针上剩余的一个盘子移到C针上。

③将n-1个盘子从B针借助A针移到C盘上。

例如:要想将A针上的3个盘子移到C针上,可以分解为以下三步:

①将A针上的2个盘子移到B针上(借助C针)。

②将A针上的一个盘子移到C针上。

③将B针上的2个盘子移到C针上(借助A针)。

其中第②步可直接实现。

第①步又可以用递归方法分解为:

a、将A上一个盘子从A移到C。

b、将A上一个盘子从A移到B。

c、将C上一个盘子从C移到B。

第③步可以分解为:

仅供个人学习参考

a、将B上一个盘子从B移到A上。

b、将B上一个盘子从B移到C上。

c、将A上一个盘子从A移到C上。

将以上综合起来,可以得到移动的步骤为:

AC,AB,CB,AC,BA,BC,AC

上面第①步和第③步,都是把n-1个盘子从一个针移到另一个针上,采用的方法是一样的,只是针的名字不同而已。为使之一般化,可以将①步和③步表示为:

将“one:”针上的n-1个盘子移到“two”针上,借助“three”针。

只是在①步和第③步中,one、two、three和A、B、C的对应关系不同。对于第①步,对应关系是:one---A,two---B,three---C。对于第③步,对应关系是:one----B、two---C、three---A。因此,可以将上面三个步骤分成两类操作:

第一类:将n-1个盘子从一个针移到另一个针上(n>1)。这是一个递归过程。

第二类:将1个盘子从一个针上移到另一个针上。

下面编写程序,分别用两个函数实现以上两类操作,用hanoi函数实现第一类操作,用move函数实现上述第二类操作。hanoi(n,one,two,three)表示将n个盘子从“one”针移动到“three”针,借助“twe”针,move(getone,putone)表示一个盘子从“getone”针移动到“putone”针。getone和putone也是代表A、B、C针之一,根据每次不同情况分别去A、B、C代入。

程序如下:

voidmove(chargetone,charputone)

{

printf("%c--->%cn",getone,putone);

}

voidhanoi(intn,charone,chartwo,charthree)

/*将n个盘子从one借助two,移到three*/

{

if(n==1)move(one,three);

else{hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

main()

{intm;

printf("inputthenumberofthediskes:");

scanf("%d",&m);

printf("thesteptomove%3ddiskes:n",m);

hanoi(m,'A','B','C');

}

程序运行结果如下:

Inputthenumberofdiskes:3

Thesteptomove3diskes:

A----C

A----B

C----B

A----C

B----A

仅供个人学习参考

B----C

A----C

第8章结构体与共用体

一.简答题

1.结构体类型与以前的标准数据类型有什么区别?

【解答】

(1)结构体类型是一种构造出来的数据类型。它具体代表多少成员还需要由用户定义。基本类型不需要用户定义而可以直接使用,而结构体类型必须先定义类型再使用。

(2)结构体类型是复合数据类型,可简单,也可复杂,而简单数据类型则比较单纯。

(3)用简单类型定义的变量一般都可直接参与多种运算,而结构体变量则往往只能对其成员进行多种运算,对整个结构体变量适用的运算很少。

2.结构体类型与共用体类型有什么异同?

【解答】

(1)结构体和共同体都是构造数据类型,使用它们都可存储多种类型的数据,可以方便地组织不同类型的数据。

(2)结构体占用的空间是所有成员所占用空间的和,而共用体则是最大成员所占据的空间。结构体重在组织多种类型的数据,从而构造一个复杂的数据类型,而共用体重在强调内存的共享与重复使用。

3.枚举类型适用于什么场合?

【解答】枚举类型用于程序中某个项目的所有可能选项是固定的,单一的表达场合时。

4.动态存储分配有什么作用?

【解答】使用动态存储分配内存空间,可以让程序适应用户对内存变化的需要,及事先不能确定内存用量的场合。它以小的牺牲(定义的指针也占用空间)换来了内存使用效率的提高。

5.类型定义有什么意义?

【解答】所谓类型定义,并不是定义了一种新类型,而是为了书写方便或使程序易于阅读,由程序员规定的一种已有类型的新名称而已。

二.运行程序写结果

1.以下程序的执行结果是。

#include

structstudinf{

char*name;

floatgrad;

}*p;

main()

{

structstudinfa;p=&a;

p->grad=95.5;

p->name=(char*)malloc(20);

strcpy(p->name,"wangpi");

printf("%st%2fn",p->name,p->grad);

}

【分析与提示】本题旨在检查读者通过指针访问结构体变量的能力。同时,练习指向运算符的用法、动态分配的使用,及结构体中指针成员的使用方法。

【解答】wangpi 95.500000

2.以下程序的执行结果是。

仅供个人学习参考


本文标签: 提示 函数 程序 结果 变量