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");  
  if(!(a == 0 || b == 0)) printf("条件式10は真\n");

  return 0;
}

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

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

A-2 奇数と偶数の判別

ファイル名: ex04a2.c

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

#include <stdio.h>

int main()
{ 
 int a;
 printf("整数を入力してください ");
 scanf("%d", &a);
 /* 以下を埋める */
 /* ここから */





 /* ここまで */
 return 0;   
}

[実行例]

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

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

ファイル名: ex04a3.c

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

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

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

  han = _______;

  switch(han){
  case 1:
      printf("この人はA班です\n");
      _______
  case _____
      printf("この人はB班です\n");
      _______
  case _____
      printf("この人はC班です\n");
      _______
  case _____
      printf("この人はD班です\n");
      _______
  case _____
      printf("この人はE班です\n");
      break;
  } 
  return 0;
} 

[実行例]

% ./a.out 
学籍番号の下三桁を入力してください(例: 001) 002
この人はB班です
% ./a.out
学籍番号の下三桁を入力してください(例: 001) 004
この人はD班です
% ./a.out
学籍番号の下三桁を入力してください(例: 001) 273
この人はC班です 
% ./a.out
学籍番号の下三桁を入力してください(例: 001) 120
この人はE班です 
%

B問題

B-1 平均点と成績の表示(複合条件問題)

ファイル名: ex04b1.c

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

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

なお、各科目の点数は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 曜日の判別

ファイル名: ex04b2.c

西暦 y 年 m 月 d 日の曜日は

{y + (y/4) - (y/100) + (y/400) + (13m + 8)/5 + d} mod 7

の値が、0 なら日曜日、1 なら月曜日、2 なら火曜日 ... 6 なら土曜日になる。
ただし、1月と2月の場合は、それぞれ前年の13月、14月と置き換える必要がある。
これはツェラーの公式と呼ばれるものの一種である。
この式を使って、年月日を入力すると曜日を出力するプログラムを作成しなさい。
なお、上記の式中の x mod n は、x を n で割った剰余を意味している。

[実行例]

% ./a.out
年月日を入力して下さい 2024 1 1
月曜日
% ./a.out
年月日を入力して下さい 2024 5 16
木曜日
% ./a.out
年月日を入力して下さい 2024 6 30
日曜日
%

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つのサイズに分けており、運送先の県によって運賃を分けている。運賃の分類は次の通りである。

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

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

[実行例]

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

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

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools