Ex04

From Prog0

Jump to: navigation, search

演習第4回

Contents

演習問題

主な内容

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

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

出席確認

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

A問題

A-1 条件式

ファイル名: ex04a1.txt

以下のプログラムの出力を予想して ex04a1.txt に書きなさい。

#include <stdio.h>

int main()
{
  int a = 0;
  int b = 1;

  if(a == 0) printf("条件式1は真\n");
  if(b != 0) printf("条件式2は真\n");
  if(!b) printf("条件式3は真\n");
  if(a+b > 0) printf("条件式4は真\n");
  if(a*b > 0) printf("条件式5は真\n");
  if(a >= 0 && b >= 0) printf("条件式6は真\n");
  if(a == 0 && b == 0) printf("条件式7は真\n");
  if(a == 0 || b == 0) printf("条件式8は真\n");
  if(!(a == 0 || b == 0)) printf("条件式9は真\n");

  return 0;
} 

予想を書き終えたらプログラムを ex04a1.c として作成し、コンパイル、実行せよ。

実行結果と ex04a1.txt に書いた内容を比較し、予想が違った場合はその理由を ex04a1.txt に追記しなさい。

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;
} 

[実行例]

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

A-3 条件式の拡張(複合条件)

ファイル名: ex04a3.c

下記のプログラムの空欄(下線部)を埋めて、実行例のような動作をするように完成させて下さい。printf文中の日本語の文意に合った記述にすること。
また、入力する点数は整数とします。

[プログラム]

以下のプログラムをFirefoxからemacsにコピーした際,コピー後のemacs画面内では \¥ に変化しているので,手入力で ¥ \ に修正すること.

#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 (_______________) printf("a は20以上60未満の整数です\n");
  if (_______________) printf("b は0未満または50以上の整数です\n");
  return 0;
}


[実行例]

% ./a.out
整数 a, b を入力して下さい 40 30
a=40, b=30
a は20以上60未満の整数です
% ./a.out
整数 a, b を入力して下さい 70 -10
a=70, b=-10
b は0未満または50以上の整数です
% ./a.out
整数 a, b を入力して下さい 55 50
a=55, b=50
a は20以上60未満の整数です
b は0未満または50以上の整数です
%

B問題

B-1 温度と湿度による快適度判定(複合条件問題)

ファイル名: ex04b1.c

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

  • 温度が20度未満の場合「寒い」
  • 温度が20度以上28度未満でかつ湿度が60%未満の場合「快適」
  • 温度が20度以上で湿度が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-2 倍数の判別

ファイル名: ex04b2.c

入力された整数が奇数か偶数かを判別し、さらに3の倍数か否かも判別するプログラムを作成したい。
以下はそのサンプルプログラムである。このプログラムでは条件分岐の部分を3つの異なる方法で実装し、同じ結果を三度出力するようにしている。
下線部を埋めて実行例のような動作をするように完成させなさい(ここでは正の数のみ考えれば良しとします)。

なお、方法3では一つの結果の出力を2回のprintfに分けて、1回目ではメッセージの途中までを改行文字をつけずに出力し、2回目でメッセージを完成させるようにしていることに留意してください。

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

  printf("整数を入力してください ");
  scanf("%d", &a);

  printf("方法1 多岐選択:\n");
  if( _________________ ) printf( _________________ );
  else if( _________________ ) printf( _________________ );
  else if( _________________ ) printf( _________________ );
  else if( _________________ ) printf( _________________ );
 
  printf("方法2 入れ子の双岐選択:\n");
  if( _____ ) {
    if( _____ ) {
      printf( _________________ );
    }
    else printf( _________________ );
  } 
  else{
    if( _____ ) {
      printf( _________________ );
    }
    else printf( _________________ );
  } 

  printf("方法3 双岐選択(printfでの工夫):\n");
  /* 一つの結果の出力を2回のprintfに分けて、
     1回目ではメッセージの途中までを改行文字をつけずに出力し、
     2回目でメッセージを完成させるようにしている */
  if( _____ ) printf( _________________ );
  else printf( _________________ );
  if( _____ ) printf( _________________ );
  else printf( _________________ );
  
  return 0;
}

[実行例]

% ./a.out
整数を入力して下さい 7
方法1 多岐選択:
7は奇数で、3の倍数ではない
方法2 入れ子の双岐選択:
7は奇数で、3の倍数ではない
方法3 双岐選択(printfでの工夫):
7は奇数で、3の倍数ではない
% ./a.out
整数を入力して下さい 21
方法1 多岐選択:
21は奇数で、3の倍数である
方法2 入れ子の双岐選択:
21は奇数で、3の倍数である
方法3 双岐選択(printfでの工夫):
21は奇数で、3の倍数である
% ./a.out
整数を入力して下さい 18
方法1 多岐選択:
18は偶数で、3の倍数である
方法2 入れ子の双岐選択:
18は偶数で、3の倍数である
方法3 双岐選択(printfでの工夫):
18は偶数で、3の倍数である
%

B-3 breakを省略したswitch文

ファイル名: ex04b3.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月は存在しません
%

Extra問題

E-1 宅配便の運賃

ファイル名: ex04e1.c

会津若松に本社を置く運送業者A社は、東北6県を対象に荷物を送り届けることにしている。この運送会社では、荷物を「小」「中」「大」の3つのサイズに分けており、運送先の県によって運賃を分けている。運賃の分類は次の通りである。

県名
福島県内 6008001000
宮城県 80010001200
山形県 80010001200
岩手県 100012001400
秋田県 120014001600
青森県 140016001800

そこで、この運送業者で荷物を配達した場合、運賃がどのようになるかを表示するプログラムを作成して欲しい。実行例は以下のようになる。

[実行例]

% ./a.out
サイズを入力してください( 小...1, 中...2, 大..3 ) 1
行き先を入力してください(福島県内...1, 宮城県...2、山形県...3, 岩手県...4, 秋田県...5, 青森県...6 ) 4
運賃は 1000円です。
%

(ヒント)switch文あるいはif文を二重に組み合わせるとよい。

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools