软件工程实践2019第三次作业
一、GitHub项目地址
https://github.com/noapanda/031702603
二、PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 900 | 1440 |
Development | 开发 | 180 | 200 |
Analysis | 需求分析 (包括学习新技术) | 100 | 200 |
Design Spec | 生成设计文档 | 30 | 60 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | 60 |
Design | 具体设计 | 120 | 180 |
Coding | 具体编码 | 60 | 90 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 300 |
Reporting | 报告 | 60 | 80 |
Test Repor | 测试报告 | 60 | 100 |
Size Measurement | 计算工作量 | 20 | 60 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 50 |
合计 | 870 | 1460 |
三、解题思路
1、从第一行开始行遍历,找到空格,并遍历空格所在的行和列,并记录行列中大于0的数
2、若该空格的候选数唯一,则写出,否则,跳过
3、当然,会出现一次遍历填不完表盘的情况,所以利用一个死循环完成表盘。当表盘中的空格数为0时,跳出循环。
#define _CRT_SECURE_NO_DEPRECATE
#include <fstream>
#include<iostream>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
int m, n;
FILE* fp1;
FILE* fp2;
m = atoi(argv[2]);//命令行输入的第三个参数:宫格阶级
n = atoi(argv[4]);//命令行输入的第五个参数:待解答盘面数目
//cin >> m >> n;
//以文本只读方式打开intput.txt
fp1 = fopen("input.txt", "r");
if (fp1 == NULL) //打开文件失败
return -1;
//打开output.txt,并立即关闭,目的:清空文本内容
fp2 = fopen("output.txt", "w");
if (fp2 == NULL) //打开文件失败
return -1;
fclose(fp2);//关闭文件
int i, j, k, num, w, p, q;
int sudoku[10][10];
int sign[4] = { 0 };//存放行列中已经出现的数,例如:某行或列出现3,则sign[3]=1
fp2 = fopen("output.txt", "a");
for (num = 0; num < n; num++)
{
//输入表盘的二维数组
for (i = 0;i < m; i++)
{
for (j = 0;j < m;j++)
{
fscanf(fp1, "%d", &sudoku[i][j]);
//cin >> sudoku[i][j];
}
}
while (1)
{
w = 0;
//判断表盘中是否还有空格
for (i = 0;i < m;i++)
{
for (j = 0;j < m;j++)
{
if (sudoku[i][j] == 0)
{
w++;
}
}
}
if (w == 0)//表示表盘已经填完
{
break;
}
for (i = 0;i < m;i++)
{
for (j = 0;j < m;j++)
{
if (sudoku[i][j] != 0)
continue;
//若该空格为填入,则进行行列遍历,找到已出现的数
if (sudoku[i][j] == 0)
{
//行遍历
for (q = 0;q < 3;q++)
{
if (sudoku[i][q] != 0)
{
sign[sudoku[i][q]] = 1;
}
}
//列遍历
for (q = 0;q < 3;q++)
{
if (sudoku[q][j] != 0)
{
sign[sudoku[q][j]] = 1;
}
}
p = 0;//p用于记录该空格的候选数数量
for (q = 1;q < 4;q++)
{
if (sign[q] == 0)//表示该空格所在行列中均没有q
{
p++;
k = q;
}
}
}
if (p == 1)
{
sudoku[i][j] = k;
//cout<<k<<endl;
}
//初始化sign[]
for (q = 0;q < 4;q++)
{
sign[q] = 0;
}
}
}
}
//输出完整表盘
for (i = 0;i < 3;i++)
{
for (j = 0;j < 3;j++)
{
fprintf(fp2, "%d ", sudoku[i][j]);
//cout << sudoku[i][j] << " ";
if (j == 2)
fprintf(fp2, "\n");
//cout << endl;
}
}
fprintf(fp2, "\n");
}
return 0;
}
四、调试以及文本输入输出
之前出现了一个错误,就是在把表盘写入output.txt时,忘记打开文件了,就是语句
fp2 = fopen("output.txt", "a");