软件工程课堂作业——寻找水王2

一、题目

  随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了总和的1/4。你能从发帖列表中快速找到他们吗?

二、设计思想

  根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了总和的1/4”这一情况。

三、代码实现

  1 #include<iostream>
  2 using namespace std;
  3
  4 int main()
  5 {
  6     int a[10000],length=-1,i;//a[10000]用来存储每个帖子的作者ID,length用来记录帖子的数量
  7     int b[3][2];
  8     bool flag=false;
  9     //b[i][0]用来记录当前认为的“水王”的ID
 10     //b[i][1]用来记录记录当前认为的“水王”相对于其他用户连续出现多出来的次数
 11
 12     //用于判断输入的数是否符合情况
 13     while(length<1)
 14     {
 15         cout<<"请输入帖子的数量:"<<endl;
 16         cin>>length;
 17     }
 18
 19     cout<<"请依次输入每个帖子的作者ID:"<<endl;
 20     for(i=0;i<length;i++)
 21     {
 22         cin>>a[i];
 23     }
 24     //初始化第一个水王号
 25     b[0][0]=a[0];
 26     b[0][1]=1;
 27     //初始第二个水王号
 28     for(i=1;i<length;i++)
 29     {
 30         if(a[i]!=b[0][0])
 31         {
 32             b[1][0]=a[i];
 33             b[1][1]=1;
 34             break;
 35         }
 36         else
 37         {
 38             b[0][1]++;
 39         }
 40     }
 41     i++;
 42     //初始第三个水王号
 43     for(;i<length;i++)
 44     {
 45         if(a[i]!=b[0][0]&&a[i]!=b[1][0])
 46         {
 47             b[2][0]=a[i];
 48             b[2][1]=1;
 49             flag=true;
 50             break;
 51         }
 52         else if(a[i]==b[0][0])
 53         {
 54             b[0][1]++;
 55         }
 56         else
 57         {
 58             b[1][1]++;
 59         }
 60     }
 61     i++;
 62     //判断输入的ID至少有三个不同的ID号
 63     if(flag==false)
 64     {
 65         cout<<"输入的ID号不符合条件!!!!"<<endl;
 66     }
 67     else
 68     {
 69         //根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次
 70         //目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一
 71         for(;i<length;i++)
 72         {
 73             if(a[i]!=b[0][0]&&a[i]!=b[1][0]&&a[i]!=b[2][0])
 74             {
 75                 b[0][1]--;
 76                 b[1][1]--;
 77                 b[2][1]--;
 78             }
 79             else
 80             {
 81                 if(b[0][1]==0&&a[i]!=b[1][0]&&a[i]!=b[2][0])
 82                 {
 83                     b[0][0]=a[i];
 84                 }
 85                 else if(b[1][1]==0&&a[i]!=b[0][0]&&a[i]!=b[2][0])
 86                 {
 87                     b[1][0]=a[i];
 88                 }
 89                 else if(b[2][1]==0&&a[i]!=b[1][0]&&a[i]!=b[0][0])
 90                 {
 91                     b[2][0]=a[i];
 92                 }
 93                 else
 94                 {
 95                     if(a[i]==b[0][0])
 96                     {
 97                         b[0][1]++;
 98                     }
 99                     if(a[i]==b[1][0])
100                     {
101                         b[1][1]++;
102                     }
103                     if(a[i]==b[2][0])
104                     {
105                         b[2][1]++;
106                     }
107                 }
108             }
109         }
110         //避免出现误将不符合条件的情况输出
111         if(b[0][1]==0||b[1][1]==0||b[2][1]==0)
112         {
113             cout<<"输入的ID号不符合条件!!!!"<<endl;
114         }
115         else
116         {
117             if(max(max(b[0][1],b[1][1]),max(b[1][1],b[2][1]))-min(min(b[0][1],b[1][1]),min(b[1][1],b[2][1]))<(length/2-length/4-1))
118             {
119
120                 cout<<"第一个水王号为:"<<b[0][0]<<endl;
121                 cout<<"第二个水王号为:"<<b[1][0]<<endl;
122                 cout<<"第三个水王号为:"<<b[2][0]<<endl;
123             }
124             else
125             {
126                 cout<<"输入的ID号不符合条件!!!!"<<endl;
127             }
128         }
129     }
130     return 0;
131 }

四、实现截图

实例一:ID号相对比较分散

实例二:ID号相对比较集中

实例三:ID号输入不满足情况

1、

2、

