首先显示博客要求:

描述在这么多相似的需求面前, 你怎么维护你的设计 (父类/子类/基类, UML, 设计模式,  或者其它方法) 让整个程序的架构不至于崩溃的?

建议从后往前来搞,比如我通读一遍需求后了解到后面会用到多种模式,那么在输入的时候自然要定义后mode然后一步一步来,这里用的是面向过程的设计方法,所以没有用到面向对象的那么多冗杂的概念,程序的架构主要是根据不同的mode分别进行相应的输入错误判断,然后调用不同的Input函数完成输入,init()函数完成初始化操作,最后通过不同的work()函数完成函数主体操作

给出你做单元测试/代码覆盖率的最终覆盖率的报告, 用截屏显示你的代码覆盖率

。。。。我的作业2是用C++的面向过程方法写的。。。无法进行单元测试。。。今天我做完了作业3。。。。用C#实现。。。尝试着用单元测试。。。

结果出现了这个东东

难道是告诉我只能有Form类可以进行单元测试么....虽然代码写的偏面向过程....也不用这个样子吧....所以这次没有这一项...或者说这次的代码不适合进行单元测试...我进行了其他方面的测试...证明了我的代码比较挫...至于Bug..从零开始学c#...调Bug 调了两天...应该质量可以的..

阅读 工程师的能力评估和发展 和相关文章, 在完成作业的时候记录自己花费的时间, 并填下表。如果你对有些术语不太清楚,请查看教材和其它资料。如果你认为你不需要做某个步骤, 那就跳过去。

  Personal Software Process Stages 时间百分比(%)  实际花费的时间 (分钟) 原来估计的时间 (分钟)
Planning 计划 3.3   45            60 
·         Estimate  ·         估计这个任务需要多少时间,把工作细化并大致排序  3.3  45 60 
Development 开发 81.2   1100  840
·         Analysis  ·         需求分析 (包括学习新技术) 4.4   60  60
·         Design Spec ·         生成设计文档   0  0
·         Design Review ·         设计复审 (和同事审核设计文档)  0  0
·         Coding Standard ·         代码规范 (制定合适的规范)  0  0
·         Design ·         具体设计 8.9   120  60
·         Coding ·         具体编码 59.0   800  600
·         Code Review ·         代码复审 4.4   60  60
·         Test ·         测试(自我测试,修改代码,提交修改) 4.4  60  60
Reporting 总结报告 15.5   210  60
·         Test Report ·         测试报告 8.9   120  0
·         Size Measurement ·         计算工作量 2.2   30  0
·         Postmortem & Improvement Plan ·         事后总结, 并提出改进 4.4   60  60
Total 总计 100% 总用时 总估计的用时
       1355  960

你在这个作业中学到了什么?  有什么好的设计值得分享?  感想如何 (太容易 / 太难 / 太无趣)?

。。。感想绝对是太难。。

其他的变形还算简单,但是关于最大联通子块自己一直没有想到好的做法,今天想了一天采用状压dp的做法一直无法得出正确的结果,原因在于我是采用按行dp的算法,那么在行与行之间进行转移的时候就出现了问题,我不知道该如何用代码表示两行之间存在相邻关系,这里我用二进制表示一行的状态,某位置0表示该位不取,置1表示该位取,那么对于相邻两行的二进制状态,我该如何表示它们的相邻关系呢?今天这一整天我想了无数的转移方法,但一个个的被我推翻,最后的最后我发现貌似我要采取更暴力的穷举状态了,那就是将每行的状态表示为一个数字,那么所有行的数字按位与之后所得的结果如果不为0就表示它们满足相邻关系,那么我就可以求出一个和,穷举所有行的所有状态,那么就可以求出一个最大值.好可怕的复杂度....记行数为n,每行m个数,那么对每一个行,状态有2^m种,复杂度就是O(2^(mn)),,一会儿去实现一下.

