第五次上機測驗-期末考
哈哈,我要死啦.jpg(指被期末弄死)
前言
這次用教室電腦比之前順利多了,我的codespace終於可以在剛打開的時候正常的跑,dev c++也正常運作。
因為如此,現在距離10點還有8分鐘左右,所以我打算來這邊打點東西。
起床的時候房間溫度21度,我忘記外面幾度了。
今天是1月3號,就是一個普通的涼涼天氣,但進到教室後,就開始覺得有點悶熱了。
現在在聽同學在跟老師爭論,因為上星期有出作業。
結果他說他不知道,以為只要單純練習。
我是覺得滿蝦的啦,畢竟課堂中都已經開作業區了,deadline也放在上面。
希望等等不要再印圖案了……
考後心得
總之考完之後先把這次的題目存下來= =
不然得到評分之後,想看題目又沒辦法看,也沒說不能存吧。
不用再印圖形了,就是我的回合了:]
這次再度變回所有功能放在同一個code裡面,但是一二功能算是有關聯的。
兩者一樣都是對矩陣做一些怪怪的事。
又是壓扁成一維陣列,又是把二位陣列強制壓扁成2x2的,老師是不是很喜歡接著同樣類型的題目出兩次啊。
第一部份
第一題滿普通的,要把二維陣列輸出成一維陣列,應該比輸出二維簡單吧?(如果會輸出二維陣列的話)
雙層for迴圈,把第一層for迴圈最後的\n
去掉就好了。
這邊我把它弄成function,在輸出的同時,順便把它弄成一個一維陣列,方便等等去找裡面重複的數字。
再來是判斷重複的數字,我是再開一個陣列去裝重複數字,每次要放抓到的重複數字進去時,用for迴圈檢查裡面放過這個數字了沒。
有點懶,所以直接幫裝重複數字的陣列,宣告成跟一維陣列一樣長。(原本想除以二,但不知道為什麼宣告的時候出錯,考試的時候沒心情debug就這樣處理ㄌ)
因為長度不是宣告剛好的長度,因此不能把重複數字陣列整個輸出,另外用了一個變數去紀錄有幾個重複數字。
用for迴圈輸出時就輸出那麼長就好,避免把後面怪怪的東西輸出出來。
第二部分
我覺得第二部份相較於第一部份難一點點,需要思考for迴圈的中止條件。
不過拿一張紙畫一畫,就清楚很多了。
多虧我的背包裡有一些奇怪的廢紙,還有背著背包就會有的鉛筆盒。
直接現場挖出來畫,有種回到以前的感覺,之前解題的時候其實都會配紙一起想,但上這堂課的時候都沒有這樣做。
再來把code抄上去就行了。
其實在解這題的時候我遇到一個小問題,我在想把範圍框出來之後,他是以什麼奇怪的規律去選擇要的數字的?
因為第一個範例是3x3矩陣,好像有點規律。
但是下一個範例是大許多的矩陣,雖然數字看起來位置有點規律,但跟3x3的那題看起來一點關係都沒有。
再回去好好看一次題目,才發現要找的是裡面最大的數字。
要看英文題目,就是這個樣子啊……
兩題總結
在寫的時候,發現很多東西可以偷之前寫的code(x
可以正大光明的從之前寫好的code借用過來,體現function的方便性(o
所以可以發現,變數的宣告方式,明明兩者的功能有點類似,但宣告的方式好像有點不同。
是的,因為我太懶ㄌ。
只要會跑,就是一個好code(o
還有原本其實是想要盡量把功能都寫成function,但就遇到一些報錯,就乾脆直接不寫function了。
再來在code裡面,可以發現switch前,有一個奇怪的小地方,先宣告了case1裡面要用的變數。
沒錯,那同樣是因為我遇到bug,在裡面宣告不了,在外面就OK,乾脆就丟到外面的東西:)
這次的註解寫了非常多,或是該說複製貼上非常多,避免助教又說註解可以再寫多一點。
幾乎每行都送上註解,應該夠多了吧。
然後又發現剪剪貼貼的過程中,不小心貼錯了一些東西。
這次沒有遇到範圍宣告不周的問題了,因為題目自己有表示範圍要設定多少,所以在寫的時候都有準備好。
還有一點,這個矩陣裡面的數字,要求隨機生成1~99。
不過要檢查檢查重複功能有沒有問題時,1~99很難剛好生出那麼多個重複數字。
也是因為運氣好,某次剛好生了三個一樣的數字,我才覺得應該要檢查之前有沒有出現過。
在把功能寫好之後,再也沒有遇到一樣的狀況,沒辦法測試。
不過把隨機生成的數字,範圍改得小一點就很容易重現了。
想到這點的時候我覺得自己很聰明ouo
code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void rand_array(int square, int array2D[square][square]);
void print_array(int square, int array2D[square][square]);
void flattened(int dimension, int length, int matrix[dimension][dimension], int flattened_matrix[length]);
void menu();
void initialized(int length, int array[length]);
int main()
{
int dimension;
while (1)
{
printf("Enter the dimension of the matrix: ");
if (scanf("%d", &dimension) != 1 || dimension<3 || dimension>10) // check input
{
printf("range must 3 to 10.\n");
// clear input buffer
while (getchar() != '\n');
}
else
break;
}
int matrix[dimension][dimension];
printf("Generated %d x %d matrix:\n", dimension, dimension);
rand_array(dimension, matrix);
print_array(dimension, matrix);
int choose;
while(1)
{
menu();
scanf("%d", &choose);
if(choose==3)
{
printf("Program exited.\n");
break;
}
// for case1
int length;
length=dimension*dimension;
int new_matrix[length];
int duplicate[length];
initialized(length, duplicate);
//
switch(choose)
{
case 1:
printf("\n");
printf("Flattened matrix:\n");
flattened(dimension, length, matrix, new_matrix);
printf("\n");
// check duplicate
int i, j, counter_1=0, counter_2=0; // counter_1 count duplicate(array) location, counter_2 to count how many duplicate
int control=0;
for (i=0;i<length;i++) // interate all element in array
{
for (j=i+1;j<length;j++) // interate all element after that
{
if (new_matrix[i] == new_matrix[j]) // find duplicate
{
for(int p=0;p<length;p++) // interate all element in duplicate array
{
if(duplicate[p]==new_matrix[i])
control=1;
}
if(control==0) // check no same duplicate
{
duplicate[counter_1]=new_matrix[i]; // add to duplicate array
counter_1++; // go to duplicate array's next location
counter_2++; // count how many duplicate
}
control=0;
}
}
}
printf("Duplicated value(s):\n");
if(counter_2>0)
{
for(int i=0;i<counter_2;i++)
printf("%d ",duplicate[i]);
printf("\n");
}
else
printf("None\n");
break;
case 2:
printf("\n");
printf("Original matrix:\n");
print_array(dimension, matrix);
printf("\n");
printf("Compressed matrix:\n");
int compressed_matrix[2][2];
int big=0;
// up left
for(int i=0;i<=dimension-2;i++) // iterate up left matrix row
{
for(int j=0;j<=dimension-2;j++) // iterate up left matrix col
{
if(matrix[i][j]>big) // find bigest number
big=matrix[i][j];
}
}
compressed_matrix[0][0]=big; //put bigest number into compressed matrix
big=0; //initalize big checker
//up right
for(int i=0;i<=dimension-2;i++) // iterate up right matrix row
{
for(int j=1;j<=dimension-1;j++) // iterate up right matrix col
{
if(matrix[i][j]>big) // find bigest number
big=matrix[i][j];
}
}
compressed_matrix[0][1]=big; //put bigest number into compressed matrix
big=0; //initalize big checker
//down left
for(int i=1;i<=dimension-1;i++) // iterate down left matrix row
{
for(int j=0;j<=dimension-2;j++) // iterate down left matrix col
{
if(matrix[i][j]>big) // find bigest number
big=matrix[i][j];
}
}
compressed_matrix[1][0]=big; //put bigest number into compressed matrix
big=0; //initalize big checker
//down right
for(int i=1;i<=dimension-1;i++) // iterate down right matrix row
{
for(int j=1;j<=dimension-1;j++) // iterate down right matrix col
{
if(matrix[i][j]>big) // find bigest number
big=matrix[i][j];
}
}
compressed_matrix[1][1]=big; //put bigest number into compressed matrix
print_array(2, compressed_matrix);
break;
default:
printf("here is no this option.\n");
break;
}
}
} // end main
//function
//rand all element
void rand_array(int square, int array2D[square][square])
{
srand(time(NULL)); //random seed
for(int i=0;i<square;i++) // iterate over each row
{
for(int j=0;j<square;j++) // iterate over each column
array2D[i][j]=rand()%99+1; // random value between 1 and 99 to each element
}
}
//print array
void print_array(int square, int array2D[square][square])
{
for(int i=0;i<square;i++) // iterate over each row
{
for(int j=0;j<square;j++) // iterate over each column
{
if(array2D[i][j]<10)
printf(" %d ", array2D[i][j]); // print <10 element head and followed by a space
else
printf("%d ", array2D[i][j]); // print >=10 element followed by a space
}
printf("\n"); // print a newline after each row
}
}
void menu()
{
printf("\n");
printf("Menu:\n");
printf("1. Flatten matrix\n");
printf("2. Compress matrix\n");
printf("3. Exit\n");
printf("Enter your option: ");
}
void flattened(int dimension, int length, int matrix[dimension][dimension], int flattened_matrix[length])
{
int counter=0;
for(int i=0;i<dimension;i++) // iterate over each row
{
for(int j=0;j<dimension;j++) // iterate over each column
{
printf("%d ", matrix[i][j]); // print >=10 element followed by a space
flattened_matrix[counter]=matrix[i][j];
counter++;
}
}
}
//initialize all elements to 0
void initialized(int length, int array[length])
{
for(int i=0;i<length;i++)
array[i]=0;
}