zoukankan      html  css  js  c++  java
  • 第一道用结构体解决的问题

    【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.

     

  • 相关阅读:
    react setstate
    【css】长文本左侧显示省略号
    react 获取input标签的输入值
    【react 分页器】 基于react-virtualized组件的分页器
    type为number的<input>标签 type和size属性失效
    js 获取Array数组 最大值 最小值
    ubuntu 编辑pdf
    【react redux && flux】
    远程唤醒、WOL、Magic_Packet
    win10无法访问局域网共享文件?(因微软账户和本地账户登陆问题导致)
  • 原文地址:https://www.cnblogs.com/programming123/p/10459755.html
Copyright © 2011-2022 走看看