昨晚找鲁大师请教了一下,他和我说这种题目叫做连通性状压dp,也就是插头dp,于是今天上午看了一会儿插头dp,可是这东西完全看不懂啊...代码那么一坨...于是今天思考了一下用暴力来解决这个问题.用01串来标记整个二维数组,枚举每一种状态,判断该状态是否满足连通性条件(采用dfs来判定),然后找最大值就好...复杂度大概为O(2^mn)....

没有用面向对象的思想来做这个问题,导致代码有500行之多...好挫..

吐槽完了,说一下代码思路

首先根据命令行参数的数量以及各个string来判断mode,并且处理错误输入

对于一维和二维普通情况,就是O(n)的最大子数组,方法不过多讲了,参加上一篇博客

 void maxsum1()//一维O(n)求最大子数组
{
long long tempsum=num[];
long long ans=tempsum;
for(int i=;i<=col;i++)
{
tempsum=max(num[i],tempsum+num[i]);
ans=max(tempsum,ans);
}
printf("%lld\n",ans);
}
 void maxsum2()//二维最大子数组O(n^3)
{
init2();
int tempans=map[][];
int ans=tempans;
for(int i=;i<=row;i++)
{
for(int j=i;j<=row;j++)
{
tempans=getsum(i,,j,);
for(int k=;k<=col;k++)
{
tempans=max(getsum(i,k,j,k),tempans+getsum(i,k,j,k));
ans=max(tempans,ans);
}
}
}
printf("%d\n",ans);
}

对于一维左右联通情况,我们可以知道它的最大和要么是没有跨过了a[n]和a[1],要么是没有跨过;如果没有跨过,那么就是简单的一维普通情况,记最大值为ans1;如果跨过了,那么不妨设此时的最大子数组为a[j],a[j+1],....a[n],a[1],a[2],...a[i],i<j,此时可以证明a[i],a[i+1],....a[j]一定是最小子数组,并且a[i]和a[j]一定是小于0的(否则可以加到最大子数组中得到更优的解),那么我们扫描一遍的时候,只要同时记录最大子数组,最小子数组,和数组总和,那么ans=max(ans1,all-ans2);

对于二维左右联通情况,只要先纵向压缩为一维,然后再调用就好

对于二维上下联通情况,这里我想到了两种解决方法:一是可以在输入的时候将原来的数组转置,那么就变成了求左右联通的情况;二是可以在纵向压缩的时候不必保证上界小于下界,当枚举的下界小于上界的时候,此时的getsum求得的和其实是总的和减去上下界之间的和,然后情况又变成了普通的二维情况

 void maxsum3()//左右联通情况的最大子数组
{
init2();
int sum1=sum[][];
int sum2=sum[][];
int all=sum[][];
int tempmin=sum[][];
int tempmax=sum[][];
int ans=sum[][];
for(int i=;i<=row;i++)
{
for(int j=i;j<=row;j++)
{
sum1=sum2=tempmin=tempmax=all=getsum(i,,j,);
for(int k=;k<=col;k++)
{
int temp=getsum(i,k,j,k);
all+=temp;
sum2=min(sum2+temp,temp);
/*
if(sum2<0)
{
sum2+=temp;
}
else
{
sum2=temp;
}
*/
tempmin=min(tempmin,sum2);
sum1=max(sum1+temp,temp);
/*
if(sum1>0)
{
sum1+=temp;
}
else
{
sum1=temp;
}
*/
tempmax=max(tempmax,sum1);
}
ans=max(max(tempmax,all-tempmin),ans);
if(tempmin==all)
{
ans=max(ans,tempmax);
}
}
}
printf("%d\n",ans);
}

