Ex04

From Prog0

Jump to: navigation, search

演習第4回

Contents

演習問題

主な内容

  • 条件分岐
  • if文・if-else文
  • switch-case文


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

すべての問題は、menuコマンドを使ってファイルを提出してください。

また、一人ひとりの授業理解度を確認することを目的として、口頭試問形式による採点も行います。

今回の口頭採点の対象は A-3 です。解けたら手を挙げ、教員またはTA/SAを呼んでください。口頭で解答の内容を説明してもらいます。

正しく説明できた場合は点数を付け、説明が不十分な場合はやり直してもらいます(間違えても減点はしません)。

出席確認

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

A問題

A-1 奇数と偶数の判別

ファイル名: ex04a1.c

以下は入力した整数が奇数か偶数かを判別するプログラムである。
空白部分を補って実行例のような動作をするように完成させなさい。条件分岐にはif-else文を使用すること。

#include <stdio.h>
int main()
{
 int a;

  /* これ以下を埋める */
 




  /* ここまで */

  return 0;   
}

[実行例]

% ./a.out
整数を入力して下さい 20
20は偶数です
% ./a.out
整数を入力して下さい 25
25は奇数です
%

A-2 switch-case文による振り分け

ファイル名: ex04a2.c

一学年240名いる学生を学籍番号の順に 1, 2, 3, 4, 1, 2, 3, 4, ... と4つの班に班分けしたい。
以下は学籍番号の下三桁を入力すると、その数を4で割った余りの数に応じてどの班に所属するかを出力するプログラムである。
下線部を埋めて実行例のような動作をするように完成させなさい。

#include <stdio.h>
int main()
{
  int id, han;

  printf("学籍番号の下三桁を入力して下さい(例: 001) ");
  scanf("%d", &id); /* 三桁の数値'00x'は'x'として読み込まれます */

  han = _______;

  switch(han){
  case _____
      printf("この人は1班です\n");
      _______
  case _____
      printf("この人は2班です\n");
      _______
  case _____
      printf("この人は3班です\n");
      _______
  case _____
      printf("この人は4班です\n");
      _______
  } 
  return 0;
} 

[実行例] 注:入力として整数値の前(左)に0を付加されていても、scanfは無視して読み込みます。つまり、'001'という入力は'1'として読み込みます。

% ./a.out 
学籍番号の下三桁を入力してください(例: 001) 001
この人は1班です
% ./a.out
学籍番号の下三桁を入力してください(例: 001) 002
この人は2班です
% ./a.out
学籍番号の下三桁を入力してください(例: 001) 104
この人は4班です
%

A-3 温度と湿度による快適度判定

ファイル名: ex04a3.c

温度と湿度を入力すると、以下の条件に応じてメッセージを出力するプログラムを作成しなさい。

  • 温度が19度未満の場合「寒い」
  • 温度が19度以上28度未満でかつ湿度が60%未満の場合「快適」
  • 温度が19度以上で湿度が60%以上の場合「蒸し暑い」
  • 温度が28度以上で湿度が60%未満の場合「暑い」

温度はdouble型、湿度はint型とする。入出力は以下の実行例に従うこと。

[実行例]

% ./a.out
温度と湿度を入力して下さい 17.0 80
温度:17.00度 湿度:80%
寒い
% ./a.out
温度と湿度を入力して下さい 22.4 55
温度:22.40度 湿度:55%
快適
% ./a.out
温度と湿度を入力して下さい 28.0 40
温度:28.00度 湿度:40%
暑い
% ./a.out
温度と湿度を入力して下さい 25.0 60
温度:25.00度 湿度:60%
蒸し暑い

B問題

B-1 平均点と成績の表示

ファイル名: ex04b1.c

100点満点で数学と物理と英語の3科目の点数を入力したときに、実行例に示すよう その平均値と成績を表示するプログラムをif~else ifを用いて作成しなさい。 なお、成績は以下の条件に従ってつけられるものとする。

  • 平均点にかかわらず、いずれかの科目で100点を取得すれば「優」
  • 3科目の平均点が80点以上「優」
  • 3科目の平均点が60点以上80点未満「良」
  • 3科目の平均点が40点以上60点未満「可」
  • 3科目の平均点が40点未満「不可」

なお、各科目の点数はint型、平均値はdouble型で表し、平均値は小数点以下2桁までを表示するようにすること。
(エラー値(負値など)が点数入力される状況は考えなくてよい)


[実行例]

% ./a.out
数学と物理と英語の点数を入力してください
87 78 95
3科目の平均値は 86.67 点です。
成績は優です。
% ./a.out
数学と物理と英語の点数を入力してください
67 75 78
3科目の平均値は 73.33 点です。
成績は良です。
% ./a.out
数学と物理と英語の点数を入力してください
45 38 27
3科目の平均値は 36.67 点です。
成績は不可です。
% ./a.out
数学と物理と英語の点数を入力してください
78 100 56
3科目の平均値は 78.00 点です。
成績は優です。
%

