c语言课后答案

更新时间:2024-04-09 16:14:01 阅读量: 综合文库 文档下载

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

第1章 课后习题参考答案

1.简述计算机系统的基本组成及其工作原理。

解:一个完整的计算机系统包括硬件系统和软件系统两大部分。按照冯.诺依曼的计算机结构思想,计算

机硬件系统由运算器、控制器、存储器、输入设备和输出设备五部分构成。计算机软件是指使计算机正

常运行需要的程序及相关技术文档的总称。软件依赖硬件的物质条件,而硬件则需要在软件的支配下才能有效的工作。 按照冯·诺依曼存储程序的原理,计算机系统在控制器的控制下,通过输入设备输入程序或数据,并自动存放在存储器中。然后控制器通过地址访问存储器,逐条取出指令、分析指令,并根据指令产生的控制信号,控制其他部件执行这条指令中规定的任务。这一过程周而复始,确保程序自动执行。

2.将下列各数转换成十进制数。

(1011.001)2 ,(127.75)8 ,(A1.D4)16

310-3

解:(1011.001)2=(1×2+1×2+1×2+1×2)10=(11.125)10

(127.75)8=(1×8+2×8+7×8+7×8+5×8)10=(87.953125)10 (A1.D4)16=(10×16+1×16+13×16+4×16)10=(161.828125)10

3.将下列各数转换成二进制数、八进制数和十六进制数(无法精确表示时,二进制取6位小数,八进制和十六进制数取2位小数)。

(25.34)10 ,(125.25)10 ,(258)10,(783.8275)10 解:(25.34)10=(11001.010101)2=(31.25)8=(19.57)16

(125.25)10=(1111101.01)2=(175.2)8=(7D.4)16

(258)10=(100000010)2=(402)8=(102)16

(783.8275)10=(1100001111.110100)2=(1417.64)8=(30F.D3)16

1

0

-1

-2

2

1

0

-1

-2

4.设机器字长为16,分别写出下列各值的原码、反码和补码。

(127)10 ,(-127)10 ,(-128)10 ,(-46)10 ,(32767)10,(-32768)10 解:[127]原 = [127]反= [127]补 = 0 000000001111111

[-127]原= 1 000000001111111 [-127] 反=1 111111110000000 [-127]补=1 111111110000001

[-128]原= 1 000000010000000 [-128] 反=1 111111101111111 [-128]补=1 111111110000000

[-46]原= 1 000000000101110 [-46] 反=1 111111111010001 [-46]补=1 111111111010010

[32767]原= [32767]反= [32767]补 =0 111111111111111

[-32768]原=1 000000000000000 [-32768]反=1 111111111111111 [-32768]补=1 000000000000000

5.已知X的补码,写出其原码与真值。

(1)[X ]补 = 01010011 (2)[X ]补 = 10001001 (3)[X ]补 = 11111111 (4)[X ]补 = 11000000 解:

(1)由于符号位为“0”,表示正数,所以,[X ]原= [X ]补= 01010011,(X)10 =83 (2)由于符号位为“1”,表示负数,数值位按位取反后为1110110,再加1,则该数的原码为1 1110111,真值为-119。

(3)由于符号位为“1”,表示负数,数值位按位取反后为0000000,再加1,则该数的原码为1 0000001,真值为-1。

(4)由于符号位为“1”,表示负数,数值位按位取反后为0111111,再加1,则该数的原码为1 1000000,真值为-64。

6.设机器字长为16位。表示带符号整数,数值位15位,符号位1位,试分析所能表示的最大整数与最小整数分别是多少?

解:如果这16位二进制用来表示带符号的整数,由于最高位为符号位,实际的数值有效位只有15位,最小可以表示到-32768(机器码为1 000000000000000),最大可表示到+32767(机器码为0 111111111111111)。

7.设机器字长为32位。浮点表示时,数符1位;阶码8位,用补码表示;尾数23位,用补码表示。试分析规格化数所能表示的数的范围。

解:一个浮点数可以表示为M·2E (E为阶码, M为尾数)的形式。阶码(指数位)决定浮点数的数量级,32位的浮点数中,阶码为8位且用补码表示,其取值范围是-128~127,所以,

-128-3812738

32位机器数可以表示的数值范围是2(即10)到2(即10)。

第2章 课后习题参考答案

1.C语言的结构特点是什么?

(1)中级语言 (2)程序设计结构化 (3)数据类型丰富 (4)运算符丰富

(5)C语言是一种高效编译型语言 (6)语言简洁、库函数丰富 2.填空题

(1)每个用C语言编写的程序必须有且只能有一个 main() 函数。 (2)C源程序的基本单位是 函数 。

(3)C语言中,每个语句的结束符是 分号(;) 。

(4)任何一个函数都由 函数首部 和 函数体 两部分组成。 3.判断下列程序的作用。

(1)#include

void main() {

}

float floata,floatb,floatc,aver; printf(“请输入三个实型数\\n”);

scanf(“%f,%f,%f”,&floata, &floatb, &floatc); aver = (floata + floatb + floatc)/3;

printf(“\\n average = %f \\n”,aver); //屏幕显示average的值____________ 作用:从键盘输入3个实型数,求它们的平均值,并将该值打印在屏幕上。 (2) #include

int xmin(int integerx,int integery) {

int integerm;

if(integerx < integery)

integerm = integerx;

else

integerm = integery;

return integerm; }

