软件工程实践2019第三次作业

1.Github项目地址

(https://github.com/Arno1999wu/homework)

2.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1520
Estimate估计这个任务需要多少时间1520
Development开发6001090
Analysis需求分析 (包括学习新技术)180210
Design Spec生成设计文档00
Design Review设计复审00
Coding Standard代码规范 (为目前的开发制定合适的规范)00
Design具体设计3040
Coding具体编码210200
Code Review代码复审6040
Test测试(自我测试,修改代码,提交修改)120600
Reporting报告120180
Test Repor测试报告3050
Size Measurement计算工作量3040
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6090
合计7351290

3.思路

仅适用于三阶。
①对输入的数独逐行求和,第一个不为0的行即为第一个数所在,记录下第一个数3及其所在行,同理可找到第二个数2;
| 0 | 0 | 3 |
| 2 | 0 | 0 |
| 0 | 0 | 0 |


②对第二个数所在行进行逐列求和,和等于0即填入第一个数3,和等于第一个数即填入剩余的数1;
| 0 | 0 | 3 |
| 2 | 3 | 1 |
| 0 | 0 | 0 |


③回到第一个数所在行,逐列求和,和为第一个数即填入第二个数2,和为第二个数即填入剩余数1;
| 1 | 2 | 3 |
| 2 | 3 | 1 |
| 0 | 0 | 0 |


④到剩余行,每个空都为sum=6减去列求和的值;
| 1 | 2 | 3 |
| 2 | 3 | 1 |
| 3 | 1 | 2 |


当有多个数独时,传入一个参数n进行行的变换。
行求和函数

int row(int m, int *a, int r,int n)
{   
    int rsum = 0 , j;
    for (j = 0; j < m; j++)
        rsum += *(a + (__int64)r * m + 9 * (__int64)n + j);
    return rsum;
}

列求和函数

int column(int m, int *a, int c,int n)
{
    int csum = 0, i;
    for (i = 0; i < m; i++)
        csum += *(a + (__int64)m * i + 9* (__int64)n + c);
    return csum;
}

4.分析并消除所有的警告

VS2017通过以下步骤进行警告的分析
1797531-20190925223538348-914072099.png
分析后产生4条一类警告(C26451)
1797531-20190925223854472-496670574.png
1797531-20190925223916470-1408305036.png
通过以下操作消除了警告
1797531-20190925223940185-1345530999.png
1797531-20190925223959384-310842962.png

5.性能分析

1797531-20190925224148427-88365391.png
分析后发现从文件中读取数独耗费了太多cpu时间,但目前没想到方法改进
1797531-20190925224158336-1284727789.png

6.源代码

#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<math.h>
#include<string>

using namespace std;

//对行进行和处理
int row(int m, int *a, int r,int n)
{   
    int rsum = 0 , j;
    for (j = 0; j < m; j++)
        rsum += *(a + (__int64)r * m + 9 * (__int64)n + j);
    return rsum;
}
//

//对列进行和处理
int column(int m, int *a, int c,int n)
{
    int csum = 0, i;
    for (i = 0; i < m; i++)
        csum += *(a + (__int64)m * i + 9* (__int64)n + c);
    return csum;
}
//

int main(int argc,char *argv[])
{
    //三阶盘面
    int m = atoi(argv[2]);
    if (m == 3)//atoi->将字符串转换为整型
    {
        int i, j, n = 0, sum = 0;
        //从input中导入数独
        ifstream fin("input.txt");
        ofstream fout("output.txt");
        int a[100][3];
        for (i = 1; i <=  3*(atoi(argv[4])); i++)
            for (j = 0; j < 3; j++)
            {
                fin >> a[i - 1][j];
            }
        for (i = 1; i <= m; i++)
            sum += i;
        //

        //填数
        while (n < atoi(argv[4]))
        {
            int f_num = 0, s_num = 0, k = 0, r, c;
            for (i = 3 * n; (i - 3 * n) < m; i++)//找出第一个数的值及其所在行
            {
                r = row(3, (int*)a, i - 3 * n, n);
                if (r != 0)
                {
                    f_num = r;
                    k = i;
                    break;
                }
            }
            for (i = k + 1; (i - 3 * n) < m; i++)//找出第二个数的值
            {
                r = row(3, (int*)a, (i - 3 * n), n);
                if (r != 0)
                {
                    s_num = r;
                    break;
                }
            }
            for (j = 0; j < m; j++)//将第二个数所在行填满
            {
                c = column(3, (int *)a, j, n);
                if (c == 0)
                    a[i][j] = f_num;
                if (c == f_num)
                    a[i][j] = (sum - f_num - s_num);
            }
            for (j = 0; j < m; j++)//回到第一个数所在行填满
            {
                if (a[k][j] == 0)
                {
                    c = column(3, (int *)a, j, n);
                    if (c == f_num)
                        a[k][j] = s_num;
                    if (c == s_num)
                        a[k][j] = (sum - f_num - s_num);
                }
            }
            for (i = 0; i < m; i++)//将剩余一行填满
            {
                r = row(3, (int *)a, i, n);
                if (r == 0)
                {
                    for (j = 0; j < m; j++)
                    {
                        c = column(3, (int *)a, j, n);
                        a[i + 3 * n][j] = sum - c;
                    }
                }
            }
            //
            n++;
            //输出填好的数独
            if (n == atoi(argv[4]))
            {
                for (i = 1; i <=  30; i++)
                    for (j = 0; j < 3; j++)
                    {
                        fout << a[i - 1][j] << " ";
                        if (j == 2)
                        {
                            fout << endl;
                            if ((i % 3) == 0)
                                fout << endl;
                        }
                    }
                fin.close();
                fout.close();
                cin.get();
            }
            //
        }
        exit(0);
    }
    //
    else
        cout << "can't deal" << endl;
    return 0;
}

输入
1797531-20190925224040627-938679841.png
1797531-20190925224102265-1753951243.png
输出
1797531-20190925224120672-1557893824.png

7.总结收获

通过这次经历,学会了VS2017的基本使用、Github采集仓库文件夹及上传本地文件,C++的一些操作以及一些七七八八的东西,从没想过一周内可以学怎么多新知识,果然,压力也是动力。
我发现虽然有很多东西不懂,但只要锲而不舍的去查去学,总能有所收获。
通过这次,我深刻的体会到计划是多么重要,刚开始没计划,想到什么些什么,调我这次从三阶开始想,想到一个方法就很快开始写,写完之后才发现这个方法根本无法扩展到高阶,而时间又不允许重新开始写,
导致这次的结果只能解决三阶问题,而且调试的时候也很痛苦,以后一定得提前规划好。

转载于:https://www.cnblogs.com/wu1999/p/11588164.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值