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;i10;i+) sum=sum+ai ; average=sum/; printf(sum=%d,average=%fn,sum,average);运行结果:sum=565,average=思考:数组有何特点此问题如果不用数组进行处理将会怎样 8-2 编写程序,求存
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;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的变化意味着
3、什么 8-3 编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。 解:#include void 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); 思考:此题中不用数组也可以处
4、理吗如果可以,区别之处在哪里 8-4将存放于上题数组中的50个数分别按升序,降序排序。 解:#include #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);
5、printf(n); 思考:此题中可以不用数组进行处理吗(进一步理解数组的特点。) 8-5 编写程序,从键盘输入某班学生C语言课程考试成绩,评定每个学生C语言成绩等级。如果高于平均分10分,则等级为优秀;如果低于平均分10分,则等级为一般;否则等级为中等。 解:#include #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 i
6、f(aiaverage-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;iN;i+) for(j=0;jM;j+) scanf(%f,&aij); for(j=0;jM;j+) sum=0; for(i=0;iN;i+)
7、 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 #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;
8、 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 #define N 6void main() int i,j,aNN=1,k; for(i=1;iN;i+) for
9、(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 #define N 1000void main() int i,aN,n=0,d
10、b ; 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 #include #define N 10in
11、t 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;iN;i+) ci=(ai+bi+jw)%10 ; jw=(ai+bi+jw)/10 ;0”. 即第一个字母变成第26个字母,第i个字母变成第26-i+1个字母。非字母字符不变。编写程序将密码译回原文,并输出密码和原文。解:#include #include#define N 100void main() int i =0;
12、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 #include#define N 50#define M 20void main() int i ,j ,n=0; char cnameNM,tranN
13、 ; 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 ;”的作用是什么若无此语句,程序
14、运行将会出现什么状况。 8-19 若A为nn对称方阵,将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;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
15、-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 #define N 30void main() int i ,j ; float salaryN
16、 ; 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) pri
17、ntf(%d元,moneyi/10); else printf(%3.1f元,moneyi/; 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) 求出每门课程的平均成绩和不及格的人数。解:#incl
18、ude #include#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(各
19、门课的考试成绩:); 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(n
20、am,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+) p
21、rintf( %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在保龄球比赛中,已知每次击倒的保龄球数。计算在一局比赛中一个人的得分,要求同时算出每一轮的得分和每一轮之后的累计得分。 保龄球比赛一局共十轮,前九轮中每一轮最多打两次球;第十轮可
22、以大两次或三次球,每轮几分规则如下: (1) 如果一轮中第一个球击倒全部10只保龄球(称为Strike,好球), 则这一轮的得分等于10分加下两次击倒保龄球的只数。 (2) 如果一轮中两个球击倒全部10只保龄球(称为Spare,成功),则这一轮的得分等于10分加下一次击倒保龄球的只数。 (3) 如果一轮中两个球一共击倒保龄球只数少于10个(称为No mark,平常),则这一轮的得分等于所击倒保龄球的总只数。 解: 此题比较复杂,详细处理过程请参见本书上机实验指导部分的综合练习。为了便于理解,在此我们先将问题简化为:当一局十轮全部滚完后,再进行积分的显示与累计。 程序如下:解:#include
23、void main() int i,j,a112,sc10,sum10 ; a100=0;a101=0;a110=0;a111=0; printf(请输入各轮两次的击倒的保龄瓶(球)数n); for(i=0;i11;i+) if(i10) printf(第%d轮第一次击倒瓶球数:,i+1); scanf(%d,&ai0); if(ai010) printf(第%d轮第二次击倒瓶球数:,i+1); scanf(%d,&ai1); else printf(OK!n);ai1=0; else if(a90+a9110) break; printf(附加第一次击倒瓶球数:) ; scanf(%d,&a
24、i0); if(a90=10) printf(附加第二次击倒瓶球数:) ; scanf(%d,&ai1); else printf(OK!n);ai1=0; if(a9010|ai0+ai110|ai0!=10) break ; for(i=0;i10;i+) if(ai0=10) if(ai+10=0&i9) sci=ai0+ai+10+ai+20; else sci=ai0+ai+10+ai+11; else if(ai0+ai1=10) sci=ai0+ai1+ai+10; else sci=ai0+ai1; if(i=0) sumi=sci ; else sumi=sumi-1+sci; printf( 轮次: ); for(i=1;i=10;i+) printf(%4d,i); printf( 附加); for(j=0;j2;j+) printf(n第%d次得分:,j+1); for(i=0;i11;i+) if(aij!=0|j=0|ai0!=10) printf(%4d,aij); else printf( /); print
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1