見出し画像

C言語で Java Silver レベルの問題を作ってみる No.24

 プログラミング言語って、しばらく触れてないと細かな部分を忘れてしまいますよね。また、複数のプログラミング言語を習得している人は、頭がこんがりますね。

 そんな方におススメしたいのが、資格試験の問題を1日5問程度解いていく方法です。毎日のスキマ時間を活用して短時間で知識レベルを維持することが出来ますよ。Javaならば、Silverの問題集が最適です。
 Silverを既に取得している人も、これから取得を目指している人もぜひ試してみてください。

 さて、この記事では、タイトルの通り、C言語をテーマにしています。
問題を毎日5問投稿していきますので、C言語を習得中の方、C言語の知識を維持されたい方は、ぜひご活用ください。


■ 標準ライブラリ 時間関数

□ 1. 次のプログラムをコンパイルし、実行したときの結果として、正しいものを選びなさい。(1つ選択)

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

int main() {
    time_t t;
    struct tm *tm_info;

    time(&t);
    tm_info = localtime(&t);

    printf("Year: %d\n", tm_info->tm_year + 1900);
    return 0;
}

A.     Year: 1970 と表示される
B.   Year: 1900 と表示される
C.   現在の西暦年が表示される
D.   実行時にエラーが発生する


□ 2. 次のプログラムをコンパイルし、実行したときの結果として、正しいものを選びなさい。(1つ選択)

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

int main() {
    time_t t = time(NULL);
    printf("%ld\n", (long int)t);
    return 0;
}

A.  現在の時間(1970年からの秒数)が表示される
B.   現在の日付 が表示される
C.  現在の時間(1970年からの分数)が表示される
D.  実行時にエラーが発生する


3. 次のtime()関数の説明で、正しいものを選びなさい。(1つ選択)

A.    現在のシステム日付を文字列として返す関数
B. プログラムの実行時間を計測する関数
C. 現在の時間をエポック(1970年1月1日)からの秒数として返す関数
D. 現在の年を返す関数


□ 4. 次の現在の月を表示させえるプログラムの空欄に入るコードとして、正しいものを選びなさい。(1つ選択)

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

int main() {
    time_t t;
    struct tm *tm_info;

    time(&t);
    tm_info = localtime(&t);

    printf("Month: %d\n", __空欄__);
    return 0;
}

A.    tm_info->tm_mon
B. tm_info->tm_mon + 1
C. tm_info->tm_mday
D.   tm_info->tm_year


□ 5. 次の現在の曜日を表示させえるプログラムの空欄に入るコードとして、正しいものを選びなさい。(1つ選択)

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

int main() {
    time_t t = time(NULL);
    struct tm *tm_info = localtime(&t);

    char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    printf("Day: %s\n", days[__空欄__]);
    return 0;
}

A.   tm_info->tm_wday
B.   tm_info->tm_yday
C.   tm_info->tm_hour
D.   tm_info->tm_min


解答

1.C

time_t t;
time_t 型の変数 t を宣言しています。この型は、エポック(1970年1月1日からの経過秒数)で時間を表します。

struct tm *tm_info;
struct tm 型のポインタ tm_info を宣言しています。この構造体には、時間を年・月・日・時・分・秒の形式で保持します。

time(&t);
現在の時刻を time() 関数を使って取得し、変数 t に格納します。この関数はエポックからの秒数を返します。

tm_info = localtime(&t);
localtime() 関数を使って、t に格納された時刻をローカルタイム(現在のタイムゾーン)に変換します。その結果は struct tm 型のポインタ tm_info に格納されます。

tm_info->tm_year
tm_year は現在の年を「1900年からの経過年数」で保持します。そのため、1900 を加えると現在の年を取得できます。

2.A

このプログラムは、時刻を「エポックからの秒数」として表示します。「エポック」とは、1970年1月1日 00:00:00 UTC からの秒数のことを指します。この形式はPOSIXタイムとも呼ばれ、UNIX系のシステムで広く使用されている時間の表現方法です。
 time() 関数に NULL を渡すことで、単に現在の時刻を取得してその値を返す処理を行います。この値は通常、システムの現在のカレンダー時間と対応しており、エポックからの秒数で表されます。

3.C

A. 誤りです。time() 関数は文字列を返しません。現在の時間を秒数として返します。
B. 誤りです。time() 関数はプログラムの実行時間を計測するための関数ではありません。実行時間を計測するには他の関数(例えば、clock() など)が使用されます。
C. 正しいです。time() 関数は、現在の時刻をエポック(1970年1月1日 00:00:00 UTC)からの経過秒数として返します。引数として NULL を渡すことで、戻り値としてその秒数を取得できます。
D. 誤りです。time() 関数は年を直接返しません。年を取得するには、time() で取得した秒数を localtime() などで変換し、struct tm の tm_year フィールドを使用します。

4.B

A. tm_info->tm_mon
誤りです。tm_info->tm_mon は現在の月を 0 から 11 で表します。1月が 0 で、12月が 11 です。このまま表示すると、1月は「0」として表示されてしまいます。そのため、正しい月を表示するためにはこの値に +1 をする必要があります。

B. tm_info->tm_mon + 1
正しいです。tm_info->tm_mon は 0 から 11 の範囲で月を表すため、表示する際には +1 して、1 から 12 の範囲にする必要があります。これにより、1月が「1」、12月が「12」として表示されます。

C. tm_info->tm_mday
誤りです。tm_info->tm_mday は現在の日(day of the month)を表します。これは「月」の情報ではなく、「日」の情報です。したがって、月を表示する目的には適していません。

D. tm_info->tm_year
誤りです。tm_info->tm_year は年を 1900 年からの経過年数で表します。例えば、現在の年が 2023 年であれば、tm_info->tm_year の値は 123 になります。この値は月を表すものではありません。

5.A

A. tm_info->tm_wday
正しいです。tm_info->tm_wday は曜日を示すフィールドで、0 から 6 の値を取り、0 が「Sunday」、6 が「Saturday」を表します。この値を使って days 配列のインデックスとして指定すれば、正しい曜日名を表示することができます。

B. tm_info->tm_yday
誤りです。tm_info->tm_yday は年初からの経過日数(0から365まで)を表します。これは曜日を示すものではなく、年内の日数を表すため、この場合のインデックスとしては適していません。

C. tm_info->tm_hour
誤りです。tm_info->tm_hour は現在の時間(0から23まで)を表します。これは曜日を示すものではなく、時刻を示すものであり、曜日を表すインデックスとしては適していません。

D. tm_info->tm_min
誤りです。tm_info->tm_min は現在の分(0から59まで)を表します。この値も曜日とは関係がなく、曜日名のインデックスとして使うことは不適切です。



本日の学習内容

お疲れ様でした。
継続は力なりです。
明日も頑張りましょう!

この記事が気に入ったらサポートをしてみませんか?