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

1.Github项目地址

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

2.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 15 20
Estimate 估计这个任务需要多少时间 15 20
Development 开发 600 1090
Analysis 需求分析 (包括学习新技术) 180 210
Design Spec 生成设计文档 0 0
Design Review 设计复审 0 0
Coding Standard 代码规范 (为目前的开发制定合适的规范) 0 0
Design 具体设计 30 40
Coding 具体编码 210 200
Code Review 代码复审 60 40
Test 测试(自我测试,修改代码,提交修改) 120 600
Reporting 报告 120 180
Test Repor 测试报告 30 50
Size Measurement 计算工作量 30 40
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 90
合计 735 1290

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通过以下步骤进行警告的分析

分析后产生4条一类警告(C26451)


通过以下操作消除了警告

5.性能分析


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

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;
}

输入


输出

7.总结收获

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

posted @ 2019-09-25 22:43  伍1999  阅读(234)  评论(3编辑  收藏  举报