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

HomeWeb BoardProblemSetStandingStatusStatistics

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);
        }
    }
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值