• ベストアンサー

プログラミングについて。

次の数学のBASICで、なぜ、THENの後ろが何もないのでしょうか?どういうことでしょうか?それと、なぜ、行140は、LET X=X✳︎1.05なのでしょうか?教えていただけると幸いなのですが。すみません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.14

回答No.11にあるように、プログラムの動作どおりに1stepづつ計算結果を全て書いていけば判ることです。 ----ここから開始---- 100行目 N=0 110行目 X=1 120行目 IF文判定:X<=2なので130行目以下の計算実行 130行目 N=0+1=1 140行目 X=1 x 1.05 = 1.05  150行目 120行目に戻る 120行目 IF文判定:X<=2なので130行目以下の計算実行 130行目 N=1+1=2 140行目 X=1.05 x 1.05=1.1025 150行目 120行目に戻る ・ ・ (以下この繰り返しなのでN=13まで中略) ・ 130行目 N=13+1=14 140行目 X=1.88564914232323560791015625 x 1.05=1.9799315994393973883056640625 150行目 120行目に戻る 120行目 IF文判定:X<=2なので130行目以下の計算実行 130行目 N=14+1=15 140行目 X=1.9799315994393973883056640625 x 1.05=2.078928179411367257720947265625 150行目 120行目に戻る 120行目 IF文判定:X>2なのでIF文実行の要件を満たさないためTHEN以下の処理は行われず、160行目へ処理が飛ばされる 160行目 END IFでIF文処理は終了 170行目 PRINT Nで現在変数Nに格納されている数値(直前の計算結果であるN=15)を出力する 180行目 終了 です。 >何故X=1.05^Nになるのでしょう? 1.05^Nは「1.05のN乗」すなわち、1.05をN回掛け合わせたという意味ですが、それを理解されていますか? 130行目のNは「1.05を掛け合わせた回数」を表しています。 140行目が1.05を複数回掛け合わせている計算処理で、140行目の計算式は常にX=1.05^Nの計算を行っています。 (N=2のときは1.05x1.05で1.05^2、N=3のときは[N=2のときのXの計算結果]x1.05なので1.05^3。以下同様) これが理解できない限り、この問題は永遠に判らないままです。 15回目の処理が終了した時点で、Xの値はX>2となりますよね。 で、16回目の処理を行おうとして150行目から120行目に戻った時点で、IF文の実行条件であるX<=2を満たさなくなります。なので130行目以下の計算処理は行われません。「直前の計算結果」はこの15回目の計算結果を指します。 「ただ計算する」だけではなく、このプログラムを動作の流れにそって1行づつ実行をたどっていけば全てが理解できるはずです。それが理解できていない、ということはプログラムを動作の流れに沿って追えていない(若しくは追っていない)ことになります。 判らなければ判るまで自分で考えて、プログラムを1ステップ(1行)づつ追って手計算で実行してみる、ということを面倒くさがらずにやることが重要であり、プログラムを理解するためには必要なことです。 とにかく努力をして自分で考える、その習慣をつけらえることをお勧めします。 以上、ご参考まで。

zasx1098
質問者

補足

では、が2を超えた直後の値というのはどういうことでしょうか?2を超えたはわかりますが、直後の値というのがわかりません。直前と言ったり、直後と言ったりもう訳がわかりません。どういうことか教えていただけると幸いなのですが。すみません。物分かりが悪くて。

その他の回答 (15)

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.16

>直前の計算結果というのは、N=14の時ですよね?それで、直後の値は、N=15ですよね?2を超えたというのは、X>2ですよね? そう云う言葉遊びをしているから理解できないのです。 プログラムを走らせたときどのような結果になるかで判断します。 >教えていただけると幸いなのですが。 回答No.12で提示したプログラムをフローチャートにして添付します。 本来はフローチャートを作成してからコーディングするのですが簡単な処理なので直接コーディングしても間違えない範囲かと思います。 目的はPRINT Nでどのような値が表示されるかを確かめることです。

  • musume12
  • ベストアンサー率63% (19/30)
回答No.15

