第6关:创建一维动态数组,顺序存放输入的一批学生数据,然后输出这批学生中分数最高的学生信息
300
- 任务要求
- 参考答案
- 评论3
任务描述
本关任务:创建动态数组,顺序存放输入的一批学生数据,然后输出这批学生中分数最高的学生信息。要求定义函数分别完成动态数组的创建,学生数据输入输出和查找。
相关知识
定义函数分别完成动态数组的创建,关键是怎么将在函数体里申请数组的首地址和数组的长度带到函数体外。 定义学生数据类型及输入输出函数如下:
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
int num;
char name[20];
char sex;
DATE birthday;
float score;
}STUDENT;
void input(STUDENT *s)
{
//printf("请输入学生学号:");
scanf("%d",&(s->num));
//printf("请输入学生姓名:");
scanf("%s", s->name);
//printf("请输入学生性别:");
scanf(" %c",&( (*s) . sex));
//printf("请输入学生出生日期:");
scanf("%d%d%d",&s->birthday.year, &s->birthday.month, &s-> birthday.day);
//printf("请输入学生成绩:");
scanf("%f",&(s-> score));
}
void output(STUDENT s)
{
printf("学号:%d\t姓名:%s\t性别:%c\t", s.num,s.name,s.sex);
printf("出生日期:%d-%d-%d \t", s.birthday.year,s.birthday.month, s.birthday.day);
printf("成绩:%.1f\n", s.score);
}
动态数组的输入输出处理都可以模块化,我们希望定义函数创建动态数组,关键是怎么将在函数体里申请的数组的首地址和数组的长度带到函数体外。 定义创建动态数组的函数如下:
void createarr(STUDENT **s,int *n)
{
scanf("%d",n);
*s=( STUDENT *) malloc( (*n) * sizeof (STUDENT) );
if( *s == NULL)
{
printf("不能成功分配存储空间。\n");
exit(1);
}
}
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,创建动态数组,顺序存放输入的一批学生数据,然后输出这批学生中分数最高的学生信息。具体要求如下:
- 定义函数 input(),从后台获取数据,实现单个学生信息的输入;
- 定义函数 inputarr(),调用函数 input(),实现所有学生信息的输入;
- 定义函数 maxscore(),找出这批学生中分数最高的学生,并返回位置结果;
- 定义函数 output(),根据测试说明的预期输出格式输出二维数组;
- 定义函数 outputarr(),调用函数 output(),输出所有学生的信息;
- 定义函数 createarr(),创建动态数组。
测试说明
平台会对你编写的代码进行测试。
测试输入: 5
10010
Liyi
M
2000 5 23
45
10020
Lier
M
2001 2 3
62.5
10030
Lisan
F
2000 10 14
92.5
10040
Lisi
F
2002 7 23
87
10050
Liwu
M
1999 8 6
78
输入说明: 第一行为输入学生的个数; 第一行后面的数据为学生的具体信息。
预期输出: 本班共5个学生学生信息:
学号:10010 姓名:Liyi 性别:M 出生日期:2000-5-23 成绩:45.0
学号:10020 姓名:Lier 性别:M 出生日期:2001-2-3 成绩:62.5
学号:10030 姓名:Lisan 性别:F 出生日期:2000-10-14 成绩:92.5
学号:10040 姓名:Lisi 性别:F 出生日期:2002-7-23 成绩:87.0
学号:10050 姓名:Liwu 性别:M 出生日期:1999-8-6 成绩:78.0
本班5个学生中的分数最高的学生是第3个学生:
学号:10030 姓名:Lisan 性别:F 出生日期:2000-10-14 成绩:92.5
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
int num;
char name[20];
char sex;
DATE birthday;
float score;
}STUDENT;
void input(STUDENT *s);
void output(STUDENT s);
void createarr(STUDENT **s,int *n);
void inputarr(STUDENT *s, int n);
int maxscore(STUDENT *s, int n);
void outputarr(STUDENT *s, int n);
int main()
{
int i,max,n;
STUDENT *ps;
createarr(&ps,&n);
inputarr (ps,n);
printf("本班共%d个学生学生信息:\n",n);
outputarr (ps,n);
max= maxscore(ps, n);
printf("本班%d个学生中的分数最高的学生是第%d个学生:\n",n,max+1);
output(ps[max]);
printf("\n");
free(ps);
}
/********** Begin **********/
void input(STUDENT *s)
{
scanf("%d",&(s->num));
scanf("%s",s->name);
scanf(" %c",&((*s).sex));
scanf("%d%d%d",&s->birthday.year,&s->birthday.month,&s->birthday.day);
scanf("%f",&(s->score));
}
void output(STUDENT s)
{
printf("学号:%d\t姓名:%s\t性别:%c\t出生日期:%d-%d-%d \t成绩:%.1f\n",s.num,s.name,s.sex,s.birthday.year,s.birthday.month,s.birthday.day,s.score);
}
void inputarr(STUDENT s[ ], int n)
{
for(int i=0;i<n;i++)
{
input(s+i);
}
}
void outputarr(STUDENT s[],int n)
{
for(int i=0;i<n;i++)
{
output(*(s+i));
}
}
void createarr(STUDENT **s,int *n)
{
scanf("%d",n);
*s=(STUDENT*)malloc((*n)*sizeof(STUDENT));
if(*s==NULL)
{
printf("error");
exit(1);
}
}
int maxscore(STUDENT *s, int n)
{
int max=0;
for(int i=0;i<n;i++)
{
if(s[max].score<s[i].score)
max=i;
}
return max;
}
/********** End **********/