寝癖頭の解法

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

C言語による流水算

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

/*
 C言語による流水算
 https://neguse-atama.hatenablog.com
*/
#include <stdio.h>
int main(void){
    int nobohaya,kudahaya,funehaya,kawahaya,kyori,bangou,tuzuki,zikan,sentaku;
    do{
        printf("流水算の計算をします。\n");
        printf("船の速さと川の流れの速さを入力してください。\n");
        printf("船の速さ:");  scanf("%d",&funehaya);
        printf("川の流れの速さ:");  scanf("%d",&kawahaya);
        printf("1.船が上る場合の速さ\n2.船が下る場合の速さ\n");
        printf("以上から1,2のどちらかを選び、入力してください:");
        scanf("%d",&bangou);
        if(bangou==1){
            nobohaya=funehaya-kawahaya;
            printf("求める船の速さは%dです。\n",nobohaya);
        }else if(bangou==2){
            kudahaya=funehaya+kawahaya;
            printf("求める船の速さは%dです。\n",kudahaya);
        }else{
            printf("1,2以外の数を入力しないでください。\n");
            goto yarinaosikeisan;
        }
        printf("所要時間を求めますか。それとも船が進む距離を求めますか。・・・0.所要時間 1.船が進む距離:");
        scanf("%d",&sentaku);
        if(sentaku==0 && bangou==1){
            printf("船が進む距離を入力してください:");
            scanf("%d",&kyori);
            zikan=kyori/(funehaya-kawahaya);
            printf("所要時間は%dです。\n",zikan);
        }else if(sentaku==0 && bangou==2){
            printf("船が進む距離を入力してください。");
            scanf("%d",&kyori);
            zikan=kyori/(funehaya+kawahaya);
            printf("所要時間は%dです。\n",zikan);
        }else if(sentaku==1 && bangou==1){
            printf("所要時間を入力してください:");
            scanf("%d",&zikan);
            kyori=(funehaya-kawahaya)*zikan;
            printf("船が進む距離は%dです。\n",kyori);
        }else if(sentaku==1 && bangou==2){
            printf("所要時間を入力してください。");
            scanf("%d",&zikan);
            kyori=(funehaya+kawahaya)*zikan;
            printf("船が進む距離は%dです。\n",kyori);
        }else{
            printf("0,1以外の数を入力しないでください。\n");
        }
        yarinaosikeisan:
        printf("計算をやり直しますか。・・・(0)はい (1)いいえ:");
        scanf("%d",&tuzuki);
    }while(tuzuki==0);
    return (0);
}

中学の入試問題や進学塾などで出題される特殊算の中から、流水算について考えてみました。
文章題やグラフとしての出題になりますが、速さだけに着目すると、単純に和と差から求まります。
時間は2つの動くものに対しても、同時に経過します。
これを、時間の同時性と言います。
したがって相対的な距離は、速さの和と差に依存するのです。
なお特殊算の中には、旅人算も同様に、速さどうしの和と差を求められることから、発展として流水旅人算と言う出題もあります。