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