時鐘時間物件
Clock Time Object・c-10-01
- APCS 中級
- 內建排序與自訂比較
- C 程式設計入門・Structure
時間限制 2 秒・記憶體 250 MB
送出程式要先用 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送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。