一.设计思路
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.空文件测试
四.个人总结
在草稿纸上研究了半天,然后才想到这个规律,然后用到这个方法,但刚开始自己的代码太过复杂,时间复杂度较大,后来参考了别人的代码,然后纠正了过来。