[c语言]统计各专业参加活动人数

本文介绍了如何使用C语言编写程序,通过输入的学号统计各学院参与学生数,并按数量排名。特别关注了对特殊情况的处理,如未知学院的分类和不足3个学院的输出规则。
摘要由CSDN通过智能技术生成

一下代码仅个人自己写的代码,不一定正确仅作参考

学校共设有多个学院,具体学院代码和名称存放在字典中。现学校举办一次全校性大型公益活动,需要统计各学院参与本科学生数,并列出参与人数排前3的学院与参与人数。学院代码与学院名称存放于字典中:输入参与学生的学号(12位,其中第5-8位为学院代码),统计各学院的参与人数,并输出人数最多的前3个学院名称及人数。

若学号对应的学院不在字典中,则均统计为“其他”,如果参与学院不足3个,则按实际学院数输出。请将以下字典直接复制到程序中。题目保证输入的学号均为12位数字。

dict1={'0550':'机械工程学院', '0556':'计算机学院',

'0557':'自动化与电子信息学院', '0560':'化学学院',

'0565':'化工学院', '0572':'材料科学与工程学院',

'0582':'环境与资源学院', '0580':'土木工程与力学学院',

'0571':'物理与光电工程学院', '0575':'数学与计算科学学院',

'0501':'马克思主义学院', '0502':'哲学与历史文化学院',

'0519':'公共管理学院', '0525':'法学部', '0513':'商学院',

'0543':'艺术学院', '0531':'外国语学院', '0537':'文学与新闻学院',

'0585':'国际交流学院', '0596':'兴湘学院'}

例如,输入:

202105430122 202105430113 202105430130 202105430118 202105000101 202105000102

则应输出:

艺术学院 4 其他 2

 

输入格式

输入n(n≤1000)个表示学号的整数,中间用空格分隔。

输出格式

输出学院名称和对应的人数,按人数从大到小顺序排列。

 

输入样例

201805820210 201805820218 201805820213 201805820214 201805820219 201805820215 201905020218 201905020219 201905720210 201905720212 201905720213 201905720214 202105311020 202105311018 202105311016 202105311009 202105311022 202105311027 202105311024 202105311008 202105311025 202105311017 202105311010 202105311028 202105311021 202105311023 202105311026 202105311006 202105430206 202105430210 202105370224 202105370204 202105370115 202105370131 202105370101 202105370114 202105370122 202105370113 202105370130 202105370118

 

输出样例

外国语学院 16

文学与新闻学院 10

环境与资源学院 6#include<stdio.h>

提示

