还剩52页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第1章课后习题参考答案1.简述计算机系统的基本组成及其工作原理解一个完整的计算机系统包括硬件系统和软件系统两大部分按照冯.诺依曼的计算机结构思想,计算机硬件系统由运算器、控制器、存储器、输入设备和输出设备五部分构成计算机软件是指使计算机正常运行需要的程序及相关技术文档的总称软件依赖硬件的物质条件,而硬件则需要在软件的支配下才能有效的工作按照冯·诺依曼存储程序的原理,计算机系统在控制器的控制下,通过输入设备输入程序或数据,并自动存放在存储器中然后控制器通过地址访问存储器,逐条取出指令、分析指令,并根据指令产生的控制信号,控制其他部件执行这条指令中规定的任务这一过程周而复始,确保程序自动执行2.将下列各数转换成十进制数(
1011.001)2(
127.75)8(A
1.D4)16解(
1011.001)2=(1×23+1×21+1×20+1×2-3)10=(
11.125)10(
127.75)8=(1×82+2×81+7×80+7×8-1+5×8-2)10=(
87.953125)10(A
1.D4)16=(10×161+1×160+13×16-1+4×16-2)10=(
161.828125)103.将下列各数转换成二进制数、八进制数和十六进制数(无法精确表示时,二进制取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)164.设机器字长为16,分别写出下列各值的原码、反码和补码
(127)10(-127)10(-128)10(-46)10
(32767)10(-32768)10解
[127]原=
[127]反=
[127]补=0000000001111111[-127]原=1000000001111111[-127]反[-127]补[-128]原=1000000010000000[-128]反=1[-128]补=1111111110000000[-46]原=1000000000101110[-46]反[-46]补
[32767]原=
[32767]反=
[32767]补[-32768]原=1000000000000000[-32768]反=[-32768]补=10000000000000005.已知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,则该数的原码为11110111,真值为-119
(3)由于符号位为“1”,表示负数,数值位按位取反后为0000000,再加1,则该数的原码为10000001,真值为-1
(4)由于符号位为“1”,表示负数,数值位按位取反后为0111111,再加1,则该数的原码为11000000,真值为-646.设机器字长为16位表示带符号整数,数值位15位,符号位1位,试分析所能表示的最大整数与最小整数分别是多少?解如果这16位二进制用来表示带符号的整数,由于最高位为符号位,实际的数值有效位只有15位,最小可以表示到-32768(机器码为1000000000000000),最大可表示到+32767(机器码为)7.设机器字长为32位浮点表示时,数符1位;阶码8位,用补码表示;尾数23位,用补码表示试分析规格化数所能表示的数的范围解一个浮点数可以表示为M·2EE为阶码,M为尾数的形式阶码(指数位)决定浮点数的数量级,32位的浮点数中,阶码为8位且用补码表示,其取值范围是-128~127,所以,32位机器数可以表示的数值范围是2-128(即10-38)到2127(即1038)第2章课后习题参考答案1.C语言的结构特点是什么?
(1)中级语言
(2)程序设计结构化
(3)数据类型丰富
(4)运算符丰富
(5)C语言是一种高效编译型语言
(6)语言简洁、库函数丰富2.填空题
(1)每个用C语言编写的程序必须有且只能有一个main函数
(2)C源程序的基本单位是函数
(3)C语言中,每个语句的结束符是分号(;)
(4)任何一个函数都由函数首部和函数体两部分组成3.判断下列程序的作用
(1)#includestdio.hvoidmain{floatfloatafloatbfloatcaver;printf“请输入三个实型数\n”;scanf“%f%f%f”floatafloatbfloatc;aver=floata+floatb+floatc/3;printf“\naverage=%f\n”aver;//屏幕显示average的值____________}作用从键盘输入3个实型数,求它们的平均值,并将该值打印在屏幕上
(2)#includestdio.hintxminintintegerxintintegery{intintegerm;ifintegerxintegeryintegerm=integerx;elseintegerm=integery;returnintegerm;}voidmain{intintegeraintegerbmin;printf请输入两个整形数\n;scanf%d%dintegeraintegerb;min=xminintegeraintegerb;printf\nminmumis%dmin;//屏幕显示min}作用从键盘输入任意2个整数,主函数调用xmin函数,比较两个数的大小,并将较小者打印在屏幕上4.编写一个C程序,在屏幕上显示一行字符(自己选择)#includestdio.hvoidmain{printfHelloWorld!\n;//屏幕显示HelloWorld!}5.编写一个C程序,在屏幕上显示3行字符(自己选择)#includestdio.hvoidmain{inti;fori=0;i3;i++{printfHelloWorld!\n;//屏幕显示3行HelloWorld!}}6.图案设计用任一字符制作三角形、菱形、正方形、五角星等图案选择字符为“*”三角形代码#includestdio.hvoidmain{printf%2c;printf%2c\n*;printf%2c*;printf%2c*;printf%2c\n*;}三角形图形如下菱形代码#includestdio.hvoidmain{printf%2c;printf%2c\n*;printf%2c*;printf%2c;printf%2c\n*;printf%2c;printf%2c\n*;}菱形图形如下正方形代码#includestdio.hvoidmain{printf%2c*;printf%2c*;printf%2c\n*;printf%2c*;printf%2c*;printf%2c\n*;printf%2c*;printf%2c*;printf%2c\n*;}正方形图形如下五角形代码#includestdio.hintmain{printf%2c;printf%2c;printf%2c;printf%2c*;printf%2c;printf%2c;printf%2c\n;printf%2c*;printf%2c;printf%2c*;printf%2c;printf%2c*;printf%2c;printf%2c\n*;printf%2c;printf%2c*;printf%2c;printf%2c;printf%2c;printf%2c*;printf%2c\n;printf%2c;printf%2c;printf%2c;printf%2c*;printf%2c;printf%2c;printf%2c\n;printf%2c;printf%2c*;printf%2c;printf%2c;printf%2c;printf%2c*;printf%2c\n;return0;}五角形图形如下第3章课后习题参考答案
1、字符常量与字符串常量有什么区别?答字符常量由单引号引起来,字符串常量由双引号引起来;字符常量只有一个字符构成,字符串常量由一个或多个字符构成;字符常量在内存中占一个字节,字符串常量占据的字节数为字符的个数+1;字符常量没有结束标志位,字符串常量有结束标志位
2、
(1)integera1=aintegera2=bintegera3=☺
(2)integerx=11integery=21integerm=10integern=21integerx=10integery=20integerm=11integern=20
(3)1040
(4)11101
(5)
3216153、
(1)
2.500000
(2)
72.
0000004、
(1)24
(2)10
(3)60
(4)0
(5)0
(6)
05、
(1)0
(2)1
(3)2
(4)0
(5)1
(6)
16、从键盘上输入一个实数,把它强制转换为整型数据,并输出到屏幕上voidForceCon{floatreala;scanf“%f”reala;printf“%d”intreala;}voidmain{ForceCon;}
7、已知integera=15,计算,并将结果赋给变量realbvoidfun1{intintegera=15;floatrealb;realb=integera*100/8;printf“realb=%f”realb;}voidmain{fun1;}
8、设计程序,输入实型数据reala、realb,然后输出reala、realb的值voidRealEval{floatrealarealb;printf“inputtworeal:”;scanf“%f%f”realarealb;printf“\nreala=%frealb=%f”realarealb;}voidmain{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)输入一个圆的半径,计算圆的周长和面积解#definePAI
3.14scanf“输入圆的半径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=C3求方程式的根分别考虑有两个不等的实根;有两个相等的实根解if输出该方程有两个不等的实根;elseif输出该方程有两个相等的实根;
(4)有3个数num
1、num
2、num3要求按大小顺序把它们打印出来解ifnum1num2{ifnum2num3输出顺序num1num2num3;elseifnum3num1输出顺序num3num1num2;elseifnum3num2输出顺序num1num3num2;}else{ifnum1num3输出顺序num2num1num3;elseifnum3num2输出顺序num3num2num1;elseifnum3num1输出顺序num1num3num2;}5判断一个数n能否同时被3和5整除ifn%3等于0,并且n%5等于0输出n
(6)1~1000之间3的倍数的整数有多少个?fori=1;i1000;i++ifn%3等于0num++;输出num
(7)求1+2+3++100的和fori=1;i=100;i++sum+=i;将每个数加起来输出sum8将100~200之间的所有素数打印出来fori=100;i=200;i++{forj=1;ji;j++ifi%j等于0即i存在公因子,因此该数i不是素数break;ifj==i输出i;//该数i是素数}
(9)任意输入10个数,打印输出最大数fori=0;i10;i++{scanf输入实数j;ifmaxj`max=j;}输出max第5章课后习题参考答案1.C语言中的语句有哪几类?答
(1)表达式语句
(2)函数调用语句
(3)空语句
(4)控制语句
(5)复合语句2.怎么区分表达式和表达式语句?什么时候用表达式,什么时候用表达式语句?答表达式的后面加上分号“;”就构成了表达式语句一般做条件判断的时候用表达式;而表达式语句一般用于计算和为变量赋值3.C语言中如何实现输入、输出功能?答C程序的基本输入输出操作是由操作系统提供的库函数实现的,没有输入输出语句由于标准输入输出库函数的原型放在头文件stdio.h中,因此在编写程序时,要用编译预处理命令“#include”将头文件stdio.h包含到用户源文件中4.写出下面程序的运行结果
(1)#includestdio.hvoidprintChar{charc1=ac2=bc3=cc4=\101c5=\116;printfa%cb%c\tabc\nc1c2c3;printf\t\b%c%c\nc4c5;}voidmain{printChar;}运行结果aabbabcAN
(2)#includestdio.hvoidprintData{inta=5b=7;floatx=
67.8546y=-
789.124;charc=A;longn=1234567;unsignedu=65535;printf%d%d\nab;printf%3d%3d\nab;printf%f%f\nxy;printf%-10f%-10f\nxy;printf%
8.2f%
8.2f%.4f%.4f%3f%3f\nxyxyxy;printf%e%
10.2e\nxy;printf%c%d%o%x\ncccc;printf%ld%lo%lx\nnnn;printf%u%o%x%d\nuuuu;printf%s%
5.3s\ncomputerEnglish;}voidmain{printData;}运行结果
575767.854599-
789.
12402367.854599-
789.
12402367.85-
789.
1267.8546-
789.
124067.854599-
789.
1240236.785460e+01-
7.89e+02A65101411234567455320712d68765535177777ffff65535computerEng
(3)#includestdio.hvoidprintData{charc=a;inta=5b=6;floatf=
12.345g=
56.789;printf%c\nc;printf%c\nc-32;printf%d%d\nab;printf%4d%4d\nab;printf%f%f\nfg;printf%
4.2f%
4.2f\nfg;printf%-
3.2f\nf+g;}intmain{printData;return0;}运行结果aA
565612.
34500056.
78900112.
3556.
7969.13
(4)#includestdio.hvoidfun{intij;i=j=2;ifi==1ifi==2printf%di=i+j;elseprintf%di=i-j;printf%dj;}intmain{fun;return0;}运行结果2
(5)#includestdio.hvoidselect{intx=3;switchx{case1:case2:printfx3\n;case3:printfx=3\n;case4:case5:printfx3\n;default:printfxunknow\n;}}intmain{select;return0;}运行结果x=3x3xunknown
(6)#includestdio.hvoidrelatOp{intx=1y=2z=3;x+=y+=z;printf%d\nxyy:x;printf%d\nxyx++:y++;printf%d%d\nxy;printf%d\nz+=xyx++:y++;printf%d%d\nyz;x=3;y=z=4;printf%d\nz=yy==x1:0;printf%d\nz=yy=x;}intmain{relatOp;return0;}运行结果6566979015.指出下面程序段中的错误
(1)intabcde;scanf“%d%d%d”abcd;//scanf传入值需加地址符号e=a*b+c*d;//更正为scanf“%d%d%d”abcdpritnf“%d\n”e;
(2)#includestdio.hvoidrelatOp{intabct;scanf%d%d%dabc;ifabac//产生歧义,更改为ifabac{ifbcprintfmin=%d\nb;elseprintfmin=%d\nc;}ifabac//产生歧义,更改为ifabacprintfmin=%d\na;}voidmain{relatOp;}6.如果下列程序执行后t的值是4吧,则执行时输入a、b值的范围是什么?#includestdio.hvoidrelatOp{intabs=1t=1;scanf%d%dab;ifa0s+=1;ifabt+=s;elseifa==bt=5;elset=2*s;printfs=%dt=%d\nst;}voidmain{relatOp;}答案ba07.若a=3b=4c=5x=
1.3y=
2.4z=-
3.6u=52769n=123456c1=’a’c2=’b’请编写程序输出以下结果#includestdio.hintmain{inta=3b=4c=5;floatx=
1.3y=
2.4z=-
3.6;unsignedu=52769;longn=123456;charc1=ac2=b;printfa=%4db=%4dc=%4d\nabc;printfx=%fy=%fz=%f\nxyz;printfx+y=%
6.2fy+z=%
6.1fz+x=%
6.1f\nx+yy+zz+x;printfu=%10un=%10ld\nun;printfc1=%cor%d\nc1c1;printfc2=%cor%d\nc2c2;return0;}运行结果a=3b=4c=5x=
1.300000y=
2.400000z=-
3.600000x+y=
3.70y+z=-
1.2z+x=-
2.3u=52769n=123456c1=aor97c2=bor988.下面的程序运行时在键盘上如何输入?如果a=3b=4x=
8.5y=
71.82c1=Ac2=a请写出对应的每个scanf()函数的输入情况解#includestdio.hvoidscanfDate{intab;floatxy;charc1c2;scanf%d%dab;scanf%f%exy;getchar;//接收空格符,以免影响后面为字符赋值的语句scanf%cc1;getchar;//接收空格符,以免影响后面为字符赋值的语句scanf%cc2;//对两个字符赋值,应该单独赋值,否则第二个字符,可能为空printfa=%d%f%c\nayc1;}intmain{scanfDate;return0;}9.程序完成的功能是从键盘输入若干个学生的成绩并输出最高成绩和最低成绩,当输入负数时结束输入填空,使程序完成操作解#includestdio.hvoidmaxAndMin{floatfmaxmin;scanf%ff;max=f;min=f;while
[1]//f0当输入的数大于0时,执行循环语句{iffmaxmax=f;if
[2]min=f;//fmin对min用f为其赋值scanf%ff;}printf\nmax=%fmin=%f\nmaxmin;//屏幕显示_____max____min值_______}intmain{maxAndMin;return0;}10.从5~100之间找出能被5或7整除的数解#includestdio.hintmain{inti;fori=6;i100;i++{ifi%5==0||i%7==0//如果i对5取余为0或i对7取余为0printf%4di;}return0;}运行结果11.有3个整数a,b,c,由键盘输入,输出其中最大的数解#includestdio.hintmain{inta=0b=0c=0;printf请输入a,b,c!\n;scanf%d%d%dabc;intmax=0;ifa=b//max表示a和b中较大的一个max=a;elsemax=b;printfmax:%d\nmax;ifmaxc//比较c与max,谁大输出谁printfmax:%d\nmax;elseprintfmax:%d\nc;return0;}12.试编程判断输入的正整数是否既是5又是7的整数倍数,若是,则输出yes;否则输出no解#includestdio.hintmain{inti=0;scanf%di;ifi0{ifi%5==0i%7==0//如果i对5取余为0并且i对7取余为0printfyes\n;elseprintfno\n;}elseprintf请输入正整数!\n;return0;}13.任意输入10个数,计算所有整数的和、负数的和以及10个数的和解#includestdio.hintmain{inti=0;intnum=0sum=0sum1=0sum2=0;//sum为所有数的总和,sum1为正数的和,sum2为负数的和whilei10{scanf%dnum;ifnum0sum1+=num;elsesum2+=num;i++;}sum=sum1+sum2;printfsum=%dsum1=%dsum2=%d\nsumsum1sum2;//将正数和,负数和以及总和打印在屏幕上return0;}14.用40元钱买苹果、西瓜和梨功100个,且三种水果都有已知苹果
0.4元一个,西瓜4元一个,梨
0.2元一个问可以买多少个?请编写程序输出所有购买方案解#includestdio.hintmain{intxyz;forx=1;x100;x++fory=1;y10;y++forz=1;z100;z++ifx+y+z==
1000.4*x+4*y+z*
0.2==40//总个数等于100,总钱数等于40,这两个条件必须同时满足{printf苹果=%d西瓜=%d梨=%d\nxyz;}return0;}运行结果15.一个数如果恰好等于它的因子之和,则这个数称为“完数”如6的因子是
1、
2、3,而6=1+2+3因此6是一个完数编写程序找出1000之内的所有完数解#includestdio.hintmain{intsumij;fori=1;i1000;i++{sum=0;forj=1;ji;j++//求该数的因子{ifi%j==0//判断j是否是该数的因子sum+=j;}ifsum==i{printf%4di;}}return0;}运行结果16.打印出所有的“水仙花数”所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身如,所以153是水仙花数解#includestdio.hintmain{inti=0abc;fori=100;i1000;i++{a=i%10;//取个位数b=i/10%10;//取十位数c=i/100%10;//取百位数ifa*a*a+b*b*b+c*c*c==iprintf%d\ni;}return0;}运行结果17.编写程序,从键盘输入6名学生的5门课成绩,分别统计出每位学生的平均成绩解#includestdio.hintmain{inti=0;floataverage=
0.0abcde;fori=1;i=6;i++{average=
0.0;scanf%f%f%f%f%fabcde;average=a+b+c+d+e/5;//求其5门课的平均值printf第%d名的成绩是%f\niaverage;}return0;}18.每个苹果
0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直到购买的苹果个数不超过100的最大值,编写程序求每天花多少钱?解#includestdio.hintmain{inti=0;fori=2;i100;i=2*i//i=i*2就是每天买前一天的2倍{printfthemoney:%f\ni*
0.8;}return0;}运行结果第6章课后习题参考答案1.改正下面这个源程序的错误#includestdio.hvoidmain{intijlist
[10];fori=0;i10;i++{list[i]=2*i+3;forj=9;j=0;j--printf%d\nlist[j];}}2.指出下面合法的说明语句A.intabcd[0x80];B.char9ab
[10];C.charchi[-200];D.intaaa
[5]={345};E.floatkey[]={
3.
04.010};F.chardisk[];G.intnfloppy[n];H.intcash
[4]={123456};解答A,D,E为合法的说明语句B中变量名定义错误,C中数组大小为负数,F未定义数组大小,G中数组大小用变量定义,H数组大小与初始化数据个数不符,它们都是错误的3.根据以下说明,写出正确的说明语句
(1)men是一个有10个整型元素的数组解答intmen
[10];
(2)step是一个有4个实型元素的数组,元素值分别为
1.9-
2.
33020.6解答floatstep
[4]={
1.9-
2.
33020.6};
(3)grid是一个二维数组,共有4行、10列整型元素解答intgrid
[4]
[10];4.写出下面程序的运行结果
(1)程序运行结果6voidmain{charch
[7]={65ab21};intis=0;fori=0;ch[i]=0ch[i]=9;i+=2s=10*s+ch[i]-0;printf%d\ns;}
(2)程序运行结果10010voidmain{inty=18i=0ja
[8];do{a[i++]=y%2;y=y/2;}whiley0;forj=i-1;j=0;j--printf%da[j];}
(3)程序运行结果bcdefgacdefgabdefgabcvoidmain{chara
[8]=”abcdefg”temp;intij;fori=0;i3;i++{temp=a
[0];forj=1;j7;j++a[j-1]=a[j];a
[6]=temp;a
[7]=\0;printf%s\na;}}
(4)运行下面程序时,输入Iliketheyoungelephant后的输出结果是见下图voidmain{inti=0kch;intnum
[5]={0};charalpha[]={aeiou}str
[80];getsstr;whilestr[i]{fork=0;k5;k++ifstr[i]==alpha[k]{num[k]++;break;}i++;}fork=0;k5;k++ifnum[k]printf%c:%d\nalpha[k]num[k];}解答程序功能为统计输入字符串中元音字母的个数5.读懂下面的程序并填空voidmain{charstr
[80];inti=0;getsstr;whilestr[i]!=0{ifstr[i]=astr[i]=zstr[i]-=32;i++;}putsstr;}程序运行时,如果输入upcase,屏幕显示UPCASE程序运行时,如果输入Aa1Bb2Cc3,屏幕显示AA1BB2CC3解答程序功能为将输入字符串中小写英文字母转换为大写字母,其他符号保持不变6.输入一个字符串(串长不超过60),将字符串中连续的空格符保留一个例如输入字符串“Iamastudent.”,则输出字符串为“Iamastudent.”#includestdio.h#includestring.hvoidmain{charstr
[60];inti;getsstr;fori=1;str[i]!=\0;i++ifstr[i-1]==str[i]=={strcpystr+i-1str+i;//此处选择适当的函数i--;}putsstr;}7.查找是计算机程序中很重要的操作对于已经排序的数据,可以采用“折半查找”算法进行查找,提高查找效率折半查找算法的基本思想是逐渐缩小目标对象可能存在的范围首先测试集合中间那个元素的值,若相同,则查找成功;否则确定目标对象是在中间元素的左半区还是右半区,然后在到可能的半区重复上述过程,直到找到指定目标或查找失败下面的函数用折半查找的算法在指定序列中查找数据,请将程序补充完整,并验证voidBinarySearch{intnum[]={13579111315};intkeyn;intlowhighmid;n=sizeofnum/sizeofint;//待查序列数据个数printfInputtheintegertofind:;//输入待查数据scanf%dkey;forlow=0high=n-1;low=high;{mid=low+high/2;//确定中间元素的下标值ifkey==num[mid]//表示查找成功{printfFind.%dspositionis%d\nkeymid;break;}elseifkeynum[mid]low=mid+1;//目标可能在右半区elsehigh=mid-1;//目标可能在左半区}iflowhigh//表示查找不成功{printfNotfind.\n;}}8.编写程序,利用数组求Fibonacci数列的前15项Fibonacci数列具有下面的性质f1=1f2=1fn=fn-2+fn-1n≥3解析要用数组存放Fibonacci数列的前15项,数组大小为15,将数组元素Fib
[0]、Fib
[1]分别代表数列最开始的两项,可利用递推公式fi=fi-2+fi-115≥i≥2计算第i项注意数组下标从0开始计程序如下#includestdio.hvoidFibonacci{intFib
[15]={11};inti;fori=2;i15;i++Fib[i]=Fib[i-1]+Fib[i-2];printfTheresults:\n;fori=0;i15;i++printf%dFib[i];}voidmain{printfExercise6-8:CalculateFibonacci\n;Fibonacci;printf\n;}9.如果将英语的26个字母由a到z分别编为1到26分的话,请编写程序,输入下面的词语,将各词语的字母分相加,看看结果,并想想为什么?knowledgehardworkattitude解析字母由a到z分别编为1到26分,程序中设计字符数组letters存放各字符且各字符的下标与其分值对应通过查找字符数组letters,得到单词的字母分值并作累加,得到各词语的字母分相加的结果程序如下#includestdio.hvoidTranslateStr{charletters[]=abcdefghijklmnopqrstuvwxyz;charstr1[]=knowledgestr2[]=hardworkstr3[]=attitude;intcount1=0count2=0count3=0ij;//计算str1的分值count1fori=0;str1[i]!=\0;i++{forj=0;letters[j]!=\0;j++{ifstr1[i]==letters[j]{count1+=j;break;}}}//计算str2的分值count2fori=0;str2[i]!=\0;i++{forj=0;letters[j]!=\0;j++{ifstr2[i]==letters[j]{count2+=j;break;}}}//计算str3的分值count3fori=0;str3[i]!=\0;i++{forj=0;letters[j]!=\0;j++{ifstr3[i]==letters[j]{count3+=j;break;}}}//输出计算结果printf%s=%d\nstr1count1;printf%s=%d\nstr2count2;printf%s=%d\nstr3count3;}voidmain{printfExercise6-9:Thinkofthebelow.\n;TranslateStr;}注该题适用于“函数设计”10.编一程序,将一维数组中的元素向右循环位移N次例如,数组各元素的值依次为012345678910;位移3次后,各元素的值依次为891001234567#includestdio.h#defineN3#defineM11voidRightShift{intarray[M]={012345678910};intijtemp;fori=1;i=N;i++{temp=array[M-1];forj=M-1;j0;j--array[j]=array[j-1];array[j]=temp;}forj=0;jM;j++printf%darray[j];}voidmain{printfExercise6-10:circlerightshift\n;RightShift;}12.输入一个3行4列的数组,先以3行4列的格式输出该数组,然后找出该数组中值最小的元素,输出该元素及其两个下标#includestdio.hvoidFindMin{intarray
[3]
[4]ij;intminrowcol;printfInput3×4array:\n;fori=0;i3;i++//按行输入{forj=0;j4;j++scanf%darray[i][j];}printfThearrayislike:\n;fori=0;i3;i++//按行输出{forj=0;j4;j++printf%darray[i][j];printf\n;}//查找最小元素min=array
[0]
[0];row=0;col=0;fori=0;i3;i++//按行查找{forj=0;j4;j++ifminarray[i][j]{min=array[i][j];row=i;col=j;}}printfMin:array[%d][%d]=%d\nrowcolmin;}voidmain{printfExercise6-11:Findminfromarray.\n;FindMin;}13.编程序求4×4矩阵对角线之和#includestdio.h#defineN4voidCalAdd{intarray[N][N]ijresult=0;//按行输入数组并计算printfInput%d×%darray:\nNN;fori=0;iN;i++forj=0;jN;j++{scanf%darray[i][j];ifi==j||i+j+1==Nresult+=array[i][j];}printfTheresult=%d\nresult;}voidmain{printfExercise6-12:\n;CalAdd;}14.输入一个字符串,将其有的数字字符删除,打印删除后的字符串#includestdio.hvoidDelDigit{charstr
[80];intij=0;printfInputastring80:\n;getsstr;fori=0;str[i]!=\0;i++ifstr[i]=0||str[i]=9{str[j]=str[i];j++;}str[j]=\0;putsstr;}voidmain{printfExercise6-13:Deletedigitfromstring.\n;DelDigit;}15.输入一个十进制整数n,将其转换为二进制代码输出#includestdio.hvoidDecToBin{intnumij;charBin
[64];printfInputtheinteger:;scanf%dnum;i=0;whilenum{Bin[i]=num%2+0;i++;num/=2;}printfThebineray:;forj=i-1;j=0;j--printf%cBin[j];printf\n;}voidmain{printfExercise6-14:Changedectobin\n;DecToBin;}第7章课后习题参考答案1.选择题
(1)下面叙述中正确的是CA.对于用户自己定义的函数,在使用前必须加以说明B.说明函数时必须明确其参数类型和返回类型C.函数可以返回一个值,也可以什么值也不返回D.空函数不完成任何操作,所以在程序设计中没有用处
(2)下面叙述中错误的是AA.主函数中定义的变量在整个程序中都是有效的B.在其他函数中定义的变量在主函数中也不能使用C.形式参数也是局部变量D.复合语句中定义的函数只是在该复合语句中有效
(3)若函数的形参为一维数组,则下面说法中正确的是BA.调用函数时的对应实参必为数组名B.形参数组可以不指定大小C.形参数组的元素个数必须多于实参数组的元素个数D.形参数组的元素个数必须等于实参数组的元素个数
(4)在函数的定义和声明时若没有指出函数的类型,则BA.系统自动地认为函数的类型为实型 B.系统自动地认为函数的类型为整型C.系统自动地认为函数的类型为字符型D.编译时会出错
(5)下列函数定义语句中正确的是AA.floatcalfloatx;floatyB.floatcalfloatxy{{returnx*y;returnx*y;}}C.intcalxyD.intcalxy{floatxy;floatxy;{returnx*y;returnx*y;}}2.分析下列程序运行结果#includestdio.hintk;voidfan{intm=0;staticintn=0;k++;m++;n++;printf\n%4d%4d%4dkmn;}voidmain{fan;fan;k=5;fan;}解答程序运行结果为111212613运行结果分析程序中变量k为全局变量,其作用范围为整个程序,作用周期为整个程序运行周期;变量m为局部变量,其作用范围为函数fan内,作用周期为函数fan运行周期;变量n为局部静态变量,其作用范围为函数fan内,作用周期为整个程序运行周期下表列出三次调用函数fan时,变量kmn值的变化情况调用fan函数变量kmn初始值执行自增运算后kmn的值第一次调用fan函数0,0,01,1,1第二次调用fan函数1,0,1(k、n保留上次计算结果,m重新初始化为0)2,1,2第三次调用fan函数5,0,2(k被赋值5,n保留上次计算结果,m重新初始化为0)6,1,33.分析下列程序运行结果#includestdio.hlongfacintm{staticlongk=1L;whilemk*=m--;returnk;}voidmain{longij;i=fac3;j=fac5;printffac3=%ldfac5=%ldij;}解答程序运行结果为fac3=6fac5=720第一次调用fac3计算出3的阶乘为6,该结果保存在静态变量k中,第二次调用fac5时,k的初始值为6,所以实际求的是6×5!=7204.编写一个函数fib求Fibonacci数列中第n项的值,要求用迭代法而不是用递归算法,并编写main函数调用该函数,求fibn,n值由用户输入确定这个数列有如下特点第
1、2两个数为
1、1,从第3个数开始,该数是其前面两个数之和#includestdio.hvoidFibonacciintn{intFib0=1Fib1=1Fibn;inti;ifn3Fibn=1;else{fori=3;i=n;i++{Fibn=Fib0+Fib1;Fib0=Fib1;Fib1=Fibn;}}printfTheresults:\n;printf%d\nFibn;}voidmain{intn;printfExercise7-2:CalculateFibonacci\n;printfInputthen:;scanf%dn;Fibonaccin;}5.编写一个判断素数的函数,并应用该函数实现歌德巴赫猜想(一个大于等于4的偶数可以表示为两个素数之和)#includestdio.h#includemath.hintprimeintn//判断n2是否是素数,若是,返回1,否则返回0{inti;fori=2;i=sqrtn;i++ifn%i==0return0;return1;}voidmain{intij;intflag=0;fori=4;i1000;i+=2//验证1000以内的偶数{forj=2;j=i/2;j++//i为偶数,i=j+i-j,若j和i-j为素数,则命题成立ifprimejprimei-j{printf%03d=%03d+%03diji-j;flag++;ifflag==5{//每行输出5个printf\n;flag=0;}break;}}}6.设计一个函数MinCommonMultiple,计算两个正整数的最小公倍数要求如下
(1)设计函数原型并实现该函数;
(2)编写主函数,输入两个正整数,调用MinCommonMultiple,输出它们的最小公倍数#includestdio.hintMinCommonMultipleintnum1intnum2{intresult;result=num1num2num1:num2;result--;do{result++;}whileresult%num1!=0||result%num2!=0;returnresult;}voidmain{intnum1num2;printfExercise7-6:MinCommonMultiple\n;printfInputtwointegersseparatedbyspacekey:\n;scanf%d%dnum1num2;printfTheMinCommonMultipleof%dand%dis%d\nnum1num2MinCommonMultiplenum1num2;}7.编写程序求下式的值S=21×1+22×2!+…+2n×n!(n10)要求如下
(1)不使用数学函数,编写函数求2n和n!;
(2)编写函数调用前两个函数求S;
(3)在主函数中输入n,输出计算的S值#includestdio.hunsignedlongPowerOfTwointn//计算2的n次幂{unsignedlongresult=1;inti;fori=1;i=n;i++result*=2;returnresult;}unsignedlongFactorialintn//计算n的阶乘{unsignedlongresult=1;inti;fori=1;i=n;i++result*=i;returnresult;}unsignedlongFuncSintn//求S{unsignedlongresult=0;inti;fori=1;i=n;i++result+=PowerOfTwoi*Factoriali;returnresult;}voidmain{intn;unsignedlongS;printfExercise7-7:CalculateS\n;printfInputaninteger10:;scanf%dn;S=FuncSn;printfTheresultis%ld\nS;}8.编写一个函数invert,使一个字符串按反序存放在同一字符数组中,在main函数中输入一个字符串,调用该函数,使其逆序存放,然后输出结果#includestdio.h#includestring.hvoidinvertcharstring[]{intilen;chartemp;len=strlenstring;fori=0;ilen/2;i++{temp=string[i];string[i]=string[len-1-i];string[len-1-i]=temp;}}voidmain{charstr
[80];printfExercise7-8:Invertastring\n;printfInputastringlessthan80characters.\n;getsstr;invertstr;putsstr;}9.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果#includestdio.hintdigits=0space=0other=0;intCountStrcharstr[]{intletters=0i;fori=0;str[i]!=\0;i++{ifstr[i]=0str[i]=9digits++;elseifstr[i]=astr[i]=zletters++;elseifstr[i]=Astr[i]=Zletters++;elseifstr[i]==space++;elseother++;}returnletters;}voidmain{charstr
[80];intletters;printfExercise7-9:stringcount\n;printfInputastringlessthan80characters.\n;getsstr;letters=CountStrstr;printf\nletters=%ddigits=%dspace=%dother=%d\nlettersdigitsspaceother;}10.编写递归函数Sum计算1+2+3+…+n的值,并在主函数中输出调用Sum100的结果#includestdio.hlongSumintn{ifn==1return1;elsereturnSumn-1+n;}voidmain{intn;printfExercise7-10:Usingrecursivefunction\n;printfInputaninteger:;scanf%dn;printfTheresultis%ld\nSumn;}第8章课后习题参考答案1.阅读程序,写出其运行结果
(1)
9.0
(2)integerc=0
(3)ar=9ar=9ar=11
(4)64
(5)a=3a=3a=2
(6)820122.分析以下一组宏所定义的输出格式#defineNLputchar\n#definePRfprmatvalueprintfvalue=%format\tvalue#definePRINT1fx1PRfx1;NL#definePRINT2fx1x2PRfx1;PRINT1fx2如果在程序中有以下的宏引用PRdx;PRINT1dx;PRINT2dx1x2;写出宏展开后的情况,并写出相应输出的结果,设x=5x1=3x2=8题中错误#defineNLputchar\n#definePRfprmatvalueprintfvalue=%format\tvalue#definePRINT1fx1PRfx1;NL#definePRINT2fx1x2PRfx1;PRINT1fx2红字部分应为value=%f(是否对?)答案value=
5.000000ormatvalue=
5.000000ormatvalue=
3.000000ormatvalue=
8.000000ormat3.输入两个整数,求它们相除的余数用带参的宏来实现#defineYSx1x2x1%x2voidmain{inta=8b=5;intc;c=YSab;printf%dc;}4.编译预处理命令的作用是什么?答编辑预处理是指在对程序作正常编译之前,先对源程序中一些特殊的预处理命令作出处理,产生一个新的源程序,然后再对新的源程序进行正常的编译,得到目标代码可以有效地提高程序的可读性、可维护性和可移植性,减少目标程序的大小,并为模块化程序设计提供帮助5.定义一个带参数的宏使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参输出已交换后的两个值#defineHHtx1x2t=x1;x1=x2;x2=t;Px1x2#definePx3x4printfAfterchange:x1=%dx2=%dx3x4voidmain{intabt=0;printfPleaseinputfigure:x1=;scanf%da;printfPleaseinputfigure:x2=;scanf%db;printfBeforechange:x1=%dx2=%d\nab;HHtab;}6.编写一个宏定义LEAPYEARy,用以判定年份y是否是闰年判定标准是若y是4的倍数且不是100的倍数或者y是400的倍数,则y是闰年#defineLEAPYEARyify%4==0{ify%100==0{ify%400==0printf%disalaepsecondy;elseprintf%disnotaleapsecondy;}elseprintf%disaleapsecondy;}elseprintf%disnotaleapsecondy}main{intyy;scanf%dyy;LEAPYEARyy;}第9章课后习题参考答案
1、
(1)D
(2)C
(3)C
(4)A
(5)D
2、
(1)ffe211126A0B
(2)gae
(3)beforeswapintegera=5integerb=10inswapintegerx=10integery=5afterswapintegera=10integerb=5
(4)13579
(5)159
(6)123456789
(7)-5,-12,17
(8)15
(9)6
(10)输入12345678910输出
109876543213、#includestdio.h#includestring.hvoidfunchars[]{inta=0b=0c=0d=0e=0i=0;char*p;forp=s;*p!=\0;p++{if*p=A*p=Za++;elseif*p=a*p=zb++;elseif*p==c++;elseif*p=0*p=9d++;elsee++;}printf大写字母%d小写字母%d\nab;printf空格%d数字%d非字符%d\ncde;}voidmain{chars
[200];getss;funs;}
4、#includestdio.hintsnchar*a{inti=0;while*a++i++;returni;}voidmain{intsum;chara
[100];getsa;sum=sna;printf\n;printf%d\nsum;}
5、voidfuninta
[3]
[4]intmin{intijhz;fori=0;i3;i++forj=0;j4;j++{ifa[i][j]min{min=a[i][j];h=i;z=j;}}printfmin=%d横坐标为%d纵坐标为%d\nminhz;}voidmain{inta
[3]
[4]={0}min;intij;fori=0;i3;i++forj=0;j4;j++scanf%da[i][j];min=a
[0]
[0];funamin;}第10章课后习题参考答案1.如果有以下的定义structperson{charname
[20];intage;charsex;};structpersona={xiaomin20m}*p=a;则对字符串lining的引用方式可以是下面哪些?CADA.*p.nameB.p.nameC.a.nameD.p-name2.下面哪些定义的结构体在内存分配上是等价的?A
(1)structabc{charx;chary;intdata;};
(2)structabc{charxy;intdata;};
(3)structabc{intdata;charx;chary;};A.
(1)和
(2)B.
(2)和
(3)C.
(1)和
(3)D.
(1)
(2)和
(3)3.读懂源程序,并写出正确结果#includestdio.hstructstu{charname
[10];intscore
[3];};voidmain{structstustudent={″xiaowang″{998790}};structstu*p1=student;int*p2=student.score;printf%d\nstudent.score
[0];//屏幕显示99___________________printf%s\np1-name;//屏幕显示___xiaowang________________printf%d\np2
[2];//屏幕显示_____90______________printf%d\n*p2+1;//屏幕显示_____87______________}4.读懂源程序,并写出正确结果structst{intx;int*y;}*p;intdt[]={10203040};structstaa
[4]={50dt
[0]60dt
[1]70dt
[2]80dt
[3]};voidmain{p=aa+2;printf\n%d++p-x;}运行结果805.读懂源程序,并写出正确结果intfuncintd[]intn{intis=1;fori=0;in;i++s*=d[i];returns;}main{inta[]={12345678}x;x=funca4;printf\n%dx;}运行结果246.读懂源程序,并写出正确结果#includestdio.hVoidmain{union{inti
[2];longk;charc
[4];}t*s=t;s-i
[0]=0x39;s-i
[1]=0x38;printf%lx\ns-k;printf%c\ns-c
[0];}运行结果399第11章课后习题参考答案1.以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此文件文件中形成文本文件,并将字符的个数写到文件尾部#includestdio.h#includestdlib.hvoidmainvoid{FILE*fp;charch,fname
[32];intcount=0;printfInputthefilename;scanf%s,fname;iffp=fopen1,w+==NULL{printfCantopenfile%s\n,fname;exit0;}printfEnterdata\n;whilech=getchar!=#{fputcch,fp;count++;}fprintf2,\n%d\n,count;fclosefp;}1fname2fp3.ASCII码文件与二进制文件有什么不同?各自的特点是什么ASCII文件又称文本文件,它的每一个字节放一个ASCII代码,代表一个字符二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放用ASCII码形式输出与字符一一对应,一个字节代表一个字符因而便于对字符进行逐个处理,也便于输出字符但一般占存储空间较多,而且要花费转换时间用二进制形式输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式一般中间结果数据需要暂时保存在外存上,以后又需要输入到内存的,常用二进制文件保存4.对文件的打开与关闭的含义是什么?为什么要打开和关闭文件?打开文件实际上起着用户申请对文件使用权的作用经文件系统验证符合使用权时才允许用户使用文件,并适当地为用户做好使用文件前的准备关闭文件操作的作用是让用户向系统归还文件的使用权5.将“TurboC”和“BASIC”写入文件aa.txt#includestdio.h#includestdlib.h#includeconio.hvoidmain{voidWriteS;WriteS;}voidWriteS;{FILE*fp;charstr1[]=TurboC;charstr2[]=BASIC;iffp=fopenaa.txtw==NULL{printf文件不能打开;exit1;}fputsstr1fp;/*向fp指向的文件aa.txt写入字符串变量str1的内容*/fputsstr2fp;/*向fp指向的文件aa.txt写入字符串变量str2的内容*/fclosefp;}6.将aa.txt文件中内容输出到屏幕上#includestdio.h#includestdlib.h#includeconio.hvoidmain{VoidReadS;ReadS;}VoidReadS;{FILE*fp;charst1
[20]st2
[20];iffp=fopenaa.txtr==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}fgetsst120fp;fgetsst220fp;printfaa.txt文件中的内容如下:\n;printf%s\n%s\nst1st2;fclosefp;}7.有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中#includestdio.h#includestdlib.h#includeconio.hstructstudent{charname
[20];intnum;intscore
[3];floatav;}stu1
[5]*pstu;voidmain{voidWriteSt;WriteSt;}voidWriteSt{FILE*fp;charch;intij;pstu=stu;fori=0;i5;i++pstu++{printfpleaseinputNO.%dstudent\ni+1;printfname:;scanf%spstu-name;printfnumber:;scanf%dpstu-num;printfthreescore:;pstu-av=0;forj=0;j3;j++{scanf%dpstu-score[j];pstu-av+=pstu-score[j];}pstu-av/=3;}iffp=fopenstuwb+==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}pstu=stu;fwritepstusizeofstructstudent5fp;fclosefp;}8.将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排好序的学生数据存入一个新文件“stu-sort”中#includestdio.h#includestdlib.h#includeconio.hstructstudent{charname
[20];intnum;intscore
[3];floatav;}stu
[5]*pstu;voidmain{voidSortSt;SortSt;}voidSortSt{FILE*fp;structstudenttemp;intij;/*readdata*/pstu=stu;iffp=fopensturb+==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}freadpstusizeofstructstudent5fp;fclosefp;/*sort*/fori=0;i4;i++forj=i+1;j5;j++ifstu[i].avstu[j].av{temp=stu[i];stu[i]=stu[j];stu[j]=temp;}iffp=fopenstu_sortwb+==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}fwritepstusizeofstructstudent5fp;fclosefp;}9.将上题已排好序的学生成绩文件进行插入处理插入一个学生的三门课成绩,程序先计算新插入学生的平均成绩,然后将他按成绩高低顺序插入,插入后建立一个新文件#includestdio.h#includestdlib.h#includeconio.hstructstudent{charname
[20];intnum;intscore
[3];floatav;}stu
[6]*pstu;voidmain{voidInsert;Insert;}voidInsert{FILE*fp;structstudenttemp;intij;pstu=stu;/*inputdata*/printfpleaseinputmessageofstudent:\n;printfname:;scanf%stemp.name;printfnumber:;scanf%dtemp.num;printfthreescore:;temp.av=0;forj=0;j3;j++{scanf%dtemp.score[j];temp.av+=temp.score[j];}temp.av/=3;/*readdata*/iffp=fopenstu_sortrb+==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}freadpstusizeofstructstudent5fp;fclosefp;/*insert*/fori=4;i=0;i--{ifstu[i].avtemp.avstu[i+1]=stu[i];elsebreak;}stu[i+1]=temp;/*save*/iffp=fopenstu_sort_iwb+==NULL{printfCannotopenfilestrikeanykeyexit!;getch;exit1;}fwritepstusizeofstructstudent6fp;fclosefp;}第12章课后习题参考答案1.评论下面代码中名字和值的选择解
(1)代码中变量采用了误导性名称误导性名称最可怕的例子是用小字字母l和大写字母O作为变量名,尤其是在组合用的时候,因为它们看起来完全像是数值常量“壹”和“零”
(2)符号常量与实现相矛盾应修改为#defineTURE1#defineFALSE0ifch=getchar==EOFeof=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*kn-mc[k+1]:d[k--];解这样的表达式虽然紧凑,但是包含的内容过多,将它分解成几个部分,结构更清晰if2*kn-m*xp=c[k+1];else*xp=d[k--];*x+=*xp;
(3)if!c==y||c==Yreturn;解if语句的条件表达式中含有逻辑否定运算,这不是必要的,应该改变关系运算符的方向,使测试的结果变成肯定的ifc!=yc!=Yreturn;这样更符合自然语序
(4)length=lengthBUFSIZElength:BUFSIZE;解建议将表达式length=lengthBUFSIZElength:BUFSIZE;修改为条件语句,同时适当修改条件语句的语序,使读者不必费力去追踪条件表达式的每条路径,这样可以降低了代码语义的复杂性,使结构更加容易理解iflength=BUFSIZElength=BUFSIZE;
(5)flag=flag0:1;解建议将表达式修改为条件语句,可以避免逻辑语义混淆ifflagflag=0elseflag=1;3.把下面的C程序改得更清晰些解
(1)将循环变量的赋值、循环条件判断、增量运算放到for循环条件中,可以使结构更加紧凑、清晰fori=1j=0;in;i++j+=i;
(2)通过调整循环的增量运算以及语句x+=y的位置 ,转换成for循环结构的一般形式fori=0;i10;i++{scanf%lfy;x+=y ;}
(3)重新调整书写格式,并将赋值作为循环体,增量运算单独书写,这样循环的格式更普通,也更容易理解fori++;i100;i++a[i]=\0;*i=\0;return\n;4.把下列程序代码段改写得更为合理解
(1)通过修改if条件消除不必要的continue语句;在表达式A与B不太复杂的情况下,可将if条件提前到循环条件中,以便降低循环内部嵌套层次
(2)合理的缩进,以便代码的结构更加清晰;通过调整if语句的语序以消除不必要的continue语句;使用while循环结构代替do…while循环结构,减少不必要的判断第13章课后习题参考答案1.选择题
(1)D
(2)B
(3)C
(4)B
(5)B
(6)B
(7)D2.写出下列各程序的运行结果
(1)voidmain{unsignedcharcharacharbcharc;chara=0x3;charb=a10x8;charc=b1;printf%d\t%d\n”charbcharc;}题目中有错误voidmain{unsignedcharcharacharbcharc;chara=0x3;charb=0x8;charc=charb1;printf“%d\t%d\n”charbcharc;}答案816
(2)答案100
(3)voidmain{unsigneducharaucharb;uchara=0x9a;ucharb=~a;printf“uchara:%x\nucharb:%x\n”ucharaucharb;}答案题目中有错误把ucharb=~a当做ucharb=~uchara,则结果为uchara:9auchara:ff65
(4)答案0x6c
(5)答案mmm3.编写程序,完成对任一整数数据实现高、低位的交换(要求用位实现)#includestdio.hvoidmain{intsamaagad;scanf%xsa;ag=sa16;ad=sa16;ad=ad0xffff;ma=ag|ad;printf%x\nma;}4.编写函数,对一个32位的二进制数求它的偶数位(即从右至左取
0、
2、4……
28、30位)的值voidmain{charstr
[32];inti;fori=0;i32;i++scanf%cstr[i];fori=0;i32;i=i+2printf%cstr[i];}5.设计一个函数,使给出一个数的原码,能得到该数的补码(要求用二进制形式输入和输出)#includestdio.hcharma
[256];voidmain{char*p;printfyuanma:;scanf%sma;ifma
[0]==1{forp=ma+1;*p;p++if*p==1*p=0;else*p=1;forp--;;p--{if*p==0{*p=1;break;}else{*p=0;}ifp==mabreak;}}printfbuma:%sma;}
(2)#defineTURE0#defineFALSE1ifch=getchar==EOFeof=TURE;
(1)inta=l;ifO==la=O1;elsel=01;
(2)fori=0;i++10;x+=yscanf%lfy;
(1)inti=1j=0;for;;{ifinbreak;j+=i++;}
(3)fori++;i100;a[i++]=\0;*i=\0;return\n;
(1)whileA{ifBcontinue;C;}
(2)do{if!Acontinue;elseB;C;}whileA;whileA{ifBcontinue;C;}whileA{if!BC;}whileA!BC;do{if!Acontinue;elseB;C;}whileA;do{if!Acontinue;elseB;C;}whileA;do{ifA{B;C;}}whileA;whileA{B;C;};。