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

下载本文档

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

文档简介

8-1 编写程序,将10个数34,3,29,63,70,16,85,82,90,93存放于一组数组中,求出这十个数的和及平均值。解: #include stdio.hvoid main() int a10=34,3,29,63,70,16,85.82,90,93; int i ,sum=0; float average ; for(i=0;i10;i+) sum=sum+ai ; average=sum/10.0; printf(sum=%d,average=%fn,sum,average);运行结果:sum=565,average=56.5000思考:数组有何特点?此问题如果不用数组进行处理将会怎样? 8-2 编写程序,求存放于上题数组中10个数的最大值,最小值及所在的位置。解:#include stdio.hvoid 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;imax) max=ai;d_max=i; if(aimin) min=ai;d_min=i; printf(max=%d,a%dn,max,d_max); printf(min=%d,a%dn,min,d_min);运行结果:max=93,a9 Min=3,a1思考:数组ai中i的变化意味着什么? 8-3 编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。 解:#include stdio.hvoid main() float a50,max,min; int i,d_max,d_min; for(i=0;i50;i+) scanf(%f,&ai); max=min=a0; d_max=d_min=0; for(i=1;imax) max=ai;d_max=i; if(aimin) 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 stdio.h#define N 3void main() float aN ,t; int i,j; for(i=0;iN;i+) scanf(%f,&ai); /*按升序排序*/ for(i=0;iN;i+) for(j=i;jaj) t=ai;ai=aj;aj=t; printf(%8.2f ,ai); printf(n); /*按降序排序*/ for(i=0;iN;i+) for(j=i;jN;j+) if(aiaj) t=ai;ai=aj;aj=t; printf(%8.2f ,ai); printf(n); 思考:此题中可以不用数组进行处理吗?(进一步理解数组的特点。) 8-5 编写程序,从键盘输入某班学生C语言课程考试成绩,评定每个学生C语言成绩等级。如果高于平均分10分,则等级为优秀;如果低于平均分10分,则等级为一般;否则等级为中等。 解:#include stdio.h#define N 3void main() int i ,j; float average,aN,sum=0; for(i=0;iN;i+) scanf(%f,&ai); sum=sum+ai; average=sum/N; for(i=0;iaverage+10)printf(a%d优秀n,i); else if(aiaverage-10)printf(a%d一般n,i); else printf(a%d中等n,i); 思考:表示数组元素的ai一般称为什么变量?它与一般变量有何区别? 8-6 某班期终考试有六门课程,编写程序计算每门课程的平均成绩。进一步考虑全年级10个班的情况。 解:#include stdio.h#define N 30#define M 6void main() int i,j; float averageM,aNM,sum=0; for(i=0;iN;i+) for(j=0;jM;j+) scanf(%f,&aij); for(j=0;jM;j+) sum=0; for(i=0;iN;i+) sum=sum+sij ; averagej=sum/N; printf(6门课程的平均成绩分别为:n); for(i=0;iM;i+) printf(%f ,averagei); printf(n) ; 思考:在此题中定义的数组aNM中,N表示什么?M 表示什么?若考虑全年级10个班的情况,程序应做哪些改进?8-7 编写程序,将一个一维数组进行逆置。例如,原来顺序为1,3,5,7,则逆置后的顺序为7,3,5,1. 解:#include stdio.h#define N 4void fun(int a) int i,t ; for(i=0;iN/2;i+) t=ai ; ai=aN-1-i; aN-1-i=t; for(i=0;iN;i+) printf(%d,ai); void main() int i ,aN ; printf(请输入一维数组各元素的值:n); for(i=0;iN;i+) scanf(%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 stdio.h#define N 6void main() int i,j,aNN=1,k; for(i=1;iN;i+) for(j=1;jN;j+) if(j=1|i=j) aij=a00 ; else aij=ai-1j-1+ai-1j ; for(i=1;iN;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 stdio.h#define N 1000void main() int i,aN,n=0,db ; for(i=1;iN;i+) ai=1 ; for(i=2;iN/2;i+) if(ai=0) continue ; db=i*2; while(dbN) adb=0; db=db+i; for(i=100;iN;i+) if(ai=1) printf(%d,i); n+ ; if(n%18=0) printf(n) ; printf(n) ;思考:在程序实际已求出了什么范围之间的所有素数?在while循环中的“adb=0;”语句的作用是什么了?8-10 编写程序,利用数组实现大整数的加减运算。假定大整数不超过10位数字。解:#include stdio.h#include string.h#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=0;i-) if(!ci&!jw) continue ; else printf(%d,ci); jw=1 ; printf(n) ;void mus() /*求两个大整数的差*/ int i ; jw=0; for(i=0;i=bi) di=ai-bi-jw ; jw=0 ;/表示无借位 else di=ai-bi-jw ; jw=1 ;/表示有借位 jw=0; printf(两数差为:); if(!flag) printf(-) ; for(i=N-1;i=0;i-) if(!di&!jw) continue ; else printf(%d,di);jw=1; void main() int i,n1,n2; chg0(a,N); chg0(b,N); chg0(c,N); chg0(d,N); char s1N,s2N; printf(请输入加数(减数):n); scanf(%s,s1) ; printf(请输入被加数(被减数):n); scanf(%s,s2) ; n1=strlen(s1); n2=strlen(s2); if(n1n2|(n1=n2&strcmp(s1,s2)=0) for(i=0;i=n1;i+) ai=s1n1-i-1-48 ; for(i=0;i=n2;i+) bi=s2n2-i-1-48 ; else for(i=0;i=n1;i+) bi=s1n1-i-1-48 ; for(i=0;i=n2;i+) bi=s2n2-i-1-48 ; flag=0; add(); mus(); printf(n) ;思考:此程序中变量的jw的作用什么?他在函数add()与mus()中的作用一样吗?判断式“if(!di&!jw)”为真时是什么情况?将大整数以字符串的形式进行输入的好处是什么? 8-11 编写程序,从键盘输入两个44的矩阵A和B,求出它们的和、差、积,并按矩阵的形式输出。解:#include stdio.hvoid main() int a44,b44,c44,i,j; for(i=0;i=4;i+) for(j=0;j4;j+) scanf(%d,&aij); for(i=0;i=4;i+) for(j=0;j4;j+) scanf(%d,&bij); for(i=0;i=4;i+) for(j=0;j4;j+) cij=aij+bij ; for(i=0;i4;i+) for(j=0;j4;j+) printf(%d,cij) ; printf(n) ; 思考: 此程序只完成了矩阵A与B的求和计算过程(求差的过程略),求A与B的乘积应对上面四个二重循环中哪个进行处理?二重循环是否能满足矩阵乘积计算过程的需要?8-12 编写程序,将一个二维数组的行列互换,并考虑用函数实现。 解:#include stdio.h#define N 3#define M 4void main() int aMN,atNM,i,j; printf(请输入二维数组(%d行%d列):n,M,N); for(i=0;iM;i+) for(j=0;jN;j+) scanf(%d,&aij); for(i=0;iN;i+) for(j=0;jM;j+) atij=aji; printf(输出行列互换后的二维数组(%d行%d列):n,N,M); for(i=0;iN;i+) printf(n) ; for(j=0;jM;j+) printf(%d,atij) ; printf(n) ; 思考:此程序中的关键语句是什么?若考虑用函数实现,哪些内容放到函数中的通用性比较好? 8-13 编写程序,找出一个二维数组中的鞍点,即该位置上的元素在该行上的最大、在该列上最小。 解:#include stdio.h#define N 3 /*设二维数组为3行3列*/#define M 3void main() int i ,j,aNM,max_min,k,flag=0; printf(请输入数组的各元素值:n) ; for(i=0;iN;i+) for(j=0;jM;j+) scanf(%d,&aij) ; for(i=0;iN;i+) /*显示数组*/ printf(n) ; for(j=0;jM;j+) printf(%d,aij) ; for(i=0;iN;i+) k=0; max_min=ai0 ; for(j=0;jM;j+) if(max_minaij)max_min=aij;k=j; for(j=0;jajk)break ; if(j=M) flag=1 ; printf(n满足条件的元素为第%d行第%d列的:%dn,i+1,k+1,max_min); if(flag!=1) printf(n没有满足条件的元素!); 思考:此题是否会出现两个以上同时满足条件的元素?为什么?8-14 编写程序,输入一行字符,统计其中共有多少个单词,单词之间用空格分隔开。解:#include stdio.h#define N 100void main() char aN,i,num=0 ; printf(请输入一行字符串(不超过100个):n) ; gets(a) ; for(i=0;ai!=0;i+) if(ai= ) num+; while(ai+= );/*处理连续空格的情况*/ printf(该行字符串有%d个单词:n,num+1) ; 思考:对语句“while(ai+= );”你是如何理解的?它的循环体是什么?是否还可以出其它形式? 8-15 有一篇文章,共10行,每行有80个字符。编写程序,统计其中大写字母、小写字母、数字、空格及其它字符各有多少个。解:#include stdio.hvoid main() char a1080,i,j,num5=0,0,0,0,0; printf(请输入各行字符(每行不超过80个):n); for(i=0;i10;gets(ai+) ; for(i=0;i=A&aij=a&aij=0&aij=9) num2+ ; else if(aij= ) num3+ ; else num4+ ; printf(该文有大写字母%d个n,num0) ; printf(该文有小写字母%d个n,num1) ; printf(该文有数字字符%d个n,num2) ; printf(该文有空格%d个n,num3) ; printf(其它字符有%d个n,num4) ; 思考:在循环结构中嵌套if结构时应该注意哪些问题?if结构中是否也可以嵌套循环结构。 8-16 编写程序,分别实现字符串复制函数strcpy()、字符串比较函数strcmp()的功能。 解:#include stdio.h#define N 100void My_strcpy(char x,char y) int i=0 ; while(xi!=0) yi=xi ; i+ ; yi=0 ;int My_strcmp(char x,char y) int i=0; while(xi!=0|yi!=0) if(yi!=xi) return 0 ; i+; if(xi!=0|yi!=0) return 0 ; return 1 ;void main() char aN ,bN; printf(请输入源字符串a(100个字符):); gets(a); My_strcpy(a,b); printf(目标字符串b为:%sn,b); printf(请输入比较字符串a(100个字符):); gets(a) ; printf(请输入比较字符串a(100个字符):); gets(b); if(My_strcmp(a,b) printf(a,b两字符串相等!n); else printf(a,b两字符串不相等!n); 思考:C语言在字符串的处理过程中,“0”的作用是什么?是如何“输入”的? 8-17 有一行电文,已按下面的规律译成密码: AZ az , BY by, CX cx, . 即第一个字母变成第26个字母,第i个字母变成第26-i+1个字母。非字母字符不变。编写程序将密码译回原文,并输出密码和原文。解:#include stdio.h#includestring.h#define N 100void main() int i =0; char chN, tranN; printf(“请输入密码电文字符串(=A&chi=a&chi=z) trani=(122-chi)+97;else trani=chi;i+; trani=0; printf(“n 电文密码:%s”,ch); printf(“n 原 文 是:%sn”,tran);思考:在C语言中,对字符的比较是如何进行的?其基本比较规则是什么?8-18 编写程序,读入若干国家的名称,按字典顺序排序输出。 解:#include stdio.h#includestring.h#define N 50#define M 20void main() int i ,j ,n=0; char cnameNM,tranN ; printf(请输入国家名称(50个且每个名称不超过20个字符,当第一个字符为空格是结束):n); for(i=0;iN;i+) gets(cnamei) ; if(cnamei0= ) break ; n+ ; for(i=0;in-1;i+) for(j=i+1;j0) strcpy(tran,cnamei); strcpy(cnamei,cnamej); strcpy(cnamej,tran); printf(按字典顺序排序后为:n); for(i=0;in;i+) puts(cnamei) ; 思考: 语句“if(cnamei0= ) break ;”的作用是什么?若无此语句,程序运行将会出现什么状况。 8-19 若A为nn对称方阵,将A压缩存放到一维数组B中,使B具有n(n+1)/2个元素,且A中信息可全部在B中找到。 解:#include stdio.h#define N 5#define M N*(N+1)/2 /*用宏处理一维数组的动态下标,内容参见第12章*/void main() int aNN,bM,i,j,k; printf(请输入方阵A的值:n); for(i=1;iN;i+) /*为了易与方阵下标的对应理解,此处弃掉0行0列*/ for(j=1;jN;j+) scanf(%d,&aij); for(i=1;iN;i+) for(j=1;j=i;j+) k=i*(i-1)/2+j; bk=aij; printf(利用一维的b数组输出方阵的值:n); for(i=1;iN;i+) for(j=1;j=j) k=i*(i-1)/2+j ; else k=j*(j-1)/2+i; printf(%d,bk); printf(n) ; 思考: 如果在一个方阵中有大量的0元素(称为稀疏矩阵),如何进行一维的压缩存储?8-20 某单位用现金发放工资,编写程序计算各种面值的最佳张数,以保证发给职工工资时不需找零。职工工资与各种面值的张数均要求用数组描述。解:#include stdio.h#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;j10;j+) sumj=0 ; printf(请输入每个职工的工资(精确到角):n); for( i=0;iN;i+) scanf(%f,salary+i) ; for(i=0;iN;i+) s=int(10*salaryi);/*取出第i个工人的工资并转化为角*/ for(j=0;j10;j+) sumj+=s/moneyj; s=s%moneyj ; /*输出结果*/ for(i=0;i10;i+) if(i7) printf(%d元,moneyi/10); else printf(%3.1f元,moneyi/10.0); printf(n) ; for(i=0;i10;i+) printf( %d ,sumi) ; printf(n) ; 思考:s/moneyj,s%moneyj这两个表达式是用来求什么的?如果不用角为单位,程序应如何设计?8-21 编写n个学生、m门课程的成绩处理程序:(1) 实际学生人数、课程门数由键盘输入。(2) n个学生、m门课程的成绩用二维实型数组描述,同时考虑学生姓名、学号数据。(3) 求出每个学生的总成绩、平均成绩、并按总成绩排序。(4) 求出每门课程的平均成绩和不及格的人数。解:#include stdio.h#includestring.h#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;in;i+) printf(n请输入第%d个学生的学号、姓名:,i+1); scanf(%d,&noi);gets(namei) ; printf(各门课的考试成绩:); for(j=0;jm;j+) scanf(%d,&scij); for(i=0;in;i+) sumi=0; for(j=0;jm;j+) sumi+=scij; ravei=sumi/m ; for(j=0;jm;j+) csumj=0;davej=0; for(i=0;in;i+) if(scij60) davej+; csumj+=scij ; cavej=csumj/n; for(i=0;in-1;i+) /排序过程 k=i ; for(j=i+1;jn;j+) if(sumksumj) 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;jm;j+) t=scij;scij=sckj;sckj=t; /*输入显示过程*/ printf(名次 学号 姓名 ); for(i=0;im;i+) printf( 课程%d ,i+1); printf( 总成绩 平均成绩n ); for(i=0;in;i+) printf(%2d %d %10s ,i+1,noi,namei); for(j=0;jm;j+) printf( %d ,scij); printf( %d %7.2fn,sumi,ravei); printf(n 各科平均成绩: ); for(j=0;jm;j+) printf(%7.2f,cavej) ; printf(n 不及格人数: ); for(j=0;jm;j+) printf(%7d,davej) ; printf(n) ;思考:二维数组是否可以看作由若干一维数组构成?此题中的排序采用了什么方法? 8-22在保龄球比赛中,已知每次击倒的保龄球数。计算在一局比赛中一个人的得分,要求同时算出每一轮的得分和每一轮之后的累计得分。 保龄球比赛一局共十轮,前九轮中每一轮最多打两次球;第十轮可以大两次或三次球,每轮几分规则如下: (1) 如果一轮中第一个球击倒全部10只保龄球(称为Strike,好球), 则这一轮的得分等于10分加下两次击倒保龄球的只数。 (2) 如果一轮中两个球击倒全部10只保龄球(称为Spare,成功),则这一轮的得分等于10分加下一次击倒保龄球的只数。 (3) 如果一轮中两个球一共

温馨提示

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

最新文档

评论

0/150

提交评论