• 600.50 KB
  • 2022-04-22 11:21:44 发布

谭浩强C程序设计第三版习题部分参考解答一.doc

  • 46页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'C程序设计(第三版)谭浩强著例题汇总课后习题部分解析二〇一〇年十二月46 目录目录2第1章C语言概述5习题51.551.65TurboC2.0集成开发环境简介6File菜单6Run菜单7Compile菜单8Options菜单9Break/watch菜单11第3章数据类型、运算符与表达式12例题12大小写字母的转换12习题123.3123.4133.6133.7133.9143.10143.11143.1215第4章最简单的C程序设计——顺序程序设计16例题161.输出单个字符162.输入单个字符。163.输入三角形的三边长,求三角形面积。164.从键盘输入一个大写字母,要求改用小写字母输出175.求ax2+bx+c=0方程的根,a,b,c由键盘输入,设b2-4ac>0。17习题184.4184.5194.6194.7204.8204.9204.1021第5章选择结构程序设计22例题2246 1.输入3个数a,b,c,要求按由小到大的顺序输出222.编程序,输入一个x值,输出y的值。223.编写程序,判断某一年是否闰年。23习题245.2245.3245.4255.5255.6265.7275.8285.9305.1030第6章循环控制32例题321.求322.输出100~200之间的不能被3整除的所有整数。333.用公式求π的近似值,直至某一项的绝对值小于为止。333.求Fibonacci数列1,1,2,3,5,8,13……的前40个数。344.判断m是否素数。345.求100~200间的全部素数356.译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。36习题376.1376.2386.3386.4396.5406.6406.7416.8416.9426.10426.11436.12436.13446.14456.154646 46 第1章C语言概述习题1.5【1.5】参照本章例题,编写一个C程序,输出以下信息:******************************VeryGood!******************************【源程序参考】:#includevoidmain(){printf("******************************n");printf("VeryGood!n");printf("******************************n");}1.6【1.6】写一个程序,输入a,b,c三个值,输出其中最大者。【源程序参考1】:#includevoidmain(){inta,b,c,max;printf("inputa,b,c:n");scanf("%d%d%d",&a,&b,&c);max=a;if(maxvoidmain(){inta,b,c,max;printf("inputa,b,c:n");46 scanf("%d%d%d",&a,&b,&c);max=a>b?a:b;max=max>c?max:c;printf("max=%d",max);}TurboC2.0集成开发环境简介打开TurboC2.0集成开发环境的编辑窗口:主菜单:FileEditRunCompileProjectOptionsDebugBreak/watch除Edit外,其它各项均有子菜单,按F10或按Alt加上某项中第一个字母,就可进入该项的子菜单。File菜单46 File菜单的子菜单共有9项。1.Load:可以从指定的文件夹调入(打开)一个文件。该项的热键为F3。2.Pick:将最近打开的编辑窗口的8个文件列成一个表,方便用户快速选择。3.New:新建文件,缺省文件名为NONAME.C。4.Save:将编辑区中的文件存盘,只有第一次存盘时询问要存盘的文件名,以后选择该菜单不再询问文件名。其热键为F2。5.Writeto:另存为,若要修改文件名时可选择该菜单项。若该文件已存在,则询问要不要覆盖。6.Directory:显示目录及目录中的文件,可由用户指定要显示目录。7.Changedir:显示当前默认目录,用户可以改变默认目录。8.Osshell:暂时退出TurboC2.0编辑窗口到DOS提示符下,此时可以运行DOS命令,若想回到TurboC2.0编辑窗口中,在DOS状态下键入EXIT即可。9.Quit:退出TurboC2.0。Run菜单Run菜单的子菜单共有6项。1.Run:先进行编译、连接后才运行。其热键为Ctrl+F9。2.Programreset:中止当前的调试,释放分给程序的空间。其热键为Ctrl+F2。3.Gotocursor::调试程序时使用,选择该项可使程序运行到光标所在行。光标所在行必须为一条可执行语句,否则提示错误。其热键为F4。4.Traceinto:在执行一条调用其它用户定义的子函数时,若用Traceinto项,则可跟踪到该子函数内部去执行。使用该菜单调试程序更方便。其热键为F7。5.Stepover:执行当前函数的下一条语句,即使用户函数调用,但不会跟踪函数内部的执行。其热键为F8。6.Userscreen:查看程序的运行结果。其热键为Alt+F5。46 Compile菜单1.CompiletoOBJ:将一个C源文件编译生成.OBJ目标文件,同时显示生成的文件名。其热键为Alt+F9。2.MakeEXEfile:此命令生成一个.EXE的文件,并显示生成的文件名。3.LinkEXEfile:把当前.OBJ文件及库文件连接在一起生成.EXE文件。4.Buildall:重新编译项目里的所有文件,并进行装配生成.EXE文件。该命令不作过时检查(上面的几条命令要作过时检查,即如果目前项目里源文件的日期和时间与目标文件相同或更早,则拒绝对源文件进行编译)。5.PrimaryCfile:当在该项中指定了主文件后,在以后的编译中,如没有项目文件名则编译此项中规定的主C文件,如果编译中有错误,则将此文件调入编辑窗口,不管目前窗口中是不是主C文件。6.Getinfo:获得有关当前路径、源文件名、源文件字节大小、编译中的错误数目、可用空间等信息。46 Options菜单1.Compiler:本项选择又有许多子菜单,可以让用户选择硬件配置、存储模型、调试技术、代码优化、对话信息控制和宏定义。2.Linker:本菜单设置有关连接的选择项。3.Environment:菜单规定是否对某些文件自动存盘及制表键和屏幕大小的设置。46 1)Messagetracking:²Currentfile 跟踪在编辑窗口中的文件错误。²Allfiles跟踪所有文件错误。²Off 不跟踪。2)Keepmessage :编译前是否清除Message窗口中的信息。3)Configautosave:选on时,在Run,Shell或退出集成开发环境之前,如果TurboC2.0的配置被改过,则所做的改动将存入配置文件中。选off时不存。4)Editautosave:是否在Run或Shell之前,自动存储编辑的源文件。5)Backupfile:是否在源文件存盘时产生后备文件(.BAK文件)。6)Tabsize:设置制表键大小,默认为8。7)Zoomedwindows:将现行活动窗口放大到整个屏幕,其热键为F5。8)Screensize设置屏幕文本大小。2.Directories:设置编译、连接所需文件的路径。(1)Includedirectories:包含文件夹include的路径。46 (1)Librarydirectories:库文件夹的路径。(2)Outputdirectoried:输出文件(.OBJ,.EXE,.MAP文件)的目录。(3)TurboCdirectoried:TurboC所在的目录。(4)Pickfilename:定义加载的pick文件名,如不定义则从currentpickfile中取。1.Arguments:允许用户使用命令行参数。2.Saveoptions:保存所有选择的编译、连接、调试和项目到配置文件中,缺省的配置文件为TCCONFIG.TC。3.Retriveoptions装入一个配置文件到TC中,TC将使用该文件的选择项。Break/watch菜单1.Addwatch:向监视窗口插入一监视表达式。2.Deletewatch:从监视窗口中删除当前的监视表达式。3.Editwatch:在监视窗口中编辑一个监视表达式。4.Removeall:watches从监视窗口中删除所有的监视表达式。5.Togglebreakpoint:对光标所在的行设置或清除断点。6.Clearallbreakpoints:清除所有断点。7.Viewnextbreakpoint:将光标移动到下一个断点处。46 第3章数据类型、运算符与表达式例题大小写字母的转换【源程序】:#includevoidmain(){charc1,c2;c1="a";c2="B";c1=c1-32;/*小写转换为大写*/c2=c2+32;/*大写转换为小写*/printf("%c,%cn%d,%dn",c1,c2,c1,c2);}习题3.3【3.3】请将下面各数用八进制和十六进制数表示:(1)10(2)32(3)75(4)-617(5)-111(6)2483(7)-28654(8)21003【解答】:(1)(10)10=(12)8=(A)16(2)(32)10=(40)8=(20)16(3)(75)10=(113)8=(4B)16(4)(-617)10=(176627)8=(FD97)16因带符号数在计算机中采用补码表示,正数的补码与原码相同,负数的补码求反加1,以2个字节存储,则-617的补码为:1111110110010111,将其转换为八进制,十六进制数分别为:(176627)8、(FD97)16(5)(-111)10=(177621)8=(FF91)16以2个字节存储,则-111的补码为1111111110010001将其转换为八进制,十六进制数分别为:(177621)8、(FF91)16(6)(2483)10=(4663)8=(9B3)16(7)(-28654)10=(110022)8=(9012)16(8)(21003)10=(51013)8=(520B)1646 3.4【3.4】将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。【解答】:各数据在内存中的存储形式如下表所示:变量的类型25-232769int型00…0000110018位111111111111111015100…001(溢出)14long型00…0000110012411…11103100…0100…0011614short型100…0000110018111111111111111015100…001(溢出)14signedchar(8位)1000110011111111000000001(溢出)unsignedint型00…000011001811…11015100…00114unsignedlong型00…0000110012411…1103100…0100…0011614unsignedshort型00…000011001811…11015100…0018unsignedchar型000110011111111000000001其中int和short类型,其取值范围是-32768~32767。32769在这两种类型中实际表示负数,它是一个负数的补码,对其再求一次补码可得其真值,char和unsignedchar为8位,若将int或long类型数据赋给这种类型,则截取数据低8位。同理,若将long赋给int,则截取低16位。3.6【3.6】写出以下程序运行的结果:#includevoidmain(){charcl=’a’,c2=’b’,c3=’c’,c4=’101’,c5=’116’;printf(“a%cb%ctc%ctabcn”,c1,c2,c3);printf(“tb%c%c”,c4,c5);}【运行结果】:aabbccabcAN3.7【3.7】要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’46 ,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。【参考源程序】#includevoidmain(){charc1="C",c2="h",c3="i",c4="n",c5="a";c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf("%c%c%c%c%cn",c1,c2,c3,c4,c5);}3.9【3.9】求下面算术表达式的值。(1)x+a%3*(int)(x+y)%2/4设x=2.5,a=7,y=4..7【解答】:2.5(2)(float)(a+b)/2+(int)x%(int)y设a=2,b=3,x=3.5,y=2.5【解答】:3.53.10【3.10】写出程序运行的结果。【运行结果】9,11,9,103.11【3.11】写出下面赋值的结果。格中写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。【解答】:int9910076536842-1char‘c’‘d’‘L’‘5’‘D’‘*’无unsignedint991007653684265535float99.000000100.00000076.00000053.6568.00000042.00000065535.000000longint99100765368426553546 3.12【3.12】出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。(1)a+=a(2)a-=2(3)a*=2+3(4)a/=a+a(5)a%=(n%=2),n的值等于5(6)a+=a-=a*=a【解答】(1)24(2)10(3)60(4)0(5)0(6)046 第4章最简单的C程序设计——顺序程序设计例题1.输出单个字符#includemain(){chara="B",b="o",c="k";putchar(a);putchar(b);putchar(b);putchar(c);putchar("t");putchar(a);putchar(b);putchar("n");putchar(b);putchar(c);}【运行结果】:BookBook2.输入单个字符。#includevoidmain(){charc;printf("inputacharactern");c=getchar();putchar(c);}3.输入三角形的三边长,求三角形面积。已知三角形的三边长a,b,c,则该三角形的面积公式为:,其中s=(a+b+c)/2【源程序】:#includevoidmain(){floata,b,c,s,area;46 scanf(“%f,%f,%f”,&a,&b,&c);s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn”,a,b,c,s);printf(“area=%7.2fn”,area);}4.从键盘输入一个大写字母,要求改用小写字母输出【源程序】:#include#includevoidmain(){charc1,c2;c1=getchar();printf("%c,%dn",c1,c1);c2=c1+32;printf("%c,%dn",c2,c2);}5.求ax2+bx+c=0方程的根,a,b,c由键盘输入,设b2-4ac>0。【源程序】:#include#includevoidmain(){floata,b,c,disc,x1,x2,p,q;scanf("%f%f%f",&a,&b,&c);disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;printf("nx1=%5.2fnx2=%5.2fn",x1,x2);}【扩展】求一元二次方程的根。要求。若输出两个不同的实根,若输出相同的实根,否则输出两复根。【源程序】:#include#include46 voidmain(){inta,b,c;floatd,x1,x2,p,q;printf("Inputa,b,c:");scanf("%d%d%d",&a,&b,&c);d=b*b-4*a*c;求两个不同的实根if(a!=0){if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("Realroot:x1=%.2fx2=%.2fn",x1,x2);}else{求两个相同的实根if(d==0){x1=-b/(2.0*a);求两个复根printf("Realroot:x1=x2=%.2fn",x1);}else{p=-b/(2.0*a);q=sqrt(-d)/(2*a);printf("Complexroot:%.2f+%.2fi,",p,q);printf("%.2f-%.2fi",p,q);}}}elseprintf("dataerror!");}习题4.4【4.4】若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。【参考源程序】:#include46 voidmain(){inta,b,c;longintu,n;floatx,y,z;charc1,c2;a=3;b=4;c=5;x=1.2;y=2.4;z=-3.6;u=51247;n=128765;c1=’a’;c2=’b’;printf(“n”);printf(“a=%2db=%2dc=%2dn”,a,b,c);printf(“x=%.6f,y=%.6f,z=%.6fn”,x,y,z);printf(“x+y=%.2fy+z=%.2fz+x=%.2fn”,x+y,y+z,z+x);printf(“u=%6ldn=%9ldn”,u,n);printf(“c1=’%c’or%d(ASCII)n”,c1,c1);printf(“c2=’%c’or%d(ASCII)n”,c2,c2);}4.5【4.5】请写出下面程序的输出结果:【运行结果】:575767.856400,-789.12402367.856400,-789.12402367.86,-789.12,67.856400,-789.124023,67.856400,-789.1240236.78564e+01,-7.9e+02A,65,101,411234567,4553207,d68765535,177777,ffff,-1COMPUTER,COM4.6【4.6】用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入?【输入信息】:a=3b=78.571.82Aa46 4.7【4.7】下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据?scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);【输入情况】□□□10□□□20Aa1.5□–3.75□1,67.8(其中□为空格,加粗划线的数据可以任意,%*f中*的作用表示这时输入的数据不赋给任何变量。)4.8【4.8】圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。【参考源程序】:#definePI3.14159#includevoidmain(){floath,r,cf,area,sq,vq,vz;printf("inputr,h:n");scanf("%f%f",&r,&h);cf=2*PI*r;area=r*r*PI;sq=4*PI*r*r;vq=3.0/4.0*PI*r*r*r;vz=PI*r*r*h;printf("circumference:=%6.2fn",cf);printf("area:=%-6.2fn",area);printf("superficialarea:=%6.2fn",sq);printf("volumeofthissphere:=%6.2fn",vq);printf("volumeofthiscolumn:=%6.2fn",vz);}4.9【4.9】输入一个华氏温度,要求输出摄氏温度,公式为:输出要有文字说明,取2位小数。【参考源程序】:#includevoidmain(){46 floatc,f;printf("EnteraFahrenheittemperature:n");scanf("%f",&f);c=(f-32)*5/9;printf("Celsiustemperature:%5.2fn",c);}4.10【4.10】编程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。【参考源程序】#includevoidmain(){charc1,c2;c1=getchar();c2=getchar();printf("%c,%cn",c1,c2);putchar(c1);putchar(c2);}输出c1,c2值的ASCII码时,应采用printf函数以整型类型输出。#includevoidmain(){charc1,c2;c1=getchar();c2=getchar();printf("%c,%cn",c1,c2);putchar(c1);putchar(c2);printf("n%d,%d",c1,c2);}通常情况下,整型变量与字符变量可以互相代替,字符型数据将该字符的相应的ASCII代码存储在存储单元,在内存中它的存储形式与整型数据的存储形式类似。这使字符型数据与整型数据之间可以通用。但字符数据只占一个字符,因此它只能存放0~255范围的整数。46 第5章选择结构程序设计例题1.输入3个数a,b,c,要求按由小到大的顺序输出【源程序】:#includevoidmain(){floata,b,c,t;scanf("%f%f%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("n%.2f,%.2f,%.2f",a,b,c);}2.编程序,输入一个x值,输出y的值。函数:【源程序一】:#includevoidmain(){intx,y;printf("Enterx:");46 scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("nx=%d:y=%d",x,y);}【源程序二】#includevoidmain(){intx,y;printf("Enterx:");scanf("%d",&x);switch(x>0){case1:y=1;break;case0:switch(x==0){case1:y=0;break;case0:y=-1;break;}}printf("nx=%d:y=%d",x,y);}3.编写程序,判断某一年是否闰年。【源程序】:#includevoidmain(){intyear;printf("Enteryear:");scanf("%d",&year);if(year%4==0&&year%100!=0||year%100==0&&year%400==0)printf("%dyearisleapyearn",year);elseprintf("%dyearisnotleapyearn",year);}【判断闰年的算法】:46 1)能被4整除,但不能被100整除的年份;2)能被100整除,又能被400整除的年份;【扩展】求2000~2055年间的所有闰年。【源程序】:#includevoidmain(){intyear,i,j=0;printf("2000~2055yearisleapyear:n");for(i=2000;i<=2055;i++){if(i%4==0&&i%100!=0){printf("%d",i);j++;}if(i%100==0&&i%400==0){printf("%d",i);j++;}if(j%4==0)printf("n");}}习题5.2【5.2】语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?在C语言中,用1表示“真”,用0表示“假”。若判断一个逻辑量的值时,以非0代表“真”,以0代表“假”。5.3【5.3】写出下面各逻辑表达式的值。设a=3,b=4,c=5。(1)a+b>c&&b==c0(2)a||b+c&&b-c1(3)!(a>b)&&!c||1146 (4)!(x=a)&&(y=b)&&00(5)!(a+b)+c-1&&b+c/215.4【5.4】有3个整数a,b,c,由键盘输入,输出其中最大的数。【参考源程序一】#includevoidmain(){inta,b,c,max;printf("Entera,b,c:");scanf("%d,%d,%d",&a,&b,&c);max=a;if(maxvoidmain(){inta,b,c,max;printf("Entera,b,c:");scanf("%d,%d,%d",&a,&b,&c);max=a>b?(a>c?a:c):(b>c?b:c);printf("max=%dn",max);}5.5【5.5】有一函数:写一程序,输入x值,输出y值。【参考源程序】#includevoidmain(){intx,y;printf("Inputx:");46 scanf("%d",&x);if(x<1)y=x;elseif(x<10)y=2*x-1;elsey=3*x-11;printf("x=%d,y=%dn",x,y);}5.6【5.6】给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。【参考源程序】:#include"stdio.h"voidmain(){floatscore;chargrade;printf("Inputscore:");scanf("%f",&score);while(score>100||score<0){printf("nInputisincorrect,pleaseagain");scanf("%f",&score);}switch((int)(score/10)){case10:case9:grade="A";break;case8:grade="B";break;case7:grade="C";break;case6:grade="D";break;case5:case4:case3:case2:case1:case0:grade="E";}printf("nScoer:%5.1f,Grade:%cn",score,grade);}46 5.7【5.7】给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。【参考源程序一】:#includevoidmain(){longnum;intge_w,shi_w,bai_w,qian_w,wan_w,m;do{printf(“Inputnumber(0~99999):”);scanf(“%ld”,&num);}while(num<0||num>99999);if(num>9999)m=5;elseif(num>999)m=4;elseif(num>99)m=3;elseif(num>9)m=2;elsem=1;printf(“Thenumberofdigitsis=%dn”,m);ge_w=num%10;shi_w=num/10%10;bai_w=num/100%10;qian_w=num/1000%10;wan_w=num/10000;switch(m){case5:printf(“%d,%d,%d,%d,%d”,wan_w,qian_w,bai_w,shi_w,ge_w);printf(“nInvertedsequence:”);printf(“%d%d%d%d%dn”,ge_w,shi_w,bai_w,qian_w,wan_w);break;case4:printf(“%d,%d,%d,%d”,qian_w,bai_w,shi_w,ge_w);printf(“nInvertedsequence:”);printf(“%d%d%d%dn”,ge_w,shi_w,bai_w,qian_w);break;case3:printf(“%d,%d,%d”,bai_w,shi_w,ge_w);printf(“nInvertedsequence:”);printf(“%d%d%dn”,ge_w,shi_w,bai_w);break;case2:printf(“%d,%d”,shi_w,ge_w);printf(“nInvertedsequence:”);printf(“%d%dn”,ge_w,shi_w);break;case1:printf(“%d”,ge_w);printf(“nInvertedsequence:”);46 printf(“%dn”,ge_w);break;}}【参考源程序二】#includevoidmain(){inti,n=0;longm,k=0;do{printf("inputm:n");scanf("%ld",&m);}while(m>32767);while(m!=0){printf("%d",m%10);k=k*10+m%10;/*求一个正整数的逆序数*/m=m/10;n++;}printf(“n%d,%d,%ld",m,n,k);}5.8【5.8】企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(1000001000000时,超过100万的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。【参考源程序if语句】#includevoidmain(){longi;floatbonus,bon1,bon2,bon4,bon6,bon10;bon1=100000*0.1;/*利润为10万元时的奖金*/bon2=bon1+100000*0.075;/*利润为20万元时的奖金*/bon4=bon2+100000*0.05;/*利润为40万元时的奖金*/bon6=bon4+100000*0.03;/*利润为60万元时的奖金*/bon10=bon6+400000*0.015;/*利润为100万元时的奖金*/printf(“Inputprofiti:”);scanf(“%ld”,&i);if(i<=100000)bonus=i*0.1;/*利润在10万元以内按0.1提成奖金*/elseif(i<=200000)46 bonus=bon1+(i-100000)*0.075;/*利润在10万至20万元时的奖金*/elseif(i<=400000)bonus=bon2+(i-200000)*0.05;/*利润在20万至40万元时的奖金*/elseif(i<=600000)bonus=bon4+(i-400000)*0.03;/*利润在40万元至60万元时的奖金*/elseif(i<=1000000)bonus=bon6+(i-600000)*0.015;/*利润在60万元至100万元时的奖金*/elsebonus=bon10+(i-1000000)*0.01;/*利润在100万元以上时的奖金*/printf(“Profit:%ld,Bonus:%10.2f”,i,bonus);}【参考源程序switch语句】#includevoidmain(){longi;floatbonus,bon1,bon2,bon4,bon6,bon10;intc;printf(“Inputprofiti:”);scanf(“%ld”,&i);bon1=100000*0.1;bon2=bon1+100000*0.075;bon4=bon2+200000*0.05;bon6=bon4+200000*0.03;bon10=bon6+400000*0.015;c=i/100000;if(c>10)c=10;switch(c){case0:bonus=i*0.1;break;case1:bonus=bon1+(i-100000)*0.075;break;case2:case3:bonus=bon2+(i-200000)*0.05;break;case4:case5:bonus=bon4+(i-400000)*0.03;break;case6:case7:case8:case9:bonus=bon6+(i-600000)*0.015;break;case10:bonus=bon10+(i-1000000)*0.01;}printf(“Profit:%ld,Bonus:%10.2f”,i,bonus);}46 5.9【5.9】输入4个整数,要求按由小到大的顺序输出。【参考源程序】#include"stdio.h"#includevoidmain(){intt,a,b,c,d;printf("Pleaseenter4integer:");scanf("%d%d%d%d",&a,&b,&c,&d);printf("a=%d,b=%d,c=%d,d=%dn",a,b,c,d);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(a>d){t=a;a=d;d=t;}if(b>c){t=b;b=c;c=t;}if(b>d){t=b;b=d;d=t;}if(c>d){t=c;c=d;d=t;}printf("Fromsmalltolarge:n");printf("%d%d%d%dn",a,b,c,d);}5.10【5.10】有4个圆塔,圆心分别为(2,2),(-2,2),(2,-2),(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。【参考源程序】#includevoidmain(){inth=10,r;floatx1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;printf(“Pleaseradiusr&&(x,y):n”);scanf(“%d%f%f”,&x,&y);d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);/*求任一点到各中心点的距离*/46 d2=(x-x2)*(x-x2)+(y+y2)*(y+y2);d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);d4=(x+x4)*(x+x4)+(y+y4)*(y+y4);if(d1>r&&d2>r&&d3>r&&d4>r)h=0;/*判断该点是否在塔外*/printf(“%d”,h);}46 第6章循环控制例题1.求【源程序for语句】#includevoidmain(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("1+2+...+100=%dn",sum);}【源程序while语句】#includevoidmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("1+2+...+100=%dn",sum);}【源程序do-while语句】#includevoidmain(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);46 printf("1+2+...+100=%dn",sum);}2.输出100~200之间的不能被3整除的所有整数。【源程序】#includevoidmain(){intn,m=0;for(n=100;n<=200;n++){if(n%3==0)continue;if(m%5==0)printf("n");printf("%6d",n);m++;}}3.用公式求π的近似值,直至某一项的绝对值小于为止。【源程序】#includevoidmain(){ints;floatn,t,pi;t=1,pi=0;n=1.0;s=1;while(fabs(t)>1e-6){pi=pi+t;n=n+2;s=-s;/*该语句处理负号*/t=s/n;}pi=pi*4;printf("pi=%10.6fn",pi);}46 3.求Fibonacci数列1,1,2,3,5,8,13……的前40个数。初始条件:a1=0n=1a2=1n=2递推条件:【参考源程序一】#includevoidmain(){longa,a1,a2;intn;a1=1;a2=1;for(n=2;n<=20;n++,i++){if(n%2==0)printf("n");printf("%10ld%10ld",a1,a2);a1=a1+a2;a2=a1+a2;}}【源程序二】#includevoidmain(){longa,a1,a2;intn;a1=1;a2=1;printf("n%10ld%10ldn",a1,a2);for(n=3;n<=40;n++){a=a1+a2;a1=a2;a2=a;if(n%3==0)printf("n");printf("%10ld",a);}}4.判断m是否素数。【源程序一】#include46 #includevoidmain(){intm,i,k;scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k)printf(“yes");elseprintf(“no");}【源程序二】#includeVoidmain(){inti,f;intok=1;printf("EnteraNumber:");scanf("%d",&f);i=2;while(ok&&ivoidmain(){intm,i,k,n=0;for(m=101;m<=200;m=m+2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1){printf(“%d”,m);n=n+1;46 }if(n%6==0)printf(“n”);}}6.译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按如下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。字母按上述规律转换,非字母字符不变。例如“China!”转换为“Glmre!”。输入一行字符,要求输出其相应的密码。【源程序一】#includevoidmain(){charc;while((c=getchar())!="\n"){if((c>="a"&&c<="z")||(c>="A"&&c<="Z")){c=c+4;if(c>"Z"&&c<="Z"+4||c>"z")c=c-26;}printf("%c",c);}}【源程序二】#includevoidmain(){charc;while((c=getchar())!="\n"){if(c>="a"&&c<="z")c="a"+(c-"a"+4)%26;elseif(c>="A"&&c<="Z")c="A"+(c-"A"+4)%26;}printf("%c",c);}}46 习题6.1【6.1】输入两个正整数m和n,求其最大公约数和最小公倍数。【用辗转相除法求最大公约数】#include原始概念:r=n%mwhile(r!=0){n=m;m=r;r=n%m;}oidmain(){intn1,m1,r,n,m,t;printf(“Pleasen&m:n”);scanf(“%d%d”,&n,&m);if(nvoidmain(){intm,n,min,i,max,j;printf(“Pleasen&m:n”);scanf(“%d%d”,&n,&m);if(n=1;i--)if(m%i==0&&n%i==0)break;printf(“GYS:(%d,%d)=%dn”,n,m,i);for(j=max;j<=m*n;j++)if(j%m==0&&j%n==0)break;46 printf(“GBS:[%d,%d]=%dn”,n,m,j);;}6.2【6.2】输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。【源程序】#includevoidmain(){charc;intletter=0,space=0,digit=0,other=0;printf(“Pleaseinputlinecharacters:n”);while((c=getchar())!=’n’){if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’)letter++;elseif(c==’’)space++;elseif(c>=’0’&&c<=’9’)digit++;elseother++;}printf(“Letter=%d,Space=%d,Digit=%d,Other=%dn”,letter,space,digit,other);}6.3【6.3】求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。例如:2+22+222+2222+22222n个a(此时n=5),n由键盘输入。【源程序】#includevoidmain(){longa,sum=0,k=0;inti,n;printf("inputnanda:");scanf("%d%ld",&n,&a);for(i=1;i<=n;i++){46 k=k*10+a;sum=sum+k;}printf("%ld",sum);}6.4【6.4】求(即求1+2!+…+20!)。【源程序】:#includevoidmain(){longi,n,sum=0,t=1;printf("inputn");scanf("%ld",&n);for(i=1;i<=n;i++){t=t*i;sum=sum+t;}printf("1!+2!+...+%ld!=%ld",n,sum);}【源程序,考虑到数的溢出的问题,应改为实型数据求解】#includevoidmain(){inti,n;doublesum=0,t=1;printf("inputn");scanf("%d",&n);for(i=1;i<=n;i++){t=t*i;sum=sum+t;}printf("1!+2!+...+%d!=%.0lf",n,sum);}46 6.5【6.5】求。#include"stdio.h"voidmain(){intn1=100,n2=50,n3=10,k;floatsum=0;for(k=1;k<=n1;k++)sum+=k;for(k=1;k<=n2;k++)sum+=k*k;for(k=1;k<=n3;k++)sum+=1.0/k;printf("sum=%8.2fn",sum);}6.6【6.6】打印出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为153=13+53+33。【源程序】#includevoidmain(){inti,j,k,n;for(n=100;n<1000;n++){i=n/100;j=n/10%10;k=n%10;if(n==i*i*i+j*j*j+k*k*k)printf(“%4d”,n);}}46 6.7【6.7】一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000以内的所有“完数”,并按下面的格式输出其因子:6Itsfactorsare1,2,3【源程序】#includevoidmain(){intm,s,i;for(m=2;m<1000;m++){s=0;for(i=1;ivoidmain(){inti,n=20;floata=2,b=1,sum=0;for(i=1;i<=n;i++){sum+=a/b;a=a+b;b=a-b;}printf(“sum=%fn”,sum);}46 6.9【6.9】一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?【源程序】#includevoidmain(){floatsum=100,h;intn;h=sum/2;for(n=2;n<=10;n++){sum=sum+2*h;/*第n次落地时共经过的米数*/h=h/2;/*第n次反弹高度*/}printf("%f%fn",sn,h);}6.10【6.10】猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩一个桃子了。求第一天共摘多少桃子。【源程序】#includevoidmain(){intday,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;/*第一天的桃子数是第二天桃子数加1后的2倍*/x2=x1;day--;}printf(“total=%dn”,x1);}46 6.11【6.11】用迭代法求x=。求平方根的迭代公式为,要求前后两次求出的x的差的绝对值小于。迭代法是一种不断用变量的旧值递推新值的过程。迭代算法是用计算机解决问题的一种基本方法。用迭代法解决问题时,需考虑三个方面的问题:¨确定迭代变量。至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。¨建立迭代公式。¨确定迭代终止条件。迭代过程的控制通常可分为两种情况:一种是规定了迭代次数。另一种是迭代次数无法确定,分析得出结束迭代过程的条件。#include#includevoidmain(){floatx,x1,a;printf("Inputa:");scanf("%f",&a);x=a/2;x1=(x+a/x)/2;while(fabs(x1-x)>1e-5){x=x1;x1=(x+a/x)/2;}printf("root=%fn",x1);}6.12【6.12】用牛顿迭代法求方程在1.5附近的根。牛顿迭代公式46 #include#includevoidmain(){floatx1,x0,f,f1;x1=1.5;do{x0=x1;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x1=x0-f/f1;}while(fabs(x1-x0)>=1e-5);printf("THerootofequationis%5.2fn",x1);}6.13【6.13】用二分法求方程在(-10,10)之间的根。二分法的思路如下:先指定一个区间[x1,x2],如果函数f(x)在此区间是单调函数,且f(x1)和f(x2)是异号,则方程f(x)=0在[x1,x2]区间内必有一个(且只有一个)实根。若f(x1)和f(x2)同符号,则在[x1,x2]区间无实根,重新改变x1和x2的值。当确定[x1,x2]有一个实根,采用二分法将[x1,x2]区间一分为二,再判断在哪个小区间中有实根。如此不断进行下去,直到区间足够小为止。#include"stdio.h"#include"math.h"voidmain(){floatx0,x1,x2,fx0,fx1,fx2;do{printf("Pleaseenterx1,x2:");scanf("%f%f",&x1,&x2);fx1=x1*((2*x1-4)*x1+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;}while(fx1*fx2>0);do{x0=(x1+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6;if(fx0*fx1<0)46 {x2=x0;fx2=fx0;}else{x1=x0;fx1=fx0;}}while(fabs(fx0)>=1e-5);printf("x=%6.2fn",x0);}6.14【6.14】打印出以下图案:#includevoidmain(){inti,j,k;for(i=0;i<=3;i++){for(j=0;j<=12-i;j++)printf(“”);/*输出*号前面的空格*/for(k=0;k<=2*i;k++)printf(“*”);/*输出*号*/printf(“n”);/*输出完一行*号后换行*/}for(i=0;i<=2;i++)/*输出下面3行*号*/{for(j=0;j<=10+i;j++)printf(“”);/*输出*号前面的空格*/for(k=0;k<=4-2*i;k++)printf(“*”);/*输出*号*/printf(“n”);/*输出完一行*后换行*/}46 }6.15【6.15】两个乒乓球队进行比赛,各出3人。甲队为A、B、C3人,乙队为X、Y、Z3人。已抽签决定比赛名单。有人向队员打听比赛名单。A说他不和X比,C说他不和X、Z比。请编程找出3对赛手的名单。解:用计算机程序处理此问题时,必须对每一种成对的组合一一检验,看他们是否符合条件。开始时,并不知道A、B、C与X、Y、Z中哪一个比赛,可以假设A与i比赛,B与j比赛,C与k比赛。【源程序一】#includevoidmain(){chari,j,k;/*i是A的对手,j是B的对手,k是C的对手*/for(i="Y";i<="Z";i++)for(j="X";j<="Z";j++){k="Y";if(i!=j&&i!=k&&j!=k)printf("A--%ctB--%ctC--%cn",i,j,k);}}【源程序二】#includevoidmain(){chari,j,k;/*i是A的对手,j是B的对手,k是C的对手*/for(i="X";i<="Z";i++)for(j="X";j<="Z";j++)if(i!=j)for(k="X";k<="Z";k++)if(i!=k&&j!=k)if(i!="X"&&k!="X"&&k!="Z")printf("A--%ctB--%ctC--%cn",i,j,k);}46'