void main() {

int integera, integerb,min; printf(\请输入两个整形数\\n\ scanf(\ min = xmin(integera,integerb);

printf(\ //屏幕显示min }

作用:从键盘输入任意2个整数,主函数调用xmin函数,比较两个数的大小,并将较小者打印在屏幕上。

4.编写一个C程序,在屏幕上显示一行字符(自己选择)。

#include void main() { }

printf(\屏幕显示HelloWorld!

5.编写一个C程序,在屏幕上显示3行字符(自己选择)。

#include void main() { int i;

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

printf(\ //屏幕显示 3行HelloWorld!

}

}

6.图案设计:用任一字符制作三角形、菱形、正方形、五角星等图案。

选择字符为“*”:

三角形代码:

#include void main() {

printf(\ printf(\ printf(\ printf(\ printf(\}

三角形图形如下:

菱形代码:

#include

void main() {

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\

printf(\

}

菱形图形如下:

正方形代码:

#include void main() {

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\}

正方形图形如下:

五角形代码:

#include int main() {

printf(\printf(\printf(\printf(\printf(\printf(\printf(\

printf(\printf(\

printf(\printf(\printf(\printf(\printf(\

printf(\printf(\printf(\printf(\printf(\printf(\printf(\

printf(\printf(\printf(\printf(\printf(\printf(\printf(\

printf(\printf(\printf(\printf(\printf(\printf(\printf(\return 0; }

五角形图形如下:

第3章 课后习题参考答案

1、字符常量与字符串常量有什么区别?

答:字符常量由单引号引起来,字符串常量由双引号引起来;

字符常量只有一个字符构成,字符串常量由一个或多个字符构成;

字符常量在内存中占一个字节,字符串常量占据的字节数为字符的个数+1; 字符常量没有结束标志位,字符串常量有结束标志位。 2、(1)integera1=a, integera2=b, integera3=? (2)integerx=11,integery=21,integerm=10,integern=21 integerx=10,integery=20,integerm=11,integern=20 (3)1040 (4)11,1,0,1 (5)32 16 15

3、(1)2.500000 (2)72.000000 4、(1)24 (2)10 (3)60 (4)0 (5)0 (6)0

5、(1)0 (2)1 (3)2 (4)0 (5)1 (6)1

6、从键盘上输入一个实数,把它强制转换为整型数据,并输出到屏幕上。 void ForceCon() { float reala;

scanf(“%f”,&reala); printf(“%d”,(int)reala); }

void main() {

ForceCon(); }

7、已知integera=15,计算void fun1()

{ int integera=15; float realb;

realb=( integera*100)/8; printf(“realb=%f”,realb); }

void main() {

integera*1008,并将结果赋给变量realb

fun1();

}

8、设计程序,输入实型数据reala、realb,然后输出reala、realb的值 void RealEval() { float reala,realb;

printf(“input two real:”);

scanf(“%f%f”,& reala,& realb);

printf(“\\nreala=%f, realb=%f”, reala, realb); }

void main() {

RealEval(); }

第4章 课后习题参考答案

1.什么是算法?它具有那些特点?

答:从广义上讲,算法就是指为解决特定问题而采取的有限操作步骤。算法具有五个特点: (1)有穷性 (2)确定性

(3)有零个或多个输入 (4)有一个或多个输出 (5)可执行性

2.程序设计的一般步骤是什么?

(1)分析问题

(2)画出程序的基本轮廓 (3)实现该程序

3a:编写程序 3b:测试和调试程序 3c:提供数据打印结果

3.试述三种基本结构的特点,你能否自己另外设计两种基本结构(要符合基本结构的特点)? 答:顺序结构:算法的步骤是依照先后顺序依次执行的。

选择结构:算法的步骤是按照指定的条件实现程序执行流的多路分支,即根据某一条件选循环结构:算法的步骤是按给定的条件重复地执行指定的程序段或模块。

择下一步的执行操作。

4.什么叫做结构化程序设计?它的主要内容是什么?

答:结构化程序设计是以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,这样使完成每一个模块的工作变单纯而明确,为设计一些较大的软件打下了良好的基础。

内容包含4点:

(1)编写的程序易读易理解。

(2)参加设计的人员必须按照统一规则、同一原则进行程序设计。 (3)顺序结构、选择结构和循环结构是大而复杂程序的三大基本结构。 (4)采取“自上而下,逐步细化”和模块化的设计方法。

5.为下列问题设计算法,分别用传统流程图、N-S流程图和伪代码表示出来。 (1)输入一个圆的半径,计算圆的周长和面积。 解: #define PAI 3.14 scanf(“输入圆的半径r”); 求解圆的周长C = 2 * PAI * r; 求解圆的面积S = PAI * r * r; (2)有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换(即A瓶原来盛醋,现在改盛

酱油,B瓶则相反)。

解: 存在空瓶C, 将A瓶的导入C,C=A; 将B瓶的代入A,B=A; 将C瓶的倒入B,B=C (3) 求方程式 ax2?bx?c?0的根。分别考虑:有两个不等的实根;有两个相等的实根。

2解: if( b?4*a*c?0) 2 输出该方程有两个不等的实根; else if(b?4*a*c??0) 输出该方程有两个相等的实根; (4)有3个数num1、num2、num3,要求按大小顺序把它们打印出来。

解: if(num1 > num2) { if(num2 > num3) 输出顺序num1,num2,num3; else if(num3 > num1) 输出顺序num3,num1,num2; else if(num3 > num2) 输出顺序num1,num3,num2; }else { if(num1 > num3) 输出顺序num2,num1,num3; else if(num3 > num2) 输出顺序num3,num2,num1; else if(num3 > num1) 输出顺序num1,num3,num2; }

(5) 判断一个数n能否同时被3和5整除。 if(n%3等于0,并且n%5 等于0) 输出n

(6)1~1000之间3的倍数的整数有多少个? for(i=1;i<1000;i++) if(n%3等于0) num ++; 输出num (7)求1+2+3+。。。。。。。。。+100的和。 for(i=1;i<=100;i++) sum += i;将每个数加起来

` 输出sum (8) 将100~200之间的所有素数打印出来。 for (i=100;i<=200;i++) { for(j=1;j

第5章 课后习题参考答案

1.C语言中的语句有哪几类?

答:

(1)表达式语句 (2)函数调用语句 (3)空语句 (4)控制语句 (5)复合语句

2.怎么区分表达式和表达式语句?什么时候用表达式,什么时候用表达式语句?

答:表达式的后面加上分号“;”就构成了表达式语句。一般做条件判断的时候用表达式;而表达式语句一般用于计算和为变量赋值。 3.C语言中如何实现输入、输出功能?

答:C程序的基本输入输出操作是由操作系统提供的库函数实现的,没有输入输出语句。由于标准输入输出库函数的原型放在头文件stdio.h中,因此在编写程序时,要用编译预处理命令“#include”将头文件stdio.h包含到用户源文件中。 4.写出下面程序的运行结果。

(1)#include

void printChar() {

char c1 = 'a',c2 = 'b',c3 ='c',c4 = '\\101',c5 = '\\116'; printf(\ printf(\}

void main()

{

printChar(); }

运行结果: aabb abc A N (2)#include

void printData() {

int a=5,b=7;

float x=67.8546,y=-789.124; char c='A'; long n=1234567; unsigned u=65535;

printf(\ printf(\ printf(\ printf(\

printf(\ printf(\ printf(\ printf(\ printf(\

printf(\}

void main() {

printData(); }

运行结果: 57 5 7 67.854599,-789.124023 67.854599 ,-789.124023 67.85, -789.12,67.8546,-789.1240,67.854599,-789.124023 6.785460e+01, -7.89e+02 A,65,101,41 1234567,4553207,12d687 65535,177777,ffff,65535 computer, Eng (3)#include

void printData() {

char c='a'; int a=5,b=6;

float f=12.345,g=56.789; printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\}

int main() {

printData(); return 0; }

运行结果: a A 5,6 5, 6 12.345000,56.789001 12.35,56.79 69.13 (4)#include

void fun() {

int i,j; i=j=2; if(i==1)

if(i==2)

printf(\

else

printf(\

printf(\}

int main() {

fun(); return 0; }

运行结果:2 (5)#include

void select() {

int x=3; switch(x) { } }

int main() {

select(); return 0; }

case 1:

case 2: printf(\case 3: printf(\case 4:

case 5: printf(\default: printf(\

运行结果: x = 3 x > 3 x unknown (6)#include

void relatOp() {

int x=1,y=2,z=3; x +=y += z;

printf(\ printf(\ printf(\

printf(\ printf(\

x=3; y=z=4;

printf(\ printf(\}

int main() {

relatOp(); return 0; }

运行结果: 6 5 6,6 9 7,9 0 1 5.指出下面程序段中的错误。 (1)int a,b,c ,d,e;

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

//scanf传入值需加地址符号

e = a*b + c*d; //更正为scanf(“%d%d%d”,&a,&b,&c,&d)

pritnf(“%d\\n”,e);

(2)#include

void relatOp() {

int a,b,c,t;

scanf(\ if(a>b)&&(a>c)

//产生歧义,更改为if((a>b)&&(a>c))

{

}

if(a

if(b

printf(\

else

printf(\

//产生歧义,更改为if((a

}

printf(\

void main() {

relatOp(); }

6.如果下列程序执行后t的值是4吧,则执行时输入a、b值的范围是什么?

#include void relatOp() {

int a,b,s=1,t=1; scanf(\ if(a>0)

s +=1;

if(a>b)

t +=s;

else if(a==b)t=5;

printf(\}

void main() {

relatOp(); }

else t=2*s;

答案:b>a>0 7.若a=3,b=4,c=5,x=1.3,y=2.4,z=-3.6,u=52769,n=123456,c1=’a’,c2=’b’。请编写程序输出以下结果。

#include int main() {

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

float x=1.3,y=2.4,z=-3.6; unsigned u=52769; long n=123456; char c1='a',c2='b';

printf(\ printf(\

printf(\ printf(\ printf(\ or %d\\n\ printf(\ or %d\\n\ return 0; }

运行结果: a= 3,b= 4,c= 5 x=1.300000,y=2.400000,z=-3.600000 x+y= 3.70,y+z= -1.2,z+x= -2.3 u= 52769,n= 123456 c1='a' or 97 c2='b' or 98 8.下面的程序运行时在键盘上如何输入?如果a=3,b=4,x=8.5,y=71.82,c1=A,c2=a,请写出对应的每个scanf()函数的输入情况。

解:#include

void scanfDate() {

int a,b; float x,y; char c1,c2;

scanf(\ scanf(\

getchar(); //接收空格符,以免影响后面为字符赋值的语句

scanf(\

getchar(); //接收空格符,以免影响后面为字符赋值的语句 scanf(\

//对两个字符赋值,应该单独赋值,否则第二个字符,可能为空

printf(\

}

int main() {

scanfDate(); return 0; }

9.程序完成的功能是:从键盘输入若干个学生的成绩并输出最高成绩和最低成绩,当输入负数时结束输入。填空,使程序完成操作。

解:#include

void maxAndMin() {

float f,max,min; scanf(\ max= f; min =f;

while([1])

//f>0 当输入的数大于0时,执行循环语句

{

if(f>max) max=f;

if([2]) min =f; scanf(\

//f

}

printf(\ //屏幕显示_____max ____min值_______ }

int main() {

maxAndMin(); return 0; }

10.从5~100之间找出能被5或7整除的数。

解:#include

int main() {

int i;

for(i=6;i<100;i++) {

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

//如果i对5取余为0或i对7取余为0

}

printf(\

return 0; }

运行结果:

11.有3个整数a,b,c,由键盘输入,输出其中最大的数。

解:#include

int main() {

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

printf(\请输入a,b,c!\\n\ scanf(\ int max=0;

if(a>=b)

//max表示a和b中较大的一个

max = a ;

else

max = b;

printf(\

if(max > c)

//比较c与max,谁大输出谁

printf(\

else

printf(\

return 0; }

12.试编程判断输入的正整数是否既是5又是7的整数倍数,若是,则输出yes;否则输出no。

解:#include

int main() {

int i=0;

scanf(\ if(i>0) {

if((i%5==0)&&(i%7==0))

//如果i对5取余为0并且i对7取余为0

}

printf(\

else

printf(\

else

printf(\请输入正整数!\\n\

return 0; }

13.任意输入10个数,计算所有整数的和、负数的和以及10个数的和。

解:#include

int main() {

int i=0;

int num=0,sum=0,sum1=0,sum2=0; 数的和

//sum为所有数的总和,sum1为正数的和,sum2为负

while(i<10)

{ }

sum = sum1 +sum2;

scanf(\if(num > 0)

sum1 += num;

else

sum2 +=num;

i++;

printf(\//将正数和,负数和以及总和打印在屏幕上

return 0;

}

14.用40元钱买苹果、西瓜和梨功100个,且三种水果都有。已知苹果0.4元一个,西瓜4元一个,梨0.2元一个。问可以买多少个?请编写程序输出所有购买方案。

解:#include

int main() {

int x,y,z;

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

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

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

if((x+y+z==100)&&(0.4*x+4*y+z*0.2==40)) //总个数等于100,总钱数等于

40,这两个条件必须同时满足

{ }

printf(\苹果=%d,西瓜=%d,梨=%d\\n\

}

return 0;

运行结果:

15.一个数如果恰好等于它的因子之和,则这个数称为“完数”。如6的因子是1、2、3,而6=1+2+3。因此6是一个完数。编写程序找出1000之内的所有完数。

解:#include

int main() {

int sum,i,j;

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

sum =0;

for(j=1;j

if(i%j==0) //判断j是否是该数的因子

}

sum += j;

if(sum == i)

}

{ }

printf(\

return 0; }

运行结果:

16.打印出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。如153?1?5?3,所以153是水仙花数。

解:#include

int main() {

int i=0,a,b,c;

for (i=100;i<1000;i++) {

a=i; //取个位数 b=(i/10); //取十位数 c=(i/100); //取百位数 if(a*a*a+b*b*b+c*c*c == i)

printf(\

333

}

return 0; }

运行结果:

17.编写程序,从键盘输入6名学生的5门课成绩,分别统计出每位学生的平均成绩。

解:#include

int main() {

int i=0;

float average =0.0,a,b,c,d,e; for(i=1;i<=6;i++) {

average =0.0;

scanf(\

average = (a+b+c+d+e)/5; //求其5门课的平均值 printf(\第 %d 名的成绩是:%f\\n \

}

return 0; }

18.每个苹果0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直到购买的苹果个数不超过100的最大值,编写程序求每天花多少钱?

解:#include

int main() {

int i=0;

for(i=2;i<100;i=2*i) //i=i*2,就是每天买前一天的2倍

{

}

return 0; }

运行结果:

printf(\

第6章 课后习题参考答案

1.改正下面这个源程序的错误。

#include void main() { int i,j,list[10]; for(i=0;i<10;i++) { list[i]=2*i+3; for(j=9;j>=0;j--) printf(\d\\n\list[j]); } } 2.指出下面合法的说明语句。

A. int abcd[0x80]; B. char 9ab[10]; C. char chi[-200]; D. int aaa[5]={3,4,5}; E. float key[]={3.0,4.0,1,0}; F. char disk[];

G. int n,floppy[n]; H. int cash[4]={1,2,3,4,5,6};

解答:A,D,E为合法的说明语句。B中变量名定义错误,C中数组大小为负数,F未定义数组大小,

G中数组大小用变量定义,H数组大小与初始化数据个数不符,它们都是错误的。 3.根据以下说明,写出正确的说明语句。 (1)men是一个有10个整型元素的数组。

解答:int men[10];

解答:float step[4]={ 1.9, -2.33, 0, 20.6}; 解答:int grid[4][10];

(2)step是一个有4个实型元素的数组,元素值分别为1.9, -2.33, 0, 20.6。

(3)grid是一个二维数组,共有4行、10列整型元素。 4.写出下面程序的运行结果。

(1)程序运行结果: 6 。

void main() { char ch[7]={\65ab21\}; int i,s=0; for(i=0; ch[i]>='0'&&ch[i]<='9'; i+=2) s=10*s+ch[i]-'0'; printf(\d\\n\,s); } (2)程序运行结果: 10010 。

void main() { int y=18,i=0,j,a[8]; do { a[i++]=y%2; y=y/2; }while(y>0); for(j=i-1;j>=0;j--) printf(\d\a[j]); } (3)程序运行结果: bcdefga

cdefgab defgabc 。 void main() { char a[8]=”abcdefg”,temp; int i,j; for(i=0;i<3;i++) { temp=a[0]; for(j=1;j<7;j++) a[j-1]=a[j]; a[6]=temp; a[7]='\\0'; printf(\%s\\n\a); } } (4)运行下面程序时,输入I like the young elephant后的输出结果是 见下图 。

void main() { int i=0,k,ch; int num[5]={0}; char alpha[]={'a','e','i','o','u'}, str[80]; gets(str); while(str[i]) { for(k=0;k<5;k++) if(str[i]==alpha[k]) { num[k]++; break; } i++; } for(k=0;k<5;k++) if(num[k]) printf(\%c:%d\\n\alpha[k],num[k]); } 解答:程序功能为统计输入字符串中元音字母的个数。 5.读懂下面的程序并填空。

void main() { char str[80]; int i=0; gets(str); while(str[i]!=0) { if(str[i]>='a'&&str[i]<='z') str[i]-=32; i++; } puts(str); } 程序运行时,如果输入upcase,屏幕显示 UPCASE 。 程序运行时,如果输入Aa1Bb2Cc3,屏幕显示 AA1BB2CC3 。

解答:程序功能为将输入字符串中小写英文字母转换为大写字母,其他符号保持不变。

6.输入一个字符串(串长不超过60),将字符串中连续的空格符保留一个。例如:输入字符串“I am a student.”,则输出字符串为“I am a student.”。

#include #include void main() { char str[60]; int i; gets(str); for(i=1; str[i]!='\\0' ; i++) if(str[i-1]==' '&&str[i]==' ') { strcpy(str+i-1,str+i); //此处选择适当的函数 i--; } puts(str) ; } 7.查找是计算机程序中很重要的操作。对于已经排序的数据,可以采用“折半查找”算法进行查找,提高查找效率。折半查找算法的基本思想是:逐渐缩小目标对象可能存在的范围。首先测试集合中间那个元素的值,若相同,则查找成功;否则确定目标对象是在中间元素的左半区还是右半区,然后在到可能的半区重复上述过程,直到找到指定目标或查找失败。下面的函数用折半查找的算法在指定序列中查找数据,请将程序补充完整,并验证。

void BinarySearch() { int num[]={1,3,5,7,9,11,13,15}; int key, n; int low,high,mid; n=sizeof(num)/sizeof(int); //待查序列数据个数 printf(\nput the integer to find:\); //输入待查数据 scanf(\%d\&key); for(low=0,high=n-1; low<=high; ) { mid= (low+high)/2 ; //确定中间元素的下标值 if(key==num[mid]) //表示查找成功 { printf(\ind. %d's position is %d\\n\key,mid); break; } else if(key > num[mid]) low= mid+1 ; //目标可能在右半区 else high= mid-1 ; //目标可能在左半区 } if(low>high)//表示查找不成功 { printf(\Not find.\\n\; } } 8.编写程序,利用数组求Fibonacci数列的前15项。Fibonacci数列具有下面的性质:

f(1)=1, f(2)=1, f(n)=f(n-2)+f(n-1) (n≥3) 解析:要用数组存放Fibonacci数列的前15项,数组大小为15,将数组元素Fib[0]、Fib[1]分别代表数列最开始的两项,可利用递推公式f(i)=f(i-2)+f(i-1) (15≥i≥2)计算第i项。注意数组下标从0开始计。程序如下: #include void Fibonacci() { int Fib[15]={1,1}; int i; for (i=2;i<15;i++) Fib[i]=Fib[i-1]+Fib[i-2]; printf(\he results:\\n\; for(i=0; i<15; i++) printf(\d \ib[i]); } void main() { printf(\xercise6-8:Calculate Fibonacci\\n\); Fibonacci(); printf(\n\); } 9.如果将英语的26个字母由a到z分别编为1到26分的话,请编写程序,输入下面的词语,将各词语的字母分相加,看看结果,并想想为什么?

knowledge hard work attitude

解析:字母由a到z分别编为1到26分,程序中设计字符数组letters存放各字符且各字符的下标与其分值对应。通过查找字符数组letters,得到单词的字母分值并作累加,得到各词语的字母分相加的结果。程序如下:

#include void TranslateStr() { char letters[]=\ abcdefghijklmnopqrstuvwxyz\; char str1[]=\nowledge\str2[]=\ard work\,str3[]=\titude\ int count1=0,count2=0,count3=0,i,j; //计算str1的分值count1 for (i=0; str1[i]!='\\0'; i++) { for (j=0; letters[j]!='\\0'; j++) { if (str1[i]==letters[j]) { count1 += j; break; } } } //计算str2的分值count2 for (i=0; str2[i]!='\\0'; i++) { for (j=0; letters[j]!='\\0'; j++) { if (str2[i]==letters[j]) { count2 += j; break; } } } //计算str3的分值count3 for (i=0; str3[i]!='\\0'; i++) { for (j=0; letters[j]!='\\0'; j++)

{ if (str3[i]==letters[j]) { count3 += j; break; } } } //输出计算结果 printf(\s = %d\\n\,str1,count1); printf(\s = %d\\n\,str2,count2); printf(\s = %d\\n\,str3,count3); } void main() { printf(\xercise6-9:Think of the below.\\n\); TranslateStr(); } 注:该题适用于“函数设计”。

10.编一程序,将一维数组中的元素向右循环位移N次。例如,数组各元素的值依次为0,1,2,3,4,5,6,7, 8,9,10;位移3次后,各元素的值依次为8,9,10,0,1,2,3,4,5,6,7。

#include

#define N 3 #define M 11

void RightShift() { }

void main() {

printf(\ circle right shift\\n\for (i=1; i<=N; i++) { }

for (j=0; j

temp=array[M-1];

array[j]=array[j-1];

int array[M]={0,1,2,3,4,5,6,7,8,9,10}; int i,j,temp;

for (j=M-1; j>0; j--)

array[j]=temp;

}

RightShift();

12.输入一个3行4列的数组,先以3行4列的格式输出该数组,然后找出该数组中值最小的元素,输出该元素及其两个下标。

#include

void FindMin() { }

printf(\4 array:\\n\for (i=0; i<3; i++) //按行输入 { }

printf(\for (i=0; i<3; i++) //按行输出 { }

//查找最小元素 min=array[0][0]; row=0; col=0;

for (i=0; i<3; i++) //按行查找 { }

printf(\

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

if (min

min=array[i][j]; row=i; col=j;

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

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

scanf(\

int array[3][4],i,j; int min,row,col;

void main() { }

13.编程序求4×4矩阵对角线之和。 #include

#define N 4 void CalAdd() {

//按行输入数组并计算 }

void main() { }

14.输入一个字符串,将其有的数字字符删除,打印删除后的字符串。 #include

void DelDigit() {

printf(\char str[80]; int i,j=0;

printf(\CalAdd();

printf(\%d array:\\n\for (i=0; i

scanf(\

result += array[i][j];

int array[N][N],i,j,result=0;

printf(\FindMin();

if ((i==j)||(i+j+1==N))

printf(\

gets(str); }

void main() { }

printf(\DelDigit();

for (i=0; str[i]!='\\0'; i++)

if (str[i]<='0' || str[i]>='9') { }

str[j]=str[i]; j++;

str[j]='\\0'; puts(str);

15.输入一个十进制整数n,将其转换为二进制代码输出。 #include

void DecToBin() { }

int num,i,j; char Bin[64];

printf(\scanf(\i=0;

while(num) { }

Bin[i]=num%2+'0'; i++; num/=2;

printf(\

printf(\

for(j=i-1; j>=0; j--)

printf(\

void main()

{ printf(\ DecToBin(); }

第7章 课后习题参考答案

1.选择题

(1)下面叙述中正确的是 C 。

A.对于用户自己定义的函数,在使用前必须加以说明 B.说明函数时必须明确其参数类型和返回类型 C.函数可以返回一个值,也可以什么值也不返回 D.空函数不完成任何操作,所以在程序设计中没有用处 (2)下面叙述中错误的是 A 。

A.主函数中定义的变量在整个程序中都是有效的 B.在其他函数中定义的变量在主函数中也不能使用 C.形式参数也是局部变量

D.复合语句中定义的函数只是在该复合语句中有效

(3)若函数的形参为一维数组,则下面说法中正确的是 B 。

A.调用函数时的对应实参必为数组名 B.形参数组可以不指定大小

C.形参数组的元素个数必须多于实参数组的元素个数 D.形参数组的元素个数必须等于实参数组的元素个数

(4)在函数的定义和声明时若没有指出函数的类型,则 B 。

A.系统自动地认为函数的类型为实型 C.系统自动地认为函数的类型为字符型 (5)下列函数定义语句中正确的是 A 。

A.float cal(float x; float y) { } {

return(x*y);

B.float cal(float x, y)

{ }

return(x*y);

B.系统自动地认为函数的类型为整型 D.编译时会出错

C.int cal(x,y) D.int cal(x,y) float x,y;

return(x*y);

float x,y; { return(x*y); }

}

2.分析下列程序运行结果。

#include

int k; void fan() { }

void main() {

int m=0; static int n=0;

k++; m++; n++;

printf(\

fan(); fan(); k=5;

fan();

}

解答:程序运行结果为 1 1 1

2 1 2

6 1 3 运行结果分析:

程序中变量k为全局变量,其作用范围为整个程序,作用周期为整个程序运行周期;

变量m为局部变量,其作用范围为函数fan内,作用周期为函数fan运行周期;变量n为

局 部静态变量,其作用范围为函数fan内,作用周期为整个程序运行周期。下表列出三

次调用 函数fan时,变量k,m,n值的变化情况。

调用fan函数 第一次调用fan函数 第二次调用fan函数 第三次调用fan函数 变量k,m,n初始值 0,0,0 结果,m重新初始化为0) 5,0,2(k被赋值5, n保留上次计算结果,m重新初始化为0)

3.分析下列程序运行结果。

#include long fac(int m) {

static long k=1L;

while(m) k*=m--; return(k); }

执行自增运算后k,m,n的值 1,1,1 1,0,1(k、n保留上次计算2,1,2 6,1,3 void main() { long i,j;

i=fac(3); j=fac(5); printf(\}

解答:程序运行结果为fac(3)=6 fac(5)=720

第一次调用fac(3)计算出3的阶乘为6,该结果保存在静态变量k中,第二次调用fac(5)时,

k的初始值为6,所以实际求的是6×5!=720。

4.编写一个函数fib求Fibonacci数列中第n项的值,要求用迭代法而不是用递归算法,并编写main函数调用该函数,求fib(n),n值由用户输入确定。这个数列有如下特点:第1、2两个数为1、1,从第3个数开始,该数是其前面两个数之和。

#include

void Fibonacci(int n) { }

void main() {

printf(\printf(\int n;

printf(\printf(\if (n<3) Fibn=1; else { }

for (i=3;i<=n;i++) { }

Fibn=Fib0+Fib1; Fib0=Fib1; Fib1=Fibn;

int Fib0=1,Fib1=1,Fibn; int i;

fac(5)=%ld\

}

scanf(\Fibonacci(n);

5.编写一个判断素数的函数,并应用该函数实现歌德巴赫猜想(一个大于等于4的偶数可以表示为两个素数之和)。

#include #include

int prime(int n)//判断n(>2)是否是素数,若是,返回1,否则返回0 { }

void main() { }

6.设计一个函数MinCommonMultiple,计算两个正整数的最小公倍数。要求如下: (1)设计函数原型并实现该函数;

(2)编写主函数,输入两个正整数,调用MinCommonMultiple,输出它们的最小公倍数。

for (i=4; i<1000; i+=2)//验证1000以内的偶数 { }

for (j=2; j<=i/2; j++) //i为偶数,i=j+(i-j),若j和i-j为素数,则命题成立

if (prime(j) && prime(i-j)) { }

printf(\ \flag++;

if (flag==5) { //每行输出5个 } break;

printf(\flag=0;

int i,j; int flag=0;

for (i=2; i<=sqrt(n); i++)

if (n%i==0) return 0; return 1; int i;

#include

int MinCommonMultiple(int num1,int num2) { }

void main() { }

7.编写程序求下式的值:S=21×1+22×2!+?+2n×n!(n<10)。要求如下: (1)不使用数学函数,编写函数求2n和n!; (2)编写函数调用前两个函数求S; (3)在主函数中输入n,输出计算的S值。 #include

unsigned long PowerOfTwo(int n)//计算2的n次幂 { }

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

result*=2; return result;

unsigned long result=1; int i;

printf(\printf(\scanf(\

printf(\

num1,num2,MinCommonMultiple(num1,num2));

int num1,num2; return result;

result=num1>num2?num1:num2; result--; do{

result++;

}while(result%num1!=0 || result%num2!=0); int result;

unsigned long Factorial(int n)//计算n的阶乘 { }

unsigned long FuncS(int n)//求S { }

void main() { }

8.编写一个函数invert,使一个字符串按反序存放在同一字符数组中,在main函数中输入一个字符串,调用该函数,使其逆序存放,然后输出结果。

#include #include

void invert(char string[]) {

int i,len; char temp;

printf(\printf(\scanf(\S=FuncS(n);

printf(\int n;

unsigned long S; for (i=1; i<=n; i++)

result+=PowerOfTwo(i)*Factorial(i); unsigned long result=0; int i;

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

result*=i; unsigned long result=1; int i;

return result;

return result;

}

void main() { }

9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。

#include

int digits=0,space=0,other=0; int CountStr(char str[]) {

for (i=0; str[i]!='\\0'; i++) }

{ }

return letters;

if (str[i]>='0' && str[i]<='9') digits++; else if (str[i]>='a' && str[i]<='z') letters++; else if (str[i]>='A' && str[i]<='Z') letters++; else if (str[i]==' ') space++; else other++; int letters=0,i;

printf(\

printf(\gets(str); invert(str); puts(str); char str[80]; len=strlen(string); for(i=0; i

temp=string[i]; string[i]=string[len-1-i]; string[len-1-i]=temp;

{

void main() { }

printf(\

printf(\gets(str);

letters=CountStr(str);

printf(\ digits=%d space=%d other=%d\\n\char str[80]; int letters;

10.编写递归函数Sum计算1+2+3+?+n的值,并在主函数中输出调用Sum(100)的结果。 #include

long Sum(int n) { }

if (n==1) return 1;

else return(Sum(n-1)+n);

void main() { }

int n;

printf(\printf(\scanf(\

printf(\

第8章 课后习题参考答案

1.阅读程序,写出其运行结果。 (1) 9.0 (2)integerc=0

(3)ar=9 ar=9 ar=11 (4)64 (5)a=3 a=3 a=2 (6)8,20,12 2.分析以下一组宏所定义的输出格式。 #define NL putchar('\\n') #define PR(fprmat,value) printf(\#define PRINT1(f,x1) PR(f,x1);NL #define PRINT2(f,x1,x2) PR(f,x1); PRINT1(f,x2) 如果在程序中有以下的宏引用: PR(d,x); PRINT1(d,x); PRINT2(d,x1,x2); 写出宏展开后的情况,并写出相应输出的结果,设x=5,x1=3,x2=8。 题中错误:

#define NL putchar('\\n') #define PR(fprmat,value) printf(\#define PRINT1(f,x1) PR(f,x1);NL #define PRINT2(f,x1,x2) PR(f,x1); PRINT1(f,x2) 红字部分应为value=%f (是否对?) 答案: value=5.000000ormat value=5.000000ormat value=3.000000ormat value=8.000000ormat 3.输入两个整数,求它们相除的余数。用带参的宏来实现。 #define YS(x1,x2) (x1)%(x2) void main() { int a=8,b=5; int c; c=YS(a,b); printf(\} 4.编译预处理命令的作用是什么?

答:编辑预处理是指在对程序作正常编译之前,先对源程序中一些特殊的预处理命令作出处理,产生一个新的源程序,然后再对新的源程序进行正常的编译,得到目标代码。可以有效地提高程序的可读性、可维护性和可移植性,减少目标程序的大小,并为模块化程序设计提供帮助。

5.定义一个带参数的宏。使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

#define HH(t,x1,x2) t=x1;x1=x2;x2=t;P(x1,x2) #define P(x3,x4) printf(\void main() { int a,b,t=0; printf(\scanf(\printf(\scanf(\printf(\HH(t,a,b); } 6.编写一个宏定义LEAPYEAR(y),用以判定年份y是否是闰年。判定标准是:若y是4的倍数且不是100的倍数或者y是400的倍数,则y是闰年。

#define LEAPYEAR(y) if(y%4==0) { if(y0==0) { if(y@0==0) printf(\else printf(\} else printf(\} else printf(\} main() { int yy; scanf(\LEAPYEAR(yy); } 第9章 课后习题参考答案

1、(1)D (2)C (3)C (4)A (5)D 2、(1)ffe2 11126 A 0 B (2)gae

(3)before swap integera=5, integerb=10 in swap integerx=10, integery=5 after swap integera=10, integerb=5 (4)1 3 5 7 9 (5)15 9 (6)1 2 3 4 5 6 7 8 9

(7)-5,-12,17

(8)15 (9)6

(10)输入:1 2 3 4 5 6 7 8 9 10 输出:10 9 8 7 6 5 4 3 2 1

3、#include #include void fun(char s[]) {

for(p=s;*p!='\\0';p++) {

if(*p>='A'&&*p<='Z')

a++; else if(*p>='a'&&*p<='z')

b++; else if(*p==' ')

c++;

else if(*p>='0'&&*p<='9')

d++; else e++;

}

printf(\大写字母 %d 小写字母 %d\\n\

printf(\空格 %d 数字 %d 非字符 %d\\n\ }

void main() { char s[200]; gets(s);

fun(s); }

4、#include int sn(char *a) {

int i=0; while(*a++) i++; return i; }

void main()

int a=0,b=0,c=0,d=0,e=0,i=0; char *p;

{

int sum; char a[100]; gets(a); sum=sn(a); printf(\ printf(\ } 5、

void fun(int a[3][4],int min) { int i,j,h,z;

for(i=0;i<3;i++) for(j=0;j<4;j++) { if(a[i][j]

{ min=a[i][j]; h=i;

z=j; } }

printf(\横坐标为%d,纵坐标为%d\\n\}

void main()

{int a[3][4]={0},min; int i,j;

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

scanf(\ min=a[0][0]; fun(a,min); }

第10章 课后习题参考答案

1.如果有以下的定义:

struct person { char name[20]; int age; char sex; }; struct person a={\iao min\20,'m'},*p=&a; 则对字符串\的引用方式可以是下面哪些? CAD A.(*p).name

(1)struct abc {char x; char y; int data; }; (2)struct abc { char x,y; int data; }; (3)struct abc { int data; char x; char y; }; B.p.name C.a.name D.p->name

2.下面哪些定义的结构体在内存分配上是等价的? A

A.(1)和(2) C.(1)和(3) 3.读懂源程序,并写出正确结果。

B.(2)和(3) D.(1)(2)和(3)

#include struct stu { char name[10]; int score[3]; }; void main() { struct stu student={″xiao wang″, {99,87,90}}; struct stu *p1=&student; int *p2=student.score; printf(\%d\\n\student.score[0]); //屏幕显示99___________________ printf(\%s\\n\p1->name); //屏幕显示___ xiaowang ________________ printf(\%d\\n\p2[2]); //屏幕显示_____90___ ___________ printf(\%d\\n\*(p2+1)); //屏幕显示_____87______________ } 4.读懂源程序,并写出正确结果。

struct st { int x; int *y; } *p; int dt[]={10, 20, 30, 40}; struct st aa[4]={50, &dt[0], 60, &dt[1], 70, &dt[2], 80, &dt[3]}; void main() { p=aa+2; printf(\\\n%d\ (++p)->x); }运行结果:80 5.读懂源程序,并写出正确结果。

int func(int d[], int n) { int i, s=1; for(i=0; i

#include\stdio.h\ Void main() { union { int i[2]; long k; char c[4]; }t,*s=&t; s->i[0]=0x39; s->i[1]=0x38; printf(\%lx\\n\,s->k); printf(\%c\\n\s->c[0]); }运行结果:39 9 第11章 课后习题参考答案

1.以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此文件文件中形成文本文件,并将字符的个数写到文件尾部。

#include #include void main(void) {

FILE *fp;

char ch,fname[32];

int count=0;

printf(\:\; scanf(\,fname);

if ((fp=fopen( (1) ,\ {

printf(\:%s \\n\,fname); exit(0);

}

printf(\:\\n\; while ((ch=getchar())!=\ {

fputc(ch,fp); count++; }

fprintf( (2) ,\,count); fclose(fp); }

(1)fname (2)fp

3.ASCII码文件与二进制文件有什么不同?各自的特点是什么?

ASCII文件又称文本文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。用ASCII码形式输出与字符一一对应,一个字节代表一个字符因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。用二进制形式输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又需要输入到内存的,常用二进制文件保存。

4.对文件的打开与关闭的含义是什么?为什么要打开和关闭文件?

打开文件实际上起着用户申请对文件使用权的作用。经文件系统验证符合使用权时才允许用户使用文件,并适当地为用户做好使用文件前的准备。关闭文件操作的作用是让用户向系统归还文件的使用权。

5.将“Turbo C”和“BASIC”写入文件 aa.txt。

#include #include #include void main() { } {

void WriteS(); WriteS();

void WriteS();

FILE *fp;

char str1[]=\char str2[]=\

if((fp=fopen(\{

printf(\文件不能打开\

exit(1); }

fputs(str1,fp); /*向fp指向的文件aa.txt写入字符串变量str1的内容*/ fputs(str2,fp); /*向fp指向的文件aa.txt写入字符串变量str2的内容*/

fclose(fp); }

6.将aa.txt文件中内容输出到屏幕上。

#include #include #include void main() {

Void ReadS(); ReadS();

} Void ReadS(); {

FILE *fp;

char st1[20],st2[20];

if((fp=fopen(\ {

printf(\getch(); exit(1);

}

fgets(st1,20,fp); fgets(st2,20,fp);

printf(\文件中的内容如下:\\n\printf(\

fclose(fp); }

7.有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。

#include\

#include\#include\struct student {

char name[20]; int num; int score[3]; float av; }stu1[5], *pstu; void main() {

void WriteSt(); WriteSt();

}

void WriteSt() {

FILE *fp;

char ch; int i,j; pstu=stu;

for(i=0;i<5;i++,pstu++) {

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

scanf(\ printf(\ pstu->av=0; for(j=0;j<3;j++)

{

scanf(\ pstu->av+= pstu->score[j]; }

pstu->av/=3;

}

if((fp=fopen(\ {

printf(\ getch(); exit(1);

}

pstu=stu;

fwrite(pstu,sizeof(struct student),5,fp); fclose(fp);

}

8.将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排好序的学生数据存入一个新文件“stu-sort”中。

#include\#include\#include\struct student {

char name[20]; int num; int score[3]; float av; }stu[5], *pstu; void main() {

void SortSt(); SortSt(); }

void SortSt() {

FILE *fp;

struct student temp; int i,j; /*read data*/ pstu=stu;

if((fp=fopen(\{

printf(\ getch(); exit(1);

}

fread(pstu,sizeof(struct student),5,fp); fclose(fp); /*sort*/

for(i=0;i<4;i++) for(j=i+1;j<5;j++)

if(stu[i].av

temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; }

if((fp=fopen(\ {

printf(\ getch(); exit(1); }

fwrite(pstu,sizeof(struct student),5,fp); fclose(fp);

}

9.将上题已排好序的学生成绩文件进行插入处理。插入一个学生的三门课成绩,程序先计算新插入学生的平均成绩,然后将他按成绩高低顺序插入,插入后建立一个新文件。 #include\#include\#include\struct student {

char name[20]; int num; int score[3]; float av;

}stu[6], *pstu; void main() { }

void Insert(); Insert();

void Insert() {

FILE *fp;

struct student temp; int i,j; pstu=stu;

/*input data*/

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

scanf(\ printf(\ temp.av=0; for(j=0;j<3;j++) {

scanf(\ temp.av+= temp.score[j]; }

temp.av/=3;

/*read data*/

if((fp=fopen(\{ printf(\

getch(); exit(1); }

}

fread(pstu,sizeof(struct student),5,fp); fclose(fp); for(i=4;i>=0;i--) { }

stu[i+1]=temp; /*save*/

if((fp=fopen(\ { }

printf(\getch(); exit(1);

if(stu[i].av

break;

/*insert*/

fwrite(pstu,sizeof(struct student),6,fp); fclose(fp);

第12章 课后习题参考答案

1.评论下面代码中名字和值的选择。 (1)int a=l; if(O==l) a=O1; else l=01; 解:

(2)#define TURE 0 #define FALSE 1 if((ch=getchar())==EOF)

eof=TURE;

(1)代码中变量采用了误导性名称。误导性名称最可怕的例子是用小字字母l和大写字母O作为变量名,尤其是在组合用的时候,因为它们看起来完全像是数值常量“壹”和“零”。 (2)符号常量与实现相矛盾。应修改为:

#define TURE 1 #define FALSE 0 if((ch=getchar())==EOF)

eof=TURE;

2.分析下列语句的副作用,通过合理的方式消除副作用。

(1)将0赋给数组中三个相邻的元素:val[i++]=val[i++]=val[i++]=0;

解:C语言对这种情况下如何操作并没有明确的规定,而是由具体的编译系统来决定。在大多数编译系统中,语句执行完毕后变量i的值会增加了3,但只有下标为i的初始值的那个元素被赋了值,其余两个元素的值均未改变。这种执行效果依赖于编译系统的语句应该避免使用。该语句中对数组val[ ]的赋值应该拆分成三个语句:val[i++]=0; val[i++]=0; val[i++]=0;

(2)*x+=(*xp=(2*k<(n-m)?c[k+1]:d[k--]));

解:这样的表达式虽然紧凑,但是包含的内容过多,将它分解成几个部分,结构更清晰。

if(2*k<(n-m)

*xp=c[k+1]; else

*xp= d[k--]; *x+=*xp;

(3)if(!(c=='y'||c=='Y')) return;

解:if语句的条件表达式中含有逻辑否定运算,这不是必要的,应该改变关系运算符的方向,使测试的结果变成肯定的:if(c!='y'&&c!='Y') return; 这样更符合自然语序。

(4)length=(length

解:建议将表达式length=(length=BUFSIZE) length=BUFSIZE;

(5)flag=flag?0:1;

解:建议将表达式修改为条件语句,可以避免逻辑语义混淆。

if(flag) flag=0 else

flag=1;

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

Top