Ex04

From Prog0

Jump to: navigation, search

演習第4回

Contents

演習問題

主な内容

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


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

出席確認

演習時間中に出席確認を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(a  > 0) printf("条件式2は真\n");
  if(!a) 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

以下は入力した3つの整数から最大値を判別して表示するプログラムである。下線部を補って実行例のような動作をするようにプログラムを完成させなさい。なお、条件分岐にはif-else if文を使用している。

#include <stdio.h>

int main()
{ 
 int a,b,c,max;
 printf("3つの整数を入力してください ");
 scanf("%d%d%d", &a,&b,&c);
 
 if(a>=b __ ___){
       _____;
 }_______(____________){
       ___=b;
 }____{
       max=c;
 }
 
 printf("最大値は%dです\n", max);
 return 0;   
}

[実行例]

% ./a.out
3つの整数を入力して下さい 12 18 15
最大値は18です
% ./a.out
3つの整数を入力して下さい 0 -2 -5
最大値は0です
%

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

ファイル名: ex04a3.c

一学年250名いる学生を学籍番号の順に 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 4:
      printf("______________ \n");
      ______;
  case _____
      printf("この人はE班です\n");
      break;
  } 
  return 0;
} 

[実行例]

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

B問題

B-1 税金の計算

ファイル名: ex04b1.c

日本の所得税率は収入により異なる。今、仮に所得税率を、年収400万円以下に対しては10%、400万円を越える場合は15%、800万円を超える場合は18%とする。
実行例に示されるよう、年収額を入力した際に年収に応じて所得税額を計算して表示するプログラムを作成しなさい。なお、年収と所得税額は[万円]の単位で表し、所得税額は小数点第4位までを表示させること。


[実行例]

% ./a.out
年収を万円単位の整数(例えば,300)で入力してください: 320
あなたの年収は320万円で、その税金は32.0000万円です
% ./a.out
年収を万円単位の整数(例えば,300)で入力してください: 450
あなたの年収は450万円で、その税金は67.5000万円です
% ./a.out
年収を万円単位の整数(例えば,300)で入力してください: 940
あなたの年収は940万円で、その税金は169.2000万円です

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

ファイル名: ex04b2.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-3 倍数の判別

ファイル名: ex04b3.c

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

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

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

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

  printf("方法1 多岐選択:\n");
  if( a%2 == 1 && ________   ) printf( "%dは奇数で、3の倍数ではない\n", a);
  else if( _________________ ) printf( _________________ );
  else if( _________________ ) printf( _________________ );
  else if( _________________ ) printf( _________________ );
 
  printf("方法2 入れ子の双岐選択:\n");
  if( a%2) {
    if( a%3 ) {
      printf( _________________ );
    }
    else printf( _________________ );
  } 
  else{
    if( _____ ) {
      printf( _________________ );
    }
    else printf( _________________ );
  } 

  printf("方法3 双岐選択(printfでの工夫):\n");
  /* 一つの結果の出力を2回のprintfに分けて、
     1回目ではメッセージの途中までを改行文字をつけずに出力し、
     2回目でメッセージを完成させるようにしている */
  if( a%2 ) 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の倍数である
%

Extra問題

E-1 breakを省略したswitch文

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

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools