見出し画像

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

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

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

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


■ 関数

□ 1. 次のプログラムでは関数プロトタイプ宣言がされていますが、必要な理由の説明として適切なものを選びなさい。(1つ選択)

#include <stdio.h>

// 関数プロトタイプ宣言
int multiply(int a, int b);

int main(void) {
    int num1 = 4, num2 = 5;
    int product;

    product = multiply(num1, num2);
    printf("積は %d です。\n", product);

    return 0;
}

int multiply(int a, int b) {
    return a * b;
}

A.    プログラムの実行速度を向上させるため
B. 関数の引数の型を自動的に推測するため
C. コンパイラが関数の戻り値の型や引数の型を正しく認識するため
D.   プログラムのデバッグを簡単にするため


□ 2. 次のプログラムの説明として、正しいものを選びなさい。(1つ選択)

main.c

#include <stdio.h>
#include "math_operations.h"

int main(void) {
    int num1 = 20, num2 = 8;
    int difference;

    difference = subtract(num1, num2);
    printf("差は %d です。\n", difference);

    return 0;
}

math_operations.h

#ifndef MATH_OPERATIONS_H_
#define MATH_OPERATIONS_H_

// subtract関数のプロトタイプ宣言
int subtract(int a, int b);

#endif /* MATH_OPERATIONS_H_ */

math_operations.c

// subtract関数の定義
int subtract(int a, int b) {
    return a - b;
}

A.  プログラムは正常に動作し、「差は 12 です。」と表示される
B.  math_operations.h のincludeで、コンパイルエラーが発生する
C.  subtract 関数は整数の引き算を行わない
D.  プログラムは引数が1つの subtract 関数を呼び出している


□ 3. ヘッダーファイルの説明として、正しいものを選びなさい。(3つ選択)

A. ヘッダーファイルには関数プロトタイプ宣言やマクロ定義を記述することができる。
B. ヘッダーファイルは必ずメインプログラムと同じファイルに記述しなければならない。
C. ヘッダーファイルを使用することで、ソースコードをモジュール化し、再利用性を高めることができる。
D. ヘッダーファイルはプログラムの実行速度を向上させるために使用される。
E. インクルードガードを使用することで、同じヘッダーファイルが複数回読み込まれるのを防ぐことができる。


□ 4. 次のプログラムの説明として、正しいものを選びなさい。(1つ選択)

average.h

#ifndef AVERAGE_H_
#define AVERAGE_H_

extern int total;   
extern int count;   

void addNumber(int num); 
double calculateAverage(); 

#endif /* AVERAGE_H_ */

average.c

#include "average.h"

int total = 0; 
int count = 0; 

void addNumber(int num) {
    total += num; 
    count++;      
}

double calculateAverage() {
    return (count > 0) ? (double)total / count : 0.0; 
}

main.c

#include <stdio.h>
#include "average.h"

int main(void) { 
    int i;
    for (i = 1; i <= 5; i++) {
        addNumber(i); 
    }
    printf("合計は %d です。\n", total);
    printf("平均は %.2f です。\n", calculateAverage()); 
    return 0;
}

A. extern int total;はtotal変数の定義である
B. addNumber関数は、引数として渡された値をtotalに加算し、countを1増やす
C. プログラムはコンパイルエラーをおこす
D. calculateAverage関数は、countが0のときにエラーを返す
E. #include "average.h"は不要である


□ 5. 次のプログラムの説明として、正しいものを選びなさい。(2つ選択)

math_utils.h

#ifndef MATH_UTILS_H_
#define MATH_UTILS_H_

extern int result; 

void add(int a, int b); 

#endif /* MATH_UTILS_H_ */

math_utils.c

#include "math_utils.h"

int result = 0; 

static void update_result(int value) { 
    result += value; 
}

void add(int a, int b) {
    update_result(a + b); 
}

main.c

#include <stdio.h>
#include "math_utils.h"

int main(void) {
    add(5, 10); 
    printf("合計は %d です。\n", result); 
    return 0;
}

A.     update_result関数は外部から呼び出せる
B.   add関数はupdate_resultを利用して合計を計算する
C.   プログラムを実行すると「合計は 15 です。」と表示される
D.   resultはextern指定子が付けられているため、外部から参照できない
E.   math_utils.hにupdate_resultのプロトタイプ宣言を記述する必要がある



解答

1.C

関数プロトタイプ宣言は、関数が呼び出される前にその戻り値の型と引数の型をコンパイラに知らせる役割を果たします。これにより、関数を呼び出す際に型の不一致がないかをコンパイラがチェックでき、プログラムの安全性と正確性が向上します。

A) は不正解です。関数プロトタイプ宣言自体は実行速度に影響を与えません。B) は不正解で、関数の引数の型は明示的に指定する必要があります。D) も不正解で、プロトタイプ宣言はデバッグの簡略化には直接関与しません

2.A

  • subtract 関数は、2つの整数を引き算してその結果を返します。main.c では num1 に 20、num2 に 8 を代入し、その差を計算するために subtract 関数を呼び出します。これにより、出力は「差は 12 です。」となります。

  • B) は不正解で、math_operations.h ファイルは正しくインクルードされているため、コンパイルエラーは発生しません。

  • C) は不正解で、subtract 関数は整数の引き算を正しく行います。

  • D) は不正解で、subtract 関数は引数を2つ取るため、この選択肢も誤りです。

このプログラムは、関数プロトタイプ宣言を利用して、異なるファイル間での関数の使用を示しています。正しいヘッダファイルの作成とインクルードにより、関数の定義がどこにあっても、プログラムは正しく機能します。

3.A C E

  • Aは正解です。ヘッダーファイルは、関数のプロトタイプやマクロ定義、構造体、定数などをまとめて記述するのに適しています。

  • Bは不正解です。ヘッダーファイルはソースファイルとは別に作成され、必要に応じてインクルードします。メインプログラムと同じファイルにする必要はありません。

  • Cは正解です。ヘッダーファイルを利用することで、プログラムのモジュール化が進み、再利用が容易になります。

  • Dは不正解です。ヘッダーファイル自体が実行速度を向上させるものではなく、主にコードの整理や再利用性向上のために使用されます。

  • Eは正解です。インクルードガードを用いることで、同じヘッダーファイルが複数回インクルードされることを防ぎ、コンパイルエラーを回避します。

4.B

  • A) は不正解で、extern int total;は宣言であり、実体は average.c で定義されています。

  • B) は正解です。addNumber関数は、渡された数をtotalに加算し、countを増やします。

  • C) は不正解で、プログラムは正常に実行できます。

  • D) は不正解で、calculateAverage関数はcountが0のときに0.0を返しますが、エラーは発生しません。

  • E) は不正解で、#include "average.h"は必要です。これにより、関数のプロトタイプとグローバル変数の宣言が利用可能になります。

5.B C

  • A) は不正解で、update_result関数はstatic指定子が付いているため外部から呼び出せません。

  • B) は正解です。add関数は内部でupdate_resultを呼び出して合計を更新します。

  • C) は正解で、実行結果は「合計は 15 です。」となります。

  • D) は不正解で、resultはexternとして宣言されているため外部から参照できます。

  • E) は不正解で、update_resultはstaticなのでヘッダファイルに宣言する必要はありません。



本日の学習内容

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

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