Ex05

From Prog0

Jump to: navigation, search

演習第5回

Contents

演習問題

主な内容

  • while文
  • 代入演算子
  • インクリメント・デクリメント
  • 無限ループ

期限内に解き、menuコマンドを使ってファイルを提出してください。

なお、一人ひとりの授業理解度を確認することを目的として、口頭試問形式による採点を行います。
採点対象の問題が解けたら手を挙げ、教員またはTA/SAを呼んでください。口頭で解答の内容を説明してもらいます。
正しく説明できた場合は点数を付け、説明が不十分な場合はやり直してもらいます(間違えても減点はしません)。
今回の口頭採点の対象は A-2 の1問のみです。
(口頭採点の対象も、その他の問題と同様、menuコマンドで提出してください。)

出席確認

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


A問題

A-1 インクリメント・デクリメント

ファイル名: ex05a1.txt

次のプログラムを作成し、実行せよ。

#include <stdio.h>

int main() {

    int i = 0;

    i++;
    printf("%d\n", i);
    ++i;
    printf("%d\n", i);
    printf("-------------\n");

    printf("%d\n", ++i);
    printf("%d\n", i++);
    printf("%d\n", --i);
    printf("%d\n", i--);

    return 0;
}

このプログラムの出力は以下の実行例のようになる。

[実行例]

% ./a.out    
1
2
-------------
3
3
3
3
%

"3"が連続して4回出力される理由を、 ex05a1.txt に簡潔に説明して提出してください。

説明の仕方は、下記にならってください。

最初の"3"は、前置インクリメントによって出力よりも前にiに1が足されるため、3が出力される。出力後のiの値は3である。
2番目の"3"は、・・・・・

A-2 (口頭試問) コラッツの問題

ファイル名: ex05a2.c

ドイツの数学者コラッツは任意の 0 でない自然数 n に対して、

  • n が偶数の場合、n を 2 で割る
  • n が奇数の場合、n に 3 をかけて 1 足す

という操作を繰り返すと、最終的に n は 1 になる、と予想した。これを コラッツの問題 と呼ぶ。
この問題はまだ証明はされていないものの、実際に任意の自然数 n に対してこの通りとなるか、コンピュータのプログラムで確かめることができる。

以下に示すフローチャートを参考にし、下線部および補うよう指示された部分を補ってプログラムを完成させなさい。
ただし、フローチャートには一部の画面表示の処理などは記入されていない。これらの処理についてはプログラム内で適切な場所を自分で考え、printf文などを入れること。

#include <stdio.h>

int main()
{
  int n;
  
  printf("0でない自然数nを入力して下さい ");
  scanf("%d", &n);
  
  while ( _______ ) {


  /* この部分に必要なプログラムを補う */    

   
  }

  printf("終了\n");
  return 0;   
}

[実行例]

% ./a.out
0でない自然数nを入力して下さい 3
n = 10
n = 5
n = 16
n = 8
n = 4
n = 2
n = 1
終了
%

A-3 九九の表示

ファイル名: ex05a3.c

whileループを使って、実行例のように「九九」を表示するプログラムを作成しなさい。

乗算の結果(s)は、被乗数(x)と乗数(y)により s = x * y とする。

アルゴリズムの考え方

  • 整数変数は、"s", "x", "y"を宣言して利用する。
  • ループの内部にループを使う(二重のループ)。
  • 外側のループは被乗数を1 から 9まで変化させる。
  • 内側のループでは、「被乗数の段」それぞれについて、乗数を1 から 9まで変化させる。
  • 各段の最後に改行を出力する。
  • 数値は右詰で桁をそろえて表示し、実行例のように各列がそろうようにすること。

[実行例]

File:Ex05B_P06.png

B問題

B-1 試験結果の集計

ファイル名: ex05b1.c

ある試験の得点を入力して、試験を受けた学生の人数と全員の平均点、合格者と不合格者の人数を求めるプログラムを作成せよ。プログラムの仕様は以下の通りとする。

  • 得点は整数とし、50点以上を合格、50点未満を不合格とする。
  • 平均点は浮動小数点型の実数とする。
  • 得点は繰り返し入力するが、負の数が入力されたら入力終了とみなし、その直前までの受験者数・平均点・合格/不合格者数を出力する。
  • 入力値に対するエラー処理は実装しなくてよい。

[実行例]

% ./a.out
得点を入力して下さい: 80
得点を入力して下さい: 25
得点を入力して下さい: 50
得点を入力して下さい: 60
得点を入力して下さい: -1
受験者数 4 名,平均点 53.750000 点
合格者数 3 名,不合格者数 1 名
%

B-2 温度計の目盛り

ファイル名: ex05b2.c

最低温度と最高温度を入力すると、以下の実行例のように温度計の目盛りを表示するプログラムを作成せよ。最低温度と最高温度は10刻みの値(10の倍数)を入力するものとし、入力される値はいずれも-90以上90以下とする。

[実行例]

% ./a.out
最低温度? -20
最高温度? 50
-20 -10   0  10  20  30  40  50 
--+---+---+---+---+---+---+---+-
% ./a.out
最低温度? 0
最高温度? 90
  0  10  20  30  40  50  60  70  80  90 
--+---+---+---+---+---+---+---+---+---+-
%

B-3 カレンダーの表示

ファイル名: ex05b3.c

以下の仕様に従って、カレンダーを表示するプログラムを作成しなさい。

仕様

  • 日付を1日(ついたち)から、31日まで表示する。
  • 最初に、1日の曜日を数字で入力する。月曜日を1、火曜日を2 ... 日曜日を7とする。
  • 最初の行には、曜日を表す" 月 火 水 木 金 土 日\n"を表示する。
  • その後、各行に月曜日から日曜日の日付を表示する。
  • 入力された曜日に基づいて、実行例のように表示する。
  • 入力された曜日のエラー処理は必要ない。


アルゴリズムのヒント

  • 1日の曜日に基づいて必要な空白を表示する。
  • 今の日付が何曜日に対応するかを表す変数を利用する。
  • その変数が日曜日(7)であるなら、改行して値を月曜日(1)にもどす。
  • 日付はそれぞれ、空白(スペース)と日付二桁、あわせて三文字分を表示している。

[実行例]

注:この実行例では、都合により他の実行例とは異なり、入力に色がない。最初の整数がユーザー入力である。

File:Ex05B_P07.png

Extra問題

E-1 クレジットカードのリボ払い返済

ファイル名: ex05e1.c

クレジットカードの返済方法として、定額リボルビング払いという方法がある。 これは、借りたお金+利子分から月ごとに決めた一定金額を返済し、 次の月はその月の残金に対しての利子分を加えたものから一定金額を返済すると いう形になる。この方法では、毎月利子分が変動していくため、実際の総返済額や 何ヶ月に渡って返済する必要があるのかわかりにくい。 この問題では、毎月支払う金額を入力し、 返済までの期間(月数)と最終的な返済金額をwhileループを使って求める プログラムを作成しなさい。 なお、年率は15%、借入額は20万円とし、これはプログラム中で設定しておき、 月々の返済額だけを入力するものとする。また、一番最後の月は月々の返済額未満に なるが、これも1月分とカウントすること。 繰り返し計算の中で、小数点以下の金額が生じる場合は切り捨てるものとする。 ちなみに、20万円*15%/12ヶ月=2500円なので、月々の返済額が2500円以下だと、 永遠に返済が終わらないことになるが、この問題では考慮しなくて良い。 もし、2500円以下を入力してしまった場合は、ctrl+c でプログラムを強制終了すること。

(注)実際の定額リボ払いにはいくつかの計算方法があるので、 問題文と実行例を参考に処理手順を考えて下さい。

実行例
% ./a.out
月毎の返済額を入力して下さい : 50000
200000円を定額リボ払いで月50000円ずつ返済します。
 1 ヵ月: 金利手数料込残金:202500円 支払後残金:152500円 返済総額: 50000円
 2 ヵ月: 金利手数料込残金:154406円 支払後残金:104406円 返済総額:100000円
 3 ヵ月: 金利手数料込残金:105711円 支払後残金: 55711円 返済総額:150000円
 4 ヵ月: 金利手数料込残金: 56407円 支払後残金:  6407円 返済総額:200000円
 5 ヵ月: 金利手数料込残金:  6487円 支払後残金:     0円 返済総額:206487円
返済期間  5ヵ月  総返済額:206487円
% ./a.out
月毎の返済額を入力して下さい : 10000
200000円を定額リボ払いで月10000円ずつ返済します。
 1 ヵ月: 金利手数料込残金:202500円 支払後残金:192500円 返済総額: 10000円
 2 ヵ月: 金利手数料込残金:194906円 支払後残金:184906円 返済総額: 20000円
 3 ヵ月: 金利手数料込残金:187217円 支払後残金:177217円 返済総額: 30000円
                           :
                           :
22 ヵ月: 金利手数料込残金: 21415円 支払後残金: 11415円 返済総額:220000円
23 ヵ月: 金利手数料込残金: 11557円 支払後残金:  1557円 返済総額:230000円
24 ヵ月: 金利手数料込残金:  1576円 支払後残金:     0円 返済総額:231576円
返済期間 24ヵ月  総返済額:231576円
%

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools