Ex14
From Prog0
演習第14回
Contents |
演習問題
以下の問題を解いて期限内に解答を提出してください。 今回は口頭試問による採点は実施しませんが、希望があれば結果の確認は受け付けます。 また、期末試験も近いので、試験勉強に関連した過去問等に関する質問や、今までの演習問題に関する質問も歓迎します。
出席確認
演習時間中に出席確認をLMS上の「演習出欠」で行ってください。出席確認用のパスワードは演習時間のどこかのタイミングで提示されます。
A問題
A-1 ヒストグラム
ファイル名: ex14a1.c
入力された整数データを、横向きのヒストグラムのように表示するプログラムを作成しなさい。プログラムの仕様は以下とする。
- 入力可能な整数値の最大の個数はマクロMAXで定義し、その値は20とする。
- 負の値が入力されたら入力終了とし、ヒストグラムの表示を行う。
- MAXでの規定より多くの値が入力された場合は、MAX個以降の入力は無視してヒストグラムの表示を行う。
- ヒストグラムの表示を行うための関数 histgram を作成して使用する。
- histgram関数は int型の引数を一つ取り、その値(数字)と、その値の数だけ「#」を出力する(実行例参照)。
- histgram関数の引数に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 エラトステネスの篩(ふるい)による素数判定法
ファイル名: ex14b1.c
ある整数 n が素数かどうかを調べるには、2以上n未満の整数で割り切れるかどうか順に調べていくのが簡単だが、 調べたい整数一つ一つに繰り返し割り算を行わなければならず、たくさんの整数を判定するには効率が良くない。
指定された整数 m 以下のすべての素数を発見するには、以下のような方法もある。
- まず 1 は素数でない(既知)とする。そして、いったん 2 から m までの整数をすべて「素数の候補」と設定しておく。
- 2 から m の平方根 までの整数 n について、順に以下の処理を繰り返す。
- nが素数の場合は、(nより大きくm以下の)n の倍数すべてについて「素数の候補」から「素数でない」設定に変更する。
- nが素数でない場合は何もしない。
- すべての繰り返し処理終了後に、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 個でした。
%
ヒント:各々の整数が素数かどうかの判定結果を入れる変数を配列で用意し、素数の候補から外れたらその変数の値を初期値から別の値に変更することで 「素数でない」ことを表現することにすれば良いでしょう。
Extra問題
E-1 三角形の面積
ファイル名: ex14e1.c
3点の座標 (x0,y0), (x1,y1), (x2,y2) が入力されたとき、 この3点を頂点とする三角形の面積を求めるプログラムを作成しなさい。
[実行例]
%./a.out
3点の座標 (x0, y0), (x1, y1), (x2, y2) を入力してください
x0, y0: 0 0
x1, y1: 7 8
x2, y2: 13 29
三角形の面積: 49.500000
%./a.out
3点の座標 (x0, y0), (x1, y1), (x2, y2) を入力してください
x0, y0: -1.5 4.3
x1, y1: 5.2 7.8
x2, y2: 2.1 -3.6
三角形の面積: 32.765000
課題提出上の注意事項
解答ファイルはmenuコマンドを使って提出してください。以下のようにmenuコマンドを実行し、表示されるメッセージに沿って操作すること。
%
~prog0/bin/menu
menuコマンドは、解答ファイルが ~/Prog0/Ex## のディレクトリに指定されたファイル名で置かれているものとして処理します。正常に提出された場合は ○ が、何らかのエラーが生じた場合は × が表示されます。
解答の提出期間は以下のとおりです。
問題 | 提出受付開始 | 提出〆切 |
---|---|---|
A問題 | 演習日の6日前の午後9時 | 演習終了時刻 |
B, Extra問題 | 演習日の6日前の午後9時 | 演習日の6日後の午後9時 |
提出は〆切前であれば何度でもやり直すことができます。再提出すると、前に提出したファイルは新しい内容で上書きされます。