國立屏東大學 資訊工程系 程式設計(一)
草稿 完成
本次作業繳交將以資料夾的形式繳交,需要為每一題建立一個資料夾(資料夾名稱為該題題目前方之代號,第一題為「p1」,第二題為「p2」,餘以此類推),
繳交說明可參考作業3:連結
任何未依照正確繳交格式的檔案將以 0 分計算
本文使用「▴」及「↵」代表「空白字元」與「Enter 換行字元」,並且將使用者輸入的部份使用灰階方式顯示。
另外,題目的執行結果中,如果出現「(」、「)」、「:」、「;」、「.」與「,」等符號,皆為英文半形!
在 C 語言中,如果要透過函式邏輯運算時,往往需要實作許多不同型態但功能相同的函式,而巨集就提供了類似於模板的作法,讓編譯器能夠依據傳入的數值進行代換。
因此本題需要請同學設計一個標頭檔 compare.h,裡面含有關於 max() 跟 min() 的巨集供以下 main.c 所呼叫:
#include <stdio.h>
#include <string.h>
#include "compare.h"
int main()
{
char method[4];
int a = -1, b = 42;
double x = 3.14, y = 13.718;
scanf(" %s", method);
if (strcmp(method, "min") == 0)
{
printf("min(%lf, %d) = %lf\n", x, a, min(x, a));
printf("min(%d, %lf) = %lf\n", b, y, min(b, y));
}
else if (strcmp(method, "max") == 0)
{
printf("max(%lf, %d) = %lf\n", x, a, max(x, a));
printf("max(%d, %lf) = %lf\n", b, y, max(b, y));
}
else
{
printf("Invalid method\n");
return 1;
}
return 0;
}
待同學實作完畢後,請將以下巨集的實作:
放入以下檔案並繳交:
另外,本題目使用以下 Makefile 進行批改:
all: main.c compare.h gcc main.c clean: rm -rf *.*~ *~ a.* *.o *.o~
輸出結果可以參考如下:
[3:23▴user@ws▴p1]▴./a.out↵
max↵
max(3.140000,▴-1)▴=▴3.140000↵
max(42,▴13.718000)▴=▴42.000000↵
[3:23▴user@ws▴p1]▴./a.out↵
min↵
min(3.140000,▴-1)▴=▴-1.000000↵
min(42,▴13.718000)▴=▴13.718000↵
[3:23▴user@ws▴p1]
在較為近代的程式語言中,如 Python, C++ 或 Rust等,都有提供一個名為 for-each 的函式或語法,其作用則是為了無需像傳統的 for 迴圈,透過索引值的方式,依序對陣列元素進行存取。
但是在 C 語言,我們也可以透過巨集的方式進行實作,因此本題需要請同學設計一個標頭檔 forEach.h 供以下 main.c 所呼叫:
請參考以下 main.c 的內容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "forEach.h"
#define lastItem(arr) (arr + sizeof(arr) / sizeof(arr[0]) - 1)
#define firstItem(arr) (arr)
int main()
{
char type[7];
scanf(" %s", type);
if (strcmp(type, "int") == 0)
{
int arr[] = {1, 2, 3, 4, 5};
forEach(int, item, arr)
{
if (item != firstItem(arr))
{
printf(", ");
}
printf("%d", *item);
}
}
else if (strcmp(type, "double") == 0)
{
double arr[] = {1.1, 2.2, 3.3, 4.4, 5.5};
forEach(double, var, arr)
{
if (var != firstItem(arr))
{
printf(", ");
}
printf("%lf", *var);
}
}
else if (strcmp(type, "str") == 0)
{
char* arr[] = {"Hello", "World", "C", "Programming", "Language"};
forEach(char*, element, arr)
{
if (element != firstItem(arr))
{
printf(", ");
}
printf("%s", *element);
}
}
else
{
printf("Invalid type\n");
return 1;
}
printf("\n");
return 0;
}
待同學實作完畢後,請將以下巨集的實作:
放入以下檔案並繳交:
另外,本題目使用以下 Makefile 進行批改:
all: main.c forEach.h gcc main.c clean: rm -rf *.*~ *~ a.* *.o *.o~
輸出結果可以參考如下:
[3:23▴user@ws▴p2]▴./a.out↵
int↵
1,▴2,▴3,▴4,▴5↵
[3:23▴user@ws▴p2]▴./a.out↵
double↵
1.100000,▴2.200000,▴3.300000,▴4.400000,▴5.500000↵
[3:23▴user@ws▴p2]▴./a.out↵
str↵
Hello,▴World,▴C,▴Programming,▴Language↵
[3:23▴user@ws▴p2]
經歷第二次的預賽,相信同學已經知道自己五子棋的棋力,請同學持續修改並增進自己的五子棋程式。
同學修改完後,請將修改完的五子棋重新上傳至平台:國立屏東大學資工系電腦五子棋 AI 競賽平台上(同樣使用gomoku2026為turnin code)。所有參賽同學的作品將進行兩兩對奕比試10場,其中5場先手,5場後手,勝負記點採用:勝者2分、平手1分、敗者0分(每局獲勝規則為:黑子先行,五子連線為勝利)。預賽完成後依最終每位參賽同學所得到的分數給定此次作業配分: