Ex04Ans

From Prog0

Jump to: navigation, search

演習第4回

Contents

解答例

A問題

A-1 奇数と偶数の判別

ファイル名: ex04a1.c

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

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

  if ( a % 2 ) printf("%dは奇数です\n", a); /* (a%2!=0), (a%2==1)など別表記や, else側を奇数条件とするなども可。 */
  else printf("%dは偶数です\n", a);
  return 0;
}

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

ファイル名: ex04a2.c

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

  printf("学籍番号の下三桁を入力してください(例: 001) ");
  scanf("%d", &id); 

  han = id % 4;

  switch( han ){
  case 1:
      printf("この人は1班です\n");
      break;

  case 2:
      printf("この人は2班です\n");
      break;

  case 3:
      printf("この人は3班です\n");
      break;

  case 0:
      printf("この人は4班です\n");
      break;
  }
  return 0;
}

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

ファイル名: ex04a3.c

#include <stdio.h>
int main()
{
  double temp; /*temperature*/
  int hum;     /*humidity*/

  printf("温度と湿度を入力して下さい ");
  scanf("%lf%d", &temp, &hum);
  printf("温度%.2f度 湿度%d%%\n", temp, hum);

  /* if 複合条件直接記述型 */
  if (temp < 19) printf("寒い\n");
  if (temp >= 19 && temp < 28 && hum < 60) printf("快適\n");
  if (temp >= 19 && hum >= 60) printf("蒸し暑い\n");
  if (temp >= 28 && hum < 60) printf("暑い\n");

  /*else if version 範囲限定型、表を作ってみてください
  if (temp < 19) printf("寒い\n");
  else if (hum >= 60) printf("蒸し暑い\n");
  else if (temp >= 28) printf("暑い\n");
  else printf("快適\n");
  */
  return 0;
}

B問題

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

ファイル名: ex04b1.c

#include <stdio.h>
int main()
{
 int ms,ps,es; /*score*/
 double average;     /*average of 3 scores*/

 printf("数学と物理と英語の点数を入力してください\n");
 scanf("%d%d%d", &ms, &ps, &es);
 
 average = (double)(ms+ps+es)/3;
 printf("3科目の平均値は");
 printf("%6.2f 点です。\n", average);

 if (average >= 80 || ms == 100 || ps == 100 || es == 100) printf("成績は優です。\n");
 else if (average < 80 && average >= 60) printf("成績は良です。\n");
 else if (average < 60 && average >= 40) printf("成績は可です。\n");
 else printf("成績は不可です。\n");
 
 return 0;
}

B-2 breakを省略したswitch文

ファイル名: ex04b2.c

#include <stdio.h>

int main()
{
  int month;

  printf("月を入力してください:");
  scanf("%d",&month);

  switch(month)
  {
    /* 以下の7つの月は同じ処理なので break 省略 */
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      printf("%d月は31日間あります\n", month);
      break;

    /* 以下の4つの月は同じ処理なので break 省略 */
    case 4:
    case 6:
    case 9:
    case 11:
      printf("%d月は30日間あります\n", month);
      break;

    case 2:
      printf("%d月は28日間、または29日間です\n", month);
      break;

    default:
      printf("%d月は存在しません\n", month);
      break;
  } 

  return 0;
}

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

ファイル名: ex04b3.c

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

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

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

  if (score < 0 || score > 100) printf("エラー\n");
  if (score >= 50 && score <= 100) printf("合格\n");
  if (score >= 0 && score < 50) printf ("不合格\n");


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

  if (score < 0 || score > 100) printf("エラー\n");
  else if (score >= 50) printf("合格\n");
  else printf("不合格\n");

  return 0;
}

Extra問題

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

ファイル名: ex04e1.txt

書き換える前

a と b を入力して下さい> 0 0
a=0, b=0
a と b は等しい
a=0, b=0

a と b を入力して下さい> 0 1
a=0, b=1
a と b は等しくない
a=0, b=1

a と b を入力して下さい> 1 0
a=1, b=0
a と b は等しくない
a=1, b=0

a と b を入力して下さい> 1 1
a=1, b=1
a と b は等しい
a=1, b=1


書き換えた後

a と b を入力して下さい> 0 0
a=0, b=0
a と b は等しくない
a=0, b=0

a と b を入力して下さい> 0 1
a=0, b=1
a と b は等しい
a=1, b=1

a と b を入力して下さい> 1 0
a=1, b=0
a と b は等しくない
a=0, b=0

a と b を入力して下さい> 1 1
a=1, b=1
a と b は等しい
a=1, b=1


結果の説明
if 文の条件式において、判定前に b から a への代入が行われ
式の値が0ないし1となったため、0(常に偽)、あるいは1(常に真)
のいずれかに分岐してしまい、正しい a,b の大小判定による分岐が
できなくなったため。
(b が 0 なら「等しくない」、b が 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;
}
Personal tools