一、实验内容
1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)
#include<stdio.h>
#define N 100
void readscore(int score[],int n);//输入函数,不用返回值。
double average(int score[],int n);//求平均值
int findmax(int score[],int n);//找最大值
int findmin(int score[],int n);//找最小值
int maxindex(int score[],int n);//最大值下标
int minindex(int score[],int n);//最小值下标
int searchscore(int num[],int n,int grade);//查询
void bubblescort(int score[],int n);//升序
void printscore(int score[],int n);//输出函数
int main()
{
int score[N]={0},num[N]={0},n,max,max1,min,min1,grade,count;
double ave;
printf("input the number:\n");
scanf("%d",&n);
readscore(score,n);
ave=average(score,n);
printf("平均成绩为%.2f\n",ave);
max=findmax(score,n);
printf("最大值为%d\n",max);
min=findmin(score,n);
printf("最小值为%d\n",min);
max1=maxindex(score,n);
printf("最大值下标为%d\n",max1);
min1=minindex(score,n);
printf("最大值下标为%d\n",min1);
printf("请输入一个学生的成绩:\n");
scanf("%d",&grade);
count=searchscore(num,n,grade);
printf("该学生成绩的下标为%d\n",count);
bubblescort(score,n);
printscore(score,n);
return 0;
}
void readscore(int score[],int n)
{
int i;
printf("input the score:\n");
for(i=0;i<n;i++)
{
scanf("%d",&score[i]);
}
}
double average(int score[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
{
sum+=score[i];//求和
}
return (double)sum/n;//求平均数
}
int findmax(int score[],int n)
{
int i,a=score[0];
for(i=1;i<n;i++)
{
if(score[i]>a)
{
a=score[i];
}
return a;
}
}
int findmin(int score[],int n)
{
int i,b=score[0];
for(i=1;i<n;i++)
{
if(score[i]<b)
{
b=score[i];
}
return b;
}
}
int maxindex(int score[],int n)
{
int i,maxindex=0;
for(i=1;i<n;i++)
{
if(score[i]>score[maxindex])
{
maxindex=i;
}
return maxindex;
}
}
int minindex(int score[],int n)
{
int i,minindex=0;
for(i=1;i<n;i++)
{
if(score[i]<score[minindex])
{
minindex=i;
}
return minindex;
}
}
int searchscore(int num[],int n,int grade)
{
int i;
printf("请输入你要查询的成绩:\n");
scanf("%d",&grade);
for(i=0;i<n;i++)
{
if(num[i]==grade)
{
return i;
}
return -i;
}
}
void bubblescort(int score[],int n)
{
int i,j,t,flag;
for(i=0;i<n;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;
}
}
}
void printscore(int score[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%3d",score[i]);
}
printf("\n");
}

2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。
#include<stdio.h>
#define N 100
int main()
{
int i,j=0,n=0;//i为变量,n是剩余数个数
int digit[N];
for(i=0;i<N;i++)
{
j++;
digit[i]=j;
if(digit[i]%3==0||digit[i]%7==0)
{
digit[i]=0;
}
}
for(i=0;i<N;i++)
{
if(digit[i]!=0)
{
printf("%4d",digit[i]);
n++;
}
}
printf("共有%d位\n",n);
return 0;
}

二、实验总结(实验中遇到的问题及解决方法)
1.数组函数引用,头文件与主函数与被调用函数一一对应。
2.做第一道题时遇到的困难是头文件和被调用函数都能编译出来 ,主函数不会写。思维比较乱,让别人讲了之后,尝试写一个头文件,然后写主函数,需要输入什么,输出什么,声明什么,都应注意,接着写被调用函数。这样一个一个的写,就不会不清楚了。还要注意什么函数不用最后输出,以致优化函数。最后出现的小错误是丢大括号,强调大括号的用法。
3.数组函数是与循环分不开的。
4.第二道题定义长度为100的整型数组,首先循环数字,如果循环到的数字能与3取余或能与7取余,就结束,若不能再进行一次循环,输出剩余的数字。
学习内容里,老师就重点学习怎样向函数传递数组,对函数和数组的理解和运用,对火柴棍问题三个程序进行优化。利用穷举,重复的函数归结在一起,应用主调用函数和被调用函数,然后学习了数组函数,用循环更简化编程。
三、程序分析
输出结果不同,第一个用的是数组做函数,实现的是定义的数组在其他函数中也可以被调用;第二个程序使用简单变量做函数,实现的是值只能单向传递使用。
程序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;
}
原文:http://www.cnblogs.com/mlj527/p/6130916.html