第九次
1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)
#include<stdio.h> #define N 1000 int readScore(int score[]); double average(int score[],int i); int findMax(int score[],int i); int findMin(int score[],int i); int findMaxIndex(int score[],int i); int findMinIndex(int score[],int i); int search(int score[],int i); void bubbleSort(int score[],int i); void printfScore(int score[],int i); int main() { int max,min,score[N]={0},a,b,c,i,x,m,n; double ave; readScore(score); ave=average(score,i); printf("平均分为%.2f\n",ave); max=findMax(score,i); min=findMin(score,i); printf("最高分为%d,最低分为%d",max,min); a=findMaxIndex(score,i); b=findMinIndex(score,i); printf("最高分是第%d个学生,最低分是第%d个学生\n",a,b); c=search(score,i); printf("这是第%d个学生\n",c+1); bubbleSort(score,n); printfScore(score,i); return 0; } int readScore(int score[]) { int i=0; printf("请输入成绩\n"); while(1) { scanf("%d",&score[i]); if(score[i]<0) { break; } i++; } return i; } double average(int score[],int i) { i=0; int sum=0; while(score[i]>=0) { sum=sum+score[i]; i++; } return (double)sum/i; } int findMax(int score[],int i) { i=0; int max; max=score[0]; while(score[i]>=0) { if(score[i]>max) { max=score[i]; } i++; } return max; } int findMin(int score[],int i) { i=0; int min; min=score[0]; while(score[i]>=0) { if(score[i]<min) { min=score[i]; } i++; } return min; } int findMaxIndex(int score[],int i) { i=0; int maxIndex; maxIndex=0; while(score[i]>=0) { if(score[i]==findMax(score,i)) { maxIndex=i+1; } i++; } return maxIndex; } int findMinIndex(int score[],int i) { i=0; int minIndex; minIndex=0; while(score[i]>=0) { if(score[i]==findMin(score,i)) { minIndex=i+1; } i++; } return minIndex; } int search(int score[],int i) { int x; printf("请输入学生成绩\n"); scanf("%d",&x); i=0; while(score[i]>=0) { if(score[i]==x) { return i; } i++; } return -1; } void bubbleSort(int score[],int n) { int i,j,t,flag; i=0; while(1) { if(score[i]<0) { break; } i++; } n=i; for(i=0;i<n-1;i++) { flag=0; for(j=0;j<n-1-i;j++) { if(score[j+1]>score[j]) { t=score[j]; score[j]=score[j+1]; score[j+1]=t; flag=1; } } if(flag==0) { break; } } } void printfScore(int score[],int i) { i=0; while(score[i]>=0) { printf("%5d",score[i]); i++; } printf("\n"); }
2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。
#include<stdio.h> #define N 100 int main() { int i,num[N],x=1,a=0; for(i=0;i<N;i++) { num[i]=x; x++; } for(i=0;i<N;i++) { if(num[i]%3==0||num[i]%7==0) { num[i]=0; } } for(i=0;i<N;i++) { if(num[i]!=0) { printf("%4d",num[i]); a++; if(a%10==0) { printf("\n"); } } } printf("数组中剩余%d个数\n",a); return 0; }
实验总结
1.定义数组和在数组中移动变量时要注意数组的越界问题
2.定义函数时,有返回值的用int型,无返回值的用void
3.冒泡排序法是将两个相邻的数比较小的排到前面
4.函数只能有一个返回值
程序分析
程序1
#include <stdio.h> void swap(int x[]); int main() { int a[2]={1,2}; swap(a); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); return 0; } void swap(int x[]) { int z; z=x[0]; x[0]=x[1]; x[1]=z; }
程序2
#include <stdio.h> void swap(int x,int y); int main() { int a[2]={1,2}; swap(a[0],a[1]); printf("a[0]=%d\na[1]=%d\n",a[0],a[1]); return 0; } void swap(int x,int y) { int z; z=x; x=y; y=z; }
程序一的a[0和a[1]的值交换了,程序二没有改变。原因是简单变量做参数,实现的是值的单向传递,不会影响实参的值,数组做函数参数,是将实参数组的地址传给形参数组。