Ex05

From Prog0

Jump to: navigation, search

演習第5回

Contents

演習問題

主な内容

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

以下の問題を解いて期限内に解答を提出してください。

出席確認

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


A問題

A-1 while文

ファイル名: ex05a1.c

1から100まで足し合わせた総和を計算して表示するプログラムを、while文を使って書きなさい。

[実行例]

% ./a.out
sum = 5050
%

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

ファイル名: ex05a2.txt

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

#include <stdio.h>

int main() {

    int i = 0;

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

    return 0;
}

このプログラムの出力は以下の実行例のようになるが、"3"が連続して4回出力される理由を ex05a2.txt に書きなさい。

[実行例]

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

A-3 複雑なif文

ファイル名: ex05a3.txt

まず、以下のコマンドを実行してハンドアウトの例題 lec05-1.c, lec05-3b.c をコピーする。

% cd ~/Prog0/Ex05
% cp /home/course/prog0/public_html/2023/lec/source/lec05-1.c .
% cp /home/course/prog0/public_html/2023/lec/source/lec05-3b.c .

lec05-1.c は日付を入力し、それが月の最後の日か否かを判定して結果を出力するプログラムだが、残念ながら正しく動作しない。例えば、実行例のように "1月31日" を入力すると結果が返ってくるが、"1月30日" だと何も出力されない。これを修正した正しいプログラムが lec05-3b.c である。これら2つのプログラムの内容と実行結果を比較して、lec05-1.c が正しく動作しない理由を ex05a3.txt に書きなさい。

[実行例]

% ./a.out
月と日を空白で区切って入力してください : 1 31
1月31日は月の最後の日
% ./a.out
月と日を空白で区切って入力してください : 1 30
%

B問題

B-1 無限ループ

ファイル名: ex05b1.c

以下のプログラムではキーボードから繰り返し整数を入力させ、偶数が合計2回入力されたら終了する動作を無限ループを利用して行う。下線部およびコメント部分を補ってプログラムを完成させなさい。ただし、入力には正の整数以外が入ることはないと仮定し、エラーチェックなどは必要ないものとする。なお、inputはキーボードから入力される整数値を格納する変数であり、countは偶数が入力された回数を意味する変数である。

無限ループのプログラムを実行途中に強制的に終了するには、コントロールキーを押しながら「c」を押せば良い(この操作は「Ctrl+c」と表現される)。

#include <stdio.h>

int main () {

  int input;
  int count = 0;

  while( _______ ){


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


  }

  printf("2回偶数が入力されました.プログラムを終了します.\n");
  
  return 0;
}

[実行例]

% ./a.out    
偶数は0回入力されています。正の整数を入力して下さい 1
偶数は0回入力されています。正の整数を入力して下さい 2
偶数は1回入力されています。正の整数を入力して下さい 3
偶数は1回入力されています。正の整数を入力して下さい 4
2回偶数が入力されました. プログラムを終了します.
%

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

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

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

[実行例]

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

B-4 曜日の計算

ファイル名: ex05b4.c

閏年でないある年の1月1日は日曜日であった。その年の月日を入力したら、その日付が1月1日から何日目であるかと何曜日であるかを計算して表示するプログラムを作成せよ。ただし、while文とswitch-case文を利用した以下の仕様に従うものとする。

  • 1月1日から入力された月日までの日数(積算日数)を、while文を用いて各月の日数(下記参照)をもとに計算する。
  • 計算した積算日数から曜日を求める。この時のみswitch-case文を用いる。
  • 誤った日付やあり得ない日付が入力された場合のエラー処理は考慮しなくてよい。

各月の日数

31日:1, 3, 5, 7, 8, 10, 12月
30日:4, 6, 9, 11月
28日:2月

[実行例]

% ./a.out
月と日を空白で区切って入力してください:1 1
2023年1月1日は1日目で日曜日です
% ./a.out
月と日を空白で区切って入力してください:4 10
2023年4月10日は100日目で月曜日です
% ./a.out
月と日を空白で区切って入力してください:6 23
2023年6月23日は174日目で金曜日です
%

Extra問題

E-1 ユークリッドの互除法

ファイル名: ex05e1.c

ユークリッドの互除法は、2 つの自然数(0を含むとする)の最大公約数を求める手法の一つである。アルゴリズム(手順)を以下に示す。

この方法を用いて、入力された二つの数値の最大公約数を求めるプログラムを作成しなさい。

ただし、実行例のように途中経過を表示すること。 入力値に対するエラー処理は含めても含めなくてもどちらでもよい。

 アルゴリズム

   1. 入力を m, n (m ≧ n) とする。
   2. n = 0 なら、 m を最大公約数として出力し、プログラムを終了する。
   3. m を n で割った余りを新たに n とし、
      元のnを新たにm として、
      2に戻る。

[実行例]

% ./a.out
m nを入力して下さい:21 14
21 % 14 = 7
14 % 7 = 0
最大公約数は 7 です
% ./a.out
m nを入力して下さい:32 18
32 % 18 = 14
18 % 14 = 4
14 % 4 = 2
4 % 2 = 0
最大公約数は 2 です
% ./a.out
m nを入力して下さい:78 48
78 % 48 = 30
48 % 30 = 18
30 % 18 = 12
18 % 12 = 6
12 % 6 = 0
最大公約数は 6 です
%

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools