《C语言程序设计》(江宝钏著)实验六答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

6.4实验六数组一、实验目的与要求1.掌握一维数组的定义、赋值和输入输出的方法。2.理解一维数组的存储方法及下标的表示方法。3.掌握与数组有关的算法(特别是排序算法)。4.掌握二维数组的定义、赋值和输入输出的方法。5.理解二维数组的存储方法及下标的表示方法。6.实验4学时。二、实验内容1.程序验证题与改错题(1)程序验证题①给定一个整型数组a,要求求出其中小于0的元素的个数。请验证下面的程序是否符合题目要求。#defineN10voidmain(){inta[N]={11,2,4,-1,5,-3,-66,0,10,-5};inti;/*变量i用于for循环*/intcount=0;/*变量count用于技术,初始化为0*/for(i=0;iN;i++)if(a[i]0)count++;/*如果元素a[i]0,count计数+1*/printf(%d\n,count);}②给定一个整型二维数组a(3,3),要求求出对角线元素的和。请验证下面的程序是否符合题目要求。#includestdio.h#defineN3voidmain(){inta[N][N]={{1,2,3},{4,5,6},{7,8,9}};inti,j;/*变量i,j用于for循环*/intsum=0;/*变量sum用于求和,初始化为0*/for(i=0;iN;i++)for(j=0;jN;j++)if(i==j)sum+=a[i][j];/*如果是对角线元素,sum+a[i][j]*/这里有改动printf(%d\n,sum);return0;}注1:在程序验证题①的基础上,修改程序,求出数组a中大于a[0]的元素之和。答;#includestdio.h#defineN10voidmain(){inta[N]={11,2,4,-1,5,-3,-66,0,10,-5};inti,sum=0;intcount=0;for(i=0;iN;i++){if(a[i]0)count++;if(a[i]a[0])sum+=a[i];}printf(小于0元素的个数为:%d\n,count);printf(大于a[0]的元素之和为:%d\n,sum);}注2:对上述程序②进行优化,消除内循环,实现同样的效果。在②的基础上,修改程序,求出数组a中反对角线元素之和。提示:内循环用逆序;i+j==N-1。答:①#includestdio.h#defineN3voidmain(){inta[N][N]={{1,2,3},{4,5,6},{7,8,9}};inti,j;intsum=0;for(i=0;iN;i++){j=i;sum+=a[i][j];}printf(%d\n,sum);}②#includestdio.h#defineN3voidmain(){inta[N][N]={{1,2,3},{4,5,6},{7,8,9}};inti,j;intsum=0;for(i=0;iN;i++){for(j=0;jN;j++)if(i+j==N-1)sum+=a[i][j];}printf(%d\n,sum);return0;}(2)程序改错题2.一般编程题编程题1:从键盘输入10个整型数据,放入数组a中,求其最大值、最小值及其所在元素的下标位置,并输出。程序提示:定义10个元素的数组,用for循环语句逐一输入数据;定义最大值变量和最小值变量,用for循环语句遍历所有数组元素,逐一比较查找最大值和最小值。答:#includestdio.hvoidmain(){inta[10],max,min,t,p;inti;for(i=0;i10;i++)scanf(%d,&a[i]);max=a[0];min=a[0];for(i=1;i10;i++){if(a[i]max){max=a[i];t=i;}if(a[i]min){min=a[i];p=i;}}printf(最大值及其下标为:%d,%d\n,max,t);printf(最小值及其下标为:%d,%d\n,min,p);}编程题2:给定一个字符数组a,要求将数组的内容倒置。如:执行前数组的内容为{'1','2','3','4','5','6','7','8'}执行后数组的内容为{'8','7','6','5','4','3','2','1'}提示:用i表示数组的第一个元素的下标;用j表示数组最后一个元素的下标。交换a[i]和a[j],当i=j时交换完毕。交换一个元素后,i+1,j-1。答:#includestdio.h#includestring.h#defineN10000voidmain(){chara[N],t;intlen,i,j;gets(a);len=strlen(a);for(i=0,j=len-1;ij;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;ilen;i++)printf(%c,a[i]);printf(\n\n);}编程题3:给定一个二维数组a,要求将数组的内容逆置。如:执行前数组的内容为{{1,2,3},{4,5,6},{7,8,9}},执行后数组的内容为{{1,4,7},{2,5,8},{3,6,9}}提示:用i表示数组的行下标;用j表示数组的列下标。以对角线元素为界,交换a[i][j]和a[j][i]。答:#includestdio.h#defineN100voidmain(){inti,j,x,y,a[N][N],t;printf(行数:);scanf(%d,&y);printf(列数:);scanf(%d,&x);printf(输入数列:\n);for(i=0;iy;i++){for(j=0;jx;j++)scanf(%d,&a[i][j]);}printf(\n正常数列为:\n);for(i=0;iy;i++){for(j=0;jx;j++)printf(%5d,a[i][j]);printf(\n);}for(i=0;iy;i++)for(j=x-1;ji;j--){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}printf(交换后的数列为:\n);for(i=0;ix;i++){for(j=0;jy;j++)printf(%5d,a[i][j]);printf(\n);}}编程题4:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。张王李赵周Math8061598576C7565638777English9271709085提示:可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average为全组各科总平均成绩。答:#includestdio.hvoidmain(){inta[3][5];inti,j;doublesum1,sum2=0,v[3],average;printf(\t张\t王\t李\t赵\t周\n);for(i=0;i3;i++){switch(i){case0:printf(math:);break;case1:printf(c:);break;case2:printf(English:);break;}for(j=0;j5;j++)scanf(%5d,&a[i][j]);}for(i=0;i3;i++){sum1=0;for(j=0;j5;j++)sum1+=a[i][j];v[i]=(double)sum1/5;sum2+=v[i];}average=sum2/3;for(i=0;i3;i++){switch(i){case0:printf(mathaverage:%.2lf\n,v[i]);break;case1:printf(chineseaverage:%.2lf\n,v[i]);break;case2:printf(Englishaverage:%.2lf\n,v[i]);break;}}printf(totleaverage:%.2lf\n,average);}3.较难编程题编程题1:给定一个整型数组a,要求将数组a中的元素进行从小到大的排序(用冒泡法排序)【算法描述】从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后;第二遍只需考虑(N-1)个数,即不用考虑最后一个数;以此类推每次少考虑一个数,直到第(N-1)遍比较后就可以完成排序。答:#includestdio.h#defineN1000voidmain(){inta[N],n;inti,j,t;printf(请输入数组中元素的个数:);scanf(%d,&n);printf(输入数组:);for(i=0;in;i++)scanf(%d,&a[i]);for(i=0;in-1;i++){for(j=0;jn-i-1;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}printf(排序后的数列为:);for(i=0;in;i++)printf(%d,a[i]);printf(\n);}编程题2:有15个整数(已排序)存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标值,如果该数不在数组中,则输出“无此数”。这15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。提示:折半查找法:在一个已从小到大排序的数组a中,用b(begin)表示数组首元素的下标,用e(end)表示数组末元素的下标,需查找的数x首先和处于数组最中间的下标为m=(b+e)/2的元素比较,若x和该数组元素相等,则找到位置,返回m;否则,若x大,则x可能落在下半区中,令b=m+1,若x小,则x可能落在上半区中,令e=m-1。重新计算m,再比较x和a[m];重复上述操作直到找到相等元素或be。若找到相等元素,则返回元素下标,否则返回-1表示无此数。答:#includestdio.h#defineN15voidf(ints[],intn);voidmain(){ints[N]={1,2,3,5,9,10,20,23,45,56,66,70,80,90,100},b=0,e=N,mid,x;printf(inputanumbertosearch:);scanf(%d,&x);while(b=e){mid=(b+e)/2;if(x==s[mid]){printf(Thepositioninarrayis%d\n,mid+1);f(s,mid);break;}elseif(xs[mid])e=mid-1;elseb=mid+1;}if(be)printf(%dnotbefoud\n,x);}voidf(ints[],intn){inti;for(i=n;iN;i++)s[i]=s[i+1];printf(outputthearrayafterdeletingthenumber\n);for(i=0;iN-1;i++)printf(%4d,s[i]);printf(\n);}

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功