第8章实验 数组
- 题目1:
学生成绩管理系统V1.0
某班有最多不超过30人(具体人数有键盘输入)参加某门课程的考试,参考例8.5、例8.9、例8.10,用一维数组做函数参数编程实现如下学生成绩管理:
- 录入每个学生的学号和考试成绩;
1、解题思路:
先定义班里最多人数30。主函数中,定义类型。以n值输出人数,然后打印学号和成绩。在读入成绩,i初始化-1,do while进行循环输入,当输入负值时结束循环,返回人数。打印学号和成绩,for循环从0到n。
2、源代码:
#include <stdio.h>
#define N 30
int ReadScore(int score[],long num[]);
void PrintScore(int score[],long num[],int n);
int main()
{
int score[N],n;
long num[N];
n = ReadScore(score,num);
printf("Total students are %d\n:",n);
PrintScore(score,num,n);
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%10ld%4d\n",num[i],score[i]);
}
}
3、程序运行效果截图
- 题目2:
(2)、计算课程的总分和平均分;
1、解题思路:
在1的基础上,Average进行原型声明。主函数中总分等于Aver*n,输出。在外层用for循环对一位数组score【i】累加求和,返回平均值。
2、源代码:
#include <stdio.h>
#define N 30
int Average(int score[],int n);
int ReadScore(int score[],long num[]);
void PrintScore(int score[],long num[],int n);
int main()
{
int score[N],aver,sum,n;
long num[N];
n = ReadScore(score,num);
aver=Average(score,n);
sum=aver*n;
printf("Total students are %d\n:",n);
PrintScore(score,num,n);
printf("Average score is %d\n",aver);
printf("Sum score is %d\n",sum);
return 0;
}
int Average(int score[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
{
sum +=score[i];
}
return sum/n;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%10ld%4d\n",num[i],score[i]);
}
}
3、程序运行效果截图:
- 题目3:
(3)、按成绩由高到低排出名次表;
1、解题思路:
在1 的基础上,对数据排序进行原型声明。在外层,两次循环,第一个循环得到第一个成绩,第二次循环,对第一个成绩和后面的所有成绩进行比较,若之后成绩大于第一个,则进行交换(temp)学号和成绩,得到第一个对大数,依次循环,得出第二个的最大数,打印。
2、源代码:
#include <stdio.h>
#define N 30
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
void PrintScore(int score[],long num[],int n);
int main()
{
int score[N],n;
long num[N];
n = ReadScore(score,num);
printf("Total students are %d:\n",n);
DataSort(score,num,n);
printf("Sorted score:\n");
PrintScore(score,num,n);
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void DataSort(int score[],long num[],int n)
{
int i,j,temp1,temp2;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(score[j]>score[i])
{
temp1=score[j];
temp2=num[j];
score[j]=score[i];
num[j]=num[i];
score[i]=temp1;
num[i]=temp2;
}
}
}
}
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%10ld%4d\n",num[i],score[i]);
}
printf("\n");
}
3、程序运行效果截图:
四、题目4:
(4)、按学号有小到大排出成绩表;
1、解题思路:
类似第三问,在条件if中,将score【i】的比较改为num【i】的比较,打印。
2、源代码:
#include <stdio.h>
#define N 30
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
void PrintScore(int score[],long num[],int n);
int main()
{
int score[N],n;
long num[N];
n = ReadScore(score,num);
printf("Total students are %d:\n",n);
DataSort(score,num,n);
printf("Sorted score:\n");
PrintScore(score,num,n);
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void DataSort(int score[],long num[],int n)
{
int i,j,temp1,temp2;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(num[j]<num[i])
{
temp1=num[j];
temp2=score[j];
num[j]=num[i];
score[j]=score[i];
num[i]=temp1;
score[i]=temp2;
}
}
}
}
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%10ld%4d\n",num[i],score[i]);
}
printf("\n");
}
3、程序运行效果截图:
五、题目5:
(5)、按学号查询学生排名及其考试成绩;
1、解题思路:
在成绩排名之后,主函数调用。函数原型声明查找,外层循环直到输入的学号找到,返回i,名次为pos+1,因为i从0开始。
2、源代码:
#include <stdio.h>
#define N 30
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
int LinSearch(long num[],long x,int n);
int main()
{
int score[N],n,pos;
long num[N],x;
n = ReadScore(score,num);
printf("Total students are %d:\n",n);
DataSort(score,num,n);
printf("Input the searching ID:");
scanf("%ld",&x);
pos=LinSearch(num,x,n);
if(pos!=-1)
printf("The score is %d and list is %d",score[pos],pos+1);
else
printf("Not Found!\n");
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void DataSort(int score[],long num[],int n)
{
int i,j,temp1,temp2;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(score[j]>score[i])
{
temp1=score[j];
temp2=num[j];
score[j]=score[i];
num[j]=num[i];
score[i]=temp1;
num[i]=temp2;
}
}
}
}
int LinSearch(long num[],long x,int n)
{
int i;
for(i=0;i<n;i++)
{
if(num[i]==x)
{
return i;
}
}
return -1;
}
3、程序运行效果截图:
六、题目6:
(6)、按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
1、解题思路:
在外层打印学号和成绩,for循环打印时if条件进行判断,符合条件的成绩计数,求百分比,打印。
2、源代码:
#include <stdio.h>
#define N 30
int ReadScore(int score[],long num[]);
void PrintScore(int score[],long num[],int n);
int main()
{
int score[N],n;
long num[N];
n = ReadScore(score,num);
printf("Total students are %d:\n",n);
PrintScore(score,num,n);
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do
{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i]>0&&score[i]>=0);
return i;
}
void PrintScore(int score[],long num[],int n)
{
int i,a=0,b=0,c=0,d=0,h=0;
float m,p,x,y,z;
for(i=0;i<n;i++)
{
if(score[i]>=90)
{
a++;
m=((float)a / n) * 100;
}
else if(score[i]>=80)
{
b++;
p=((float)b / n) * 100;
}
else if(score[i]>=70)
{
c++;
x=((float)c / n) * 100;
}
else if(score[i]>=60)
{
d++;
y=((float)d / n) * 100;
}
else
{
h++;
z=((float)h / n) * 100;
}
}
printf("Excellent students %d and percent %f%%. Good students %d and percent %f%%. Mid students %d and percent %f%%.Pass students %d and percent %f%%. Fail students %d and percent %f%%\n",a,m,b,p,c,x,d,y,h,z);
}
3、程序运行效果截图:
七、MOOC网
课程测试结果: