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

 Github地址:https://github.com/LuoAiyue/031702601 git

(只能用於三宮格的菜鳥代碼)github

PSP表格數組

PSP 預估耗時(小時) 實際耗時(小時)
計劃 1 0.5
估計這任務須要多少時間 27 19
開發 3 2
需求分析 3 1
生成設計文檔 1 2
設計複審 2 0.5
代碼規範 1.5 0.5
具體設計 2 0.5
具體編碼 6 3
代碼複審 3 5
測試 2 2
報告 1 1
測試報告 1 0.5 
計算工做量 1 0.5
過後總結,並提出過程改進計劃 0.5 0.5
合計  27  19

由於此次只作了三宮格的,因此實際完成時間比預計少不少函數

 

個人解題思路工具

解三宮格數獨學習

一、找出盤面上已知兩個數的兩行兩列,把這兩個交叉點填上測試

二、遍歷全部行,碰見有兩格已知點的,就把剩下一格補上,有的行全空的,就跳過編碼

三、遍歷全部列,把每一列剩下那格補上spa

 

 

上代碼設計

int a[3][3];                    //用來存放錶盤的二維數組
int row[2] = { 0 };             //用來存放已知數的行
int line[2] = { 0 };            //用來存放已知數的列
int b[2];                       //用來存放已知點
const int c[3] = { 1,2,3 };

 

這個是輸入函數

 1 void input()
 2 {
 3     FILE* fp1;
 4     fp1 = fopen("input.txt", "r");
 5 
 6     for (int i = 0; i < 3; i++)
 7     {
 8         for (int j = 0; j < 3; j++)
 9         {
10             
11             fscanf(fp1, "%d", &a[i][j]);
12             if (a[i][j] != 0)                //找出已知點,並記錄下它們的行和列
13             {
14                 row[t] = i;
15                 line[t] = j;
16                 b[t] = a[i][j];
17                 t++;
18             }
19         }
20     }
21 }

 

這個是填上交叉點的函數

void search()
{
	int y = 6;
	for (int i = 0; i < 2; i++)
	{

		for (int j = 0; j < 3; j++)
		{
			if (b[i] == c[j])
				y = y - c[j];
		}
	}
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			if (a[row[i]][line[j]] == 0)
			{
				a[row[i]][line[j]] = y;
			}
		}
	}

}

 

行遍歷函數

void hang()
{
	int y = 6;
	for (int i = 0; i < 3; i++)
	{
		int temp = 0;                                //計數菌 
		for (int j = 0; j < 3; j++)            
		{
			if (a[i][j] != 0)
				temp++;
		}
		if (temp == 2)                              //找出有兩個已知數的行
		{
			for (int k = 0; k < 3; k++)         //找出剩下那個數
			{
				if (a[i][k] != 0)
				{
					y = y - a[i][k];
				}
			}

			for (int f = 0; f < 3; f++)         //將剩下那個數填入空格中
			{
				if (a[i][f] == 0)
				{
					a[i][f] = y;
				}

			}
			y = 6;                              //每一重循環完畢,記得把y歸爲6             

		}
		else
			continue;
	}
}

 

列遍歷和行遍歷類似,因此不放代碼了。

我在這裏定義了一個臨時變量y,用來計算空缺的那個數。由於恰好1+2+3=6,減去已知的數字,結果就是未知的那個。(運氣好,恰好遇到這種狀況,因此這隻能用於三宮格)

以前個人方法是遇到已知數,而後把c數組裏面的那個已知數置0,而後一個小循環把非0的那個數找出來,就是未知數。可是問題來了,後面這個c數組就不能變回{1,2,3},就不能繼續用了,就算我在第一重循環下面加了個int c[3]={1,2,3};也沒用。

後面我又想了一下,不如把c數組看成「工具人」,就用來比較是否相等,再在這函數裏定義一個同爲{1,2,3}的數組,用來修改成0。可是這個在函數裏定義的數組,也是和c數組同樣的啊,二重循環一次事後回不到初始狀態了,被本身蠢到了。

而後我又想到,既然未知數是0,那麼拿來和{1,2,3}比較,已知數確定能找到相等的,找不到相等的就是未知數咯。愚蠢的我忘記這是個二重循環,假如已知數中有個3,那麼它和1比較,確定不相等啊,就被看成未知數處理了。(再一次被本身蠢到,double kill)

 

 

我爲何這麼執着於在數組裏改數據呢,由於這樣就能夠應用到5宮這種7宮這種不用考慮宮的環境啦。

 

可能有人會說,既然你找未知數的方法都同樣,那爲何不寫個函數而後調用呢?我開始就是這麼寫的,可是出了點問題,致使傳遞參數的時候出現語法錯誤,順着這錯誤百度了一下也沒找到結果,由於趕時間因此就選擇了沒調用。只能怪本身曾經基礎沒打好啊。(因此菜是原罪= =)

 

代碼調試階段

 

 

 

 

 

測試樣例

 

 

 

 

 

 

總的來講,雖然代碼簡單,黑貓白貓,能捉到老鼠就是好貓。此次代碼全是本身的思路(由於簡單,百度上搜了下都是玩九宮格那些大佬),遇到問題也是本身一點一點悟出來的,沒有問同窗,對於我來講真的很可貴了TAT。此次代碼體驗深深感覺到沒打好基礎是什麼後果。後面的學習要更加努力鞭策本身,嚴格執行第二次做業的學習計劃。(流下了不學無術的眼淚)

相關文章
相關標籤/搜索