您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言内涵教程练习6参考答案
练习66.1输入10个整数,计算它们的平均值。找出最小数,再找出与平均值最接近的整数。#includestdio.hvoidmain(){inta[10],ave,min,dif,pos,i;ave=min=0;for(i=0;i10;++i){scanf(%d,&a[i]);ave+=a[i];if(a[i]a[min])min=i;}ave/=10;printf(平均值为%d,最小数为%d,,ave,a[min]);min=ave-a[0]0?ave-a[0]:a[0]-ave;pos=0;for(i=1;i10;++i){dif=ave-a[i]0?ave-a[i]:a[i]-ave;if(difmin){min=dif;pos=i;}}printf(与平均值最接近的整数为%d\n,a[pos]);}6.2输入20个1至5之间的整数,给出1至5每个数出现的次数。#includestdio.hvoidmain(){inta[6]={0},i;for(i=0;i20;++i){scanf(%d,&a[0]);if(a[0]5||a[0]1){printf(输入错误);return;}++a[a[0]];}for(i=1;i6;++i)printf(%d出现了%d次!\n,i,a[i]);}6.3以十六进制的形式输出用户输入的十进制整数。#includestdio.hvoidmain(){intn;inta[8],j=0;scanf(%d,&n);printf(%X\n,n);while(n0){a[j]=n%16;n/=16;++j;}for(--j;j=0;--j)if(a[j]9)printf(%c,'A'+a[j]-10);elseprintf(%d,a[j]);printf(\n);}或者:printf(%x,n);6.4找出整型数组中的最大值,把它后面的元素依次前移一位,再把它放在数组的末尾。#includestdio.h#defineN5voidmain(){intnum[N],max,i,temp;max=0;for(i=0;iN;++i){scanf(%d,&num[i]);if(num[i]num[max])max=i;}temp=num[max];for(i=max;iN-1;++i)num[i]=num[i+1];num[i]=temp;printf(处理后的数组为:\n);for(i=0;iN;++i)printf(%d,num[i]);}6.5有一整型数组a[10]={20,23,37,52,95},输入5个整数存储在a中,且要保持数组a中的元素按升序排列。#includestdio.hvoidmain(){inta[10]={20,23,37,52,95},i,j,temp;for(i=0;i=4;++i){scanf(%d,&temp);for(j=4+i;j=0&&a[j]temp;--j)a[j+1]=a[j];a[j+1]=temp;}printf(添加元素后的数组为:\n);for(i=0;i10;++i)printf(%d,a[i]);}6.6输入20个整数到数组num中,并对num中的偶数号元素按升序排序。#includestdio.h#defineN20voidmain(){inti,j,num[N],temp;for(i=0;iN;++i)scanf(%d,&num[i]);for(i=2;iN;i=i+2){temp=num[i];for(j=i;j0&&tempnum[j-2];j=j-2)num[j]=num[j-2];num[j]=temp;}//按升序10个一行输出for(i=0;iN;++i){if(i%10==0)printf(\n);printf(%d,num[i]);}printf(\n);}6.7输入一个5位无符号整数,输出构成这个整数的5个数字可以组成的整数中最大的及最小的5位整数(输入67890、10002测试)。#includestdio.hvoidmain(){intbit[5],i,j,temp;unsignednum,max,min;max=min=0;scanf(%u,&num);for(i=0;i=4;++i){bit[i]=num%10;num/=10;}for(i=1;i=4;++i){temp=bit[i];for(j=i;j0&&tempbit[j-1];--j)bit[j]=bit[j-1];bit[j]=temp;}for(i=4;i=0;--i)max=max*10+bit[i];for(i=0;i=4;++i)if(bit[i]!=0){temp=bit[i];bit[i]=bit[0];bit[0]=temp;break;}for(i=0;i=4;++i)min=min*10+bit[i];printf(最大的5位整数为%d,最小的为%d\n,max,min);}6.8分析下面的程序1.#includestdio.hvoidmain(){inti,j,a[10],temp;for(i=0;i10;++i){a[i]=i;printf(%3d,a[i]);}i=0;j=9;while(ij){temp=a[i];a[i]=a[j];a[j]=temp;++i;--j;}printf(\n\n);for(i=0;i10;++i)printf(%3d,a[i]);}2.#includestdio.hvoidmain(){inta[35]={1};inti,k,n,m;for(n=2;n=1000;++n){k=1;m=n-1;for(i=2;in;++i){if(n%i==0){m-=i;a[k++]=i;}}if(m==0){printf(\n%d=,n);for(i=k-1;i0;--i)printf(%d+,a[i]);printf(%d\n,a[0]);}}}分析:1.对数组进行了倒置。2.求出了1000以内的完全数。6.9冒泡排序时第一趟操作可用代码描述如下:#includestdio.hvoidmain(){inti,num[]={25,22,21,29,23},temp;for(i=0;i4;++i)if(num[i]num[i+1]){temp=num[i];num[i]=num[i+1];num[i+1]=temp;}}请结合代码分析冒泡排序中一趟操作的效果。冒泡排序需要几趟类似操作才能使整个数组有序?请实现冒泡排序算法。答:冒泡排序中一趟操作的效果是找出数组里无序元素中的最大者(或最小者),并将其放在适当的位置。冒泡排序需要比数组元素总数少一趟的类似操作才能使整个数组有序。冒泡排序算法为:#includestdio.h#defineN5voidmain(){inti,j,num[]={25,22,21,29,23},temp;for(j=N-1;j=1;--j)for(i=0;ij;++i)if(num[i]num[i+1]){temp=num[i];num[i]=num[i+1];num[i+1]=temp;}for(i=0;iN;++i)printf(%d,num[i]);}6.10选择排序算法的思路是:先从数组中找出最小的元素和第0号元素交换,接着从余下的元素中找出最小的元素和第1号元素交换,再从余下的元素中找出最小的元素和第2号元素交换……。请实现选择排序算法。#includestdio.h#defineN5voidmain(){inti,j,num[N]={25,22,21,29,23},min,temp;for(j=0;jN;++j){for(min=i=j;iN;++i)if(num[i]num[min])min=i;temp=num[j];num[j]=num[min];num[min]=temp;}for(i=0;iN;++i)printf(%d,num[i]);}6.11分析下面两段代码。1.intnum[]={49,38,65,97,76,13,27};inti=1,j=7,temp,pivot;pivot=num[0];while(1){for(;i7&&num[i]pivot;++i);while(num[--j]pivot);if(i=j)break;temp=num[i];num[i]=num[j];num[j]=temp;}num[0]=num[j];num[j]=pivot;2.intnum[]={49,38,65,97,76,13,27};intleft=0,right=6,pivot=num[0];do{while(rightleft&&num[right]=pivot)--right;if(rightleft){num[left]=num[right];++left;}while(leftright&&num[left]=pivot)++left;if(leftright){num[right]=num[left];--right;}}while(leftright);num[left]=pivot;参考:1.输出为数组中小于首元素的元素均位于首元素的左边,而大于的均去了右边。(应认真分析代码的执行过程)。2.输出为作用同1,但采用的算法不同。6.12分析下面的程序#includestdio.hvoidmain(){inta[]={-15,6,0,7,9,23,54,82,101};intb[3]={101,-14,82};inti,left,right,middle;for(i=0;i3;++i){left=0;right=8;while(left=right){middle=(left+right)/2;if(b[i]==a[middle]){printf(a[%d]=b[%d]=%d\n,middle,i,b[i]);break;}elseif(b[i]a[middle])left=middle+1;elseright=middle-1;}if(leftright)printf(b[%d](%d)不在数组中!\n,i,b[i]);}}b[0]=101b[1]=-14b[2]=82leftrightmiddleleftrightmiddleleftrightmiddle084084084586031586787000787888106.13利用筛选法求1000以内的素数的步骤如下:第一步依次列出2,3,4,5,……,1000,并确定第一个素数2;第二步从该素数起(但不包括),筛去(删去)序列中该素数的倍数;第三步把序列中大于原素数且没有被删去的第一个数作为新确定的素数,并重复第二步。如果找不到这样的数,则算法结束。提示:用数组存储序列。intnum[1000]={0},2是素数则num[2]=0,筛去2的倍数时让num[4]=1,num[6]=1……参考程序:#includestdio.hvoidmain(){intnum[1000]={0},i,j,sum=0;for(i=2;i1000;++i){if(num[i]==0){printf(%5d,i);if(++sum%10==0)printf(\n);for(j=i+i;j1000;j+=i)num[j]=1;}}}6.14找出矩阵m中的最大、最小元素,并输出它们的位置。#includestdio.h#defineROW2#defineCOL3voidmain(){intm[ROW][COL],i,j;intpos[4]={0};printf(请输入%d行%d列矩阵的元素\n,ROW,COL);for(i=0;iROW;++i)for(j=0;jCOL;++j)scanf(%d,&m[i][j]);pri
本文标题:C语言内涵教程练习6参考答案
链接地址:https://www.777doc.com/doc-4065417 .html