Ex04Ans
From Prog0
演習第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;
}
