軟件工程實踐2019第三次做業

1、GitHub項目地址

https://github.com/noapanda/031702603ios


2、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

3、解題思路

一、從第一行開始行遍歷,找到空格,並遍歷空格所在的行和列,並記錄行列中大於0的數

二、若該空格的候選數惟一,則寫出,不然,跳過

三、固然,會出現一次遍歷填不完錶盤的狀況,因此利用一個死循環完成錶盤。當錶盤中的空格數爲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;
}

4、調試以及文本輸入輸出

以前出現了一個錯誤,就是在把錶盤寫入output.txt時,忘記打開文件了,就是語句

fp2 = fopen("output.txt", "a");

5、心路歷程與收穫

(自閉大鐘表演在線開花)

由於以前沒有玩過數獨,只是簡單瞭解過,好比《意林》雜誌倒數幾頁的「趣味數學」模塊,以及《愛情公寓》裏的數獨高手陸展博,等等。因此一接觸到此次的做業題目,下意識就想作作數獨題感覺一下,因而就下載了APP 「全民數獨」,作了60幾題以爲本身摸清楚規律了,而後就去作高難題,結果由於眼高手低,屢屢碰壁。不甘心的我決定去網上找找解題技巧(畢竟我以爲數獨遊戲仍是很燒腦的),因而發現了惟一法和候選數法。但我比較理解候選數法的解法因此就是用這種方法寫的實現多盤三宮格代碼。雖然她仍是個菜鳥,可是畢竟也是我在推翻一種種解法最後獲得的。最困擾個人除了代碼只能跑三宮格以及還沒來得及優化之外,就是vs編輯器的用法,其中上面出現的報錯就讓我頭疼了好久,多虧了舍友大大們幫學得已經長草的我debug,發現問題並解決後,心情真的就像荒草裏開花同樣明朗。此次的編程體驗,說實話對我來講影響不小,我也終於認清本身簡單事情複雜化、作事情總愛一股傻勁兒往前的壞毛病,固然仍是要再次感謝室友們,讓我再次真切的體會到協做的力量。學習是永無止境的,但同時也是有根據有計劃的,謹記於己。

相關文章
相關標籤/搜索