五、个人工作总结

  这次实验是在前次寻找一个大水王的实验上的叠加,因此这次算法也是在上次算法的基础上的一个改进。上次是两个两个的比较,从而找到水王。这次实验只要抓住“三个水王号的ID数均超过四分之一”这一句话可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。刚开始没有考虑当水王号出现次数不满足条件“超过1/4”这个情况,在无意中某次输入实例三的情况1时,任显示有水王号,最后通过找到水王号出现次数之差的临界值,即ID号数量/2-ID号数量/4-1,当不小于这个临界值时,输入的ID号不满足条件。

  通过这次实验,我自己通过边界测试来查找自己编写的代码的错误,让我对边界测试的实例选择有了实际体验,相信在以后的实验我可以更好地运用边界测试找到自己编写的算法的缺陷。

时间: 2024-10-13 11:54:56

软件工程课堂作业——寻找水王2的相关文章

软件工程课堂作业——寻找“水王”

一.题目 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思想: 由于该“水王”发帖数目超过了帖子数目的一半,可以通过相邻两个帖子的作者ID是否相同来寻找.如果相邻两个ID不同,则将两个ID略过:若相等,则判断之前是否有怀疑是“水王”的ID,如

课堂作业-寻找水王

[设计思想]   因为水王是整个论坛中发帖和回帖数加起来最多的的人,且超过总帖数的一半以上.(这里将发帖数和回帖数记在一起)使用"两两相消"的方法.将帖子的作者id纳入数组,将数组中的一个数记作疑似水王者,并记发帖数t=0.遍历数组,若数组中的数和疑似水王者id相同,使发帖数t加一.如与疑似水王者id不同,使发帖数t减一.当t=0时,将数组中当前与水王疑似者比较的数作为新的疑似水王者.循环结束,当前水王怀疑者就是水王. [代码实现] 1 2 3 4 5 6 7 8 9 10 11 12

软件工程课堂作业04

软件工程课堂作业04 源代码: 1 package jian; 2 import java.io.*; 3 import java.util.Scanner; 4 public class Point3D{ 5 public static int Lenght(int list[],int lenght) 6 { 7 int i,max; 8 max=list[0]; 9 for(i=1;i<=(lenght-1);i++) 10 { 11 if(list[i]>max) 12 { 13 ma

课堂作业--寻找水军

一.题目要求 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思路 本次题目是在上次寻找“水王”的基础上进行拓展,设计思路和上次的相似,上次寻找水王是用的一个水王变量,一个计数变量,那么本次的设计思想沿用上次的技巧,有三个水军变量,三个计数变量:分别使水军的这三个变量和下一个数比较,然后和三个水军相对应的计数变量分别进行计数,相同则加一,不同则抵消减一:依次循环,和水王的规则类似,最后找到3

软件工程随堂小作业—— 寻找“水王”(C++)

一.设计思路 (1)输入发帖ID记录表 (2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一.若计数器的数值被减为零,则重新选取当前ID开始记录比较. (3)输出结果 二.源代码 1 // shuiwang.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "iostream.h" 6 #def

软件工程课堂作业(十四)——揪出“水王”

一.题目: 现有一个灌水论坛,信息学院的学生都喜欢在上面交流灌水.传说在论坛上有一个“水王”,它不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目已超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者ID在其中,请设计算法快速找到这个传说中的“水王”. 二.设计思路: 1.首先要快速找到,要求时间复杂度要低.如果进行ID数目多少排序的话,时间复杂度至少为O(n*lgn),所以不能排序: 2.要想遍历一遍就能找到最多出现的ID,可以将数目少的ID删

软件工程课堂作业(十五)——揪出“水王”续

一.题目: 随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了总和的1/4.请设计算法从列表中快速找到他们. 二.设计思路: 扩展题目和原题基本相似,方法是一样的,都可用消除思想.可以三个比较,若不相同,则删除,若相同,则计数器加一. 三.源代码: 1 //找小“水王”——胡亚宝——2015/04/26 2 3 #include "stdafx.h" 4 #include"iostream" 5 6 7 8

课堂作业-找水王2

1.题目要求: 随着论坛的发展,管理员发现水王没有了,但是统计结果表明, 有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 2.设计思路: 因为三个小水王的ID在所有发帖ID中均超过1/4,所以初始化水王的时候可以用4个ID相比.如果所有ID序列排列在1-4的四个ID中出现相同ID名,那么就可以利用一个包含三个元素的数组初始化小水王ID:如果所有ID序列排列在1-4中无重复ID名,则在排列在4-8中寻找是否存在重复的ID名.以此循环直到找到在4个ID中出现

课堂练习------寻找水王

•三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. •如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 1 #include<iostream.h> 2 int main() 3 { 4 int water; 5 int a[10]={1,5,2,5,3,5,4,5,5,5}; 6 int j,k=1