(1)じゃんけんプログラムを,どちらかが先に3回勝つまで繰り返すようにしよう。繰り返すのは,/* 入力 */ から /* 勝負 */までですね。あとは,どちらかが3回勝つまでというのを,どうやって表現したら良いだろうか。
解答例:
#include <stdio.h>
void main()
{
int a, b, win_a=0, win_b=0;
while(win_a<3 && win_b<3){
printf("a君とb君がじゃんけんします。¥nグー : 1 チョキ : 2 パー : 3¥n");
printf("a君は何を出しますか?¥n"); scanf("%d", &a);
printf("b君は何を出しますか?¥n"); scanf("%d", &b);
if(a < 1 || a > 3 || b < 1 || b > 3){
printf("1か2か3をちゃんと入力してください¥n");
}else if(b==(a%3)+1){ /* aの勝ち */
win_a++;
}else if(b==(((a+1)%3)+1)){ /* bの勝ち */
win_b++;
}else{ /* あいこ */
printf("あいこです。¥n");
}
printf("A君:%d勝¥nB君:%d勝¥n",win_a,win_b);
}
if(win_a==3){
printf("A君が先に3回勝ちました。¥n");
}else{
printf("B君が先に3回勝ちました。¥n");
}
}
(2)先週の課題(2)ができなかった人は,これに挑戦しよう。キーボードから,二つの正整数を入力すると,はじめの数÷あとの数 を計算し,商とあまりを求めるプログラムを,引き算だけで実現しなさい。
解答例:
#include <stdio.h>
void main()
{
int a,b,i=0;
printf("初めの数の入力 "); scanf("%d",&a);
printf("あとの数の入力 "); scanf("%d",&b);
while(a>b){
a -= b;
i++;
}
printf("商は%d,余りは%dです。¥n",i,a);
}
(3)先週の課題(5)ができなかった人は,かけ算九九を何とか表示するプログラムを作ろう。九九を計算するには,繰り返しを入れ子にして,カウンタを二つ利用する方法が一般的です。
解答例:
#include <stdio.h>
void main()
{
int a,b,i,j;
a=9;b=9;
i=1;
while(i<=a){
j=1;
while(j<=b){
printf("%d×%d=%2d ",j,i,i*j); /* %2dの2は二桁表示の意味 */
j++;
}
printf("¥n"); /* 行の改行 */
i++;
}
}
(4)素数の判定:入力した整数が,素数かどうか判定するプログラムを作成しよう。
解答例:
#include <stdio.h>
void main()
{
int i,a,s;
printf("整数を入力してください。¥n");
scanf("%d", &a);
s=0;
for( i=1; i <a; i++){
if(a%i == 0){
s++;
}
}
if(s == 1){
printf("素数です。¥n");
}else{
printf("素数ではありません。¥n");
}
}
(5)ユークリッドの互除法に挑戦しよう。2つの整数の最大公約数を求める有名なアルゴリズムです。最大公約数は,これまでどうやって求めてきましたか?これまでに習った素因数分解は,人間の感に頼っている部分がありコンピュータではできません。そこで,考えられたのが次のアルゴリズムです。 「大きい方の数から小さい方の数を引くことを,両者が等しくなるまで繰り返す。等しくなったら,その数が最大公約数。」
解答例:
#include <stdio.h>
void main()
{
int a,b;
printf("一つ目の整数を入力してください。");
scanf("%d",&a);
printf("二つ目の整数を入力してください。");
scanf("%d",&b);
while(a!=b&&a>0){
if(a>b){
a=a-b;
}else{
b=b-a;
}
}
if(a==b){
printf("最大公約数は%dです。¥n",a);
}else{
printf("最大公約数はありません。¥n");
}
}