練習 [8] 関数(5/5)

練習 5(提出プログラム名:p0805a.h)※加点対象
p0805a.c ではなく p0805a.h を提出なので注意!
※講義資料(その2)で説明している内容です

この問題は中級クラスの受講生は必須ではない(提出しなくてもよい)が,
上級クラスの受講生は必須とする.
なお,どちらのクラスであっても適切に正解すれば加点対象として扱う.

まず,このプログラム(p0805a.c)ヘッダ(p0805a.h)をそれぞれダウンロードしなさい.
そして,p0805a.h(p0805a.c ではない)を次の指示に従って編集し,以下の実行例のように実行できるようにしなさい.
書き換えるのは p0805a.h のみであり,p0805a.c はコンパイルと実行に使うだけなので間違えないこと)

この問題では,SIZE 個の整数を読み込んでいったんすべて配列へ格納しておき,その中に登場する素数の個数と最大の素数をそれぞれ関数で求めている(SIZE はマクロで定義されている).

【編集すべき内容:次の 2 つの関数を p0805a.h の中に追加しなさい】
① 関数 get_prime_count
 引数で与えられた配列(長さは SIZE)内の整数のうち,素数であるものの個数を返す.
 素数の判定には同ヘッダで既に用意されている関数 is_prime を使いなさい.
 ※個数をカウントするための変数について,繰り返しの前に 0 で初期化するのを忘れないこと.
 ※配列の各要素 a[i] をチェックするにあたり,for 文を for ( i = 0; i <= SIZE; i++ ) と書いてしまうというミスが例年見られるので注意せよ.繰り返し条件は i < SIZE にしておかないと i = SIZE の場合も実行してしまい, a[SIZE] という存在しない変数にアクセスすることになってしまう.

② 関数 get_max_prime
 引数で与えられた配列(長さは SIZE)内の整数のうち,最大の素数を返す.
 素数の判定には同ヘッダで既に用意されている関数 is_prime を使いなさい.
 なお,配列内には少なくとも 1 つの素数が登場すると仮定してプログラムを作ってよい.

【注意】
この問題では p0805a.h を提出しなさい(p0805a.c ではない).
また,マクロの定義部分以外に 100 と直接書いてはいけません.

【ヒント】
最大の素数を見つけ出すにあたって,その最大値を変数 max で表すとします.
この場合,max の初期値を a[0] とするとうまくいかないことがありますので注意してください.
なぜなら,a[0] は素数とは限らないため,もしも a[0] が素数ではないが大きな値であった場合に,誤ってそれを最大素数として出力してしまう場合があるからです.
素数は 2 以上でなければなりませんので,max の初期値は 2 未満の値(例えば -1 )にしておくとよいでしょう.

この問題では問 4 と同じデータを使ってください

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容(data0804a-1.txt を使用)※Mac の人は a ではなく ./a.out
a < data0804a-1.txt
100 個の整数を入力してください:
入力された値の中の素数の個数 = 27 個
入力された値の中の素数の最大値 = 109
  • 【プログラムの実行例】(その2,その3)
    data0804a-2.txt … 素数は 18 個,最大素数は 113
    data0804a-3.txt … 素数は 21 個,最大素数は 97

【過去にあったミス(減点となり,やり直しを命じられる)】
3 種類の実行例を確認せずに提出してしまっている.
 例えば,素数の最大値だけが間違っている(上のヒントを見落としている可能性大).
■ マクロ SIZE の定義部分以外に 直接 100 と書いてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


第8回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p0801a.c ~ p0803a.c, p0804a.h, p0805a.h を Moodle から提出してください.※ただし,p0805a.h は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.