对于游泳圈的情况,就是把前两种总和起来考虑就好

 void maxsum5()//游泳圈形状的最大子数组
{
init2();
int sum1=sum[][];
int sum2=sum[][];
int all=sum[][];
int tempmin=sum[][];
int tempmax=sum[][];
int ans=sum[][];
for(int i=;i<=row;i++)
{
for(int j=;j<=row;j++)
{
sum1=sum2=tempmin=tempmax=all=getsum(i,,j,);
for(int k=;k<=col;k++)
{
int temp=getsum(i,k,j,k);
all+=temp;
sum2=min(sum2+temp,temp);
/*
if(sum2<0)
{
sum2+=temp;
}
else
{
sum2=temp;
}
*/
tempmin=min(tempmin,sum2);
sum1=max(sum1+temp,temp);
/*
if(sum1>0)
{
sum1+=temp;
}
else
{
sum1=temp;
}
*/
tempmax=max(tempmax,sum1);
}
ans=max(max(tempmax,all-tempmin),ans);
if(tempmin==all)
{
ans=max(ans,tempmax);
}
}
}
printf("%d\n",ans);
/*
for(int i=1;i<=row;i++)
{
int len=(i>1?row-1:row);
for(int j=i;j-i<len;j++)
{
int begin=1;
int temp=0;
for(int end=1;end<col*2&&begin<=col;end++)
{
if(end-begin>=col)
{
end=++begin;
temp=0;
}
temp=max(0,temp+sum[j][end]-sum[i-1][end]);
if(temp<=0)
{
begin=end+1;
}
if(temp>ans)
{
ans=temp;
}
}
}
}
printf("%d\n",ans);
*/
}

对于联通块,我的朴素解法已经在上面说明了,对于更高效率的插头dp解法我不会

 bool check(int x,int y)
{
if(x<||x>=row||y<||y>=col)
{
return false;
}
else
{
return true;
}
}
void dfs(int x,int y,int choice)
{
visit[x][y]=;
for(int i=;i<;i++)
{
int tx=choice?(x+dx[i]+row)%row:x+dx[i];
int ty=choice?(y+dy[i]+col)%col:y+dy[i];
if(check(tx,ty)&&!visit[tx][ty]&&bit[tx][ty])
{
dfs(tx,ty,choice);
}
}
}
void anotherwork(int choice)
{
int ans=-INF;
for(int i=;i<row;i++)
{
for(int j=;j<col-;j++)
{
if(scanf_s("%d,",&map[i][j])!=)
{
printf("input matrix wrong!\n");
exit();
}
}
if(scanf_s("%d",&map[i][col-])!=)
{
printf("input matrix wrong!\n");
exit();
}
}
int N=row*col;
for(int i=;i<(<<N);i++)//枚举2^nm种状态
{
for(int j=;j<row;j++)
{
for(int k=;k<col;k++)
{
visit[j][k]=;
bit[j][k]=;
}
}
for(int j=;j<N;j++)
{
bit[j/col][j%col]=(i&(<<j))>>j;
}
bool ok=true;
for(int j=;j<row;j++)
{
if(!ok)
{
break;
}
for(int k=;k<col;k++)
{
if(bit[j][k])//找到第一个1点进行dfs标记该联通块
{
dfs(j,k,choice);
ok=false;
break;
}
}
}
ok=true;
for(int j=;j<row;j++)
{
if(!ok)
{
break;
}
for(int k=;k<col;k++)
{
if(bit[j][k]&&!visit[j][k])
{
ok=false;
break;
}
}
}
int s=-INF;
if(ok)
{
s=;
for(int j=;j<row;j++)
{
for(int k=;k<col;k++)
{
if(bit[j][k])
{
s+=map[j][k];
}
}
}
ans=max(ans,s);
}
}
printf("%d\n",ans);
}

PS:作业有要求对于错误输入要能够正确处理,结果我写了一个巨长的处理函数处理了未输入指定分隔符;输入数据不够多;输入数据太多===是不是想太多了..

