数组类型习习题及答案_第1页
数组类型习习题及答案_第2页
数组类型习习题及答案_第3页
数组类型习习题及答案_第4页
数组类型习习题及答案_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、8-1 编写程序,将10个数34,3,29,63,70,16,85,82,90,93存放于一组数组中,求出这十个数的和及平均值。解: #include ""void main() int a10=34,3,29,63,70,16,90,93; int i ,sum=0; float average ; for(i=0;i<10;i+) sum=sum+ai ; average=sum/; printf("sum=%d,average=%fn",sum,average);运行结果:sum=565,average=思考:数组有何特点此问题如果不用数组进

2、行处理将会怎样 8-2 编写程序,求存放于上题数组中10个数的最大值,最小值及所在的位置。解:#include ""void main() int a10=34,3,29,63,70,16,85,82,90,93; int i,sum,max,min,d_max,d_min; max=min=a0; d_max=d_min=0; for(i=1;i<10;i+) if(ai>max) max=ai;d_max=i; if(ai<min) min=ai;d_min=i; printf("max=%d,a%dn",max,d_max); p

3、rintf("min=%d,a%dn",min,d_min);运行结果:max=93,a9 Min=3,a1思考:数组ai中i的变化意味着什么 8-3 编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。 解:#include ""void main() float a50,max,min; int i,d_max,d_min; for(i=0;i<50;i+) scanf("%f",&ai); max=min=a0; d_max=d_min=0; for(i=1;i<50;i+) i

4、f(ai>max) max=ai;d_max=i; if(ai<min) min=ai;d_min=i; printf("max=%d,a%dn",max,d_max); printf("min=%d,a%dn",min,d_min); 思考:此题中不用数组也可以处理吗如果可以,区别之处在哪里 8-4将存放于上题数组中的50个数分别按升序,降序排序。 解:#include ""#define N 3void main() float aN ,t; int i,j; for(i=0;i<N;i+) scanf(&quo

5、t;%f",&ai); /*按升序排序*/ for(i=0;i<N;i+) for(j=i;j<N;j+) if(ai>aj) t=ai;ai=aj;aj=t; printf("%8.2f ",ai); printf("n"); /*按降序排序*/ for(i=0;i<N;i+) for(j=i;j<N;j+) if(ai<aj) t=ai;ai=aj;aj=t; printf("%8.2f ",ai); printf("n"); 思考:此题中可以不用数组进行处

6、理吗(进一步理解数组的特点。) 8-5 编写程序,从键盘输入某班学生C语言课程考试成绩,评定每个学生C语言成绩等级。如果高于平均分10分,则等级为优秀;如果低于平均分10分,则等级为一般;否则等级为中等。 解:#include ""#define N 3void main() int i ,j; float average,aN,sum=0; for(i=0;i<N;i+) scanf("%f",&ai); sum=sum+ai; average=sum/N; for(i=0;i<N;i+) if(ai>average+10)p

7、rintf("a%d优秀n",i); else if(ai<average-10)printf("a%d一般n",i); else printf("a%d中等n",i); 思考:表示数组元素的ai一般称为什么变量它与一般变量有何区别 8-6 某班期终考试有六门课程,编写程序计算每门课程的平均成绩。进一步考虑全年级10个班的情况。 解:#include ""#define N 30#define M 6void main() int i,j; float averageM,aNM,sum=0; for(i=0;

8、i<N;i+) for(j=0;j<M;j+) scanf("%f",&aij); for(j=0;j<M;j+) sum=0; for(i=0;i<N;i+) sum=sum+sij ; averagej=sum/N; printf("6门课程的平均成绩分别为:n"); for(i=0;i<M;i+) printf("%f ",averagei); printf("n") ; 思考:在此题中定义的数组aNM中,N表示什么M 表示什么若考虑全年级10个班的情况,程序应做哪些改进

9、8-7 编写程序,将一个一维数组进行逆置。例如,原来顺序为1,3,5,7,则逆置后的顺序为7,3,5,1. 解:#include ""#define N 4void fun(int a) int i,t ; for(i=0;i<N/2;i+) t=ai ; ai=aN-1-i; aN-1-i=t; for(i=0;i<N;i+) printf("%d",ai); void main() int i ,aN ; printf("请输入一维数组各元素的值:n"); for(i=0;i<N;i+) scanf("

10、%d",&ai); fun(a); printf("n"); 思考:如果要对7个元素的数组进行逆置操作,只需要修改什么地方数组元素的下标可以是算术表达式吗有何要求 8-8 编写程序,打印如下的杨辉三角形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 解:#include ""#define N 6void main() int i,j,aNN=1,k; for(i=1;i<N;i+) for(j=1;j<N;j+) if(j=1|i=j) aij=a00 ; else aij=ai-1j-1+ai-1j ;

