Ex14

From Prog0

Jump to: navigation, search

演習第14回

Contents

演習問題

以下の問題を解いて期限内に解答を提出してください。 今回は口頭試問による採点は実施しませんが、希望があれば結果の確認は受け付けます。 また、期末試験も近いので、試験勉強に関連した過去問等に関する質問や、今までの演習問題に関する質問も歓迎します。

出席確認

演習時間中に出席確認をLMS上の「演習出欠」で行ってください。出席確認用のパスワードは演習時間のどこかのタイミングで提示されます。


A問題

A-1 ヒストグラム

ファイル名: ex14a1.c

入力された整数データを、横向きのヒストグラムのように表示するプログラムを作成しなさい。プログラムの仕様は以下とする。

  • 入力可能な整数値の最大の個数はマクロMAXで定義し、その値は20とする。
  • 負の値が入力されたら入力終了とし、ヒストグラムの表示を行う。
  • MAXでの規定より多くの値が入力された場合は、MAX個以降の入力は無視してヒストグラムの表示を行う。
  • ヒストグラムの表示を行うための関数 histogram を作成して使用する。
  • histogram関数は int型の引数を一つ取り、その値(数字)と、その値の数だけ「#」を出力する(実行例参照)。
  • histogram関数の引数に70より大きい値が入った場合は、"illegal value!" というメッセージを標準エラー出力に出力して強制終了する(終了時にシェル変数へは「4」を渡す。ハンドアウト Lec12-23 参照)。

[実行例]

% ./a.out
1 4 3 10 0 2 -1
[ 1]:#
[ 4]:####
[ 3]:###
[10]:##########
[ 0]:
[ 2]:##
% ./a.out
3 9 81 27 -1
[ 3]:###
[ 9]:#########
illegal value!
% echo $?
4
%

B問題

B-1 BMI計算

ファイル名: ex14b1.c

身長と体重の情報を読み込み、個々のボティマス指数(BMI)と肥満度分類を判定する プログラムを、以下の仕様にもとづき作成しなさい。


[仕様]

  • 身長(cm)と体重(kg)は空白で区切って入力する。
  • 入力可能な最大の人数はマクロMAXで定義する。
  • MAXの値は12とする。
  • 入力はControl+dで終えることができる。
  • 入力後に身長と体重からBMI を計算する。
    • BMI の計算式は、体重(kg)÷(身長(m)の二乗)である。
  • 日本肥満学会が定義しているBMIを用いた肥満度分類に基づく肥満度の判定を行う。
  • 肥満度の判定のために、BMI を引数として、肥満度分類結果を戻り値とするbmi_hantei関数を定義して使用すること。
    • 肥満度分類とbmi_hantei関数の戻り値の定義は下表を参照。
  • 関数 bmi_hantei を利用して実行例のようにその人の状態を表示すること。
  • 最後に、肥満度分類が「普通体重」となった人の割合を表示する。割合はパーセントで示し、小数点以下第 1 位を四捨五入した値を表示すること。
    • double型の値をint型にキャストしたり、表示時にprintfの書式を"%2.0f"などのようにする方法では正しく四捨五入になることは保証されていないため、割合の四捨五入を適切に行う処理を組み込むこと。


日本肥満学会の肥満度分類とbmi_hantei関数の戻り値
BMI 肥満度分類 bmi_hantei関数の戻り値
BMI<18.5 低体重 -1
18.5≦BMI<25 普通体重 0
25≦BMI<30 肥満(1度) 1
30≦BMI<35 肥満(2度) 2
35≦BMI<40 肥満(3度) 3
40≦BMI 肥満(4度) 4


[実行例(途中でControl+dにより入力を終えた場合)]

% ./a.out 
身長(cm)と体重(kg)を空白で区切って入力してください。
入力可能な最大の人数は 12 人です。
175.4  64.2
175.7  53.2
180.3  62.1
^D
        BMI  肥満度分類
 1 人目 20.9 普通体重
 2 人目 17.2 低体重
 3 人目 19.1 普通体重

