---
# System prepended metadata

title: 實習上機考

---

# 實習上機考
### 第一題:
``` 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  
祝大家期末快樂通通歐趴，下禮拜正課上機考分數很重，大家加油啊~~~  
有任何問題歡迎聯絡任何助教