11、for(i=1;i<N;i+) for(k=1;k<=N-i;k+) /* 每行前面的空格*/ printf(" ") ; for(j=1;j<=i;j+) printf("%4d",aij) ; printf("n") ; 思考: 在此题中定义一个aNN的方阵数组显然有些浪费(有些元素闲置,却占用存储空间),可否考虑用一维数组进行处理 8-9 编写程序,用筛选法求100-1000之间的素数。 解:#include ""#define N 1000void main() int i,aN,n=0,

12、db ; for(i=1;i<N;i+) ai=1 ; for(i=2;i<N/2;i+) if(ai=0) continue ; db=i*2; while(db<N) adb=0; db=db+i; for(i=100;i<N;i+) if(ai=1) printf("%d",i); n+ ; if(n%18=0) printf("n") ; printf("n") ;思考:在程序实际已求出了什么范围之间的所有素数在while循环中的“adb=0;”语句的作用是什么了8-10 编写程序,利用数组实现大整数的

13、加减运算。假定大整数不超过10位数字。解:#include ""#include ""#define N 10int aN,bN,cN,dN,jw=0;int flag=1 ;/*标志两个大整数的大小关系*/void chag0(int a,int n) for(int i=0;i<=n;i+) ai=0;void add() /*求两个大整数的和*/ int i ; for(i=0;i<N;i+) ci=(ai+bi+jw)%10 ; jw=(ai+bi+jw)/10 ;0”. 即第一个字母变成第26个字母,第i个字母变成第26-i+1个字

14、母。非字母字符不变。编写程序将密码译回原文,并输出密码和原文。解:#include ""#include""#define N 100void main() int i =0; char chN, tranN; printf(“请输入密码电文字符串(<100): ”); getch(ch); while(chi!=0) if(chi>=A&&chi<=Z) trani=(90-chi)+65;else if(chi>=a&&chi<=z) trani=(122-chi)+97;else tra

15、ni=chi;i+; trani=0; printf(“n 电文密码:%s”,ch); printf(“n 原 文 是:%sn”,tran);思考:在C语言中,对字符的比较是如何进行的其基本比较规则是什么8-18 编写程序,读入若干国家的名称,按字典顺序排序输出。 解:#include ""#include""#define N 50#define M 20void main() int i ,j ,n=0; char cnameNM,tranN ; printf("请输入国家名称(<50个且每个名称不超过20个字符,当第一个字符为空格是

16、结束):n"); for(i=0;i<N;i+) gets(cnamei) ; if(cnamei0=' ') break ; n+ ; for(i=0;i<n-1;i+) for(j=i+1;j<n;j+) if(strmp(cnamei,cnamej)>0) strcpy(tran,cnamei); strcpy(cnamei,cnamej); strcpy(cnamej,tran); printf("按字典顺序排序后为:n"); for(i=0;i<n;i+) puts(cnamei) ; 思考: 语句“if(c

17、namei0= ) break ;”的作用是什么若无此语句,程序运行将会出现什么状况。 8-19 若A为n×n对称方阵,将A压缩存放到一维数组B中,使B具有n(n+1)/2个元素,且A中信息可全部在B中找到。 解:#include ""#define N 5#define M N*(N+1)/2 /*用宏处理一维数组的动态下标,内容参见第12章*/void main() int aNN,bM,i,j,k; printf("请输入方阵A的值:n"); for(i=1;i<N;i+) /*为了易与方阵下标的对应理解,此处弃掉0行0列*/ fo

18、r(j=1;j<N;j+) scanf("%d",&aij); for(i=1;i<N;i+) for(j=1;j<=i;j+) k=i*(i-1)/2+j; bk=aij; printf("利用一维的b数组输出方阵的值:n"); for(i=1;i<N;i+) for(j=1;j<N;j+) if(i>=j) k=i*(i-1)/2+j ; else k=j*(j-1)/2+i; printf("%d",bk); printf("n") ; 思考: 如果在一个方阵中有大

19、量的0元素(称为稀疏矩阵),如何进行一维的压缩存储8-20 某单位用现金发放工资,编写程序计算各种面值的最佳张数,以保证发给职工工资时不需找零。职工工资与各种面值的张数均要求用数组描述。解:#include ""#define N 30void main() int i ,j ; float salaryN ; int s ,money10=1000,500,200,100,50,20,10,5,2,1; int sum10 ;/*存放各种面值的张数*/ for( j=0;j<10;j+) sumj=0 ; printf("请输入每个职工的工资(精确到角):

