• 软件工程个人项目——寻找水王2


    寻找水王2

    ”……随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?“
    一、设计思想
          上次上网搜到的编程思想不中也介绍了这次题目的改变,然后我又自己分析了一遍,开始下面的编程。
          首先依旧是用文件存取各个发帖id(相当于题目中说的“论坛帖子列表”),文件命名为“id_form”。
          其次,上次是找出一个水王,这个水王发帖数超过了总帖数一半;这次是找三个小水王,他们每一个人的帖子数都超过了总帖数的1/4。因此基本的思想不变,我们只需要在上次的基础上进行改进就可以。本题的关键依旧是:三个小水王发帖的总数(也就是id号码)超过总帖子数量的1/4。抓住这个条件,我们将存放疑似水王id的和存放某个id发帖数量的都设置成数组,并把前三个id号码初始化成“疑似水王”。每次选取下一个id分别与三个嫌疑人比较,若有相同则计数加1;若三个都不相同,则三个计数器都减1。若减为0,就意味着这个id号出现的次数没有超过1/4,则重新将下一个id赋值给嫌疑人,然后重复上述过程。因为三个小水王的id数大于1/4,所以到最后总会有三个id号码使得记录次数的值>0,那他们个就是真正的“小水王”。
     
    二、代码实现
     1 //Zhao Ziyin 2016/5/27 寻找小水王
     2 
     3 #include<iostream>
     4 #include<fstream>
     5 using namespace std;
     6 #define MAX 50
     7 
     8 void Find(int id[], int lenth, int water[])
     9 {
    10     int i = 0;
    11     int count[3] = { 0, 0, 0 };             //count数组用来记录某id发帖次数
    12     water[0] = water[1] = water[2] = -1;    //初始化嫌疑人列表
    13     for (i = 0; i<lenth; i++)
    14     {
    15         if (count[0] == 0)            //初始化后先赋值
    16         {
    17             count[0]++;
    18             water[0] = id[i];
    19         }
    20         else if (count[1] == 0)
    21         {
    22             count[1]++;
    23             water[1] = id[i];
    24         }
    25         else if (count[2] == 0)
    26         {
    27             count[2]++;
    28             water[2] = id[i];
    29         }
    30         else if (id[i] == water[0])    //如果count为0,重新赋值
    31         {
    32             count[0]++;
    33         }
    34         else if (id[i] == water[1])
    35         {
    36             count[1]++;
    37         }
    38         else if (id[i] == water[2])
    39         {
    40             count[2]++;
    41         }
    42         else //如果与三个嫌疑人的ID都不同,则三个计数数组的值都减1,直到count为0
    43         {
    44             count[0]--;
    45             count[1]--;
    46             count[2]--;
    47         }
    48     }
    49 }
    50 
    51 int main(int argc, char* argv[])
    52 {
    53     int i;
    54     int ID[MAX];                //发帖记录表
    55     int in[MAX + 1];                //从文件中读出的数组
    56     int num, King[3];            //发帖数目、水桶
    57     
    58     //读取文件中的id号
    59     ifstream infile("id_form.txt", ios::in);
    60     if (infile.is_open() == false)
    61     {
    62         cerr << "open error!" << endl;
    63         exit(1);
    64     }
    65     infile >> in[0];//读取帖子总数
    66     num = in[0];
    67     cout << "帖子的总数为:" << in[0] << endl;
    68 
    69     cout << "发帖的id号分别为:" << endl;
    70     for (i = 0; i < num; i++)
    71     {
    72         infile >> in[i + 1];
    73         ID[i] = in[i + 1];
    74         cout << ID[i] << " ";
    75     }
    76     cout << endl;
    77 
    78     Find(ID, num, King);
    79     cout << endl << "找到小水王!!!" << endl;
    80     cout << "id为:";
    81     for (i = 0; i<3; i++)
    82     {
    83         cout << King[i] << " ";
    84     }
    85     cout << endl;
    86     infile.close();
    87     return 0;
    88 }
    三、实现截图
    四、个人总结
          看到了老师给我之前写的代码的评论才意识到最好在主函数中使用int main()而不是void main()。其实以前真的没有注意这个,编写主函数的时候想起来哪个就写哪个了。这一点以后我会注意的。通过水王这两次实验,加上之前做过的数组最大值,包括二柱子的程序题,越来越让我懂得程序中的迭代思想,很多程序都是思想互通的。就好比这次实验,如果没有水王1,我可能不会那么快的想到这次的算法思想。因此以后在考虑问题的时候一定要把问题拆分来看,或者把问题转换去看。一题多解,多题一解。
  • 相关阅读:
    python之路——进程
    python之路——操作系统的发展史
    python之路——网络编程
    模块学习之re模块
    day11迭代器、生成器
    day10闭包、函数装饰器
    vnc安装和配置
    单例模式
    代理设计模式
    工厂模式例子
  • 原文地址:https://www.cnblogs.com/2016helen/p/5527031.html
Copyright © 2020-2023  润新知