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 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; }
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 i; int m, d; int days; printf("月と日を空白で区切って入力してください:"); scanf("%d %d", &m, &d); days = d; i = 1; while (i < m) { if (i == 2) { days += 28; } else if ((i == 1) || (i == 3) || (i == 5) || (i == 7) || (i == 8) || (i == 10) || (i == 12)) { days += 31; } else { days += 30; } i++; } printf("2023年%d月%d日は%d日目で", m, d, days); switch (days % 7) { case 0: printf("土"); break; case 1: printf("日"); break; case 2: printf("月"); break; case 3: printf("火"); break; case 4: printf("水"); break; case 5: printf("木"); break; case 6: printf("金"); break; } printf("曜日です\n"); return 0; }