20、n"); for( i=0;i<N;i+) scanf("%f",salary+i) ; for(i=0;i<N;i+) s=int(10*salaryi);/*取出第i个工人的工资并转化为角*/ for(j=0;j<10;j+) sumj+=s/moneyj; s=s%moneyj ; /*输出结果*/ for(i=0;i<10;i+) if(i<7) printf("%d元",moneyi/10); else printf("%3.1f元",moneyi/; printf("n&q

21、uot;) ; for(i=0;i<10;i+) printf(" %d ",sumi) ; printf("n") ; 思考:s/moneyj,s%moneyj这两个表达式是用来求什么的如果不用角为单位,程序应如何设计8-21 编写n个学生、m门课程的成绩处理程序:(1) 实际学生人数、课程门数由键盘输入。(2) n个学生、m门课程的成绩用二维实型数组描述,同时考虑学生姓名、学号数据。(3) 求出每个学生的总成绩、平均成绩、并按总成绩排序。(4) 求出每门课程的平均成绩和不及格的人数。解:#include ""#include

22、""#define N 100 /假定学生人数不超过100#define M 8 /假定课程门数不超过8void main() int n,m,i,j,k,lo,t; int noN,scNM,sumN,csumM ,daveM; float raveN ,caveM,ave; char nameN10,nam10 ; printf("请输入(学生人数,课程门数):"); scanf("%d,%d",&n,&m) ; for(i=0;i<n;i+) printf("n请输入第%d个学生的学号、姓名:&q

23、uot;,i+1); scanf("%d",&noi);gets(namei) ; printf("各门课的考试成绩:"); for(j=0;j<m;j+) scanf("%d",&scij); for(i=0;i<n;i+) sumi=0; for(j=0;j<m;j+) sumi+=scij; ravei=sumi/m ; for(j=0;j<m;j+) csumj=0;davej=0; for(i=0;i<n;i+) if(scij<60) davej+; csumj+=sci

24、j ; cavej=csumj/n; for(i=0;i<n-1;i+) /排序过程 k=i ; for(j=i+1;j<n;j+) if(sumk<sumj) k=j ; lo=noi;noi=nok;nok=lo; strcpy(nam,namei);strcpy(namei,namek);strcpy(namek,nam); t=sumi;sumi=sumk;sumk=t; ave=ravei;ravei=ravek;ravek=ave; for(j=0;j<m;j+) t=scij;scij=sckj;sckj=t; /*输入显示过程*/ printf(&quo

25、t;名次 学号 姓名 "); for(i=0;i<m;i+) printf(" 课程%d ",i+1); printf(" 总成绩 平均成绩n "); for(i=0;i<n;i+) printf("%2d %d %10s ",i+1,noi,namei); for(j=0;j<m;j+) printf(" %d ",scij); printf(" %d %7.2fn",sumi,ravei); printf("n 各科平均成绩: "); for(

26、j=0;j<m;j+) printf("%7.2f",cavej) ; printf("n 不及格人数: "); for(j=0;j<m;j+) printf("%7d",davej) ; printf("n") ;思考:二维数组是否可以看作由若干一维数组构成此题中的排序采用了什么方法 8-22在保龄球比赛中,已知每次击倒的保龄球数。计算在一局比赛中一个人的得分,要求同时算出每一轮的得分和每一轮之后的累计得分。 保龄球比赛一局共十轮,前九轮中每一轮最多打两次球;第十轮可以大两次或三次球,每轮几分规则如下

27、: (1) 如果一轮中第一个球击倒全部10只保龄球(称为Strike,好球), 则这一轮的得分等于10分加下两次击倒保龄球的只数。 (2) 如果一轮中两个球击倒全部10只保龄球(称为Spare,成功),则这一轮的得分等于10分加下一次击倒保龄球的只数。 (3) 如果一轮中两个球一共击倒保龄球只数少于10个(称为No mark,平常),则这一轮的得分等于所击倒保龄球的总只数。 解: 此题比较复杂,详细处理过程请参见本书上机实验指导部分的综合练习。为了便于理解,在此我们先将问题简化为:当一局十轮全部滚完后,再进行积分的显示与累计。 程序如下:解:#include ""void

28、main() int i,j,a112,sc10,sum10 ; a100=0;a101=0;a110=0;a111=0; printf("请输入各轮两次的击倒的保龄瓶(球)数n"); for(i=0;i<11;i+) if(i<10) printf("第%d轮第一次击倒瓶球数:",i+1); scanf("%d",&ai0); if(ai0<10) printf("第%d轮第二次击倒瓶球数:",i+1); scanf("%d",&ai1); else printf("OK!n");ai1=0; else if(a90+a91&l

温馨提示

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

评论

0/150

提交评论