c程序设计第三版习题参考解答全_第1页
c程序设计第三版习题参考解答全_第2页
c程序设计第三版习题参考解答全_第3页
c程序设计第三版习题参考解答全_第4页
c程序设计第三版习题参考解答全_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERC程序设计(第三版)课后习题参考解答第1章C语言概述15参照本章例题,编写一个C程序,输出以下信息VERYGOOD解MAINPRINTF“N“PRINTF“N“PRINTF“VERYGOODN“PRINTF“N“PRINTF“N“16写一个程序,输入A,B,C三个值,输出其中最大者。解MAININTA,B,C,MAXPRINTF“请输入三个数A,B,CN“SCANF“D,D,D“,MAXAIFMAXVOIDMAININTA,BFLOATX,YCHARC1,C2SCANF“ADBD“,SCANF“FE“,SCANF“CC“,解A3B7857182GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERAA47下面的SCANF函数输入数据,使A10,B20,C1A,C2A,X15,Y375,Z678,请问在键盘上如何输入数据SCANF“5D5DCCFFF,F“,解MAININTA,BFLOATX,Y,ZCHARC1,C2SCANF“5D5DCCFFF,F“,PRINTF“AD,BD,C15C,C2C,X62F,Y62F,Z62FN“,A,B,C1,C2,X,Y,Z运行情况如下1020AA1537515,678(此行为输入的数据,其中为空格)A10,B20,C1A,C2A,X150,Y375,Z6780(此行为输出)说明按5D格式的要求输入A和B时,要先键入三个空格,然后再键入10与20。F是用来禁止赋值的。在输入时,对应于F的地方,随意打入了一个数15,该值不会赋给任何变量。48圆半径R15,圆柱高H3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用SCANF输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。解MAINFLOATPI,H,R,L,S,SQ,VQ,VZPI31415926PRINTF“请输入圆半径R,圆柱高HN“SCANF“F,F“,L2PIRSRRPISQ4PIRRVQ30/40PIRRRVZPIRRHPRINTF“圆周长为L62FN“,LPRINTF“圆面积为S62FN“,SPRINTF“圆球表面积为SQ62FN“,SQPRINTF“圆球体积为SV62FN“,VQPRINTF“圆柱体积为SZ62FN“,VZ运行结果请输入圆半径R,圆柱高H15,3圆周长为L942GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER圆面积为S707圆球表面积为SQ2827圆球体积为SV795圆柱体积为SZ212149输入一个华氏温度,要求输出摄氏温度,公式为C5/9F32输出要有文字说明,取2位小数。解MAINFLOATC,FPRINTF“请输入一个华氏温度N“SCANF“F“,C50/90F32/注意5和9要用实型表示,否则5/9的值为0/PRINTF“摄氏温度为52FN“,C运行结果请输入一个华氏温度78摄氏温度为2556第5章选择结构程序设计52语言中如何表示“真“和“假“系统如何判断一个量的“真“和“假“解设有一个逻辑表达式,若其结果为“真“,则以1表示;若其结果为“假“,则以0表示。但是判断一个逻辑量的值时,以0代表“真“,以非0代表“假“。例如3PRINTF“请输入3个整数“SCANF“D,D,D“,IFABAB/将A和B中的大者存入TEMP中/MAXTEMPCTEMPC/将A和B中的大者与C比较,取最大者/PRINTF“3个整数中最大数是DN“,MAX方法三ABACACBCBC运行结果请输入3个整数12,34,93个整数的最大数是34。55有一函数写一程序,输入X值,输出Y值。解程序如下MAININTX,YPRINTF“输入X“SCANF“D“,IFX100|SCORE9999PLACE5ELSEIFNUM999PLACE4ELSEIFNUM99PLACE3ELSEIFNUM9PLACE2ELSEPLACE1PRINTF“PLACEDN“,PLACEPRINTF“每位数字为“TEN_THOUSANDNUM/10000THOUSANDINTNUMTEN_THOUSAND10000/1000HUNDREDINTNUMTEN_THOUSAND10000THOUSAND1000/100TENINTNUMTEN_THOUSAND10000THOUSAND1000HUNDRED100/10INDIVINTNUMTEN_THOUSAND10000THOUSAND1000HUNDRED100TEN10SWITCHPLACECASE5PRINTF“D,D,D,D,D“,TEN_THOUSAND,THOUSAND,HUNDRED,TEN,INDIVPRINTF“N反序数字为“PRINTF“DDDDDN“,INDIV,TEN,HUNDRED,THOUSAND,TEN_THOUSANDBREAKCASE4PRINTF“D,D,D,D“,THOUSAND,HUNDRED,TEN,INDIVPRINTF“N反序数字为“PRINTF“DDDDN“,INDIV,TEN,HUNDRED,THOUSANDBREAKCASE3PRINTF“D,D,D“,HUNDRED,TEN,INDIVPRINTF“N反序数字为“GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERPRINTF“DDDN“,INDIV,TEN,HUNDREDBREAKCASE2PRINTF“D,D“,TEN,INDIVPRINTF“N反序数字为“PRINTF“DDN“,INDIV,TENBREAKCASE1PRINTF“D“,INDIVPRINTF“N反序数字为“PRINTF“DN“,INDIVBREAK运行结果请输入一个整数(099999)98765位数5每位数字为9,8,7,6,5反序数字为5678958企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10;利润高于10万元,低于20万元(1000001000000时,超过100万的部分按1提成。从键盘输入当月利润I,求应发放奖金总数。要求(1)用IF语句编程序;(2)用SWITCH语句编程序。解计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中由10万元按10的比例提成,另外5万元则按75提成。(1)用IF语句编程序,MAINLONGIFLOATBONUS,BON1,BON2,BON4,BON6,BON10BON110000001/利润为10万元时的奖金/BON2BON11000000075/利润为20万元时的奖金/BON4BON2100000005/利润为40万元时的奖金/BON6BON4100000003/利润为60万元时的奖金/BON10BON64000000015/利润为100万元时的奖金/PRINTF“请输入利润I“SCANF“LD“,IFI10THENC10SWITCHCCASE0BONUSI01BREAKCASE1BONUSBON1I1000000075BREAKCASE2CASE3BONUSBON2I200000005BREAKCASE4CASE5BONUSBON4I400000003BREAKCASE6CASE7CASE8CASE9BONUSBON6I6000000015BREAKCASE10BONUSBON10I1000000001PRINTF“奖金是102F“,BONUS运行结果请输入利润I234000奖金是1920000GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER59输入4个整数,要求按由小到大的顺序输出。解程序如下INCLUDE“STDIOH“VOIDMAININTT,A,B,C,DPRINTF“请输入4个整数“SCANF“D,D,D,D“,PRINTF“AD,BD,CD,DD“,A,B,C,DIFABTAABBTIFACTAACCTIFADTAADDTIFBCTBBCCTIFBDTBBDDTIFCDTCCDDTPRINTF“排序结果如下N“PRINTF“DDDDN“,A,B,C,D510有4个圆塔,圆心分别为(2,2),(2,2),(2,2),(2,2),圆半径为1。见图44。这4个塔的高度分别为10M。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。解程序如下MAININTH10FLOATX12,Y12,X22,Y22,X32,Y32,X42,Y42,X,Y,D1,D2,D3,D4PRINTF“请输入一个点X,Y“SCANF“F,F“,/求该点到各中心点的距离/D1XX1XX1YY1YY1D2XX2XX2YY2YY2D3XX3XX3YY3YY3D4XX4XX4YY4YY4IFD11/判断该点是否在塔外/PRINTF“该点高度为D“,H运行情况请输入一个点X,Y05,07GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER该点高度为0请输入一个点X,Y21,23该点高度为10第6章循环控制61输入两个正整数M和N,求其最大公约数和最小公倍数。解用辗转相除法求最大公约数MAININTP,R,N,M,TEMPPRINTF“请输入两个正整数N,M“SCANF“D,D“,IFNMAINCHARCINTLETTER0,SPACE0,DIGIT0,OTHER0PRINTF“请输入一行字符N“WHILECGETCHARNIFCA/N1表示A至少有2个因子/IFN2PRINTF“,D“,K3/N2表示至少有3个因子,故应再输入一个因子/IFN3PRINTF“,D“,K4/以下类似/IFN4PRINTF“,D“,K5IFN5PRINTF“,D“,K6IFN6PRINTF“,D“,K7IFN7PRINTF“,D“,K8IFN8PRINTF“,D“,K9IFN9PRINTF“,D“,K10PRINTF“N“运行结果6ITSFACTORSARE1,2,328ITSFACTORSARE1,2,4,7,14496ITSFACTORSARE1,2,4,8,16,31,62,124,248方法二MAININTM,S,IFORM2M0X1X212/第一天的桃子数是第二天桃子数加1后的2倍/X2X1DAYPRINTF“TOTALDN“,X1运行结果TOTAL1534611用迭代法求X。求平方根的迭代公式为XN1要求前后两次求出的X的差的绝对值小于105。解用迭代法求平方根的算法如下(1)设定一个X的初值X0(2)用上述公式求出X的下一个值X1(3)再将X1代入上述公式,求出X的下一个值X2(4)如此继续下去,直到前后两次求出的X值(和XN1)满足以下关系|XN1|MAINFLOATA,X0,X1PRINTF“ENTERAPOSITIVENUMBER“SCANF“F“,/输入A的值/X0A/2GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERX1X0A/X0/2DOX0X1X1X0A/X0/2WHILEFABSX0X11E5PRINTF“THESQUAREROOTOF52FIS85FN“,A,X1运行结果ENTERAPOSITIVENUMBER2THESQUAREROOTOF200IS141421612用牛顿迭代法求方程2X34X23X60在15附近的根。解牛顿迭代法又称牛顿切线法,它采用以下方法求根先任意设定一个与真实的根接近的值X0作为第一个近似根,由X0求出FX0,过X0,FX0点做FX的切线,交X轴于X1,把它作为第二次近似根,再由X1求出FX1,再过X1,FX1点做FX的切线,交X轴于X2,再求出FX2,再作切线如此继续下去,直到足够接近真正的X为止。这就是牛顿迭代公式。本题中,FX2X34X23X62X4X3X6FX6X28X36X83INCLUDE“STDIOH“INCLUDE“MATHH“VOIDMAINFLOATX1,X0,F,F1X115DOX0X1F2X04X03X06F16X08X03X1X0F/F1WHILEFABSX1X01E5PRINTF“THEROOTOFEQUATIONIS52FN“,X1613用二分法求方程2X34X23X60在(10,10)之间的根。解二分法的思路如下先指定一个区间X1,X2,如果函数FX在此区间是单调变化,可以根据FX1和FX2是否同符号来确定方程FX0在X1,X2区间是否有一个实根。若FX1和FX2不同符号,则FX0在X1,X2区间必有一个(且只有一个)实根。若FX1和FX2同符号,说明在X1,X2区间无实根,要重新改变X1和X2的值。当确定X1,X2有一个实根,采用二分法将X1,X2区间一分为二,再判断在哪个小区间中有实根。如此不断进行下去,直到小区间GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER足够小为止。算法NS图如下INCLUDE“STDIOH“INCLUDE“MATHH“VOIDMAINFLOATX0,X1,X2,FX0,FX1,FX2DOPRINTF“PLEASEENTERX1,X2“SCANF“F,F“,FX1X12X14X136FX2X22X24X236WHILEFX1FX20DOX0X1X2/2FX0X02X04X036IFFX0FX11E5PRINTF“X62FN“,X0614打印出以下图案解MAININTI,J,KFORI0IMAININTI,J,N,A101FORI1IAJMINJA0AI/以下3行将AI1A10中最小者与AI对换/AIAMINAMINA0PRINTF“NTHESORTEDNUMBERSN“FORI1IENDA10NUMBERELSEFORI0INUMBER/找到合适的插入位置为I/GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERTEMP1AIAINUMBERFORJI1J0I/从数组中最后一个数开始比较,凡大于NUMBER的数向后移动/AI1AIAI1NUMBER/将NUMBER插入到合适位置/FORI0INI2JGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERELSEIFINJ1IFAIJ0AIJKELSEI2JAIJK/输出魔方阵/FORI1IMAXMAXAIJMAXJJFORK0,FLAG11KAKMAXJFLAG0IFFLAG1PRINTF“N第D行,第D列的D是鞍点N“,I,MAXJ,MAXFLAG21IFFLAG2PRINTF“N矩阵中无鞍点N“运行结果输入行数N3输入列数M4第0行1234第1行4556第2行3567123445363567第0行,第3列的4是鞍点输入行数N3输入列数M4第0行GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER24907第1行3458第2行91232490734589123矩阵中无鞍点79有15个数按从小到大的顺序存放在一个数组中。输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,输出“不在表中“。解折半查找是一种效率较高的查找方法,但前提是待查找的序列必须有序。其思路是假定待查找序列按从大到小排列,设变量LOW指向待查找区间的下限(一开始时指向第一个元素),变量HIGH指向待查找区间的上限(一开始时指向最后一个元素),令变量,将待查找元素与MID所指元素比较,若相等,则查找成功;若小于,由于待查找序列按从大到小排列,可以断定待查找元素只可能在MID1HIGH区间,令LOWMID1,查找区间缩小一半,然后继续在此区间进行折半查找;类似的,若大于,则令HIGHMID1。如此反复进行,如果出现LOWHIGH,则表示查找失败,即序列中不存在待查找元素。下面的程序演示了随机产生N1个099的整数,存放在数组1N1单元中,主要为了与人的习惯一致,即第1个元素存放位置是1号单元。然后进行冒泡法排序,最后根据用户输入的数据进行折半查找(可进行多次)。DEFINEN16VOIDMAININTARRAYN,I,J,NUMBER,LOW,HIGH,MIDCHARCHPRINTF“THEORIGINALARRAYIS“FORI1IHIGHPRINTF“CANNOTFINDDN“,NUMBERPRINTF“DOYOUWANTTOFINDANOTHERNUMBERY/Y“SCANF“C“,/注意C前面有一个空格,为了虑除以前的回车符,否则循环只能执行一次/IFCHY710有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格以及其它字符的个数。GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER解程序如下MAININTI,J,UPP,LOW,DIG,SPA,OTHCHARTEXT380UPPLOWDIGSPAOTH0FORI0IACHARCH80,TRAN80PRINTF“NINPUTCIPHERCODE“GETSCHPRINTF“NCIPERCODES“,CHJ0WHILECHJ0IFCHJACHARS1100,S2100PRINTF“NINPUTSTRING1“GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERGETSS1PRINTF“NINPUTSTRING2“GETSS2I0WHILES1IS2IIFS1I0ELSERESUS1IS2IPRINTF“NRESULTDN“,RESU运行情况如下INPUTSTRING1AIDINPUTSTRING2ANDRESULT5715编写一个程序,将字符数组S2的全部字符拷贝到字符数组S1中,不用STRCPY函数。拷贝时,0也要拷过去,0后面的字符不拷贝。解程序如下INCLUDEMAINCHARS180,S280INTIPRINTF“INPUTS2“SCANF“S“,S2FORI0IUGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERTUUVVTWHILERUV0UVVRRETURNVINTLCDINTU,INTV,INTHRETURNUV/HMAININTU,V,H,LSCANF“D,D“,HHCFU,VPRINTF“HCFDN“,HLLCDU,V,HPRINTF“LCDDN“,L运行结果如下24,16HCF8LCD4882求方程AX2BXC0的根,用3个函数分别求当B24AC大于0,等于0和小于0时的根,并输出结果。从主函数输入A,B,C的值。解程序如下INCLUDEFLOATX1,X2,DISC,P,QGREATER_THAN_ZEROFLOATA,FLOATB/定义一个函数,用来求DISC0时方程的根/X1BSQRTDISC/2AX2BSQRTDISC/2AEQUAL_TO_ZEROFLOATA,FLOATB/定义一个函数,用来求DISC0时方程的根/X1X2B/2ASMALLER_THAN_ZEROFLOATA,FLOATB/定义一个函数,用来求DISC0GREAT_THAN_ZEROA,BPRINTF“X152FTX252FNN“,X1,X2ELSEIFDISC0EQUAL_TO_ZEROA,BPRINTF“X152FTX252FNN“,X1,X2ELSESMALLER_THAN_ZEROA,BPRINTF“X152F52FITX252F52FIN“,P,Q,P,Q运行结果INPUTA,B,C1,2,1EQUATION100XX200X1000ROOTX1100X210083写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。解MAININTPRIMEINT/函数原型声明/INTNPRINTF“NINPUTANINTEGER“IFPRIMENPRINTF“NDISAPRIME“,NELSEPRINTF“NDISNOTAPRIME“,NGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERINTPRIMEINTNINTFLAG1,IFORI2I0ISTR2ISTRISTR2I1PRINTF“NOUTPUTNS“,STRGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER运行结果INPUTFOURDIGITS1357OUTPUT135788编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。解INTLETTER,DIGIT,SPACE,OTHERS/全局变量/MAININTCOUNTCHARSTR/函数声明/CHARTEXT80PRINTF“NINPUTSTRINGN“GETSTEXTPRINTF“STRING“PUTSTEXTLETTER0DIGIT0SPACE0OTHERS0COUNTTEXTPRINTF“LETTERD,DIGITD,SPACED,OTHERSDN“,LETTER,DIGIT,SPACE,OTHERSINTCOUNTCHARSTRINTIFORI0STRI0IIFSTRIAPLACEPOINTLEN0RETURNPLACEMAININTICHARLINE100PRINTF“INPUTONELINEN“GETSLINEPRINTF“NTHELONGESTWORDIS“FORILONGESTLINEALPHABETICLINEIIPRINTF“C“,LINEIPRINTF“N“运行结果GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERINPUTONELINEIAMASTUDENTTHELONGESTWORDISSTUDENT810写一函数,用“起泡法“对输入的10个字符按由小到大的顺序排列。解SORT函数的作用是排序。程序如下DEFINEN10CHARSTRNMAINVOIDSORTCHARSTRINTI,FLAGFORFLAG1FLAG1PRINTF“NINPUTSTRINGN“SCANF“S“,IFSTRLENSTRNPRINTF“STRINGTOOLONG,INPUTAGAIN“ELSEFLAG0SORTSTRPRINTF“STRINGSORTEDN“FORI0ISTRI1TSTRISTRISTRI1STRI1T运行结果INPUTSTRINGREPUTATIONSTRINGSORTEDAEIONPRTTU811用弦截法求根。GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER方程为AX3BX2CXD0,系数A,B,C,D的值依次为1,2,3,4。求X在1附近的一个实根。求出根后由主函数输出。解有关弦截法的算法已在C语言程序设计一书的例76中作了介绍。在主函数中输入系数A,B,C,D并输出结果。在函数ROOT中求出X的近似根。程序如下INCLUDEFLOATROOTFLOATA,FLOATB,FLOATC,FLOATDFLOATX1,X2,X,Y1,Y2,YDOPRINTF“NINPUTX1,X2“SCANF“F,F“,Y1AX1X1X1BX1X1CX1DY2AX2X2X2BX2X2CX2DWHILEY1Y20DOXX1Y2X2Y1/Y2Y1YAXXXBXXCXDIFYY10X1XY1YELSEX2XWHILEFABSY00001RETURNXMAINFLOATA,B,C,DPRINTF“NINPUTA,B,C,D“SCANF“F,F,F,F“,PRINTF“EQUATIONIS52FX352FX252FX52F0“,A,B,C,DPRINTF“NX107FN“,ROOTA,B,C,DROOT函数的形参A,B,C,D的值由主函数实参A,B,C,D传递过来。在执行ROOT函数过程中输入用户预设的两个点X1,X2的值,计算出相应于X1和X2的函数值Y1FX1和Y2FX2。如果Y1和Y2同号,表示X1,X2区间无实根,程序要求重新输入X1和X2,直到Y1和Y2异号为止(此时在(X1,X2)区间应有一实根)。在第二个DOWHILE循环中,先求出Y1与Y2的连线和X轴的交点X(即弦截点),再求出相应于该点的函数值YFX。如果Y和Y1同号,表示根不在X1,X区间内,而在X,X2区间内。所以用X的值作为新的X1的值,用Y的值取代Y1原值,再进行下一次循环。如此反复进行,直到Y的绝对值小于104为止。此时X的值就是近似根。将X作为函数值带回主函数中输出。请思考在ROOT函数的第二个DOWHILE循环中,如果YY1HIGHHIGHSCOREIJGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERRI1/数组行号I从0开始,学生号R从1开始,故RI1/CJ1/数组列号J从0开始,学生号C从1开始,故CJ1/RETURNHIGHFLOATS_VARVOID/求方差的函数/INTI,JFLOATSUMX,SUMXNSUMX00SUMXN00FORI0I3,显然3应当在A1到A5的范围内,而不会在A6到A9的范围内。这样就可以缩小查找范围,甩掉A6到A9这一部分,将查找范围缩小一半。然后找在A1到A5的范围内居中的数,即A3,将要找的数3与A3比较,A3的值是5。发现A33,显然3应当在A1到A3的范围内。这样又将查找的范围缩小一半。再将3与在A1到A3范围内居中的数A2比较,发现要找的数3等于A2,查找结束。一共比较了3次。如果表列中有N个数,则最多比较的次数为INTLOG2N1。先建立一个数组NUM,内有已排好序的N个元素。设置变量TOP,BOTT,LOCA的初值。TOP和BOTTBOTTOM的缩写是数组要查找区间的两个端点的下标。开始时要查找的范围时NUM0到NUMN1,因此TOP的初值应为0,BOTT的初值应为N1。用变量LOCA(LOCATION的缩写)存放最后查找到的数在数组中的序号(下标),开始时设LOCA初值为0。输入要查找的数N,然后检查N是否在数组各元素范围之内。如果超出范围,则令LOCA1,表示此数不在数组内。在WHILE循环中,先计算数组中的元素下标MID(MIDDLE的缩写)。如果此居中的元素NUMMID正好等于要查找的数N,则一次查找成功,LOCA就取MID的值,输出结果NUMLOCA;然后使标志变量SIGN的值改变为1,不再执行WHILE循环。通常,第一次就查找到即NNUMMID的可能性不大,这时就需要将查找的范围缩小一半,继续查找。如果NNUMMID,则表示要查找的数在数组的后半部分,即在NUMMID1到NUMBOTT之间,因此使TOP的值改变为MID1。这样下一次NUMTOP和NUMBOTT的范围内查找,也就是在NUMMID1和NUMN1的范围内查找。如此每次缩小查找范围,直到某一次N等于NUMMID为止。当找到此数后,输出结果,并结束循环。GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER如果要查找的数据超出数组包括的数值范围,则LOCA等于1,如果要查找的数虽未超出数组包括的数值范围但在数组中找不到此数,则SIGN的值保持为1。对这两种情况都应输出“找不到此数“。程序如下INCLUDEDEFINEN10VOIDINPUTINTNUM,CHARNAMEN8/INPUT是输入数据的函数/INTIFORI0INUMJMINJTEMP1NUMISTRCPYTEMP2,NAMEINUMINUMMINSTRCPYNAMEI,NAMEMINNUMMINTEMP1STRCPYNAMEMIN,TEMP2PRINTF“NRESULTN“FORI0INUMN1LOCA1WHILESIGN1I0FLAG0FLAG11PRINTF“NINPUTAHEXNUMBER“WHILECGETCHAR0PRINTF“ISTHEDTHDAYINTHISYEARN“,DAYSINTDAY_TAB130,31,28,31,30,31,30,31,31,30,31,30,31/外部数组/INTSUM_DAYINTMONTH,INTDAY/函数一计算日期/INTI/累计所在月之前的天数/FORI1IDEFINESA,B,CABC/2DEFINEAREAA,B,CSQRTSA,B,CSA,B,CASA,B,CBSA,B,CCMAINFLOATA,B,CPRINTF“INPUTA,B,C“SCANF“F,F,F“,IFABCELSEPRINTF“ITISNOTATRIANGLE“运行结果INPUTA,B,C3,4,5AREA600INPUTA,B,C12,3,5ITISNOTATRIANGLE94给年份YEAR定义一个宏,以判断该年份是否为闰年。提示宏名可定义为LEAP_YEAR,形参为Y,即定义宏的形式为DEFINELEAP_YEARY读者设计的字符串GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER在程序中用以下语句输出结果IFLEAP_YEARYEARPRINTF“DISALEAPYEAR“,YEARELSEPRINTF“DISNOTALEAPYEAR“,YEAR解DEFINELEAP_YEARYY40PRINTF“NINPUTYEAR“SCANF“D“,IFLEAP_YEARYEARPRINTF“DISALEAPYEARN“,YEARELSEPRINTF“DISNOTALEAPYEARN“,YEAR运行结果INPUTYEAR19901990ISNOTALEAPYEARINPUTYEAR20002000ISALEAPYEAR95请分析以下一组宏所定义的输出格式DEFINENLPUTCHARNDEFINEPRFORMAT,VALUEPRINTF“VALUEFORMATT“,VALUEDEFINEPRINTF,X1PRF,X1NLDEFINEPRINTF,X1,X2PRF,X1PRINTF,X2如果在程序中有以下的宏引用PRD,XPRINT1D,XPRINT2D,X1,X2写出宏展开后的情况,并写出应输出的结果,设X5,X13,X28。解展开后为PRINTF“VALUEFORMATT“,XPRINTF“VALUEFORMATT“,XPUTCHARNPRINTF“VALUEFORMATT“,X1PRINTF“VALUEFORMATT“,X2PUTCHARN如果运行以下程序INCLUDEGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERDEFINENLPUTCHARNDEFINEPRFORMAT,VALUEPRINTF“VALUEFORMATT“,VALUEDEFINEPRINT1F,X1PRF,X1NLDEFINEPRINT2F,X1,X2PRF,X1PRINT1F,X2MAINFLOATX50,X130,X280CHARDPRD,XPRINT1D,XPRINT2D,X1,X2输出结果如下VALUE5000000ORMATVALUE5000000ORMATVALUE3000000ORMATVALUE8000000ORMAT通过本习题可以看到如果用TURBOC,则不能用这种方法将输出格式和输出项都作为参数。在宏替换时对字符串中的字符不予替换,一律保留原状。96请设计输出实数的格式。实数用“62F“格式输出。解DEFINEPRPRINTFDEFINENL“N“DEFINEFS“F“DEFINEF“62F“DEFINEF1FNLDEFINEF2F“T“FNLDEFINEF3F“T“F“T“FNLMAINFLOATA,B,CPR“INPUTTHREEFLOATINGNUMBERSA,B,CN“SCANFFS,SCANFFS,SCANFFS,PRNLPR“OUTPUTONEFLOATINGNUMBERSEACHLINEN“PRF1,APRF1,BPRF1,CPRNLPR“OUTPUTTWOFLOATINGNUMBERSN“PRF2,A,BPRF1,CPRNLPR“OUTPUTTHREEFLOATINGNUMBERSN“GENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERPRF3,A,B,C运行情况如下INPUTTHREEFLOATINGNUMBERA,B,C245991OUTPUTONEFLOATINGNUMBEREACHLINE240590910OUTPUTTWOFLOATINGNUMBERS590910OUTPUTTHREEFLOATINGNUMBERS24059091097分别用函数和带参的宏,从3个数中找出最大数。解(1)用函数实现MAININTA,B,CPRINTF“ENTERTHREEINTEGERS“SCANF“D,D,D“,PRINTF“MAXDN“,MAXA,B,CMAXINTX,INTY,INTZINTTTXYXYRETURNTZTZ运行结果INPUTTHREEINTEGERS12,34,9MAX342用带参的宏实现DEFINEMAXA,BABABMAININTA,B,CPRINTF“INPUTTHREEINTEGERS“SCANF“D,D,D“,PRINTF“MAXDN“,MAXMAXA,B,CGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER运行结果INPUTTHREEINTEGERS12,34,9MAX3498试述“文件包含“和程序文件的连接(LINK)的概念,二者有何不同解“文件包含“是事先将程序中需要用到的信息分别存放在不同的“头文件“中(文件后缀为H),用户在编写程序时,利用INCLUDE命令将该头文件的内容包含进来,成为程序的一部分。特别应当注意的是,该头文件与它所在的源文件共同组成一个文件模块(而不是两个文件模块)。在编译时它是作为一个文件进行编译的。连接则与此不同,它的作用是将多个目标文件连接起来。如果有两个或多个源程序文件,应先对它们分别进行编译,得到两个或多个目标文件(后缀为OBJ),在连接阶段,把这些目标文件与系统提供的函数库等文件连接成一个可执行的文件(后缀为EXE)。99用条件编译法实现以下功能输入一行电报文字,可以任选两种输出一为原文输出;一为将字母变成其下一字母(如A变成BZ变成A。非字母的字符不变)。用DEFINE命令来控制是否要译成密码。例如DEFINECHANGE1则输入密码。若改为DEFINECHANGE0则不译成密码,按原码输出。解INCLUDE“STDIOH“DEFINEMAX80DEFINECHANGE1MAINCHARSTRMAXINTIPRINTF“INPUTTEXTN“GETSSTRIFCHANGEFORI0IAIFN1N3SWAPP1,P3IFN1N3SWAPP2,P3PRINTF“NOW,THEORDERISD,D,DN“,N1,N2,N3SWAPINTP1,INTP2INTPPP1P1P2P2P运行结果INPUTTHREEINTEGERSN1,N2,N334,21,25NOW,THEORDERIS21,25,34102输入3个字符串,按由小到打的顺序输出。解MAINCHARSTR120,STR220,STR320CHARSWAPGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERPRINTF“INPUTTHREELINESN“GETSSTR1GETSSTR2GETSSTR3IFSTRCMPSTR1,STR20SWAPSTR1,STR2IFSTRCMPSTR1,STR30SWAPSTR1,STR3IFSTRCMPSTR2,STR30SWAPSTR2,STR3PRITNF“NOW,THEORDERISN“PRINTF“SNSNSN“,STR1,STR2,STR3CHARSWAPCHARP1,CHARP2/交换两个字符串/CHARP20STRCPYP,P1STRCPYP1,P2STRCPYP2,P运行结果INPUTTHREELINESISTUDYVERYHARDCLANGUAGEISVERYINTERESTINGHEISAPROFESSORNOW,THEORDERISCLANGUAGEISVERYINTERESTINGHEISAPROFESSORISTUDYVERYHARD103输入10个整数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。写3个函数(1)输入10个数;(2)进行处理;(3)输出10个数。解MAININTNUMBER10INPUTNUMBER/调用输入10个数的函数/MAX_MIN_VALUENUMBER/调用交换函数/OUTPUTNUMBER/调用输出函数/INPUTINTNUMBER10/输入10个数的函数/INTIPRINT“INPUT10NUMBER“FORI0IMAXMAXP/将大数地址赋给MAX/ELSEIFPARRAYPPP1ARRAYARRAY_ENDGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERMIFM0MOVEARRAY,N,M/递归调用,当循环次数M减至0时,停止调用/运行结果HOWMANYNUMBER8INPUT8NUMBERS1243656782711HOWMANYPLACEYOUWANTTOMOVE4NOW,THEYARE7271112436567105有一字符串,包含N个字符。写一个函数,将此字符串中从第M个字符开始的全部字符复制成为另一个字符串。解MAININTMCHARSTR120,STR220PRINTF“INPUTSTRING“GETSSTR1PRINTF“WHICHCHARACTERTHATBEGINTOCOPY“SCANF“D“,IFSTRLENSTR1MAININTUPPER0,LOWER0,DIGIT0,SPACE0,OTHER0,I0CHARP,S20PRINTF“INPUTSTRING“WHILESIGETCHARNIPWHILEPNIFA0DIGITELSEOTHERPPRINTF“UPPERCASEDLOWERCASED“,UPPER,LOWERPRINTF“SPACEDDIGITDOTHERDN“,SPACE,DIGIT,OTHER运行结果INPUTSTRINGTODAYIS2000/1/1UPPERCASE1LOWERCASE6SPACE2DIGIT6OTHER2107写一个函数,将一个33的矩阵转置。解MAININTA33,P,IPRINTF“INPUTMATRIXN“FORI0IP5IJPMINP5IJTEMPPMIN/将第二最小值换给右上角元素/PMINP4P4TEMPPMINP1FORI0IP5IJPMINP5IJTEMPPMIN/将第三最小值换给左下角元素/PMINP20P20TEMPPMINP1FORI0I5JIFP5IJPTEMPPMIN/将第四最小值换给右下角元素/PMINP24P24TEMP运行结果INPUTMATRIXGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTER3534333231302928272625242322211514131211NOW,MATRIX11343332123029282726252435222120191817161323153114109在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出这10个已排好序的字符串。解INCLUDEMAINVOIDSORTCHARSINTICHARSTR106PRINTF“INPUT10STRINGSN“FORI0I0STRCPYP,SJSTRCPYSJ,SJ1STRCPYSJ1,P运行结果INPUT10STRINGSCHINAGENERATEDBYUNREGISTEREDBATCHDOCTOPDFCONVERTER201023011358,PLEASEREGISTERJAPANKOREAEGYPTNEPALBURMAGHANASUDANITALYLIBYANOW,THESEQUENCEISBURMACHINAEGYPTGHANAITALYJAPANKOREALIBYANEPALSUDAN1010用指针数组处理上一题目,字符串不等长。解MAIN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论