数据结构记录--学生管理系统

时间:2021-07-04 08:55:25
Home Web Board ProblemSet Standing Status Statistics

Problem I: 学生管理系统

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 975   Solved: 337
[ Submit][ Status][ Web Board]

Description

现有学生成绩信息文件,内容如下:
姓名    学号   语文  数学   英语     
张明明  01     67    78      82
李成友  02     78    91      88
张辉灿  03     68    82      56
王露   04     56    45      77
陈东明  05     67    38      47


试编写一管理模拟系统,要求如下:
a)首先输出三科成绩中有补考的学生输出。
b)输入一个学生学号后,能查找到此学生的信息并输出结果(采用查找方法实现)
c)要求使用结构体,链或数组等实现上述要求.
d)先按总成绩高的优先输出,总成绩相同学号小的优先输出

Input

第一行输入两个整数n,p(1 <= n <= 2000, 1 <= p <= 200000)分别表示学生的总数和查询数量。接下来n行每行输入四个数据,格式如下:
姓名(由英文字母组成,不超过20个字符),学号(由int范围内的整数),语文成绩,数学成绩,英语成绩。规定每门课程都是60分为及格线。
接下来p行每行需要输入一个整数,代表需要查询学生的学号。

Output

对于每一个询问,如果该生存在,则输出该学生的信息;如果该学生不存在,则输出“NOT FOUND”。

Sample Input

7 5Zhangyi 201501 90 90 90zhanger 201502 80 80 80zhangsan 201404 70 70 70Zhangsi 201504 60 60 60Zhangwu 201505 50 50 50wcr 1124 100 100 100loushangdashen 1234 60 60 602015012015032015051201506

Sample Output

Zhangwu 201505 50 50 50Zhangyi 201501 90 90 90NOT FOUNDZhangwu 201505 50 50 50NOT FOUNDNOT FOUND

HINT

Append Code

[ Submit][ Status][ Web Board]
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define max 2005
struct Type
{
int sno;
char name[22];
int china, math, english,sum;
};
struct Student
{
Type r[max + 1];
int length ;
};
bool cmp (Type a, Type b)
{
return a.sno<b.sno;
}
bool com (Type a, Type b)
{
if(a.sum!=b.sum)
return a.sum>b.sum;
else
return a.sno<b.sno;
}

//对全部学生的二分查找
int search(int sno,Student &s)
{
int low = 1, high = s.length ;
while (low <= high)
{
int m = (low + high) / 2;
if(sno == s.r[m].sno)
return m;
else if (sno < s.r[m].sno)
high = m - 1;
else
low = m + 1;
}
return 0;
}

int main()
{
int s_num, q_num;
// freopen("out.txt", "w", stdout);
Student s,stub; //s是全部学生的集合,stub是补考的学生的集合
s.length = 0;
stub.length = 0;
scanf("%d %d",&s_num,&q_num);
int index = 1;
for (int i = 1; i <= s_num; i++)
{
scanf("%s %d %d %d %d",s.r[i].name,&s.r[i].sno,&s.r[i].china,&s.r[i].math,&s.r[i].english);
s.r[i].sum = s.r[i].china + s.r[i].math + s.r[i].english;
s.length++;
if (s.r[i].china < 60 || s.r[i].english < 60 || s.r[i].math < 60)
{
stub.r[index++] = s.r[i];
stub.length++;
}
}
sort(stub.r+1,stub.r+stub.length+1,com);
sort(s.r+1,s.r+s.length+1,cmp);
for (int j = 1; j <= stub.length; j++)
{
printf("%s %d %d %d %d\n",stub.r[j].name,stub.r[j].sno,stub.r[j].china,stub.r[j].math,stub.r[j].english);
}
for (int i = 1; i <= q_num; i++)
{
int sno;
scanf("%d",&sno);
int m = search(sno, s);
if(m == 0)
printf("NOT FOUND\n");
else
{
printf("%s %d %d %d %d\n",s.r[m].name,s.r[m].sno,s.r[m].china,s.r[m].math,s.r[m].english);
}
}
}