# 實習上機考 ### 第一題: ``` c #include<stdio.h> void sort(int arr[], int len) { //bubble sort for(;len > 0; --len) { for(int i = 0; i < len - 1; ++i) { if(arr[i] > arr[i + 1]) { int tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; } } } return; } void search(int arr[], int len, int target) { //linear search and find left, right bound int start = -1; int end = -1; int i = 0; //loop will run untill current number is "bigger" than our target while(arr[i] <= target && i < len) { if(arr[i] == target) { if(start == -1) { //if left bound is not iniitial start = i; end = i; } else { end = i; } } i++; } //check if target found if(start == -1 && start == -1) { printf("Target %d Not Found!", target); } else { printf("Target %d is from index %d to %d", target, start, end); } return; } int main() { int len; printf("Please input the array size: "); scanf("%d", &len); printf("Please input array: "); int arr[50] = {0}; for(int i = 0; i < len; ++i) { scanf("%d", arr + i); } sort(arr, len); int target = 0; printf("The array after order:\n"); for(int i = 0; i < len; ++i) { printf("%d ", arr[i]); } printf("\nPlease input target number: \n"); scanf("%d", &target); search(arr, len, target); return 0; } ``` 特別注意1.2 直接用linear search 就好,程式衡量標準絕對不是只執行效率 還包含了可讀性、可維護性、記憶體占用...等等 這題如硬要用binary search我認為得不償失。 ### 第二題: 在開始之前有個觀念大家一定要清楚。 還記得我們上課有提到,其實`char也是一種數字`。 For example: ```c char c = 'A'; printf("%d", c); ``` 這時候會印出65(大寫A的ASCII Code)。 所以其實char存在電腦裡面依然是數字的形式,只不過印出來的時候經過編碼而已。 解題思路很單純,就用一個大小為26的陣列,去儲存每一個字母的出現次數。 很直觀的,我們希望把a的次數放在index 0, b的次數放在index 1, c在index 2... 依此類推。 那我們要怎麼建構26個字母的陣列index。 For example: 今天讀到字母'f',我們可以用'f' - 'a' = 5(因為f是第6個字母)當作存f的陣列index。 所以我們迴圈內計算出現頻率的code會像是這樣: ```c char C = input[i]; freq[C - 'a']++; ``` 這樣我們跑完迴圈就會很容易得到所有字母的出現頻率。 完整的code 如下: ```c #include <stdio.h> int main() { printf("Please input string:\n"); char string[100] = {'\0'}; scanf("%s", string); int maxinum = 0; int freq[26] = {0}; char most = '\0'; for(int i = 0; string[i]; ++i) { char C = string[i]; freq[C - 'a']++; if(freq[C - 'a'] > maxinum) { maxinum = freq[C - 'a']; most = C; } } printf("%c %d", most, maxinum); return 0; } ``` ### 總結 另外,發現大家因位不太會用debugger,所以上機的時候花了大量的時間在找Bug。 直白的說,如果沒有Dubugger,抓蟲就跟通靈沒什麼區別,所以大家一定要善用啊!!!! 附上code block debugger的使用方法: https://www.youtube.com/watch?v=HghfCpOcfF0 祝大家期末快樂通通歐趴,下禮拜正課上機考分數很重,大家加油啊~~~ 有任何問題歡迎聯絡任何助教