B-2 breakを省略したswitch文

ファイル名: ex04b2.c

1月から12月までの各月と日数の関係は以下のようになっている。

1月 31日
2月 28日(うるう年の場合29日)
3月 31日
4月 30日
5月 31日
6月 30日
7月 31日
8月 31日
9月 30日
10月 31日
11月 30日
12月 31日

(31日でない月の「2月」「4月」「6月」「9月」「11月」の5つを「西向く士(にしむくさむらい)」と覚えると便利である)

ハンドアウトの例題 lec04-4.c を参考にして、switch文で各月の日数を判断するプログラムを作成しなさい。
1〜12以外の数字が入力された場合は、実行例のようにエラーメッセージを出力すること(このエラー処理もswitch文の中に含めること)。

[実行例]

% ./a.out
月を入力してください:1
1月は31日間あります
% ./a.out
月を入力してください:2
2月は28日間、または29日間です
% ./a.out
月を入力してください:11
11月は30日間あります
% ./a.out
月を入力してください:13
13月は存在しません
%

B-3 フローチャートを使用したif文

ファイル名: ex04b3.c

キーボードから点数(整数)を入力して50点以上の場合に「合格」、50点未満の場合に「不合格」と表示するプログラムを二つの方法で作成しなさい。
ただし、0点から100点以外の点数が入力が入力された場合は入力エラーとし、「エラー」と表示すること。

  • 方法1:(a)入力エラーの場合、(b)合格の場合、(c)不合格の場合、それぞれについてif文(単岐選択)で表現します(3つのif文が必要)。
    • この場合、全部のif文が実行されることになるので、条件(点数の範囲)を正確に記述する必要があります。
    • (a)負又は100点より大きい場合は入力エラー、(b)50以上100点以下が合格、(c)0点以上50点未満が不合格、となるようにif文を書きます。
  • 方法2:多岐選択(if else if 〜)を使って、ふるい落としていきます。
    • まず、負または100点より大きい場合に入力エラーとし
    • 入力エラーでなかった場合、50点以上だったら合格とします。
    • 合格でなかった場合、(0点以上50点未満ということで)不合格とします。

これらについて、フローチャートを示しておきます。
サンプルプログラムの空白部分を補って完成させて下さい。

方法1 方法2


[プログラム]

#include <stdio.h>
int main()
{
  int score;

  printf("点数を入れて下さい ");
  scanf("%d",&score);
  printf("score : %d\n", score);

  printf("方法1による実行例\n");
  /* 方法1:入力エラーの場合、合格の場合、不合格の場合、それぞれについてif文で表現する方法 */
  /* この行以降に方法1を実現するif文を書いて下さい */


printf("方法2による実行例\n"); /* 方法2:多岐選択(if else)を使って、ふるい落としする方法 */ /* この行以降に方法2を実現するif文を書いて下さい */

return 0; }

[実行例]

% ./a.out
点数を入れて下さい -10
score : -10
方法1による実行例
エラー
方法2による実行例
エラー
% ./a.out
点数を入れて下さい 101
score : 101
方法1による実行例
エラー
方法2による実行例
エラー
% ./a.out
点数を入れて下さい 80
score : 80
方法1による実行例
合格
方法2による実行例
合格
%

Extra問題

E-1 条件式の間違いによる影響

ファイル名: ex04e1.txt

if文で a が b と等しいかどうか判定したい際、これまでの問題でみたように、if( a == b ) のようにイコールを2つ書きます。
この問題では、誤って if( a = b ) のようにイコールを1つだけ書いたとき、プログラムがどのように動作するか体験してみましょう。

以下のプログラム中の if 文の条件式を、意図的に a=b に書き換え、a と b に対して下記の4種類の値のペアを与えたとき、どのような結果が得られるかを提出ファイルに記述しなさい。
さらに、何故そのような結果が得られるのか、説明を記述しなさい。

ヒント: if 文の条件式を書き換えずにそのまま実行した場合の結果と異なることを確認し、書き換え前後で条件式の意味や値がどのように変わったか考えてください.

(なお、コンパイル時に警告(warning)が出ることがありますが、この問題ではそうした状況を意図的に作っているので、続けて実行してかまいません。)

< a と b の値のペア>

0 0
0 1
1 0
1 1

[プログラム]

#include <stdio.h>
int main()
{
  int a, b;

  printf("a と b を入力して下さい> ");
  scanf("%d%d", &a, &b);
  printf("a=%d, b=%d\n", a, b);

  if ( a == b ) printf("a と b は等しい\n");
  else printf("a と b は等しくない\n");
  printf("a=%d, b=%d\n", a, b);
  return 0;
}

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools