// 題目

時鐘時間物件

Clock Time Object・c-10-01

  • APCS 中級
  • 內建排序與自訂比較
  • C 程式設計入門・Structure

時間限制 2 秒・記憶體 250 MB

到 Aki-Judge 送出

送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。

題目敘述

請實作一個「時鐘時間」物件,時間由時、分、秒組成,並提供以下函式。只需提交 time.c,不要寫 main。

typedef struct Time {
	int hour;
	int minute;
	int second;
} Time;
void initTime(Time *time);
void setTime(Time *time, int hour, int minute, int second);
void addTime(Time *time, int hour, int minute, int second);
void printTime(Time *time);
  • initTime:把時間設成 00:00:00。
  • setTime:以 24 小時制設定時間。
  • addTime:加上一段時間。可能超過一天,此時要繞回去:例如晚上 11 點加 2 小時,結果是凌晨 1 點。
  • printTime:印出時間。若編譯時有定義 H24,用 24 小時制印出,例如下午 3 點 15 分印成 15:15:00;沒有定義 H24 時,用 12 小時制,同一個時間印成 03pm:15:00。

十二小時制的細節

  • 參考:wiki 12-hour clock
  • 00:15:30 在 12 小時制要印成 12am:15:30。
  • 12:15:30 在 12 小時制要印成 12pm:15:30。
  • 12 小時制的小時固定印兩位(不足補 0),分與秒也各印兩位。

編譯方式

同一份 time.c 會被編譯兩次,一次是 12 小時制版本,一次是加上 -DH24 並把函式改名為帶 24 的版本:

$ gcc -std=c99 -O2 -c main.c
$ gcc -std=c99 -O2 -c
.c -o h12.o
$ gcc -std=c99 -O2 -c
.c -o h24.o -DH24 -DinitTime=initTime24 -DsetTime=setTime24 -DaddTime=addTime24 -DprintTime=printTime24
$ gcc -std=c99 -O2 main.o h12.o h24.o
$ ./a.out

輸入格式

輸入第一行是整數 n,表示有 n 個時間物件,編號 0 到 n−1。接著是一連串指令,每個指令以一個字母開頭:

  • i x:對物件 x 呼叫 initTime。
  • s x h m s:對物件 x 呼叫 setTime。
  • a x h m s:對物件 x 呼叫 addTime。
  • p x:印出物件 x,先印 12 小時制,再印 24 小時制。

輸出格式

每個 p 指令輸出兩行:第一行是 12 小時制的結果,第二行是 24 小時制的結果。

提交檔案

time.c 需符合:

typedef struct Time {
	int hour;
	int minute;
	int second;
} Time;

void initTime(Time *time);
void setTime(Time *time, int hour, int minute, int second);
void addTime(Time *time, int hour, int minute, int second);
void printTime(Time *time);
void printTime24(Time *time);

評測系統會以以下 driver 編譯:

#include <stdio.h>
#include <stdlib.h>
#include "time.h"

int main() {
	int ch;
	int n, i, h, m, s;
	scanf("%d", &n);
	Time *t = (Time*) malloc(sizeof(Time)*n);
	while ((ch = getchar()) != EOF) {
		switch(ch) {
			case 'i':
				scanf("%d", &i);
				initTime(&t[i]);
				break;
			case 's':
				scanf("%d%d%d%d", &i, &h, &m, &s);
				setTime(&t[i], h, m, s);
				break;
			case 'a':
				scanf("%d%d%d%d", &i, &h, &m, &s);
				addTime(&t[i], h, m, s);
				break;
			case 'p':
				scanf("%d", &i);
				printTime(&t[i]);
				printTime24(&t[i]);
				break;
			default:
				break;
		}
	}
	free(t);
	return 0;
}

範例

此題沒有附在題目中的範例,下面用文字舉例說明輸出:物件被設成 15:15:00 後執行 p,會輸出

03pm:15:00
15:15:00

到 Aki-Judge 送出

送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。

卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。