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; }