现代程序设计 homework-02的更多相关文章

  1. 标准C程序设计七---02

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  3. vs2015c++/MFC入门知识全集/实例规范书籍视频下载孙鑫c++对话框计算器基础控件使用教程系列

    VIP教程可免费看.可免费下载前部分试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 本课程目录 67章 [MFC项目开发第01天]Wind ...

  4. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  5. python奇闻杂技

    第一天 01 从计算机到程序设计语言 02 python环境配置 03 实例一:温度转换 04 python语法分析 第二天 01 深入理解python语言 02 实例二,python蟒蛇配置 03 ...

  6. 2012年游戏软件开发独立本科段01B0815自考科目

    01B0815自考科目 课程代码[学分] 课程名称 03708[02] 中国近现代史纲要 03709[04] 马克主义基本原理概论 03684[10] 综合英语(四) 01042[05] 应用数学 0 ...

  7. 20145219 《Java程序设计》第02周学习总结

    20145219 <Java程序设计>第02周学习总结 教材学习内容总结 类型:基本类型.类类型(参考类型) 基本类型: 整数:short占2字节,int占4字节,long占8字节 字节: ...

  8. js程序设计02——变量、作用域问题

    首先,ECMAScript中的数据类型分为基本类型.引用类型,基本类型的访问操作是按值的.引用类型的值是保存在内存中的对象,操作对象时,实际上操作的是对象的引用,而非对象自身.“javascript高 ...

  9. 20145218 《Java程序设计》第02次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 一.实验内容 初步掌握单元测试和T ...

  10. 读书笔记(02) - 可维护性 - JavaScript高级程序设计

    编写可维护性代码 可维护的代码遵循原则: 可理解性 (方便他人理解) 直观性 (一眼明了) 可适应性 (数据变化无需重写方法) 可扩展性 (应对未来需求扩展,要求较高) 可调试性 (错误处理方便定位) ...

随机推荐

  1. swift protocol 见证容器 虚函数表 与 动态派发

    一.测试代码: //protocol DiceGameDelegate: AnyObject { //} // //@objc protocol OcProtocol{ //    @objc fun ...

  2. 2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描 原理与实践说明 实践原理 实践内容概述 基础问题回答 实践过程记录 各种搜索技巧的应用 DNS IP注册信息的查询 ...

  3. pek (北大oj)3070

    思路:矩阵快速幂, 二分加速 #include<cstdio> #include<cstring> #define ll long long #define mod 10000 ...

  4. 一个非常好的php实现手机号归属地查询接口类

    前一阵子看到了一个非常好的php手机归属地查询的类,写的很精简,查询也很精确!大致代码是这样的: <?php header("Content-type:text/html;charse ...

  5. 关于Java并发编程的总结和思考

    编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更 ...

  6. [转]Win7 + Ubuntu 18.04 LTS (Bionic Beaver)双系统安装方法

    这里介绍在win7的基础上,安装ubuntu 18.04 LTS,实现双系统启动. 首先,假设你已安装了windows 7系统. 一. 制作ubuntu U盘启动盘. 方法见http://blog.p ...

  7. PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  8. 【Codeforces Round 1110】Codeforces Global Round 1

    Codeforces Round 1110 这场比赛只做了\(A\).\(B\).\(C\),排名\(905\),不好. 主要的问题在\(D\)题上,有\(505\)人做出,但我没做出来. 考虑的时候 ...

  9. <转>聊聊持续集成

    从别处看到了一篇关于持续集成的文章,个人感觉蛮不错的,分享给大家... 原文链接:对于持续集成实践的常见问题解答 1.什么是持续集成? 集成,就是一些孤立的事物或元素通过某种方式集中在一起,产生联系, ...

  10. python游戏开发之俄罗斯方块(一):简版

    编程语言:python(3.6.4) 主要应用的模块:pygame (下面有源码,但是拒绝分享完整的源码,下面的代码整合起来就是完整的源码) 首先列出我的核心思路: 1,图像由"核心变量&q ...