软件工程课堂作业——寻找水王2
2016-05-27 10:30
316 查看
一、题目
随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了总和的1/4。你能从发帖列表中快速找到他们吗?
二、设计思想
根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了总和的1/4”这一情况。
三、代码实现
四、实现截图
实例一:ID号相对比较分散
实例二:ID号相对比较集中
实例三:ID号输入不满足情况
1、
2、
五、个人工作总结
这次实验是在前次寻找一个大水王的实验上的叠加,因此这次算法也是在上次算法的基础上的一个改进。上次是两个两个的比较,从而找到水王。这次实验只要抓住“三个水王号的ID数均超过四分之一”这一句话可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。刚开始没有考虑当水王号出现次数不满足条件“超过1/4”这个情况,在无意中某次输入实例三的情况1时,任显示有水王号,最后通过找到水王号出现次数之差的临界值,即ID号数量/2-ID号数量/4-1,当不小于这个临界值时,输入的ID号不满足条件。
通过这次实验,我自己通过边界测试来查找自己编写的代码的错误,让我对边界测试的实例选择有了实际体验,相信在以后的实验我可以更好地运用边界测试找到自己编写的算法的缺陷。
随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了总和的1/4。你能从发帖列表中快速找到他们吗?
二、设计思想
根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了总和的1/4”这一情况。
三、代码实现
#include<iostream> using namespace std; int main() { int a[1000000],length=-1,i;//a[1000000]用来存储每个帖子的作者ID,length用来记录帖子的数量 int b[3][2]; bool flag=false; //b[i][0]用来记录当前认为的“水王”的ID //b[i][1]用来记录记录当前认为的“水王”相对于其他用户连续出现多出来的次数 //用于判断输入的数是否符合情况 while(length<1) { cout<<"请输入帖子的数量:"<<endl; cin>>length; } cout<<"请依次输入每个帖子的作者ID:"<<endl; for(i=0;i<length;i++) { cin>>a[i]; } //初始化第一个水王号 b[0][0]=a[0]; b[0][1]=1; //初始第二个水王号 for(i=1;i<length;i++) { if(a[i]!=b[0][0]) { b[1][0]=a[i]; b[1][1]=1; break; } else { b[0][1]++; } } i++; //初始第三个水王号 for(;i<length;i++) { if(a[i]!=b[0][0]&&a[i]!=b[1][0]) { b[2][0]=a[i]; b[2][1]=1; flag=true; break; } else if(a[i]==b[0][0]) { b[0][1]++; } else { b[1][1]++; } } i++; //判断输入的ID至少有三个不同的ID号 if(flag==false) { cout<<"输入的ID号不符合条件!!!!"<<endl; } else { //根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次 //目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一 for(;i<length;i++) { if(b[0][1]==0&&a[i]!=b[1][0]&&a[i]!=b[2][0]) { b[0][0]=a[i]; b[0][1]++; } else if(b[1][1]==0&&a[i]!=b[0][0]&&a[i]!=b[2][0]) { b[1][0]=a[i]; b[1][1]++; } else if(b[2][1]==0&&a[i]!=b[1][0]&&a[i]!=b[0][0]) { b[2][0]=a[i]; b[2][1]++; } else if(a[i]==b[0][0]) { b[0][1]++; } else if(a[i]==b[1][0]) { b[1][1]++; } else if(a[i]==b[2][0]) { b[2][1]++; } else if(a[i]!=b[0][0]&&a[i]!=b[1][0]&&a[i]!=b[2][0]) { b[0][1]--; b[1][1]--; b[2][1]--; } } //避免出现误将不符合条件的情况输出 if(b[0][1]==0||b[1][1]==0||b[2][1]==0) { cout<<"输入的ID号不符合条件!!!!"<<endl; } else { 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)) { cout<<"第一个水王号为:"<<b[0][0]<<endl; cout<<"第二个水王号为:"<<b[1][0]<<endl; cout<<"第三个水王号为:"<<b[2][0]<<endl; } else { cout<<"输入的ID号不符合条件!!!!"<<endl; } } } return 0; }
四、实现截图
实例一:ID号相对比较分散
实例二:ID号相对比较集中
实例三:ID号输入不满足情况
1、
2、
五、个人工作总结
这次实验是在前次寻找一个大水王的实验上的叠加,因此这次算法也是在上次算法的基础上的一个改进。上次是两个两个的比较,从而找到水王。这次实验只要抓住“三个水王号的ID数均超过四分之一”这一句话可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。刚开始没有考虑当水王号出现次数不满足条件“超过1/4”这个情况,在无意中某次输入实例三的情况1时,任显示有水王号,最后通过找到水王号出现次数之差的临界值,即ID号数量/2-ID号数量/4-1,当不小于这个临界值时,输入的ID号不满足条件。
通过这次实验,我自己通过边界测试来查找自己编写的代码的错误,让我对边界测试的实例选择有了实际体验,相信在以后的实验我可以更好地运用边界测试找到自己编写的算法的缺陷。
相关文章推荐
- Files存储练习
- 寻找“水王”02
- 变量存储区
- linux 不能启动disk启动失败.
- ISCC2016Basic Writeup
- SQl server 2008 附加数据库失败如何解决
- iOS app启动图片及icon图片及应用名设置
- 《解剖PetShop》之三:PetShop数据访问层之消息处理
- jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
- finally关键字
- jquery 弹窗拖动效果
- 关于RabbitMQ
- String toUppercase和toLowerCase
- 网络请求数据加滑动加载
- Linux mount使用大全
- os中的mmu介绍
- Laravel工程搭建
- VS筛选器
- Matlab函数备忘4
- 题目