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

下载本文档

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

文档简介

注:欢迎大家来到wmxnzn的CSDN,更多、更好的资料等你下载。C程序设计(第三版)课后习题参考解答第1章C语言概述参照本章例题,编写ー个C程序,输出以下信息:VeryGood!解:〃******************************main()〃******************************{printf(〃*************************可printf(〃\n");printf(z/VeryGood!\nw);〃******************************printf(〃\n〃);〃******************************printf("*************************写ー个程序,输入a,b,c三个值,输岀其中最大者。解:main(){inta,b,c,max;printf(“请输入三个数a,b,c:\n");scanfド%d,%d,%d",&a,&b,&c);max=a;if(max<b)max=b;if(max<c)max=c;printf(M最大数为:%d”,max);第2章程序的灵魂——算法什么叫结构化的算法?为什么要提倡结构化的算法?解:山一些基本结构顺序组成的算法称为结构化的算法。由于在基本结构之间不存在非顺序的跳转,流程的转移只存在于一个基本结构范围之内,因而提高了算法的质量。什么叫结构化程序设计?它的主要内容是什么?解:结构化程序就是用髙级语言表示的结构化算法。它的主要内容包括“自顶向下,逐步细化”的分析方法和“模块化设计”的解决方法,以及“结构化编码”的实现方法。第3章数据类型、运算符与表达式3.3请將下面各数用八进制和十六进制数表示:10 (2)32 (3)75 (4)-617(5)—111 (6)2483 (7)-28654 (8)21003解:⑴(10)io=(12)8=(A)通(32)10=(40*(20)短(75)1o=(113)8=(4B)16(-617)i0=(176627)8=(FD97)16此题可以这样考虑:带符号数在计算机中采用补码表示,正数的补码与原码相同,负数的补码=模+真值。若使用16位存储,模为216=65536。一617的补码为65536+(167)=64919=(176627)8=(FD97)16(一lll)io=(177621)8=(FF91)i6(2483)io=(4663)8=(9B3)16⑺(一28654)10=(110022)8=(9012)16(21OO3)io=(51O13)8=(52OB)163.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。变量的类型25-232769int型long型

sort型signedchar(8位)unsignedint型unsignedlong型unsignedshort型unsignedchar型注:如果没有学过二进制和补码,此题可以不做。解:各数据在内存中的存储形式如下表所示:变量的类型25-232769int型00—0000110018位111111111111111015100…001(溢出)14long型〇〇…0000110012411 … 11103100・・・0100…00116 14short型10〇…0000110018111111111111111015100…001(溢出)14signedchar(8位)1000110011111111000000001(溢出)unsignedint型〇〇…000011001811 … 11015100・・・00114unsignedlong型〇〇…0000110012411 … 1103100・・・0100…00116 14unsignedshort型〇〇…000011001811 … 11015100・・・0018unsignedchar型000110011111111000000001其中int和short类型,其取值范围是一32768〜32767。32769在这两种类型中实际表示负数,它是ー个负数的补码,对其再求一次补码可得其真值,即一(65536-32769)=-32767»char和unsignedchar为8位,若将int或!ong类型数据赋给这种类型,则截取数据低8位。同理,若将long赋给int,则截取低16位。3.5字符常量和字符串常量有什么区别?解:字符常量是ー个字符,用单引号括起来。字符串常量是由。个或若干个字符组合而成,用双引号括起来,存储时自动在字符串最后加一个结束符号‘、。’。3.6写出以下程序运行的结果:main(){chard二'a',c2='b',c3='c;c4='\101;c5='\116';printf("a%cb%c\tc%c\tabc\n"zcl,c2,c3);printf("\t\b%c%c",c4,c5);}解:程序运行的结果为:aabbcc abc3.7要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A1因此,“China”应译Xj“Glmre二请编ー程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为C','h','i',H,宣,经过运算,使c1,c2,c3,c4,c5的值分别变为‘G',T,'m',下,并输出。解:main(){char c2=,h:c3=V,c4=,n:c5=/a/;cl+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf(“密码是%c%c%c%c%c\n,cl,c2,c3,c4,c5);}运行结果:密码是Glmre3.8例2.6能否改成如下:main(){intcl,c2; (原为charcl,c2)cl=97;c2=98;printfド%c%c\n”,cl,c2);printfぐ’%d%d\n”,cl,c2);}解:可以。因为在可输出的字符范围内,用整型和用字符型作用相同。9求下面算术表达式的值,x+a%3*(int)(x+y)%加设x=2.5,a=7,y=4..7(float)(a+b)^+(int)x%(int)y设a=2,b=3>x=3.5,y=2.5解・/VT•2.53.53.10写出程序运行的结果。main(){inti,j,m,n;i=8;j=10;m=++i;n=j++;printfぐ’%d,%d,%d,%dw,i,j,m,n);|解:运行结果为:9,11,9,103.11写出下面赋值的结果。格中写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。int9942chardXunsignedint7665535float53.65longint68解:int9910076536842-1charでdV,5',D',*,Xunsignedint991007653684265535float99.000000100.00000076.00000053.6568.00000042.00000065535.000000longint9910076536842655353.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解:TOC\o"1-5"\h\z(1)24 (2) 10(3)60 (4) 0(5)0 (6) 0第4章最简单的C程序设计——顺序程序设计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\想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。要求输出的结果如下:a=n3nCb=D4n□¢=□5x=1.200000,y=2.400000,2=-3.600000x+y=□3.60ロロy+z=-1.20□□z+x=-2.40u=□51247□□n=□□□128765cl=/a,norD97(ASCII)c2=b/norn98(ASCII)解:main()(inta,b,c;longintu,n;floatx,y,z;charcl,c2;a=3;b=4;c=5;x=1.2;y=2.4;z=-3.6;u=51247;n=128765;cl=,a/;c2=/b/;printf("\n");printf("a=%2dUUb=%2dLIIZIc=%2d\n”,a,b,c);printf("x=%.6f,y二%.6f,z二%.6f\n”,x,y,z);printf("x+y二口%.2f口ロ丫+z二%.2fロ□z+x=%.2f\n/;x+y/y+z,z+x);printf("u二%61d口Dn二%9ld\n”,u,n);printf("cl二"%ごor%d(ASCII)\n”,cl,cl);printf("c2二%ゼor%d(ASCII)\n”,c2,c2);5请写出下面程序的输出结果:main(){inta=5,b=7;floatx=67.8564/y=-789.124;charc=W;longn=1234567;unsignedu=65535;printf("%d%d\n”,a,b);printf(〃%3d%3d\n〃,a,b);printf("%f,%f\n”,x,y);printf("%・10f,%・10f\n”,x,y);printf(“%8.2f,%8.2f,%4f,%4f,%3f,%3f\n/;x,y/x/y/x/y);printf("%e,%10.2e\n”,x,y);printf("%c,%d,%〇,%x\n",c,c,c,c);printf("%1d,%lo,%x\n",n,n,n);printf("%u,%〇,%x,%d\n”,u,u,u,u);printf(〃%s,%5.3s\n〃,"COMPUTER","COMPUTER");|运行结果:5ロ7ロロ5ロロ767.856400,-789.12402367.856400D,-789.124023ロ□□67.86,0□-789.12,67.8564,-789.1240,67.856400,-789.1240236.785640e+01,ロロ-7.9ヒ+02A,65,101,411234567,4553207,d68765535,177777,ffff,-lcomputer,nncoM可以发现,输出数据中若有负号、e和小数点,这些字符也占位。用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,4='A',c2='a'。问在键盘上如何输入?#include<stdio.h>voidmain()(inta,b;floatx,y;charcl,c2;scanf(〃a=%db=%d",&a,&b);scanf("%f%e",&x,&y);scanf("%c%c”,&cl,&c2);}解:a=3Qb=7ロ8.5ロ71.82□ADa下面的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,&cl,&c2,&x,&y,&z);解:main()(inta,b;floatx,y,z;charcl,c2;scanf("%5d%5d%c%c%f%f%*f,%f",&a,&b,&cl,&c2,&x,&y,&z);printf("a=%d,b=%d,cl=5c,c2=%c,x=%6.2f,y=6.2f,z=6.2f\n,,),a,b,cl,c2,x,y,z);|运行情况如下:□□□10D□n20Aal.5-3.750!.5,67.8 (此行为输入的数据,其中口为空格)a=10,b=20,cl=A,c2=a,x=1.50,y=-3.75,z=67.80 (此行为输出)说明:按%5d格式的耍求输入a和b时,要先键入三个空格,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应于%*f的地方,随意打入了一个数1.5,该值不会赋给任何变量。圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。解:main()floatpi,h,rj,s,sq,vq,vz;pi=3.1415926;printf(“请输入圆半径r,圆柱高h:\n");scanfド%f,%f〃,&r,&h);l=2*pi*r;s=r*r*pi;

sq=4*pi*r*r;I二%6.2f\nつ);s=%6.2f\nw,s);sq二%6.2f\n",sq);sv=%6.2f\nI二%6.2f\nつ);s=%6.2f\nw,s);sq二%6.2f\n",sq);sv=%6.2f\nz;vq);sz二%6.2f\n",vz);printf(〃圆周长为:printf("圆面积为:printf("圆球表面积为:printf(〃圆球体积为:printf(“圆柱体积为:运行结果:请输入圆半径r,圆柱高h:1.5,3/圆周长为: 1=9.42圆面积为: s=7.07圆球表面积为: sq=28.27圆球体积为: sv=7.95圆柱体积为: sz=21.21输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F・32)输出要有文字说明,取2位小数。解:main(){floatc,f;printf("请输入・个华氏温度:\n");scanf(〃%f〃,&f);c二(5.0戸.〇)*(f-32); /・注意5和9要用实型表示,否则鸡的值为0・/printf("摄氏温度为:%5.2f\n",c););运行结果:请输入・个华氏温度:78/摄氏温度为:25.56第5章选择结构程序设计语言中如何表示“真”和“假”?系统如何判断ー个量的“真”和“假”?解:设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以。表示。但是判断ー个逻辑量的值时,以〇代表“真”,以非0代表"假”。例如3&&5的值为“真”,系统会给出3&&5的值为1〇写出下面各逻辑表达式的值。设a=3,b=4,c=5。a+b>c&&b==ca|Ib+c&&b-cl(a>b)&&!c||l!(x=a)&&(y=b)&&0!(a+b)+c-l&&b+c/2解:01101有3个整数a,b,C,由键盘输入,输岀其中最大的数。解:方法一:程序如下:main(){inta,b,c;printf(“请输入3个整数:〃);scanf("%d,%d,%d",&a,&b,&c);if(a<b)if(b<c)printf("max二%d\n”,c);elseprintf(〃max二%d\n”,b);elseif(a<c)printf("max二%d\n”,c);elseprintf(〃max二%d\n",a);运行结果:请输入3个整数:12,34,9/max=34方法二:使用条件表达式,可以使程序更简明,清晰。main(){inta,b,c,temp,max;printf(“请输入3个整数:");scanf("%d,%d,%d",&a,&b,&c);temp=(a>b)?a:b; /・将a和b中的大者存入temp中・/max=(temp>c)?temp:c; /・将a和b中的大者与c比较,取最大者・/printf("3个整数中最大数是%d\n",max);方法三:a>b?(a>c?a:c):(b>c?b:c)运行结果:请输入3个整数:12,34,9/3个整数的最大数是34。有一函数:X X<1>=<2x-1 1<x<103x-ll x>10写ー程序,输入x值,输出y值。解:程序如下main(){intx,y;printf("输入x:")■,scanf("%d",&x);if(x<l) /*x<l*/{y=x;printf("x=%d3d,y=x=%d\n",x,v);|elseif(x<10) /*lWx<10*/{y=2*x-l;printf("x=%3d, y=2*x-l=%d\n”,x,y);)else /*x>10*/{y=3*x-ll;printf(/zx=%3d, y=3*x-ll=%d\n,,/x/y);})运行结果:①输入x:4/x=4, y=2*x-l=7②输入x:-1/x=-l,y=x="l③输入x:20/x=20, y=3*x-ll=49给出ー百分制成绩,要求输出成绩等级’A’、‘B‘、C、‘D’、‘E'。90分以上为A,8〇〜89分为B,70〜79分为‘C',6〇〜69分为‘D',60分以下为E’。解:程序如下includeHstdio.h"voidmain()(floatscore;chargrade;printf(“请输入学生成绩:");scanf(“%f”,&score);while(score>10011score<0)(printf("\n输入有误,请重输ッ;scanf("%f”,&score);)switch((int)(score/10))(e10:case9:grade='A';break;case8:grade='B';break;case7:grade='C*;break;case6:grade='D';break;case5:case4:case3:case2:e1:case〇:gradeゴE';printf("\n成绩是%5.If,相应的等级是%c。、n”,score,grade);给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。解:main(){longintnum;intindiv,ten,hundred,thousand,ten_thousand,place;/・分别代表个位,十位,百位,千位,万位和位数・/printf(“请输入ー个整数(。〜99999):〃);scanf("%ld”,&num);if(num>9999)place=5;elseif(num>999)place=4;elseif(num>99)

place=3;elseif(num>9)place=2;elseplace=l;printf("place二%d\n”,place);printf(“每位数字为:");ten_thousand=num/10000;thousand=(int)(num-ten_thousand*10000)/1000;hundred=(int)(num・ten_thousand*10000-thousand*1000)/100;ten=(int)(num・ten_thousand*10000-thousand*1000-hundred*100)/10;indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);switch(place){case5:printf("%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv);printf(Qn反序数字为:〃);printf(//%d%d%d%d%d\n//,indiv,ten,hundred,thousand,ten_thousand);break;case4:printf(//%d,%d,%d,%d,/,thousand,hundred,ten,indiv);printf(〃、n反序数字为:");printf("%d%d%d%d\nw,indiv,ten,hundred,thousand);break;case3:printfド%d,%d,%d”,hundred,ten,indiv);printf(〃'n反序数字为:");printf(〃%d%d%d\nz;indiv,ten,hundred);break;

case2:printf("%d,%d”,ten,indiv);printf("\n反序数字为:printfド%d%d\nw,indiv,ten);break;casel:printf("%d”,indiv);printf("\n反序数字为:");printf("%d\n",indiv);break;|}运行结果:请输入ー个整数(0-99999):98765/位数=5每位数字为:9,8,7,6,5反序数字为:56789企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(100000<lく20000〇)时,其中10万元按10%提成,高于10万元的部分,可提成7.5%:200000<IW40000〇时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<1<600000时,高于40万元的部分按3%提成:600000<1く1000000时,高于60万的部分按1.5%提成;l>1000000时,超过100万的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中由10万元按10%的比例提成,另外5万元则按7.5%提成。用if语句编程序,main(){longi;floatbonus,bonl,bon2,bon4,bon6,bonl0;bonl=100000*0.1;bon2=bonl+100000*0.075bon4=bon2+100000*0.05bon6=bon4+100000*0.03bonl0=bon6+400000*0.015;printf("请输入利润bonl=100000*0.1;bon2=bonl+100000*0.075bon4=bon2+100000*0.05bon6=bon4+100000*0.03bonl0=bon6+400000*0.015;printf("请输入利润i:");scanf(〃%ld〃,&i);if(i<=100000)bonus=i*0.1;/・利润为10万元时的奖金・//・利润为20万元时的奖金・//・利润为40万元时的奖金・/

/・利润为60万元时的奖金・/

/・利润为100万元时的奖金・//・利润在10万元以内按0.1提成奖金・/elseif(i<=200000)bonus=bonl+(i-100000)*0.075elseif(i<=200000)bonus=bonl+(i-100000)*0.075elseif(i<=400000)bonus=bon2+(i-200000)*0.05elseif(i<=600000)bonus=bon4+(i-400000)*0.03elseif(i<=1000000)bonus=bon6+(i-600000)*0.015elsebonus=bonl0+(i-1000000)*0.01printf("奖金是%10.2f”,bonus);/・利润在10万至20万元时的奖金・//・利润在20万至40万元时的奖金・//・利润在40万元至60万元时的奖金・//・利润在60万元至I00万元时的奖金・//・利润在100万元以上时的奖金・/运行结果:请输入利润i:234000/奖金是:19200.00用switch语句编程序,main(){longi;floatbonus/bonlzbon2/bon4/bon6/bonl0;intc;bonl=100000*0.1bon2=bonl+100000*0.075bon4=bon2+200000*0.05bon6=bon4+200000*0.03bonl0=bon6+400000*0.015printf(〃请输入利润i:〃);scanf(〃%d”,&i);c=i/100000;if(c>10)thenc=10;switch(c){case0:bonus=i*0.1;break;case1:bonus=bonl+(i-100000)*0.075;break;case2:case3:bonus=bon2+(i-200000)*0.05;break;case4:bonus=bon4+(i-400000)*0.03;break;bonus=bon6+(i-600000)*0.015;break;bonus=bonl0+(i-1000000)*0.01;)printf("奖金是%10.2f”,bonus);)运行结果:请输入利润i:23400〇/奖金是:19200.00入4个整数,要求按由小到大的顺序输出。解:程序如下#include"stdio.h"voidmain()(intt,a,b,c,d;printf(“请输入4个整数:");scanf("%d,%d,%d,%d“,&a,&b,&c,&d);printf("a=%d/b=%d/c=%d/d=%d"/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("排序结果如下:'n");printf("%d%d%d%d\n",a,b,c,d);4个圆塔,圆心分别为(2,2),G2,2),(2,-2),(-2,-2),圆半径为1。见图4.4。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。解:程序如下main(){inth=10;floatxl=2/yl=2/x2=-2/y2=2/x3=-2/y3=-2zx4=2,y4=-2/x/y/dl/d2/d3/d4;printf("请输入一・个点(x,y):");scanf("%f,%f〃,&x,&y); /・求该点到各中心点的距离・/dl=(x-xl)*(x-xl)+(y-yl)*(y-yl);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(dl>l&&d2>l&&d3>l&&d4>l)h=0;/・判断该点是否在塔外ッprintf(“该点高度为%d”,h);运行情况:请输入ー个点(x,y):050.7/该点高度为〇请输入ー个点(x,y):2.1,23/该点高度为10第6章循环控制输入两个正整数m和n,求其最大公约数和最小公倍数。解:用辗转相除法求最大公约数main(){intp,r,n,m,temp;printf("请输入两个正整数n,m:scanf("%d,%d",&n,&m);if(n<m){temp=n;n=m;m=temp; /・把大数放在n中,小数放在m中・/)p=n*m; /・先将m和n的乘积保存在p中,以便求最小公倍数时用・/while(m!=0) /・求m和n的最大公约数・/{r=n%m;n=m;m=r;)printf(〃它们的最大公约数为:%d\n”,n);printf(〃它们的最小公倍数为:%d\n〃,p/n); /*p是原来两个整数的乘积・/)运行情况:请输入两个正整数:12,8/它们的最大公约数为:4它们的最小公倍数为:24输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。解:#include<stdio.h>main(){charc;intletter=0,space=0,digit=0,other=0;printf("请输入,行字符:\n");while((c=getchar())!=/\^){if(»='a'&&c<='z'11c>='A'&&c<='Z')letter++;elseif(c=='')space++;elseif(c>='0'&&c<='9')digit++;elseother++;)printf("字母数=%d,空格数=%d,数字数=%d,其它字符数二%d\n"Jetter,space,digit,other);}运行情况:请输入•行字符:Myteacher'saddressis"#123BeijingRoad,Shanghai".字母数:38,空格数:6,数字数:3,其它字符数:6求Sn二a+aa+aaa+…+aa…a之值,其中a是一个数字。例如:2+22+222+2222+22222n个a(此时n=5),n由键盘输入。解:main(){inta,n,i=l,sn=0,tn=0;printf("a,n=:scanf("%d,%d",&a,&n);while(i<二n){tn=tn+a; /・赋值后的tn为i个a组成数的值ッsn=sn+tn; /・赋值后的sn为多项式前I项之和・/a=a*10;++i;}printf(,,a+aa+aaa+"-=%d\n,,,sn);}运行情况:a,n:2,5/a+aa+aaa+…=24690求£n!(即求1+2!+…+20!)。解:main(){floats=Ozt=l;intn;for(n=l;n<=20;n++){t=t*n; /*求n!*/s=s+t; /・将各项累加・/}printf("l!+2!+…+20!==%e\n”,s);}运行结果:l!+2!+―+20!=2.56133e+18注意:s不能定义为int型,因为int型数据的范围是ー32768~32767;也不能定义为!ong型,因为!ong型数据的范围为ー21亿〜21亿,无法容纳求得的结果。求が+ル+為£=1 女=1 k=\K解:include"stdio.h"#include"conio.h"main()intnl=100zn2=50zn3=10zk;floatsl=0zs2=0zs3=0;for(k=l;k<=nl;k++)sl+=k;for(k=l;k<=n2;k++)s2+=k*k;for(k=l;k<=n3;k++)s3+=1.0/k;printf(,,sum=%8.2f\n"/sl+s2+s3);getch();打印出所有的‘‘水仙花数ニ所谓“水仙花数”是指ー个3位数,其各位数字的立方和等于该数本身。例如,153是ー个“水仙花数”,因为153=プ+53+33。解:main(){inti,j,k,n;printfC“水仙花数”是:");for(n=100;n<1000;n++){i=n/100;j=n/10-i*10;k=n%10;if(n==i*i*i+j*j*j+k*k*k)printf("%4d”,n);)printf("\n");|运行结果:“水仙花数”是:153370371407ー个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000以内的所有“完数”,并按下面的格式输出其因子:6Itsfactorsare1,2,3解:方法一:#defineM1000 /・定义寻找范围・/main{){intkl,k2,k3,k4,k5,k6,k7,k8,k9,kl0;

inti,a,n,s;for(a=2;a<=M;a++)/*a是2〜1000之间的整数,检杳它是否完数・/{n=0;/*n用来累计a的因子的个数s=a;/*s用来存放尚未求出的因子之和,开始时等于a*/for(i=l;i<a;i++)/・检查i是否a的因子・/if(a%i==0)/・如果i是a的因子・/{n++;/*n加1,表示新找到ー个因子・/s=s-l;/*s减去已找到的因子,s的新值是尚未求出的因子之和ッswitch(n)/*将找到的因子赋给kl-klO*/{case1:kl=i;break;/・找出的第1个因子赋给kl*/case2:k2=i;break;/・找出的第2个因子赋给k2ツcase3:k3=i;break;/・找出的第3个因子赋给k3ソcase4:k4=i;break;/・找出的第4个因子赋给k4*/case5:k5=i;break;/・找出的第5个因子赋给k5ツcase6:k6=i;break;/・找出的第6个因子赋给k6*/case7:k7=i;break;/・找出的第7个因子赋给k7*/case8:k8=i;break;/・找出的第8个因子赋给k8*/case9:k9=i;break;/・找出的第9个因子赋给k9ツcase10:klO=i;break;/・找出的第10个因子赋给klO*/))*s=0表示全部因子都已找到*s=0表示全部因子都已找到・//*n>!表示a至少有2个因子ッ/♦n>2表示至少有3个因子,故应再输入ー个因子・//*以下类似・/{printfド%dItsfactorsare”,a);if(n>l)printf(/z%d,%d",kl,k2);if(n>2)printf(/z,%d",k3);if(n>3)printf(/z,%d",k4);if(n>4)printf(zz,%d",k5);if(n>5)printf(zz,%d",k6);if(n>6)printf(zz,%d",k7);if(n>7)printf(zz,%d",k8);if(n>8)printf(zz,%d",k9);if(n>9)printf(zz,%d",klO);printf(zz\n");运行结果:6Itsfactorsare1,2,328Itsfactorsare1,2,4,7,14496Itsfactorsare124,8,16,31,62,124,248方法二:main(){intm,s,i;for(m=2;m<1000;m++){s=0;for(i=l;i<m;i++)if((m%i)==0)s=s+i;if(s==m){printf(〃%d是ー个“完数”。它的因子是“,m);for(i=l;i<m;i++)if(m%l==0)printfド%d”,l);printf(へn〃);)}}方法三:此题用数组方法更简单。main(){intk[ll];inti,a,n,s;for(a=2;a<=1000;a++){n=0;s=a;for(i=l;i<a;i++)if((a%i)==0){n++;s=s-i;k[n]=i; /*将找到的因子赋给k[l],-,k[10]*/)if(s==0){printf(An%d是ー个“完数”,它的因子是:",a);for(i=l;i<n;i++)printf("%d,",k[i]);printf(z/%d\n",k[n]);}运行结果:6是一个“完数”,它的因子是:1,2,328是ー个“完数”,它的因子是:1,2,4,7,14496是ー个“完数”,它的因子是:1,2,4,8,16,31,62,124,248有一分数序列:M,必,駒,附1监,2レ13,…求出这个数列的前20项之和。解:main(){inti,t,n=20;floata=2,b=l,s=0;for(i=l;i<=n;i++){s=s+a/b;t=a;a=a+b; /・将前ー项分子与分母之和作为下ー项的分子・/b=t; /*将前ー项分子作为下ー项的分母・/}printf("sum=%9.6f\n",s);}运行结果:sum=32.660259ー球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高?include"stdio.h"voidmain()(floatsn=100,hn=sn/2;intn;for(n=2;n<=10;n++)(sn=sn+2*hn;/・第n次落地时共经过的米数・/hn=hn/2;/*第n次反弹高度・/}printf("第!0次落地时共经过%f米。\n",sn);printf("第10次反弹%f米。\n",hn);猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,见只剩ー个桃子了。求第一天共摘多少桃子。解:main(){intday/xl/x2;day=9;x2=l;while(day>0){xl=(x2+l)*2; /*第一天的桃子数是第二天桃子数加1后的2倍ッx2=xl;day--;}printf(//total=%d\n,:xl);}运行结果:total=1534用迭代法求X=お。求平方根的迭代公式为X"产丄(XJ+ヱ2xn要求前后两次求出的x的差的绝対值小于105„解:用迭代法求平方根的算法如下:设定一个X的初值Xo;用上述公式求出x的下ー个值X1;再将X1代入上述公式,求出X的下ー个值X2;如此继续下去,直到前后两次求出的X值(X。和Xn.1)满足以下关系:Ixn+i—Xn|<10s为了便于程序处理,今只用变量Xo和Xi,先令x的初值x()=a/2(也可以是另外的值),求出X1;如果此时IXn+1—XnI210、贝リ使X】fX(),然后用这个新的X。求出下ー个X1;如此反复,直到IXn+1—Xn|<10-5为止。 程序如下:#include<math.h>main(){floata,xOzxl;printf("Enterapositivenumber:");scanf(〃%f〃,&a); /*输入a的值ッx0=a/2;xl=(x0+a/x0)/2;do{xO=xl;xl=(xO+a/x0)/2;}while(fabs(x0-xl)>=le-5);printf("Thesquarerootof%5.2fis%8.5f\n”,a,xl);}运行结果:Enterapositivenumber:2/Thesquarerootof2.00is1.41421用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。解:牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值X。作为第一个近似根,由X。求出f(X0),过(X0,f(Xo))点做f(X)的切线,交X轴于Xi,把它作为第二次近似根,再由Xi求出f%),再过(Xi,f(xj)点做f(X)的切线,交X轴于X2,再求出f(X2),再作切线……如此继续下去,直到足够接近真正的X・为止。ハX°)=3七一々因此,w华fUo)这就是牛顿迭代公式。本题中,f(x)=2x3-4x2+3x-6=((2x-4)x+3)x-6f*(x)=6x2-8x+3=(6x-8)+3#include"stdio.h"include"math.h"voidmain()(floatxl,xO,f,fl;xl=1.5;do(x0=xl;f=((2*x0-4)*x0+3)*x0-6;fl=(6*x0-8)*x0+3;xl=xO-f/fl;}while(fabs(xl-x0)>=le-5);printf("THerootofequationis%5.2f\n",xl);)用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。解:二分法的思路如ド:先指定一个区间区メカ,如果函数f(x)在此区间是单调变化,可以根据f(xj和f(X2)是否同符号来确定方程f(X)=0在区,X2)区间是否有一个实根。若f(Xi)和f(X2)不同符号,则f(x)=o在区的]区间必有一个(且只有一个)实根。若f(xj和f(X2)同符号,说明在仅1凶]区间无实根,要重新改变X1和X2的值。当确定区メカ有一个实根,采用二分法将品,X2)区间一分为二,再判断在哪个小区间中有实根。如此不断进行下去,直到小区间足够小为止。算法N-S图如下:include"stdio.h"#include"math.h"voidmain()(floatx0,xl,x2,fx0,fxl,fx2;do(printf("Pleaseenterxl,x2:");scanf(”%f,%f”,&xl,&x2);fxl=xl*((2*xl-4)*xl+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;}while(fxl・仅2>0);

doxO=(xl+x2)/2;fxO=xO*((2*x0-4)*x0+3)-6;if(fxO*fxl<O)doxO=(xl+x2)/2;fxO=xO*((2*x0-4)*x0+3)-6;if(fxO*fxl<O)x2=x0;fx2=fx0;}else(xl=xO;fxl=fxO;}}while(fabs(fx0)>=le-5);printf("x=%6.2f\n",x0);6.14打印出以下图案:解:main(){intl,j,k;for(i=0;i<=3;i++){for(j=O;j<=2-i;j++)print耳"for(k=O;k<=2*i;k++)print*"*");printf(w\nH);)for(i=0;i<=2;i++){for(j=O;j<=i;j++)print""");for(k=0;kv=4-2*i;k++)printf("*");printf("\n");)/・输出上面4行・号・//・输出・号前面的空格・//・输出・号・//・输出完一行・号后换行・//・输出下面3行・号・//・输出・号前面的空格・//・输出・号・//・输出完一行・后换行・/运行结果: ****************6.15两个乒乓球队进行比赛,各出3人。甲队为A、B、C3人,乙队为X、丫、Z3人。已抽签决定比赛名单。有人向队员打听比赛名单。A说他不和X比,C说他不和X、Z比。请编程找出3对赛手的名单。解:用计算机程序处理此问题时,必须对每一种成对的组合ーー检验,看他们是否符合条件。开始时,并不知道A、B、C与X、Y、Z中哪一个比赛,可以假设A与i比赛,B与j比赛,C与k比赛。#include"stdio.h"voidmain()(charijk;/力是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-%c\tB-%c\tC-%c\n',/ij/k);第7章数组7.1用筛法求100之内的素数。解:所谓“筛法”指的是“Eratosthenes筛法。Eratosthenes是古希腊的著名数学家。他采用的方法是:在ー张纸上写下1〜1000之间的全部整数,然后逐个判断它们是否素数,找出ー个非素数就把它挖掉,最后剩ド的就是素数。マ23@5目7B910111回13区41516|17国!9顾2122)23124252627司29国311323334353す37138394〇,4I园43回454す47148495〇,…具体做法如下:(1)先将1挖掉(因为1不是素数)。(2)用2去除它后面的各个数,把能被2整除的数(如4,6,8-)挖掉,即把2的倍数挖掉。(3)用3去除它后面各数,把3的倍数挖掉。(4)分别用4,5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如在上表中1〜50范围内的素数,要一直进行到除数为47为止。事实上,这ー过程可以简化。如果需要找1〜n范围内的素数,只需进行到除数为〃(取其整数)即可。例如对1~50,只需进行到将7(即病的整数部分)作为除数即可。上面的算法可表示为:挖去1;用刚オ被挖去的数的下一个数p去除p后面的各数,把p的倍数挖掉;检查p是否小于〃的整数部分(如果n=1000,则检査p<31否),如果是,则返回(2)继续执行,否则就结束;纸上剩下的就是素数。解题的基本思路有了,但要变成计算机的操作,还要作进ー步的分析。如怎样判断一个数是否已被“挖掉”,怎样找出某ー个数p的倍数,怎样打印出未被挖掉的数。可以设ー个数组a,a⑴到a[100]的值分别是1,2,3,-1000然后用上述方法将非素数‘‘挖去"。如果ー个数被认为是非素数,就将它的值变为零,最后将不为零的数组元素输出,就是所求的素数表。程序如下;#include<math.h>main(){inti,j,n,a[101];for(i=l;i<=100;i++)a[i]=i;for(i=2;i<sqrt(100);i++)for(j=i+l;j<=100;j++){if(a[i]!=0&&a[j]!=O)if(a[j]%a[i]==0)aU]=0;} /・非素数,赋值为〇,"挖掉”*/printf(〃\n〃);for(i=2/n=0;i<=100;i++){if(a[昨。){printf("%5d〃,a[i]);n++;}if(n==10) /・此处if语句的作用是在输出10个数后换行・/{printf(Anw);n=0;}}运行结果:2357 11 13 17 19 23 29 31 37 4143475359 61 67 71 73 79 83 89 97

用选择法对10个整数排序(从小到大)。解:选择排序的思路如下:设有10个元素将a[l]与a⑵〜a[10]比较,若a口]比a⑵〜a[10]都小,则不进行交换,即无任何操作。若a[2]〜a口。]中有一个以上比a[l]小,则将其中最小的一个(假设为a[i])与aロ]交换,此时aロ]中存放了10个中最小的数。第二轮将a[2]与a[3]~a口〇]比较,将剩ド9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第2小的数。依此类推,共进行9轮比较,aロ]到a口。]就已按由小到大的顺序存放。程序如下:main(){intij,min间11];printf("Enterdata:\n〃);for(i=l;i<=10;i++){printf("a[%d]=",i);scanf("%d”,&a[i]);)printf("\n");for(i=l;i<=10;i++)pritnf("%5d",a[i]);printf(〃\n〃);for(i=l;i<=9;i++){min=i;for(j=i+l;j<=10;j++)if(a[min]>a[j])min=j;a[0]=a[i];a[i]=a[min];a[min]=a[0];)printf("\nThesortednumbers:\n/z);for(i=l;i<=10;i++)printf(〃%5d〃,a[i]);/・输入10个数・/・输入10个数・//・输出这10个数・//・以下8行是对10个数排序・//・以下3行将aロ中最小者与a[i]对换リ/・输出己牌好序的10个数・/a[10]=101/6 9045561 15 44 78 58 101Thesortednumber:1 6154445 56 58 78 90 101说明:定义a数组有11个元素:a[0]~a[10],但实际上只对a[l]~a[10]这10个元素输入值并排序,这样符合人们的习惯。a[〇]用作两数交换时的中间变量。求一个3X3矩阵对角线元素之和。解:main(){inta[3][3],sum=0;intij;printf(z/Enterdata:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d”,&a[i皿);for(i=0;i<3;i++)sum=sum+a[i][i];printf("sum=%5d\n",sum);}运行情况如下:Enterdata:123456789/sum=15此程序中用的是整型数组,运行结果是正确的。如果用的是实型数组,程序应修改为:main(){floata[3][3]zsum=0;intij;printf("Enterdata:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scant("%r,&a[i][j]); /・注意:在%f前有一空格,否则无法输入数据・/for(i=0;i<3;i++)sum=sum+a[i][i];printf("sum=%6.2f\n",sum);}该程序在TurboC3.0F可正常运行,得到结果:sum=16.50但在TurboC2.0环境下运行此程序时,出现运行错误,在输入数据后系统显示出错信息:scanf:floatingpointfomatsnotlinkedAbnormalprogramtermination经过检查,程序的逻辑和语法都是正确的,而且在其它的C系统中(例如BorlandC++)可以正常运行。出现这种情况是所用的C编译系统不完善,处理的方法有两个:ー是把程序移到其它C系统上运行(但往往不方便):二是迁就所用的C系统,修改程序,避开其缺陷,这就需要通过多次试验掌握其规律。对以上程序来说,可以有多种替代的方案,例如可以把程序中第5〜7行改为:for(i=0;i<3;j++)scanf(K%f%f%r,&a[i][0],&[i][l],&a[i][2]);它在效果上应与原来的第5〜7行等价,但上机运行时发现仍不能正常运行,再改为:for(j=O;j<3;j++)scanf("%f%f%f”,&a[O][j],&ロ皿,&a[2][j]);它也是与原来的5〜7行等价的,上机运行时发现可以正常运行。程序如下:main(){floata[3][3]zsum=0;intij;printf("Enterdata:\n")for(j=O;j<3;j++)scanfド%f%f%f,,/&a[O][j]/&a[l][j]/&a[2][j]);for(i=0;i<3;i++)sum=sum+a[i][i];printf("sum=%6.2f\n”,sum);}运行情况如下:Enterdata:LI2.23.34.45.56.67.78.89.9/应注意数据与元素的对应关系:1.1是a[〇][〇]的值,2.2是a[l][0]的值,3.3是a[2][0]的值……有一个已排好序的数组,今输入ー个数,要求按原来排序的规律将它插入数组中。解:程序如下:main(){inta[ll]={l,4,6,9,13,16,19,28,40,100); /*注意数组a长度应足够大,以便容纳新插入的元素・/inttempi,temp2,number;end/,j;printf("arraya:\n");for(i=0;i<10;i++)printf(〃%5d",aロ]);printf(〃\n〃);printf("lnsertdata:");scanf("%d”,&number);end=a[9];if(number>end)a[10]=number;else{for(i=0;j<10;i++){if(a[i]>number) /・找到合适的插入位置为i*/{templ=a[i];a[i]=number;for(j=i+l;j<ll;j++) /*将原来的第i个元素移至第i+!位置,其它顺序后移・/{temp2=a[j];a[j]=templ;templ=temp2;)break;)})printf("Now,arraya:\n");for(i=0;i<ll;i++)printf(〃%6d”,a[i]);运行情况如下:arraya:1 4 6 9 13 16 19 28 40 100Insertdata:5/Now,arraya:1 4 5 6 9 13 16 19 28 40 100加以改进后,可以采用以下方法。voidmain(){inta[ll]={l,4,6,9,13,16,19,28,40,100};inttempi,temp2,number,end/,j;printf("arraya:\n");for(i=0;i<10;i++)printf(”%5d”,a[i]);printf("\nM);printf("lnsertdata:");scanf("%dH,&number);for(i=9;i>=0&&a[i]>number;i-) /・从数组中最后ー个数开始比较,凡大于number的数向后移动ッa[i+l]=a[l];a[i+l]=number; /・将number插入到合适位置・/for(i=0;i<ll;i++)printf(“%5d,a[i]);printf("\n");}将一个数组中的值按逆序重新存放。例如原来顺序为:865,4,1。要求改为:1,4,568。解:程序如下:#defineN5main(){inta[N],i,temp;printfC'Enterarraya:\n");for(i=O;i<N;i++)scanf(〃%d",&a[i]);printf(warraya:\nw);for(i=0;i<N;i++)printf(〃%4for(i=0;i<N/2;i++){temp=a[i];a[i]=a[N-i-l];a[N-i-l]=temp;}printf("\nNo叫arraya:\n");for(i=0;i<N;i++)printf("%4dw#a[i]);prin廿)运行情况如ド:Enterarraya:86541/arraya:8 6 5 4 1Now,arraya:1 4 5 6 8程序中第二个for循环也可以写成:for(i=0,j=N-l;i<j;i++,j-){temp=a[i];a[i]=a[j];a[j]=temp;7.6打印出以下的杨辉三角形(要求打印出10行。111121133114641解:杨辉三角形是(a+b)"展开后各项的系数。例如:(a+b)°展开后为1 系数为1(a+b尸展开后为a+b 系数为1,1(a+b)ユ展开后为a2+2ab+b2 系数为1,2,1(a+b)ユ展开后为a3+3a2b+3ab2+b3 系数为1,3,3,1(a+bf展开后为a4+4a3b+6a2b2+4ab3+b4 系数为1,4,6,4,1以上就是杨辉三角形的前5行。杨辉三角形各行的系数有以下规律:(1) 各行第一个数都是1。(2)各行最后一个数都是1。(3) 从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列2个数之和。例如第4行第2个数(3)是第3行第2个数(2)和第3行第1个数(1)之和。可以这样表示:a[i][j]=a[i-l][j]+a[i-l][j-l],其中i为行数,j为列数。#defineN11main(){inti,j,a[N][N];for(i=l;i<N;i++){a[i][i]=l;a[i][l]=l;|for(i=3;i<N;i++)for(j=2;j<=i-l;j++)a[i][j]=a[i-l][j-l]+a[i-l][j];for(i=l;i<N;i++){for(j=l;j<=i;j++)printf(〃%6d”,a[i][j]);printf("\n〃);}printf("\n");运行结果:11112 113 3 11 5 10105 11 6 151 7 211 8 281 6 151 7 211 8 282015635352156705617 1288 19 3684126126843691输出魔方阵。所谓魔方阵是指这样的方阵(方阵的阶数应为奇数),它的每一行、每ー列和对角线之和均相等。飞!6例如,三阶魔方阵为357492要求输出由1〜パ之间的自然数构成的魔方阵。解:魔方阵中各数的排列规律如下:1)将1放在第一行中间一列。2)从2开始直到nXn止各数依次按下列规则存放:每ー个数存放的行比前ー个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)。3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行),列数同样加1。例如,!在第1行第2歹リ,则2应放在最下一行第3歹リ。4)当上一个数的列数为n时,下ー个数的列数应为1,行数同样减1。例如2在第3行最后一列,则3应放在第2行第1歹リ。5)如果按上面规则确定的位置上已经有数,或上一个数是第1行第n列时,则把下ー个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2歹リ,但该位置已经被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6的下面。按此方法可以得到任何的魔方阵。voidmain()(inta[16][16],i,j,k,p,n;P=l;while(p==l)(printf("Entern(n=lto15):");scanf("%d",&n);if(n!=O&&n<=15&&n%2!=0) /・要求阶数为1至15之间的奇数・/p=0;/・初始化,第0行和第0列不用,与魔方阵构造规则一致*/for(i=l;i<=n;i++)for(j=l;j<=n;j++)a(i][j]=O;j=n^+l;aU皿=1;for(k=2;k<=n*n;k++)j++;if(i<l&&j>n){i+=2;j-;)else{if(i<l)i=n;if(j>n)j=l;}if(a[i]U]==O)a[i][j]=k;else{i+=2;卜-;a[i][j]=k;)}/・输岀魔方阵・/for(i=l;i<=n;i++){for(j=l;j<=n;j++)printf("%7d",a[i][j]);printf("\n");system("pause");找岀ー个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。解:ー个二维数组最多有一个鞍点,也可能没有。解题思路是:先找出一行中值最大的元素,然后检查它是否该列中的最小值,如果是,则是鞍点(不需要再找别的鞍点了),输出该鞍点;如果不是,则再找下一行的最大数,……。如果每一行的最大数都不是鞍点,则该数组无鞍点。程序如下:defineN10defineM10main(){inti,j,k,m,n,flagl,flag2,a[N][M],max,maxi,maxj;printfC\n输入行数n:〃);scanf(〃%d”,&n);printf(〃、n输入列数m:〃);scanfド%d”,&m);for(i=0;i<n;i++){printf(〃第%d行?\n〃,i);for(j=0;j<m;j++)scanf("%d〃,&a[i][j]);)for(i=0;i<n;i++){for(j=0;j<m;j++)printf(〃%5d〃,a[i][j]);printf(〃Xn");)flag2=0;for(i=0;i<n;i++){max=a[i][0];for(j=0;j<m;j++)if(a[i][j]>max){max=a[i][j];maxj=j;|for(k=0,flagl=l;k<n&&flagl;k++)if(max>a[k][maxj])flag=0;if(flagl){printf("\n第%d行,第%d列的%d是鞍点、n”,i,maxj,max);flag2=l;)if(!flag2)printfC\n矩阵中无鞍点!'n");运行结果:输入行数n:3/输入列数m:4/第〇行?1234/第1行?4556/第2行?3567/TOC\o"1-5"\h\z12 3 44 5 3 63 5 6 7第。行,第3列的4是鞍点输入行数n:3Z输入列数m:4/第0行?24907/第1行?3458/第2行?9123/TOC\o"1-5"\h\z2 4 90 73 4 5 89 12 3矩阵中无鞍点!7.9有15个数按从小到大的顺序存放在ー个数组中。输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,输出“不在表中”。解:折半查找是ー种效率较高的查找方法,但前提是待查找的序列必须有序。其思路是:假定待查找序列按从大到小排列,设变量low指向待查找区间的下限(一开始时指向第一个元素),变量high指向待查找区间的上限(ー开始时指向最后ー个元素),令变量mid=ルw+恸,将待查找元素与mid所指元素比较,若相等,则查找成功;若小于,し2J由于待查找序列按从大到小排列,可以断定待查找元素只可能在mid+1〜high区间,令low=mid+l,查找区间缩小一半,然后继续在此区间进行折半查找;类似的,若大于,则令high=mid-lo如此反复进行,如果出现low>high,则表示查找失败,即序列中不存在待查找元素。下面的程序演示了随机产生N—1个。〜99的整数,存放在数组ロド[№1]单元中,主要为了与人的习惯一致,即第1个元素存放位置是⑴号单元。然后进行冒泡法排序,最后根据用户输入的数据进行折半查找(可进行多次)。#defineN16voidmain()(intarray[N],i,j,number,low,high,mid;charch;printf("Theoriginalarrayis:");for(i=l;i<N;i++)(array[i]=rand()%100; /・产生并显示N-!个〇〜99的随机整数,存放在数组单元中・/printf("%3d",array[i]);)printf("\n");/・冒泡法排序・/for(i=l;i<N;i++)for(j=l;j<N-i;j++)if(array[j]<array[j+l])(array[〇]二array。];array[j]=array[j+l];array[j+l]=array[〇];}/・显示排序后的数列・/printf("Thesortedarrayis:");for(i=l;i<N;i++)printf("%3d",array。]);printf("\n");/・折半查找,可进行多次・/while(l)(printf("\nPleaseinputthenumberwhichyouwanttolookfor:");scanf("%d",&number);low=l;high=N-l;while(low<=high)mid=(low+

温馨提示

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

评论

0/150

提交评论