1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)
#include<stdio.h> #define N 100 void putin(int score[],int n);//输入函数 double average(int score[],int n);//平均值函数 int maxindex(int score[],int n,int max[]);//最大值下标函数 int minindex(int score[],int n,int min[]);//最小值下标函数 int findindex(int a,int score[],int n,int find[]);//查找函数 void paixu(int score[],int n);//排序函数 void putout(int score[],int n);//输出函数 int main() { int i,score[N]={0},n,max[N]={0},min[N]={0},f,find[N]={0}; printf("请输入学生的人数:"); scanf("%d",&n); putin(score,n); printf("平均分为%.2lf ",average(score,n)); //double类型,输出是%lf若是%d会输出零 printf("成绩最高的学生是:"); i=maxindex(score,n,max); putout(max,i); printf("成绩最低的学生是:"); i=minindex(score,n,min); //应该先使用自定义函数,把返回值给一个变量,如果在putout函数里直接使用,因为前面是先输出的原除赋值数组,后用的自定义函数,数组没有被再赋值。 putout(min,i); printf("请输入你想查找的成绩:"); scanf("%d",&f); if(findindex(f,score,n,find)) { i=findindex(f,score,n,find); printf("这个成绩的学生是: "); putout(find,i); } else { printf("你查找的成绩不存在。 "); } printf("将成绩由小到大排列: "); paixu(score,n); putout(score,n); return 0; } void putin(int score[],int n) { int i; for(i=0;i<n;i++) { printf("请输入第%d个学生的成绩: ",i+1); scanf("%d",&score[i]); } } double average(int score[],int n) { int i,sum=0; for(i=0;i<n;i++) { sum=sum+score[i]; } return (double)sum/n; } int maxindex(int score[],int n,int max[]) { int i,Max,index=0; Max=score[0]; for(i=0;i<n;i++) { if(score[i]==Max) { max[index++]=i; } else if(score[i]>Max) { Max=score[i]; index=0; max[index++]=i; } } return index; } int minindex(int score[],int n,int min[]) { int i,Min,index=0; Min=score[0]; for(i=0;i<n;i++) { if(score[i]==Min) { min[index++]=i; } else if(score[i]<Min) { Min=score[i]; index=0; min[index++]=i; } } return index; } int findindex(int a,int score[],int n,int find[]) { int i,index=0,flag=0; for(i=0;i<n;i++) { if(a==score[i]) { find[index++]=i; flag=1; } } if(flag==0) return 0; else return index; } void paixu(int score[],int n) { int i,j,temp,flag; for(i=0;i<n-1;i++) { flag=0; for(j=0;j<n-1-i;j++) { if(score[j]>score[j+1]) { temp=score[j]; score[j]=score[j+1]; score[j+1]=temp; flag=1; } } if(flag==0) break; } } void putout(int score[],int n) { int i; for(i=0;i<n;i++) { printf("%d ",score[i]); } }
2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。
#include<stdio.h> #define N 100 int main() { int i,nums[N]={0},a=0; for(i=0;i<N;i++) { nums[i]=i+1; } for(i=0;i<N;i++) { if(nums[i]%3==0||nums[i]%7==0) { nums[i]=0; } else { a++; printf("%5d ",nums[i]);
if(a%10==0)
printf("
");
} } printf("剩余%d个",a); return 0; }
附加题
1.将数组a中的10个元素后移m位,移出的m位顺序存放在数组的 前m位。要求:(1)数组值在程序中初始化(2)m从键盘输入。
#include<stdio.h> #define N 10 int main() { int i,nums[N]={0},m,temp,temp1,j; for(i=0;i<N;i++) { nums[i]=i; } for(i=0;i<N;i++) { printf("%3d",nums[i]); } printf(" 请输入后移的位数: "); scanf("%d",&m); for(i=0;i<m;i++) { temp=nums[N-1]; for(j=N-2;j>=0;j--) { nums[j+1]=nums[j]; } nums[0]=temp; } for(i=0;i<N;i++) { printf("%3d",nums[i]); } return 0; }
2. 数字加密:输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。(使用数组)
#include<stdio.h> #define N 4 int main() { int num,temp,i,j,nums[N]={0}; printf("请输入一个四位数。 "); scanf("%d",&num); while(num<1000||num>9999) { printf("输入错误,请重新输入: "); scanf("%d",&num); } for(i=3;i>=0;i--) { nums[i]=(num%10+9)%10; num=num/10; } temp=nums[3]; nums[3]=nums[1]; nums[1]=temp; temp=nums[2]; nums[2]=nums[0]; nums[0]=temp; for(i=0;i<N;i++) printf("%d",nums[i]); return 0; }
实验总结:1.double类型,输出是%lf若是%d会输出零;
2.应该先使用自定义函数,把返回值给一个变量,如果在putout函数里直接使用,
因为前面是先输出的原除赋值数组,后用的自定义函数,数组没有被再赋值;
3.实参是数组名,不加中括号;
4.后移应该先将最后一个数组元素提出来出来,让其一个一个移动,直到将第一个位置空出来,
再把最后一个元素放到第一个位置,要求后移几位,外层循环就执行几次;
5.冒泡排序法,外层循环比较n-1趟,内层比较n-1-i次;
三、程序分析
程序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; }
分析原因:swap函数里的实参是数组名,是将数组的首元素地址传给了形参,
形参是和实参公用同一储存空间,自定义函数里数组的改变会就是实际数组的改变。
程序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; }
分析原因:swap函数将实参的值复制一份给了形参,形参的改变不会影响到实参的改变,
所以最后输出的结果,实参没有发生变化。