> 15回目の処理が終了した時点で、Xの値はX>2となりますよね。 > で、16回目の処理を行おうとして150行目から120行目に戻った時点で、 > IF文の実行条件であるX<=2を満たさなくなります。なので130行目以下の計算処理 > は行われません。「直前の計算結果」はこの15回目の計算結果を指します。  この簡潔な説明で十分すぎると思うのですけどね・・・  このプログラムコードは目的を果たすために   130  LET N = N + 1   140  LET X = X*1.05 という処理を16回繰り返そうとしますが、実際には15回まで実行した時点で X の値は X>2 となります。それがあなたの言う > 2を超えた直後の値 です。つまり「15回の処理を終えた直後のXの値」です。しかし、プログラムはここで終わらず   150 GOTO 120 によって16回の処理を実行しようとします。そして   120 IF X <= 2 THEN により処理が終わります。この時点(16回の処理を実行しようした時点)での「直前の結果」とは   「15回の処理を終えた直後の結果」 のことです。  ふ~、わかったかな(笑)。プログラミングがどうのこうのというより、日本語の読解力の問題です。  ちなみに、この程度のプログラムで GOTO文を使うのはまったく感心できません。その本の著者のプログラミング能力を疑いたくなるほどです。確か、あなたの別の質問のコードも GOTO文を使っていたような気が。普通は LET N = 0 LET X = 1 DO WHILE X <= 2   LET N = N + 1   LET X = X*1.05 LOOP PRINT N END とします。これまでの問答を見る限り、できたら別の参考書で勉強した方がいいと思います。

回答No.13

>直前の計算結果というのは、N=14の時ですよね?それで、直後の値は、N=15ですよね? 小生の回答にある「プログラムの流れ通りの処理」を実際に手計算で書き出して行われましたか? その手間をきちんとかけて書き出していけば、今までの小生を含めた他の回答者様からのご回答も全て納得がいくはずです。 逆に言うと、「プログラムの流れ通りの処理」を実際に書き出さず、bunjii様のご回答にある「N=15でX>2になる」だけにとらわれてしまうとプログラムの動作は永久に理解できません。 大変失礼な物言いになりますが、質問者様のレベルでは小生を含めた回答者様からの回答の文言「だけ」を見て理解しようとするのはおそらく不可能です。 実際に「どのような流れでプログラムが実行されるか」をきちんと自分で手作業で書き出す手間をかけて、その上で再度各回答者様からの回答とその書き出した結果を比較しつつ見てみれば、プログラムの動作、及び各回答者様がどのような意図で回答を書かれていたか、は理解できるはずです。 以上、ご参考まで。

zasx1098
質問者

お礼

すみません。X>2でした。すみません。

zasx1098
質問者

補足

はい。行いました。しかし、直前の計算結果というのは、なぜ、X=1.05∧Nになるのでしょうか?が2を超えた直後の値というのは、なぜ、x>2となった値なのでしょうか?教えていただけると幸いなのですが。すみません。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.12

>Higurashi777さんが言っている直前の計算結果が2を超えた直後の値とはどういうことでしょうか? 質問の添付画像で示されているプログラムを下記のように書き換えれば理解できますか? 100 RET N=0 110 RET X=1 120 RET N=N+1 130 RET X=X*1.05 140 IF X<=2 THEN GOTO 120 150 END IF 160 PRINT N このプログラムで求めたいのはNの値です。 XのN乗が2を超えたときのNの値を表示するプログラムです。 例えば年利5%の複利で資産運用するとN年で2倍を超えることを確かめるためのプログラムと言えるでしょう。 下記のように動作します。 N=0 X=1 N=1 X=1*1.05=1.05 N=2 X=1.05*1.05=1.1025 N=3 X=1.1025*1.05=1.157625 N=4 X=1.157625*1.05=1.21550625 N=5 X=1.21550625*1.05=1.2762815625  ・  ・ N=14 X=1.88564914232323560791015625*1.05=1.9799315994393973883056640625 N=15 X=1.9799315994393973883056640625*1.05=2.078928179411367257720947265625 ∴ X=1.05^15=2.078928179411367257720947265625 年利5%で資産運用すると15年で約2倍になります。

zasx1098
質問者

お礼

書き出してみました。教えていただけると幸いなのですが。すみません。 https://6900.teacup.com/cgu135/bbs/820

zasx1098
質問者

補足

直前の計算結果というのは、N=14の時ですよね?それで、直後の値は、N=15ですよね?2を超えたというのは、X>2ですよね?どういうことなのかやっぱりしっくりきません。教えていただけると幸いなのですが。すみません。丁寧な解説をもらっているのに。

回答No.11

