超清视界

 找回密码
 加入我们
搜索
查看: 391|回复: 9

写程序模拟统计论坛的相关信息

[复制链接]
  • TA的每日心情
    开心
    前天 22:24
  • 签到天数: 1854 天

    [LV.Master]伴坛终老

    1105

    主题

    1万

    帖子

    2万

    积分

    黑暗骑士

    昨天毕竟短暂,明天才是永远

    Rank: 12Rank: 12Rank: 12

    积分
    23648

    版主勋章管理勋章在线达人勋章积分达人勋章灌水达人勋章资源达人勋章警卫勋章骑士勋章法师勋章卫兵勋章

    发表于 2020-8-1 15:46:33 | 显示全部楼层 |阅读模式

    亲,您还未注册,注册后可以访问更多内容~

    您需要 登录 才可以下载或查看,没有帐号?加入我们

    x
    本帖最后由 黑暗天使 于 2020-8-1 15:48 编辑



           大家好,又到了休闲放松的时间了。今天我想想做点什么好呢? 前几天发了项目图片,该写的文字写的,该调妹的也调了,是应该做点正事了,算是良心发现吧,不能就知道玩啊,呵呵。所以今天我们继续玩玩程序,为下一次的知识综合竞赛做准备(不好意思,可能要多等一段时间,还没构思好)


    程序要求:

          从键盘上输入一万名用户的信息(包括用户ID,组别,金币,精品值),要求分别输出在普通用户组(不含管理组,也不含会员组)中,金币前三位的用户ID和金币最后三位的用户ID,以及目前所有会员的总人数(包括月会员,半年会员,年会员)


    为了不要太复杂,假设作以下规定:

    1)规定所有用户的金币都不相等。
    2)组别只有三种可能,其中用字母S表示普通用户组,字母M表示管理组,字母V表示VIP组即会员组。

       
           正题开始之前还是说清楚,本程序纯属学习或娱乐之用,与论坛的运作毫无任何关系。不管你懂或不懂,或者是否为计算机专业都不重要,关键是有没有认真学的决心,为了照顾大家理解,我尽可能在重要地方写上注解。这个程序相对来说还是有点综合有点难度(至少对非计算机专业来说),你如果能达到我这水平,参加考试或毕业设计就根本不成问题,万一不行就要努力加油了。



    下面程序开始,我们一起正式踏入C语言的苦海。如果你在学校学习别的语言或你对其它语言(如VB,JAVA等)有兴趣,可以自己试着实现。


    #include<stdio.h>
    #define  MAXNUM  10000      //将MAXNUM定义为题目要求人数一万

    struct  userinfo
    {  
       char  userID[50];      //这表示用户的ID号,假设最大长度为50字符,如果是汉字就是25个字
       char  userTYPE;      //这表示用户的组别,只能为一个字母。只能是S或M或V
       int   coins;             //这表示金币,只能为整数
       int   values;          //这表示精品值,只能为整数

    }   
    // 上面四项合成起来构成了一个结构体,表示一个用户的完整记录,名称取名为userinfo。

    typedef  userinfo  Uk;    //这句话是将userinfo取一个简单的别名叫UK,因为每次都要写struct userifno就太麻烦了

    Uk a[MAXNUM],b[MAXNUM];   //在这里定义两个全局变量,是两个全局数组,分别是a和b,其中数组a用来保存所有用户的记录,而数组b只保存普通用户组的记录(不含管理组和会员组)

    int  usernum=0,vipnum=0;       //这也是两个全局变量,都是整型,usernum表示普通用户组的总人数,vipnum表示会员组的总人数。


    void  inputdata(    )        //这是第一个子程序,它的功能是从键盘上输入一万名用户记录,并保存在数组a中

    {
        int k;
        printf("请输入10000名用户的信息!");
        for(k=0;k<MAXNUM;k++)
      {
      scanf("%s",a[k].userID);          //这条语句保存用户的ID,%s是表示字符串
      scanf("%c",&a[k].userTYPE);  //这条语句保存用户的组别,%c是单个字母
      scanf("%d",&a[k].coins);        //这条语句保存用户的金币,%d是整型
      scanf("%d",&a[k].values);     //这条语句保存用户的精品值

      }


    }

    void   totaluserinfo(    )        //这是第二个子程序,功能是将所有用户中组别为S(也就是普通用户组)的记录全部挑出来,并按顺序存放在数组b中
    {
            int  k;
       for(k=0;k<MAXNUM;k++)
        if(a[k].userTYPE=='S')      // 如果当前某用户的组别为字母S
           b[usernum++]=a[k];   //则将它保存到数组b中,数组b中序号从0开始,每保存一条记录,序号就加1
        if(a[k].userTYPE=='V')
           vipnum++;                 //同理,如果当前某用户的组别为字母V,则将会员组人数加1,即vipnum++
    }


    Uk  getmaxk(int k, Uk  a[ ])   //这是第三个子程序,也是整个程序中非常重要的一个函数,它的功能是从所有普通用户中,挑选出第k大的用户记录并返回。例如,当k=3则表示找出金币排行第3的那条用户记录。
    {
       int k,j;        //k和j用来处理循环,一般来说排序都是两个循环
       Uk temp;  //这是一个临时变量,用在交换变量时使用,这是程序基本功了

       for(k=0;k<usernum;k++)
         for(j=k+1;j<usernum;j++)
         if(a[k].coins<a[j].coins)        //a[k]表示前面的记录,a[j]表示后面的记录,如果前面记录的金币小于后面记录的金币,则说明当前是升序,而我们的目的是要降序,所以要将它们交换过来
        {
           temp=a[k];
           a[k]=a[j];
           a[j]=temp;                 //此处三行用于实现将a[k]和a[j]交换过来,程序基本功,不再解释。
        }
       
        return  a[k-1];            //最后将满足的记录返回。例如,k=1则表示第1大的记录也就是金币最多的记录,还记得前面已经交换后,变成了降序,也就是说a[0]是最大的,将k=1代入刚好是a[0]

    }

    void outputdata(     )     //这是最后一个子程序,用于输出结果
    {

       printf("在普通用户中,金币排行前三位的用户ID分别为:");
       puts(getmaxk(1,b).userID);
       puts(getmaxk(2,b).userID);
       puts(getmaxk(3,b).userID);   //这三条都是一样的,只要看懂一条即可。puts是用来输出字符串的,也就是为了在屏幕上显示用户的ID号,接着调用前面的子程序getmaxk,将参数k直接传入即可。这三条语句很明显,第一个参数分别为1,2,3,当然就表示第1大记录,第2大记录,第3大记录,后面的.userID是表示从记录中取出用户ID号。
      
       printf("在普通用户中,金币排行最后三位的用户ID分别为:");
       puts(getmaxk(usernum,b).userID);
       puts(getmaxk(usernum-1,b).userID);
       puts(getmaxk(usernum-2,b).userID);      //这三条和上面三条同理,只是刚好反过来而已。最后三位记录,所以k就变成了usernum,usernum-1,usernum-2

       printf("截止目前论坛所有会员的总人数为:%d",vipnum);  //最后输出所有会员的总人数,在子程序totaluserinfo() 中的最后一条,已经统计了,就是vipnum
      

    }

    main(  )
    {

        inputdata(               );
        totaluserinfo(          );
        outputdata(            );

    }  //最后是我们的主程序。大家可以看到,只要前面的分工都到位了,这里什么也不用管,只往里面填就完事了,但要格外注意一点,这三条语句可千万不能颠倒啊


    最后的反思:

           学而不思则罔,思而不学则殆。思考是无限的,不要知其然不知其所以然。这个程序有以下几点值得我们思考:

    1)程序中用MAXNUM表示最大人数一万(题目中明确假设就是一万人),但为什么要写MAXNUM,为什么不直接写10000?
    2)  scanf("%s",a[k].userID);          //这条语句保存用户的ID,%s是表示字符串
           scanf("%c",&a[k].userTYPE);  //这条语句保存用户的组别,%c是单个字母
          为什么上面一句没有&符号,而下面一句有&符号,这是为什么?

    3)Uk a[MAXNUM],b[MAXNUM];  这上面已经解释了,是两个全局数组。大家想想为什么要这样写,为什么不能将数组a和数组b直接写到子程序中?

    4)本程序中是假设所有用户的金币不相等。其实如果考虑相等,这情况就有点差别了,稍稍有点麻烦了,这留给你们自己去改进去完善。

             
          有能力有兴趣的朋友多多完善,既是放松心情也是温故而知新,一举两得。上面这四个疑问,很抱歉,我是不会回答的,这些问题有可能作为下一界知识综合竞赛的部分选题,请大家多多翻书,多多百度总有解决方法的。




    只要自己不放弃梦想,梦想就不会破灭
  • TA的每日心情
    开心
    昨天 10:32
  • 签到天数: 1462 天

    [LV.10]以坛为家III

    2

    主题

    4628

    帖子

    9531

    积分

    年度用户

    Rank: 5Rank: 5

    积分
    9531
    发表于 2020-8-1 16:20:07 | 显示全部楼层
    看到这些语言脑袋就是头晕,算了

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1132 天

    [LV.10]以坛为家III

    73

    主题

    7092

    帖子

    1万

    积分

    黑暗骑士

    Rank: 12Rank: 12Rank: 12

    积分
    14795

    积分达人勋章灌水达人勋章法师勋章骑士勋章警卫勋章卫兵勋章

    发表于 2020-8-1 16:42:48 | 显示全部楼层
    前段还稍微看得懂,中后段就完全不明白

  • TA的每日心情
    开心
    前天 22:24
  • 签到天数: 1854 天

    [LV.Master]伴坛终老

    1105

    主题

    1万

    帖子

    2万

    积分

    黑暗骑士

    昨天毕竟短暂,明天才是永远

    Rank: 12Rank: 12Rank: 12

    积分
    23648

    版主勋章管理勋章在线达人勋章积分达人勋章灌水达人勋章资源达人勋章警卫勋章骑士勋章法师勋章卫兵勋章

     楼主| 发表于 2020-8-1 20:31:00 | 显示全部楼层
    cp2020 发表于 2020-8-1 16:42
    前段还稍微看得懂,中后段就完全不明白

    已经算不错了,你毕竟是学会计的,不用勉强,了解即可。再说现在看不太懂,不代表以后也看不懂。

    只要自己不放弃梦想,梦想就不会破灭
  • TA的每日心情
    慵懒
    4 小时前
  • 签到天数: 1348 天

    [LV.10]以坛为家III

    34

    主题

    1851

    帖子

    4291

    积分

    魔法警卫

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    4291

    骑士勋章警卫勋章年度会员勋章白银勋章法师勋章卫兵勋章黑铁勋章青铜勋章

    发表于 2020-8-2 09:48:56 | 显示全部楼层
    SQL狗景仰地表示,虽然勉强看懂了,但自己完全写不出来,这就是我N次想转码失败的原因了。。。

  • TA的每日心情
    慵懒
    昨天 20:21
  • 签到天数: 1719 天

    [LV.Master]伴坛终老

    30

    主题

    3732

    帖子

    7984

    积分

    黑暗骑士

    Rank: 12Rank: 12Rank: 12

    积分
    7984

    警卫勋章灌水达人勋章骑士勋章法师勋章卫兵勋章

    发表于 2020-8-3 21:39:19 | 显示全部楼层
    我沒碰程式語言太久
    看一段就想放棄了慚愧

  • TA的每日心情
    开心
    前天 22:24
  • 签到天数: 1854 天

    [LV.Master]伴坛终老

    1105

    主题

    1万

    帖子

    2万

    积分

    黑暗骑士

    昨天毕竟短暂,明天才是永远

    Rank: 12Rank: 12Rank: 12

    积分
    23648

    版主勋章管理勋章在线达人勋章积分达人勋章灌水达人勋章资源达人勋章警卫勋章骑士勋章法师勋章卫兵勋章

     楼主| 发表于 2020-8-9 14:33:55 | 显示全部楼层
    eric7711 发表于 2020-8-3 21:39
    我沒碰程式語言太久
    看一段就想放棄了慚愧

    你们台湾叫程式,我们内地叫程序。

    只要自己不放弃梦想,梦想就不会破灭
  • TA的每日心情
    慵懒
    昨天 20:21
  • 签到天数: 1719 天

    [LV.Master]伴坛终老

    30

    主题

    3732

    帖子

    7984

    积分

    黑暗骑士

    Rank: 12Rank: 12Rank: 12

    积分
    7984

    警卫勋章灌水达人勋章骑士勋章法师勋章卫兵勋章

    发表于 2020-8-9 21:10:45 来自手机 | 显示全部楼层
    黑暗天使 发表于 2020-8-9 14:33
    你们台湾叫程式,我们内地叫程序。

    是的 不同文字一樣的意思呢

  • TA的每日心情
    奋斗
    2024-2-13 16:08
  • 签到天数: 188 天

    [LV.7]常住居民III

    7

    主题

    673

    帖子

    1508

    积分

    双手剑士

    Rank: 9Rank: 9Rank: 9

    积分
    1508

    卫兵勋章法师勋章

    发表于 2021-3-5 17:03:19 | 显示全部楼层
    用dev c++可以跑这个程序吗?

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 1112 天

    [LV.10]以坛为家III

    295

    主题

    1万

    帖子

    2万

    积分

    黑暗骑士

    Rank: 12Rank: 12Rank: 12

    积分
    27610

    灌水达人勋章卫兵勋章法师勋章骑士勋章警卫勋章年度会员勋章在线达人勋章积分达人勋章资源达人勋章

    发表于 2024-1-19 08:42:56 | 显示全部楼层
    能写这些的,都是狠人阿

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    手机版|小黑屋|超清视界 超清视界官方群

    GMT+8, 2024-4-29 12:52 , Processed in 0.065686 second(s), 23 queries .

    Powered by Discuz! X3.4

    © 2018-2021 超清视界 HDshot.

    快速回复 返回顶部 返回列表