第八次作业
1.输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩。
#include<stdio.h> #define N 100 int main() { int score[N],n,i,sum,max,min,maxindex[N],minindex[N],grade,grades[N],a=1,b=1,c; double average; printf("请输入学生的数量。\n"); scanf("%d",&n); sum=0; for(i=1;i<=n;i++) { printf("请输入第%d个学生的成绩。\n",i); scanf("%d",&score[i]); sum=sum+score[i]; } average=(double)sum/n; printf("平均成绩为%.2lf\n",average); max=score[1]; min=score[1]; for(i=1;i<=n;i++) { if(score[i]==max) { maxindex[a++]=i; } else if(score[i]>max) { max=score[i]; a=1; maxindex[a++]=i; } if(score[i]==min) { minindex[b++]=i; } else if(score[i]<min) { min=score[i]; b=1; minindex[b++]=i; } } printf("成绩最高的同学有:"); for(i=1;i<a;i++) { printf("第%d名学生 ",maxindex[i]); } printf("\n"); printf("成绩最低的同学有:"); for(i=1;i<b;i++) { printf("第%d名学生 ",minindex[i]); } printf("\n"); printf("请输入你想查找的成绩。\n"); scanf("%d",&grade); c=1; for(i=1;i<=n;i++) { if(score[i]==grade) { grades[c]=i; c++; } } if(c==1) printf("你所查找的成绩不存在。\n"); else { printf("符合你所查找成绩的学生有:"); for(i=1;i<c;i++) printf("第%d名学生 ",grades[i]); printf("\n总共有%d名学生。",c-1); } return 0; }
2.现有一个有序正整数数组(从小到大排序),输入一个数,插入到数组中,要求插入后的数组仍然有序。对插入到最前、最后、中间位置三种情况进行验证。
#include<stdio.h> #define N 11 int main() { int numbers[N]={1,2,3,4,5,6,7,8,9,10},number,i,n,a=1; printf("请输入你想插入的数。\n"); scanf("%d",&number); for(i=0;i<N-1;i++) { if(number<=numbers[i]) { a=0; for(n=N-2;n>=i;n--) { numbers[n+1]=numbers[n]; } numbers[i]=number; break; } } if(a) { numbers[N-1]=number; } for(i=0;i<N;i++) { printf("%d ",numbers[i]); } return 0; }
3.用数组实现火柴棍等式
#include<stdio.h> int main() { int a,b,c,huochai[10]={6,2,5,5,4,5,6,3,7,6}; for(a=0;a<=9;a++) for(b=0;b<=9;b++) { c=a+b; if(c>9) break; if(huochai[a]+huochai[b]+huochai[c]==12) { printf("%d+%d=%d\n",a,b,c); } } return 0; }
附加题
输入一行任意长的数字,用数组元素作为计数器统计每个数字出现的次数。用下标为0的元素统计0出现的次数,用下标为1的元素统计1出现的次数…
#include<stdio.h> int main() { int numbers[10]={0},i; char number; printf("请输入一行任意长的数字。\n"); while(number!='\n') { scanf("%c",&number); numbers[number-'0']++; } for(i=0;i<10;i++) printf("%d出现了%d次。\n",i,numbers[i]); return 0; }
![](https://images2015.cnblogs.com/blog/1032124/201611/1032124-20161121204557487-723012379.png)
知识点总结:
1.数组应先定义后使用: 数据类型 数组名【常量表达式】
数组中的每一种元素属于同一数据类型,元素在内存中是连续以此排列的;
只能逐个引用数组元素,不能一次引用整个数组;
2.不允许动态定义数组,数组一但创建,便不能改变长度大小,最好使用宏定义,
即#define N 10
int a[N]
3.数组里的元素 如果不赋初值,默认是随机数,然而只要有部分赋了初值,其他部分就会默认是0。
4.当全部数组元素赋初值时,可以不定制数组长度,系统会默认给出。
5.下标是从零开始的,而非是一;如果要使用下标是1~10,应定义数组长度为11,使下标为零的数组元素被系统默认为零。
6.数组变量本身(数组名)不能被复制,它只代表一个地址。
7.C语言不会对数组下标做越界检查,所以元素数应该小于等于数组长度。
8.对数组数据的访问一定是跟循环结构分不开的,一般情况下,循环变量的值随数组元素的下标变化。
实验总结:
1.整形除整形还是整形,不要忘记强制类型转换。
2.分清数组长度和下标的区别。
3.下标不仅可以是一个常数、变量,还可以是一个表达式。
4.在有序数组中插入一个数,当选定好位置是一定不要忘记加break,否则从这个位置开始到最后一个位置,都会被插入这个数。
5.数组离不开循环,让数组里的元素全部输出必须借助循环,不可以直接输出数组名。