肥満度分類が普通体重である人の割合は 67 パーセントです。

[実行例(MAX人分のデータを入力した場合)]

% ./a.out 
身長(cm)と体重(kg)を空白で区切って入力してください。
入力可能な最大の人数は 12 人です。
175.4  64.2
175.7  53.2
180.3  62.1
163.1  42.7
164.7  86.5
175.4  64.2
175.7  53.2
180.3  62.1
163.1  42.7
164.7  86.5
175.4  64.2
175.7  53.2

        BMI  肥満度分類
 1 人目 20.9 普通体重
 2 人目 17.2 低体重
 3 人目 19.1 普通体重
 4 人目 16.1 低体重
 5 人目 31.9 肥満(2度)
 6 人目 20.9 普通体重
 7 人目 17.2 低体重
 8 人目 19.1 普通体重
 9 人目 16.1 低体重
10 人目 31.9 肥満(2度)
11 人目 20.9 普通体重
12 人目 17.2 低体重

肥満度分類が普通体重である人の割合は 42 パーセントです。

Extra問題

E-1 エラトステネスの篩(ふるい)による素数判定法

ファイル名: ex14e1.c

ある整数 n が素数かどうかを調べるには、2以上n未満の整数で割り切れるかどうか順に調べていくのが簡単だが、 調べたい整数一つ一つに繰り返し割り算を行わなければならず、たくさんの整数を判定するには効率が良くない。

指定された整数 m 以下のすべての素数を発見するには、以下のような方法もある。

  1. まず 1 は素数でない(既知)とする。そして、いったん 2 から m までの整数をすべて「素数の候補」と設定しておく。
  2. 2 から m の平方根 までの整数 n について、順に以下の処理を繰り返す。
    1. nが素数の場合は、(nより大きくm以下の)n の倍数すべてについて「素数の候補」から「素数でない」設定に変更する。
    2. nが素数でない場合は何もしない。
  3. すべての繰り返し処理終了後に、1 から m までの整数で「素数の候補」設定のままになっている数が素数である。

この方法(エラトステネスの篩(ふるい))を用いて、900までの正の整数が素数かどうか判定するプログラムを作成しなさい。

調べる範囲の上限を表す数(900とその平方根である30)はマクロで与えて、後から調べる範囲が簡単に変更できるようにしておく。
(ループの上限に900などの定数を直接書き入れないこと。)
結果の表示は、素数ならその数を表示、素数でない数の所には '---' と表示し、10個ごとに改行しなさい(実行例参照)。
また、最後に素数が全部でいくつ見つかったか表示すること。

[実行例]

% ./a.out
---   2   3 ---   5 ---   7 --- --- ---
 11 ---  13 --- --- ---  17 ---  19 ---
--- ---  23 --- --- --- --- ---  29 ---
(中略)
--- --- --- --- --- --- 877 --- --- ---
881 --- 883 --- --- --- 887 --- --- ---
--- --- --- --- --- --- --- --- --- ---

900 以下の素数は 154 個でした。
%

ヒント:各々の整数が素数かどうかの判定結果を入れる変数を配列で用意し、素数の候補から外れたらその変数の値を初期値から別の値に変更することで 「素数でない」ことを表現することにすれば良いでしょう。

課題提出上の注意事項

解答ファイルはmenuコマンドを使って提出してください。以下のようにmenuコマンドを実行し、表示されるメッセージに沿って操作すること。

% ~prog0/bin/menu

menuコマンドは、解答ファイルが ~/Prog0/Ex## のディレクトリに指定されたファイル名で置かれているものとして処理します。正常に提出された場合は ○ が、何らかのエラーが生じた場合は × が表示されます。

解答の提出期間は以下のとおりです。

問題提出受付開始提出〆切
A問題 演習日の6日前の午後9時演習終了時刻
B, Extra問題 演習日の6日前の午後9時演習日の6日後の午後9時

提出は〆切前であれば何度でもやり直すことができます。再提出すると、前に提出したファイルは新しい内容で上書きされます。

Personal tools