寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による旅人算

C言語による旅人算のプログラムです。
Xcode上で、動作を確認しました。
旅人算は、ウィキペディアから引用すれば、算数の文章題、またその解き方の一種です。
https://ja.wikipedia.org/wiki/時計算
動くものが2つあるとき、2つの物の隔たりの推移に関する問題です。
出題内容を大きく分けると、2つの物の進行方向により、出会い算と追いつき算に分けられます。
そして公式としては、以下の2パターンがあります。
1.向かい合って進む場合(出会い算)
・出会うまでの時間 = 2地点の距離 ÷ 速さの和
2.同じ方向に進む場合(追いつき算)
・追いつくまでの時間 = はじめの距離 ÷ 速さの差
そのため本プログラムにおいては、まず2つの選択肢を用意しました。
次に、2つの物(人)の速さをそれぞれに入力することで、それらの速さを計算します。
そして、所要時間か、あるいは2地点の距離の入力を促すことで、出会い算、追いつき算の計算結果を表示します。
ただし入力時の単位に関しては、あらかじめ揃えられているものとしています。
結果表示後に、もう一度計算し直す場合は継続し、そうでなければ終了します。

/*
 C言語による旅人算
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void)
{
    int number1,number2,distance1,distance2,distance3,speed1,speed2,speed3,speed4,again;
    do{
        printf("旅人算を計算します。\n");
        printf("1.出会い算\n2.追いつき算\n");
        printf("以上から1,2のどちらかを選び、入力してください:");
        scanf("%d",&number1);
        if(number1==1){
            printf("では、旅人算(出会い算)を計算します。\n");
            printf("1.2地点の距離と2つの物(人)の速さを入力\n2.出会った時間と2つの物(人)の速さを入力\n");
            printf("以上から1,2のどちらかを選び、入力してください:");
            scanf("%d",&number2);
            if(number2==1){
                printf("2地点の距離と2つの物(人)の速さを入力してください。\nただし入力時の単位に関しては、あらかじめ揃えられているものとしています。\n");
                printf("2地点の距離:");  scanf("%d",&distance1);
                printf("1人目の速さ:");  scanf("%d",&speed1);
                printf("2人目の速さ:");  scanf("%d",&speed2);
                speed3=speed1+speed2;
                printf("2つの物(人)が出会うまでの時間は%dです。\n",distance1/(speed1+speed2));
            }else if(number2==2){
                printf("出会った時間と2つの物(人)の速さを入力してください。\nただし入力時の単位に関しては、あらかじめ揃えられているものとしています。\n");
                printf("出会った時間:");  scanf("%d",&distance2);
                printf("1つ目の速さ:");  scanf("%d",&speed1);
                printf("2つ目の速さ:");  scanf("%d",&speed2);
                speed3=speed1+speed2;
                printf("2地点の距離は%dです。\n",distance2*speed3);
            }else if(number2!=1 && number2!=2){
                printf("1,2以外の数を入力しないでください。\n");
            }
        }else if(number1==2){
            printf("では、旅人算(追いつき算)を計算します。\n");
            printf("1.2つの物(人)の距離と2つの物(人)の速さを入力\n2.追いついた時間と2つの物(人)の速さを入力\n");
            printf("以上から1,2のどちらかを選び、入力してください:");
            scanf("%d",&number2);
            if(number2==1){
                printf("2つの物(人)の距離と2つの物(人)の速さを入力してください。\nただし入力時の単位に関しては、あらかじめ揃えられているものとしています。\n");
                printf("2つの物(人)の距離:");  scanf("%d",&distance1);
                printf("1つ目の速さ:");  scanf("%d",&speed1);
                printf("2つ目の速さ:");  scanf("%d",&speed2);
                if(speed1>speed2){
                    speed4=speed1-speed2;
                }else if(speed1<speed2){
                    speed4=speed2-speed1;
                }
                printf("追いつくまでの時間は%dです。\n",distance1/speed4);
            }else if(number2==2){
                printf("追いついた時間と2つの物(人)の速さを入力してください。\nただし入力時の単位に関しては、あらかじめ揃えられているものとしています。\n");
                printf("追いついた時間:");  scanf("%d",&distance3);
                printf("1つ目の速さ:");  scanf("%d",&speed1);
                printf("2つ目の速さ:");  scanf("%d",&speed2);
                if(speed1>speed2){
                    speed4=speed1-speed2;
                }else if(speed1<speed2){
                    speed4=speed2-speed1;
                }
                printf("2地点の距離は%dです。\n",distance3*speed4);
            }else if(number2!=1 && number2!=2){
                printf("1,2以外の数を入力しないでください。\n");
            }
        }else if(number1!=1 && number1!=2){
            printf("1,2以外の数を入力しないでください。\n");
        }
        printf("計算をやり直しますか。・・・(0)はい (1)いいえ:");
        scanf("%d",&again);
    }while(again==0);
    return (0);
}

中学の入試問題や進学塾などで出題される特殊算の中から、旅人算について考えてみました。
文章題としての出題になりますが、出会い算、追いつき算のいずれにしても、2地点の距離がゼロになるところで、出会ったり、追いついたりします。
応用としては、時計算、通過旅人算、流水旅人算などの類型もあります。
さらに経路が環状、複線(平面)、複線(空間)であったり、速さが規則的に変化したりするような問題もあります。

あと今回から、変数名を改善してみました。