统计人数时利用字典存储统计结果,排序时将字典转换成列表进行排序。测试样例时,请直接复制样例字符串,输出时无需格式化,直接输出相关列表元素。多个学院人数相同时,按输入学号的先后顺序输出。

  1. #include<stdio.h>

  2. #include<string.h>
  3. typedef struct
  4. {
  5.     int num;//表示该学院数量
  6.     int print;//表示有没有输出过
  7.     int order[1001];//记录学院到达某数量的顺序
  8. }u;
  9. int main()
  10. {
  11.     char a[13];
  12.     int i,j,k,b[1001];//b用来表示记录每个学院到达某一个数的总数
  13.     //初始化用于排序的数组
  14.     for(i=1;i<=1000;i++)
  15.     {
  16.         b[i]=1;
  17.     }
  18.     //初始化结构体
  19.     u uni[21];
  20.     for(i=0;i<21;i++)
  21.     {
  22.         uni[i].num=0;
  23.         uni[i].print=0;
  24.         uni[i].order;
  25.     }
  26.     //逐个录入
  27.     while(scanf("%s",a))
  28.     {
  29.         //检测学院
  30.         if(strstr(a,"0550")==&a[4])
  31.         uni[0].num++;
  32.         else if(strstr(a,"0556")==&a[4])
  33.         uni[1].num++;
  34.         else if(strstr(a,"0557")==&a[4])
  35.         uni[2].num++;
  36.         else if(strstr(a,"0560")==&a[4])
  37.         uni[3].num++;
  38.         else if(strstr(a,"0565")==&a[4])
  39.         uni[4].num++;
  40.         else if(strstr(a,"0572")==&a[4])
  41.         uni[5].num++;
  42.         else if(strstr(a,"0582")==&a[4])
  43.         uni[6].num++;
  44.         else if(strstr(a,"0580")==&a[4])
  45.         uni[7].num++;
  46.         else if(strstr(a,"0571")==&a[4])
  47.         uni[8].num++;
  48.         else if(strstr(a,"0575")==&a[4])
  49.         uni[9].num++;
  50.         else if(strstr(a,"0501")==&a[4])
  51.         uni[10].num++;
  52.         else if(strstr(a,"0502")==&a[4])
  53.         uni[11].num++;
  54.         else if(strstr(a,"0519")==&a[4])
  55.         uni[12].num++;
  56.         else if(strstr(a,"0525")==&a[4])
  57.         uni[13].num++;
  58.         else if(strstr(a,"0513")==&a[4])
  59.         uni[14].num++;
  60.         else if(strstr(a,"0543")==&a[4])
  61.         uni[15].num++;
  62.         else if(strstr(a,"0531")==&a[4])
  63.         uni[16].num++;
  64.         else if(strstr(a,"0537")==&a[4])
  65.         uni[17].num++;
  66.         else if(strstr(a,"0585")==&a[4])
  67.         uni[18].num++;
  68.         else if(strstr(a,"0596")==&a[4])
  69.         uni[19].num++;
  70.         else
  71.         uni[20].num++;
  72.         //记录每个院到达某个数量的顺序
  73.         uni[k].order[uni[k].num]=b[uni[k].num];
  74.         b[uni[k].num]++;
  75.         if(getchar()!=' ') break;//遇到换行符输入结束
  76.     }
  77.     //输出人数最多的三个学院
  78.     for(i=1;i<=3;i++)
  79.     {
  80.         //找到uni中号数最小且未被输出过的学院
  81.         for(j=0;j<21;j++)
  82.         {
  83.             if(uni[j].num==0)
  84.             {
  85.                 k=j;
  86.                 break;
  87.             }
  88.         }
  89.         //找到剩下学院人数最多的那一个 
  90.         for(j=k;j<21;j++)
  91.         {
  92.             if(uni[j].print==0)
  93.             {
  94.                 if(uni[j].num>0)
  95.                 {
  96.                     if(uni[j].num>uni[k].num)
  97.                     {
  98.                         k=j;
  99.                     }
  100.                     else if(uni[j].num==uni[k].num)
  101.                     {
  102.                         if(uni[j].order[uni[j].num]<uni[k].order[uni[k].num])
  103.                         k=j;
  104.                     }
  105.                 }
            }
        }
        if(uni[k].num==0) break; //如果k位数量为0则没有符合题意得学院,则退出循环
        //输出并将print置为1表示输出过了
        switch(k)
        {
            case 0: printf("机械工程学院");break;
            case 1: printf("计算机学院");break;
            case 2: printf("自动化与电子信息学院");break;
            case 3: printf("化学学院");break;
            case 4: printf("化工学院");break;
            case 5: printf("材料科学与工程学院");break;
            case 6: printf("环境与资源学院");break;
            case 7: printf("土木工程与力学学院");break;
            case 8: printf("物理与光电工程学院");break;
            case 9: printf("数学与计算科学学院");break;
            case 10: printf("马克思主义学院");break;
            case 11: printf("哲学与历史文化学院");break;
            case 12: printf("公共管理学院");break;
            case 13: printf("法学部");break;
            case 14: printf("商学院");break;
            case 15: printf("艺术学院");break;
            case 16: printf("外国语学院");break;
            case 17: printf("文学与新闻学院");break;
            case 18: printf("国际交流学院");break;
            case 19: printf("兴湘学院");break;
            case 20: printf("其他");break;
        }
        printf(" %d\n",uni[k].num);
        uni[k].print=1;
    }
}
 
代码目前个人发现有以下缺陷:
    12位中前四位不能和中间四位构成表示那20个学院数字,否则会检测不到,但是前四位表示年份,大概是2019~2023最多了,应该符合题意。
 
目前我也不知道到底还有没有错误,大家有意见的可以积极来讨论!
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值