1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)
#include <stdio.h> #define N 100 void rscore(int score[],int n); //输入成绩 double average(int score[],int n); //平均值 int max(int score[],int n); //最大值 int maxi(int score[],int n,int index[]); //最大值下标 int min(int score[],int n); //最小值 int mini(int score[],int n,int index[]); //最小值下标 void search(int score[],int n); //查询 void bubblesort(int score[],int n); //排序 void printf(int score[],int n); //输出 int main() { int score[N]={0},n,i,x,fmax,fmaxi,fmin,fmini,index[N]={0}; double ave; printf("请输入人数和成绩 "); scanf("%d",&n); rscore(score,n); ave=average(score,n); printf("这%d个人的平均成绩为%.2f ",n,ave); fmax=max(score,n); printf("最大值为%d ",fmax); fmaxi=maxi(score,n,index); for(i=0;i<fmaxi;i++) { x=index[i]; printf("是%d号 ",x+1); } printf(" "); fmin=min(score,n); printf("最小值为%d ",fmin); fmini=mini(score,n,index); for(i=0;i<fmini;i++) { x=index[i]; printf("是%d号 ",x+1); } printf(" "); search(score,n); bubblesort(score,n); printf(score,n); return 0; } void rscore(int score[],int n) { int i; for(i=0;i<n;i++) { scanf("%d",&score[i]); } } double average(int score[],int n) { int sum=0,i; for(i=0;i<n;i++) { sum=sum+score[i]; } return (double)sum/i; } int max(int score[],int n) { int i,max=score[0]; for(i=1;i<=n;i++) { if(max<=score[i]) { max=score[i]; } } return max; } int maxi(int score[],int n,int index[]) { int i,fmax,num=0; fmax=max(score,n); for(i=0;i<n;i++) { if(score[i]==fmax) { index[num++]=i; } } return num; } int min(int score[],int n) { int i,min=score[0]; for(i=0;i<n;i++) { if(min>=score[i]) { min=score[i]; } } return min; } int mini(int score[],int n,int index[]) { int i,fmin,num=0; fmin=min(score,n); for(i=0;i<n;i++) { if(score[i]==fmin) { index[num++]=i; } } return num; } void search(int score[],int n) { int i,x,flag=0; printf("请输入需要查的数: "); scanf("%d",&x); for(i=0;i<n;i++) { if(score[i]==x) { printf("是第%d人 ",i+1); flag=1; } } if(flag==0) { printf("输入错误 "); } } void bubblesort(int score[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-1;j++) { if(score[j]>score[j+1]) { t=score[j]; score[j]=score[j+1]; score[j+1]=t; } } } } void printf(int score[],int n) { int i; for(i=0;i<n;i++) { printf("%5d",score[i]); } }
2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。
#include <stdio.h> #define N 100 int main() { int num[N]={0},i,a,b=0; for(i=0;i<N;i++) { num[i]=i+1; if(num[i]%3==0||num[i]%7==0) { num[i]=0; } if(num[i]!=0) { printf("%3d ",num[i]); b++; if(b%10==0) { printf(" "); } } } printf("共%d个数字 ",b); return 0; }
附加题
1.将数组a中的10个元素后移m位,移出的m位顺序存放在数组的 前m位。要求:(1)数组值在程序中初始化(2)m从键盘输入。
#include<stdio.h> #define N 10 int main() { int num[N]={0,1,2,3,4,5,6,7,8,9},i,a,b,c; printf("请输入一个个位数: "); scanf("%d",&a); if(a>9||a<0) { printf("输入错误 "); } for(i=0;i<a;i++) { c=num[N-1]; for(b=N-2;b>=0;b--) { num[b+1]=num[b]; } num[0]=c; } for(i=0;i<N;i++) { printf("%d ",num[i]); } return 0; }
2. 数字加密:输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。(使用数组)
#include<stdio.h> int main() { int num[4]={0},a,i,temp1,temp2; printf("请输入一个4位数: "); scanf("%d",&a); for(i=3;i>=0;i--) { num[i]=(a%10+9)%10; a=a/10; } temp1=num[0]; num[0]=num[2]; num[2]=temp1; temp2=num[1]; num[1]=num[3]; num[3]=temp2; for(i=0;i<4;i++) { printf("%d",num[i]); } return 0; }
二、实验总结
1.要学会数组和函数的相互应用,当你不知道数组里要存些啥数的时候,一般都是让里边的数是0,然后在程序中输数;
2.第二题说的是将数组中是3、7的倍数的数删除,不能只是选择性的输出,可以将关于3、7倍数的让他是个别的数比如0,在最后输出时可以让不是0的输出;
3.附加1这个题和之前做的插序的那个差不多,只是这个是定义的数满了,为了让这些输可以向后移动 可以考虑先拿出来一个数 然后剩下的数就跟之前插序的那个题一样了;
4.附加2一定要搞清楚是谁和谁换了,数组下标是从0开始,可不要写成a[1]···a[4],这可就不对了。
三、程序分析
程序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; }
这是两个程序运行结果的截图,显然一个互换了 另一个没有
第一个实参的地址给了形参,所以形参变了,实参也变,所以输出交换
第二个只是把实参的值给形参,就算形参变,实参也不会变,所以输出是不变的