一.设计思路

  1.创建结构体M3Water,包含两个属性(“水王”ID、贴子数num);

  2.在主函数中读入文件列表,获取ID列表;

  3.调用查找函数,在查找函数中创建M3Water实例对象数组(包含三个元素),用来存储查找到的“水王”的信息,并初始化赋值,并将获取到的列表ID数赋值给CountAll;

  4.当三个实例对象中的num值为0时,存入一个ID列表中读取出的发贴人ID;

  5.当读取的ID列表中的发帖人ID与三个实例中的某个实例的“水王”ID相同时,该实例的num值加1;

  6.当读取的ID列表中的发帖人ID与三个实例中的“水王”ID均不相同时,三个实例中的num值均减1,CountAll减1;

  7.读取完所有的ID列表中的发贴人ID后,若三个实例中的num值与CountAll的比值均大于1/4,则该三个实例中的ID号即为所找的三个“水王”,否则不存在这样的三个“水王”。

二.代码实现

  1 #include<iostream>
  2 #include<fstream>
  3 #include<string>
  4 #define N 1000
  5 using namespace std;
  6 
  7 struct M3Water{
  8     string ID;    //水王ID
  9     float num;    //水王发帖数
 10 };
 11 
 12 int Find(string IDnum[], int Num)
 13 {
 14     M3Water m3water[3];
 15     float CountAll=Num;    
 16     int Number;    //序号
 17     int member;    //水王序号
 18     for (member = 0; member < 3; member++)
 19     {
 20         m3water[member].num = 0;
 21         m3water[member].ID = "";
 22     }
 23     for (Number = 0; Number < Num; Number++)
 24     {
 25         if (m3water[0].num == 0)
 26         {
 27             m3water[0].ID = IDnum[Number];
 28             m3water[0].num++;
 29         }
 30         else if (m3water[1].num == 0)
 31         {
 32             m3water[1].ID = IDnum[Number];
 33             m3water[1].num++;
 34         }
 35         else if (m3water[2].num == 0)
 36         {
 37             m3water[2].ID = IDnum[Number];
 38             m3water[2].num++;
 39         }
 40         else if (m3water[0].ID == IDnum[Number])
 41         {
 42             m3water[0].num++;
 43         }
 44         else if (m3water[1].ID == IDnum[Number])
 45         {
 46             m3water[1].num++;
 47         }
 48         else if (m3water[2].ID == IDnum[Number])
 49         {
 50             m3water[2].num++;
 51         }
 52         else
 53         {
 54             m3water[0].num--;
 55             m3water[1].num--;
 56             m3water[2].num--;
 57             CountAll--;
 58 
 59         }
 60     }
 61     if (m3water[0].num/CountAll > 0.25 && m3water[1].num/CountAll > 0.25 && m3water[2].num/CountAll > 0.25)
 62     {
 63         cout << "三个水王为:"<<endl;
 64         for (member = 0; member < 3; member++)
 65         {
 66             cout << m3water[member].ID << "\t";
 67         }
 68         cout << endl;
 69     }
 70     else
 71     {
 72         cout << "不存这样的三个水王(每个水王的贴子数超过1/4)!" << endl;
 73     }
 74     return 0;
 75 }
 76 
 77 int main()
 78 {
 79     int number[N];    //贴子序号
 80     string idnum[N];    //发帖人ID号
 81     int Num = 0;    //贴子数
 82     ifstream file;
 83     file.open("myfile.txt");
 84     if (!file)
 85     {
 86         cout << "文件不存在!"<<endl;
 87     }
 88     else
 89     {
 90         while (file >> number[Num] >> idnum[Num])
 91         {
 92             Num++;
 93         }
 94         if (Num == 0)
 95         {
 96             cout << "文件为空!" << endl;
 97         }
 98         else
 99         {
100             if (Num < 12)
101             {
102                 cout << "不存在这样的三个水王(每个水王的贴子数超过1/4)!" << endl;
103             }
104             else
105             {
106                 Find(idnum,Num);
107             }
108         }
109     }
110     file.close();
111     return 0;
112 }

三.测试结果

 1.测试数据一

 2.错误列表(不满足三水王要求)测试一

 3.错误列表(不满足三水王要求)测试二

4.空文件测试

四.个人总结

  在草稿纸上研究了半天,然后才想到这个规律,然后用到这个方法,但刚开始自己的代码太过复杂,时间复杂度较大,后来参考了别人的代码,然后纠正了过来。