C言語で3リットルと5リットルのバケツで4リットル用意するバケツ問題を作ってみた。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

おはこんばんにちは!!!
うにゃうにゃエンジニアの猫です(=^・^=)mm

タイトルに「C言語」とありますが、プログラミング未経験の方もお楽しみいただけるよう、イラストでアルゴリズムをお伝えしています。
絵が下手すぎて笑えますが、その分見やすさと理解しやすさにこだわりました。

IT企業の入社試験の問題?それともお受験とかで出て来るのでしょうか。
3リットルのバケツと、5リットルのバケツを使って、4リットルの水を用意する問題。

そんなの両方に水を入れて8リットルにして、テキトーに半分ぐらいにすれば4リットル、はい、完了!!!

それではアルゴリズムの勉強にならないので、イラストとC言語を使って、水くみアルゴリズムをやってみたいと思います。

「ピッタリ4リットル」が求まるまで、「または」終了ボタン(キーボードのq)を押すまで後判定のdo whileループが繰り返されます。
コードを書く時は、継続条件になるので、
「ピッタリ4リットル」が求まっていない「かつ」終了ボタンを押していない間が継続、という後判定のdo whileループが繰り返されます。
これ、基本情報技術者試験の復習になりますね。

では、やってみます。

3リットルのバケツが空、5リットルのバケツも空、合計0リットルと言う状態です。
その下に、それぞれのバケツを使うメニュー、バケツの水を移すメニュー、
このプログラムを終了するキーがあります。

図で描くとこんなかんじです。

雑な絵でごめんなさいm(__)m

では、3リットルのバケツに水を汲むので、3リットルのバケツを選びます。

バケツに水を汲むを選びます。

3リットルのバケツに3リットルの水が入りました。

図で描くとこうなります。

以下、水を汲む、捨てるなどをシンプルに書きます。

次に、この3リットルの水を5リットルのバケツに移します。

更に、3リットルのバケツに水を汲みます。

この状態で、3リットルのバケツから5リットルのバケツに水を移すと、
こうなります。

ここで、5リットルのバケツを捨てます。
勿体無い!!けれど、今3リットルに入っている残りの1リットルと3リットルを使って、
4リットルが出来そうです。

この1リットルを大きい方に移します。

ここで、小さい方を 3リットルで満たします。

もうすぐです!!!
もうお気づきの方が殆どですね。
この小さい方を大きい方に移したら、フィニッシュですにゃ(=^・^=)mm

おめでとうメッセージとともに、このアルゴリズムが終わりました。
8回の操作でした。

これでばんざ~~~い、なのですが、逆に5リットルのバケツを先に汲む方法もあり、
その方が少ない手順で済むのでそれもやってみます。

では、大きい方を5リットルで満たします。

次に、5リットルから3リットルのバケツに移します。

ここで、またまたもったいないのですが、小さいバケツを空にします。

大きいバケツから小さいバケツに移します。

5リットルのバケツを満たします。

最後に、5リットルのバケツから3リットルのバケツに水を移します。
ここで1リットル減るので、残り4リットル、完成です!!

6回の操作でした。

プログラムはコチラになります。

コードはコチラになります。

#include <stdio.h>

int main(){

int big=0; //5リットルのバケツ
int small=0; //3リットルのバケツ
int x=0; //それぞれのバケツの注水可能な量
char s[20]; //キー入力した文字列
char menu; //選択メニュー

printf(“3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n”,small,big);
printf(“合計【%d】リットル\n—————————-\n\n”,small+big);

//3リットルと5リットルのバケツを使うループ。 4リットルが求まるまでor[q]が押されるまで
do{

//メニューの選択
printf(“3リットルのバケツを使う>>>[s]\n5リットルのバケツを使う>>>[b]\n”);
printf(“3リットルのバケツから5リットルに移す>>>[m]\n5リットルのバケツから3リットルに移す>>>[n]\nq:終了する\n\n>>>>>”);
gets(s);
menu=s[0];

//3リットルのバケツを使う
if(menu==’s’){
printf(“3リットルのバケツに水を汲む>>>[i]\n3リットルのバケツを空にする>>>[o]\n>>>>>”);
gets(s);
menu=s[0];
if(menu==’i’){
small=3;
}
if(menu==’o’){
small=0;
}
}

//5リットルのバケツを使う
if(menu==’b’){
printf(“5リットルのバケツに水を汲む>>>[i]\n5リットルのバケツを空にする>>>[o]\n>>>>>”);
gets(s);
menu=s[0];
if(menu==’i’){
big=5;
}
if(menu==’o’){
big=0;
}
}

//3リットルのバケツけら5リットルのバケツに移す
if(menu ==’m’){
printf(“3リットルのバケツを5リットルのバケツに移す\n”);

//もしも5リットルのバケツに3リットル以上入っていて、空いている分が2リットル以下の場合
if(big>=3){


//5リットルのバケツの量が3リットルより少ない場合
x=5-big;


//5リットルのバケツの空き量
big+=small;
small-=x;
}
else{
big+=small;
small=0;
}
}

//5リットルのバケツから3リットルのバケツに移す
if(menu==’n’){
printf(“5リットルのバケツを3リットルのバケツに移す\n”);
x=3-small; //3リットルのバケツの空き量
if(big3){
small=3;
}

//3リットルのバケツが空になった時
if(small<0){ small=0; }


//5リットルのバケツが溢れた時 if(big>5){
big=5;
}

//5リットルのバケツが空になった時
if(big<0){
big=0;
}

printf(“\n3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n”,small,big);
printf(“合計【%d】リットル\n—————————-\n\n”,small+big);

//終了条件は、4リットル求まった、「または」[q]を押したということは、
//継続条件は、4リットル求まっていない「かつ」[q]を押していないとなることに注意
}while(big!=4 && menu!=’q’);
//入力ループおしまい

if(big==4){
printf(“3リットルバケツ:【%d】リットル\n5リットルバケツ:【%d】リットル\n合計【%d】リットル\n\nおめでとう(=^・^=)!!\n”,small,big,small+big);
}

return 0;
}

長くなってしまいましたが、読んでくださってありがとうございました。
あなたのことを愛しています(=^・^=)mm

このバケツ問題はアルゴリズムを考えるのにとても大事になって来ます。

アルゴリズムの勉強になった参考書2冊

このプログラムを作成するのにヒントになった参考書

です。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。