Ex05Ans
From Prog0
演習第5回
Contents |
解答例
A問題
A-1 whileループ
ファイル名: ex05a1.c
#include <stdio.h>
int main() {
int n, r, count = 0;
printf("初期値の入力 : ");
scanf("%d", &n);
while (n > 0) { /* n!=0でも可 */
count = count + 1;
r = n%2;
n = n/2;
printf("%d回目ループ 商 %d 余り %d\n", count, n, r);
}
return 0;
}
A-2 インクリメント・デクリメント・代入演算子
ファイル名: ex05a2.c
#include <stdio.h>
int main() {
int n, r, count = 0;
printf("初期値の入力 : ");
scanf("%d",&n);
while(n > 0) {
count++; /* ++count や count+=1 でも可 */
r = n%2;
n /= 2;
printf("%d回目ループ 商 %d 余り %d\n", count, n, r);
}
return 0;
}
A-3 無限ループによる書き換え(口頭採点)
ファイル名: ex05a3.c
#include <stdio.h>
int main() {
int n, r, count = 0;
printf("初期値の入力 : ");
scanf("%d",&n);
while(1) {
count++;
r = n%2;
n /= 2;
printf("%d回目ループ 商 %d 余り %d\n", count, n, r);
if(n<1) break; /* n==0 も可 */
}
return 0;
}
B問題
B-1 コラッツの問題
ファイル名: ex05b1.c
#include <stdio.h>
int main()
{
int n;
printf("0でない自然数nを入力して下さい ");
scanf("%d", &n);
while(n != 1) {
if (n%2 == 0) {
n = n / 2;
} else {
n = n * 3 + 1;
}
printf("n = %d\n", n);
}
printf("終了\n");
return 0;
}
B-2 コラッツの問題プログラムの改良
ファイル名: ex05b2.c
#include <stdio.h>
int main()
{
int n, count;
count = 1;
printf("0でない自然数nを入力\n");
scanf("%d", &n);
while (n != 1) {
printf("%d回目\n",count);
if (n%2 == 0) {
printf("%dは偶数\n",n);
n = n / 2;
} else {
printf("%dは奇数\n",n);
n = n * 3 + 1;
}
printf("次の n = %d\n\n", n);
count++;
}
printf("%d回目で n = %d になりました\n", count-1, n);
return 0;
}
B-3 試験結果の集計
ファイル名: ex05b3.c
#include <stdio.h>
int main() {
int student = 0; /* 受験者数 */
int pass = 0, fail = 0; /* pass:合格者数、fail:不合格者数 */
int score, total_score = 0; /* score:得点、total_score:得点の合計 */
double average;
while(1) {
printf("得点を入力して下さい: ");
scanf("%d", &score);
if (score < 0) break;
student++;
total_score += score;
if (score >= 50 ) pass++;
else fail++;
}
average = (double) total_score / student;
printf("受験者数 %d 名,平均点は %f 点\n", student, average);
printf("合格者数 %d 名,不合格者数 %d 名\n", pass, fail);
return 0;
}
B-4 インクリメント・デクリメント
ファイル名: ex05b4.txt
最初の"3"は、前置インクリメントによって出力よりも前にiに1が足されるため、3が出力される。出力後のiの値は3である。 2番目の"3"は、後置インクリメントによって出力の後にiに1が足されるため、3が出力される。出力後のiの値は4になる。 3番目の"3"は、前置デクリメントによって出力よりも前にiから1が引かれるため、3が出力される。出力後のiの値は3である。 最後の"3"は、後置デクリメントによって出力の後にiから1が引かれるため、3が出力される。出力後のiの値は2である。
Extra問題
E-1 ユークリッドの互除法
ファイル名: ex05e1.c
#include <stdio.h>
int main() {
int m, n, new_n;
printf("m nを入力して下さい:");
scanf("%d%d", &m, &n);
while(n != 0) {
new_n = m%n;
printf("%d %% %d = %d\n", m, n, new_n);
m = n;
n = new_n;
}
printf("最大公約数は %d です\n", m);
return 0;
}
