1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)
#include <stdio.h> #define N 100 void Score(int score[],int n); //输入成绩 double average(int score[],int n); //平均值 int FindMax(int score[],int n); //最大值 int FindMin(int score[],int n); //最小值 int FindMaxIndex(int score[],int n,int max); //最大值下标 int FindMinIndex(int score[],int n,int min); //最小值下标 int Search(int score[],int n,int x); //查找函数 void bubblesort(int score[],int n); //排序函数 void printscore(int score[],int n); //输出函数 int main() { int score[N]={0},i,n,x,index1,max,min; double ave; printf("请输入人数 "); scanf("%d",&n); Score(score,n); ave=average(score,n); printf("average=%.2f ",ave); max=FindMax(score,n); min=FindMin(score,n); printf("最高分为%d 最低分为%d ",max,min); FindMaxIndex(score,n,max); FindMinIndex(score,n,min); index1=Search(score,n,x); printf("您查找的是第%d个学生 ",index1); bubblesort(score,n); printf("排序后的数: "); printscore(score,n); return 0; } double average(int score[],int n) { int sum=0,i; for(i=0;i<n;i++) { sum=sum+score[i]; } return (double)sum/n; } void Score(int score[],int n) { int i; printf("请输入成绩 "); for(i=0;i<n;i++) { scanf("%d",&score[i]); } } int FindMax(int score[],int n) { int i,a; a=score[0]; for(i=0;i<n;i++) { if(score[i]>a) { a=score[i]; } } return a; } int FindMin(int score[],int n) { int i,a; a=score[0]; for(i=0;i<n;i++) { if(score[i]<a) { a=score[i]; } } return a; } void printscore(int score[],int n) { int i; for(i=0;i<n;i++) { printf("%5d",score[i]); } printf(" "); } int FindMaxIndex(int score[],int n,int max) { int i,count=0; for(i=0;i<n;i++) { if(score[i]==max) { count=i+1; printf("最高分的有第%d个人 ",count); } } } int FindMinIndex(int score[],int n,int min) { int i,count=0; for(i=0;i<n;i++) { if(score[i]==min) { count=i+1; printf("最低分的有第%d个人 ",count); } } } int Search(int score[],int n,int x) { int i; printf("请输入要查询的成绩 "); scanf("%d",&x); for(i=0;i<n;i++) { if(score[i]==x) { return i+1; } } return -1; } void bubblesort(int score[],int n) { int i,j,t,flag; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { flag=0; if(score[j]>score[j+1]) { t=score[j]; score[j]=score[j+1]; score[j+1]=t; flag=1; } } if(flag==0) { break; } } }
2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。
#include <stdio.h> #define N 100 int main() { int num[100]={0},i,j=0,m=0,n=0,a=0,b=0; for(i=0;i<N;i++) { num[i]=j+1; j++; } for(i=0;i<N;i++) { m=num[i]%3; n=num[i]%7; if(m==0||n==0) { num[i]=0; } } for(i=0;i<N;i++) { if(num[i]==0) { continue; } else { printf("% 04d",num[i]); a++; b++; } if(a%10==0) { printf(" "); } } printf("一共输出了%d个数",b); return 0; }
附加题
1.将数组a中的10个元素后移m位,移出的m位顺序存放在数组的 前m位。要求:(1)数组值在程序中初始化(2)m从键盘输入。
#include <stdio.h> #include <stdlib.h> #define N 100 int main() { int a,b,i,j=0,k; int num[N]={0}; printf("请输入数组个数 "); scanf("%d",&a); printf("请输入你要移动的位数 "); scanf("%d",&b); if(b>a) { printf("error "); exit(0); } for(i=0;i<a;i++) { num[i]=j+1; j++; } for(j=1;j<=b;j++) { k=num[a-1]; for(i=a-1;i>0;i--) { num[i]=num[i-1]; } num[0]=k; } for(i=0;i<a;i++) { printf("% 02d",num[i]); } return 0; }
实验总结:
1 void无返回值,直接调用就行!
2 % d用来对齐!
3 先利用排序函数排序再用输出函数进行输出!
知识点总结:
1 冒泡排序法的思路是:把相邻两个数进行比较,把小的调到前头!
2 函数中定义的变量只在本函数范围内起作用,在其他函数中不能使用!
3 简单变量做函数,实现的是值的单向传递!数组作函数参数,是将实参数组的地址传给形参数组,占用的是相同的内存空间!
三 程序分析
程序1
#include <stdio.h> void swap(int x[]); int main() { int a[2]={1,2}; swap(a); printf("a[0]=%d a[1]=%d ",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 a[1]=%d ",a[0],a[1]); return 0; } void swap(int x,int y) { int z; z=x; x=y; y=z; }
两者结果相反。
原因是因为简单变量做函数,实现的是值的单向传递!数组作函数参数,是将实参数组的地址传给形参数组!第一个用的是数组做函数,第二个程序是用简单变量做函数!