使用者工具

網站工具


c:2026spring:hw9

國立屏東大學 資訊工程系 程式設計(一)

草稿 完成

Turnin作業9

  • chapter 16
  • Turnin Code: c.hw9
  • Due Date: 2026/06/10 23:59 Hard Deadline

繳交方式說明

本次作業繳交將以資料夾的形式繳交,需要為每一題建立一個資料夾(資料夾名稱為該題題目前方之代號,第一題為「p1」,第二題為「p2」,餘以此類推),

繳交說明可參考作業3:連結

任何未依照正確繳交格式的檔案將以 0 分計算

本文使用「▴」及「↵」代表「空白字元」與「Enter 換行字元」,並且將使用者輸入的部份使用灰階方式顯示。 另外,題目的執行結果中,如果出現「(」、「)」、「:」、「;」、「.」與「,」等符號,皆為英文半形!


P1 泛型大小判斷

在 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;
}


待同學實作完畢後,請將以下巨集的實作:

  • max()
  • min()

放入以下檔案並繳交:

  • compare.h:含有上述函式的宣告與定義。

另外,本題目使用以下 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]

  • 本題相關的程式碼路徑已註明於檔名右側,同學們可以透過路徑複製到自己的家目錄。
  • 本題將以上述提供的 Makefile 進行編譯,請同學作答時 “以題目提供的文件為主”
  • 本題應繳交檔案如下(main.cMakefile 則不需繳交):
    • compare.h

P2 forEach 迴圈

在較為近代的程式語言中,如 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;
}


待同學實作完畢後,請將以下巨集的實作:

  • forEach()

放入以下檔案並繳交:

  • forEach.h:含有上述函式的宣告與定義。

另外,本題目使用以下 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]

  • 本題相關的程式碼路徑已註明於檔名右側,同學們可以透過路徑複製到自己的家目錄。
  • 本題將以上述提供的 Makefile 進行編譯,請同學作答時 “以題目提供的文件為主”
  • 本題應繳交檔案如下(main.cMakefile 則不需繳交):
    • forEach.h

p3 五子棋-決賽

經歷第二次的預賽,相信同學已經知道自己五子棋的棋力,請同學持續修改並增進自己的五子棋程式。

同學修改完後,請將修改完的五子棋重新上傳至平台:國立屏東大學資工系電腦五子棋 AI 競賽平台上(同樣使用gomoku2026為turnin code)。所有參賽同學的作品將進行兩兩對奕比試10場,其中5場先手,5場後手,勝負記點採用:勝者2分、平手1分、敗者0分(每局獲勝規則為:黑子先行,五子連線為勝利)。預賽完成後依最終每位參賽同學所得到的分數給定此次作業配分:

  • 8%:本題分數 $\times 8$
  • 20%:本題分數 $\times 4$
  • 50%:本題分數 $\times 2$
  • 95%:本題分數 $\times 1$
  • 未上傳者編譯錯誤 將以 0分 計算
  • 本題請使用gomoku2026作為turnin code上傳至參賽平台檢查是否能夠由平台順利完成編譯 即完成本題目,請不要繳交至c.hw9
  • 請勿過度使用AI撰寫,若是助教發現疑似使用AI撰寫,將會約談同學。
  • 約談過程中,若對本人繳交之代碼內容回答模糊、邏輯不通,將會取消同學分數,並以0分計。
c/2026spring/hw9.txt · 上一次變更: 2026/06/04 05:43 由 zhengxuan

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki