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地点の距離がゼロになるところで、出会ったり、追いついたりします。
応用としては、時計算、通過旅人算、流水旅人算などの類型もあります。
さらに経路が環状、複線(平面)、複線(空間)であったり、速さが規則的に変化したりするような問題もあります。
あと今回から、変数名を改善してみました。