软工第二次作业

Github项目地址:

https://github.com/caidada/ruangong

遇到的困难及解决方法

困难描述+做过的尝试+是否解决

  • git出现问题,无法正常上传文件;
    重新下载配置,已解决
  • 不知道该怎么进行单元测试;
    好吧,还是没大看懂。
  • 太久没用C++,函数都忘了怎么用;
    一边看书一边敲,函数什么的就没怎么去用。
  • 性能低,生成速度慢
    试着优化了一些循环和计算,速度就变快了一些,写到文档里面变的更短了
    1216572-20170910160903476-383419304.png
  • 发现自己完全忘了怎么生成文档
    翻书+百度,解决。
  • visual studio 发生了一些故障,不能用,要哭了/(ㄒoㄒ)/,只能先用dev c++做,所以完全不知道哪里用时比较多,哪里需要优化
    重新下载了,性能分析那里还是提示有错误,大概是哪个文件没下载,只能看摘要。
    1216572-20170910182318444-1920403326.png

有何收获

  • 复习了下好久没有的c++;
  • 做之前有把《构建之法》的前三章看完,里面提到需求分析的重要性,所以试着在敲代码之前把要完成的每个功能分步设计,发现这么做下来具体编码的时间确实会缩短,而且出现bug也比较好修改,对比以前只是先粗略想了下就开始敲感觉好一些。
  • 小伙伴感情++,一起讨论如何解决遇到的问题,感觉很不错
  • 了解了visual studio 的基础用法
  • 解决了拖了好久的git问题

关键代码or设计说明

解题思路

根据题目,我们需要做的是生成N个 不重复 的 已解答完毕的 数独棋盘,于是我将其分成以下几步来实现

  • 设计一个生成数独的方式
    数独有9个宫格

    B1 | B2 | B3
    B4 | B5 | B6
    B7 | B8 | B9
    先确定第一个宫格B1的数,将每行进行对调后则生成第二个和第三个宫格,则前三个宫格为以下所示
    2 1 3 | 4 5 6 | 7 8 9
    4 5 6 | 7 8 9 | 2 1 3
    7 8 9 | 2 1 3 | 4 5 6
    再将前三个宫格每列对调后生成第四—九个宫格,全部宫格如下所示
    2 1 3 | 4 5 6 | 7 8 9
    4 5 6 | 7 8 9 | 2 1 3
    7 8 9 | 2 1 3 | 4 5 6
    ——————————
    1 3 2 | 5 6 4 | 8 9 7
    5 6 4 | 8 9 7 | 1 3 2
    8 9 7 | 1 3 2 | 5 6 4
    ——————————
    3 2 1 | 6 4 5 | 9 7 8
    6 4 5 | 9 7 8 | 3 2 1
    9 7 8 | 3 2 1 | 6 4 5

        for(i=0;i<3;i++)
    {
        k=(i+1)%3;                      //将第一宫格的数组向上移动一行变成第二个宫格 
        l=(i+2)%3;
        for(j=0;j<3;j++)              //将第一宫格的数组向上移动两行变成第三个宫格 
        {
            cout<<Block[i][j]<<" ";
        }
        for(j=0;j<3;j++)
        {
            cout<<Block[k][j]<<" ";
        }
        for(j=0;j<3;j++)
        {
            cout<<Block[l][j]<<" ";
        }
        cout<<endl;
        n++;
        if(i==2)
        {
            if(n==3||n==6)               //第4-6行是通过第1-3行进行向左移动一列生成的 
            {
                for(i=0;i<3;i++)          //第7-9行是通过第1-3行进行向左移动两列列生成的 
                {
                a=Block[i][0];          //暂存第一列的数 
                   for(j=0;j<3;j++)
                   {            
                    m=(j+1)%3;
                   Block[i][j]=Block[i][m];     
                   }
                Block[i][2]=a;
                
                }
                i=-1;
            }
        }
    }
  • 生成随机数
    定义一个一维数组,用2进行初赋值(学号%9+1=2),调用随机函数rand()
    for(i=1;i<9;i++)                                //从1开始,则r[0]就为初赋值的2了
    {
        r[i]=rand()%9+1;
        for(j=1;j<9;j++)
        {
            g=(i+j)%9;
            if(r[i]==r[g])                      //与已前几个随机数进行比较判断,若有相同,则重新生成
            {           
            r[i]=rand()%9+1;
                j=0;    
            }
        } 
    }
  • 生成随机个数独矩阵
    用万能的for循环来实现

  • 去除重复
    用数组记录已经生成的随机数,进行对比

   for(i=0;i<dd;i++)
  {
    for(j=0;j<9;j++)
    {
        if(r[j]==rr[i][j])     //若一个数相同rr_n1加1, 
        rr_n1++;        
    }
    if(rr_n1==9)              //当9个都相同,则此次生成的随机数不能使用,需要重新生成 
    rr_n2++;
    else
    rr_n1=0;
    }
  • 将生成的数独矩阵写到文档
freopen("sudoku.txt","w",stdout);

测试运行结果如下

1216572-20170910173518366-18744414.png
1216572-20170910160831038-1134939366.png

性能分析
1216572-20170910185121054-1753681095.png
程序除了rand函数,基本全是for和if循环,性能来讲确实很差,因为太久没用c++了,函数怎么用都忘了,已经尽力去减少使用循环,缩短程序运行时间,不过确实应该花点时间复习一下函数的用法,争取下次作业代码能优雅一些(命名好像也很烂?)。

PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1010
· Estimate· 估计这个任务需要多少时间1000920
Development开发9501020
· Analysis· 需求分析 (包括学习新技术)3020
· Design Spec· 生成设计文档20
· Design Review· 设计复审 (和同事审核设计文档)
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)
· Design· 具体设计6070
· Coding· 具体编码180160
· Code Review· 代码复审2010
· Test· 测试(自我测试,修改代码,提交修改)640760
Reporting报告90115
· Test Report· 测试报告75100
· Size Measurement· 计算工作量55
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划1010
合计10501135

学习进度条

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
11381383636复习了c++,了解了vs和git

对执行力和泛泛而谈的理解

我理解中的执行力是尽快完成所需要做的工作,也就是没有拖延症。目标说起来都很容易,每天泡两小时图书馆啊,每天写1000行代码,但真正要做的时候,想想又觉得算了,这就是泛泛而谈和喊口号。个人觉得这跟自己定的目标和自身现阶段的能力是否相匹配有很大关系,拿自己举例,大一曾跟小伙伴夸下海口,要把图书馆的书都看完,现在觉得十分的幼稚,分析一下,当时我立下目标时,更多想的是做完这件事之后的成就感,而不是做这件事情的过程,因此容易忽略掉例如时间不够、有些书没有看的必要等等本应考虑的问题。所以,我觉得要想提高执行力、改变泛泛而谈、喊口号的现状,更多的是看清自己,坦然接受自己的不足,如三分钟热度、拖延症等,然后合理的安排适合自己的时间,合理制定自己的目标,可能刚开始进步不大,但好歹比泛泛而谈好些吧。

感谢阅读( •̀∀•́ )

转载于:https://www.cnblogs.com/Akyy/p/7500022.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值