>どうしてもしっくりきません 今までの説明で判らない、というのであれば、このプログラムが動作したらどのような計算過程になるのかを実際に手書きで計算されてみると良いでしょう。 すなわち、「このプログラム実行された場合、実際にどのように計算が行われるのか」を以下の要領で書き出して確認されることをお勧めします。 ----ここから開始---- N=0 X=1 120行目のIF文判定:X<=2なので130行目以下の計算実行  N=0+1=1  X=1 x 1.05 = 1.05   120行目に戻る 120行目のIF文判定:X<=2なので130行目以下の計算実行  N=1+1=2  X=1.05 x 1.05=1.1025  120行目に戻る 120行目のIF文判定:X<=2なので130行目以下の計算実行  N=2+1=3  X=1.1025 x 1.05 = 1.157625  120行目に戻る 120行目のIF文判定:X<=2なので130行目以下の計算実行  N=3+1=4  X=1.157625 x 1.05 =1.21550625  120行目に戻る 120行目のIF文判定:X<=2なので130行目以下の計算実行  N=4+1=5  X=1.21550625 x 1.05 = (←これはご自分で計算されてみてください) (以下、上記の作業の繰り返し) 手計算でも5分もあれば回答にたどりつきます。 このプログラムが回答にたどりつくまでに実際にどのような動作をするか、というのを実際に手計算で確認すれば、今まで小生を含めた他の回答者様からの回答が理解できるかと思われます。 「このプログラムが実際にどのような動作をするか」を理解するためには、実際にその動作を追うしかありません。聞いてばかりではいつまでたっても理解はできません。 百聞は一見にしかず/千里の道も一歩から、です。 以上、ご参考まで。

zasx1098
質問者

補足

Bunjiiさんの補足に書いた質問に答えていただけると幸いなのですが。すみません。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.10

>格納されているということは、それが、最小のNであるということですよね?教えていただけると幸いなのですが。すみません プログラムがどうこう以前に文章の読解力を鍛える必要があるように思えますが。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.9

>なぜ、THENの後ろが何もないのでしょうか? 次の行130、140、150がTHENの後に続いていますので実行されます。 ELSEが定義されていませんので160 END IFがIF文の終わりになります。 実質では160のEND IFが無くても動作は同じになります。 >なぜ、行140は、LET X=X✳︎1.05なのでしょうか? Xは1.05のN乗であることが理解できないと目的のプログラムが組めません。

zasx1098
質問者

補足

すみません。Higurashi777さんが言っている直前の計算結果が2を超えた直後の値とはどういうことでしょうか?直前の計算結果とはどういうことか、詳しく教えていただけると幸いなのですが。 後、が2を超えた直後の値とはどういうことか詳しく教えていただけると幸いなのですが。もう少し詳しく教えていただけると幸いなのですが。すみません。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.8

これがどのBASICかわかりませんが、IFとEND IFは対となっておりIFからEND IFまでの行がIFの判定文で真と判断されたときに実行される行となります。 蛇足ですが・・・IF文の中でGOTOでIFの判定文に戻るなんて…なんてお行儀の悪いコードなんでしょう。そういうことをするんだったらWhileを使ったループでしょう。 ・・・ん?!BASICにはWhile~End Whileって無いのかな? ※他の言語だとend whileは別の書き方だったりします。 学校のプログラミングではそこまでやらない? 現実問題として、仕事でそんなコード書いていたらバグ探しのときに物凄く苦労することがあるのでそういうコードの書き方は嫌われます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.7

まずは文法をしっかり勉強しましょうね。

回答No.6

>直前の計算結果が2を超えた直後の値 文章のとおりです。 「直前の計算結果」・・・X=1.05^Nの計算結果 「が2を超えた直後の値」 X>2となった値(=120行目のIF文の実行条件である「X<=2」を満たさなくなった値) です。 Xの値が2を超えるまでは120行目~150行目を延々とループして繰り返します。 2を超えた時点で、130行目以降の処理を行わずに160行目へ飛び、END IFでIF文が終了し、170行目の処理へ移行します。 160行目へ飛んだ時点でX,Nに保管されている値は「Xの値が2を超えた直後のX及びN」の値ですから、問題文にある「1.05^N>2」を満たす最小のNの値が変数Nに格納されています。 問題文の解説をよく読めば理解できる内容です。それ以外の事は小生も記載していません。まず「書いてあることを自分で考え、理解する努力をする」ことをお勧めします。 以上、ご参考まで。

zasx1098
質問者

お礼

直前の計算結果が2を超えた直後の値をもう少し詳しく教えていただけると幸いなのですが。説明としては、いいのですが。文章の通りとはどういうことでしょうか?直前というのは、N行目であるとすればNー1行目であるのですよね?それで、直後の値というのは、N行目のことですよね?どうしてもしっくりきません。教えていただけると幸いなのですが。すみません。文章能力が低くて。

zasx1098
質問者

補足

格納されているということは、それが、最小のNであるということですよね?教えていただけると幸いなのですが。すみません。

関連するQ&A