第一道用结构体解决的问题

【Description】

[C - 排名]

今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。

[input]

测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。

[output]

对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。

[sample input]

4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
0

[sample output]

3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20

Hint

Huge input, scanf is recommended.

【源代码】

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
struct Node

{  

    char name[25];
    int score;
}node[1005];
bool cmp(Node a,Node b)
{
    if(a.score!=b.score)
        return a.score>b.score;
    else
        return strcmp(a.name,b.name)>0?0:1;

}
int main()
{
   int a,b,c,k,x,s[10000];
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)/*a为考试人数,b为考题数,c为分数线*/
    {
        if(a==0)
            break;
        else
        {
            int i,sum=0;
            for(i=0; i<b; i++)
            {
                scanf("%d",&s[i]);/*输入每题分数*/
            }
            for(i=0; i<a; i++)
            {
                scanf("%s",&node[i].name);/*输入学号*/
                scanf("%d",&k);/*输入答对题数*/
                node[i].score=0;
                while(k--)
                {
                    scanf("%d",&x);/*输入答对题号*/
                    node[i].score=node[i].score+s[x-1];
                }
            }
            sort(node,node+a,cmp);
            for(i=0; i<a; i++)
            {
                if(node[i].score>=c)
                    sum++;
            }
            printf("%d\n",sum);
            for(i=0; i<sum; i++)
            {
                printf("%s %d\n",node[i].name,node[i].score);
            }
        }

    }

    return 0;
}

(此题在解决过程中有请教某中大学长,并参考了另一个博主的博客[忘了是谁......])

这题我一开始没用结构体,用了n多个for循环实现输入,但是最后把自己都弄晕了......(此时我也不知道哪里是输入什么量了...)第二天学长简单讲了一下结构体,

这里贴上结构体的基本模板

struct 结构体名称(如node)

{

     成员变量

}数组/变量(如node[1000])

【有一个指标时】

bool cmp(node a, node b)

{

     return a.score>b.score;

}

【有两个/多个指标时】

bool cmp(node a, node b)

{

     if(   )

          return ....

    else if(   )

          return...

    else

          return....

}

按照这个思路,定义结构体名为Node,在Node这个结构体里含有学生姓名数组(用来存放学生姓名)、学生成绩整型数字两个参量。关于排序那里的else return strcmp(a.name,b.name)>0?0:1;当两个人成绩相同时,如果a.name>b.name,则返回值为0,返回假(不符合),此时通过cmp排序使前者小于后者输出(因为题目要求成绩相同时,按学号从小到大输出),如果a.name<b.name,则返回值为1,返回真(已经符合了,就不用进行cmp排序了)。

后面的代码就是正常思路输入输出了。

注意输入结构体里面的成员变量时:scanf("%d",&node[i].name);【&结构体名称[成员变量的下标,即类似数组下标].成员变量【如score,name等】】

输出结构体里面的成员变量时:scanf("%d",&node[i].name);【&结构体名称[成员变量的下标,即类似数组下标].成员变量【如score,name等】】

(其实输入输出基本是一样的)

噢还有头文件要记得:

#include<algorithm>
#include<iostream>

using namespace std;

如果是用scanf与printf输入输出时还要加上C的#include<stdio.h>和#include<string.h>

End.

 

原文地址:https://www.cnblogs.com/programming123/p/10459755.html