• ベストアンサー

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

次の数学の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/8248)
回答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/8248)
回答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% (1621/5657)
回答No.10

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

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答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/17765)
回答No.8

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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

  • BASICプログラミング &の使い方

    (A)IF a>=b THEN LET x=a & & ELSE LET x=b (B)IF a>=b THEN LET x=a ELSE LET x=b 学校でもらったプリントに 「1つの文を複数行に渡って書くときは&を使うと」書いてあるのですがなぜBの文では使ってないのでしょうか? &の使い方がわからないので教えてください。

  • Basicのプログラミングについて… (game)

    箱の上から自然に落ちるようにするにはどうすればよいのでしょうか? SET bitmap SIZE 500,500 SET WINDOW 0,10000,10000,0 LET x=5000 LET y=5000 LET jsw=0 DO UNTIL getkeystate(13)<0 PLOT LINES:0,5000+110;10000,5000+110 PLOT LINES:6000,4000;7000,4000 PLOT LINES:6000,4000;6000,5000+110 PLOT LINES:7000,4000;7000,5000+110 SET AREA COLOR "white" DRAW disk WITH SCALE(100)*SHIFT(x,y) IF getkeystate(37)<0 THEN LET x=x-50 IF getkeystate(39)<0 THEN LET x=x+50 IF x<0 THEN LET x=0 IF x>10000 THEN LET x=10000 IF getkeystate(38)<0 AND jsw=0 THEN LET jsw=1 LET i=-SQR(2500) END IF IF jsw=1 THEN LET y=i^2+2500 LET i=i+1 IF i>SQR(2500) THEN LET jsw=0 end if if i>0 then if 6000<x and x<7000 then if 4000-140<=y THEN LET jsw=0 end if end if end if if i>0 then if 6000>x then LET y=i^2+2400 IF i>SQR(2500) THEN LET jsw=0 end if end if SET AREA COLOR "black" DRAW disk WITH SCALE(100)*SHIFT(x,y) WAIT DELAY 0.01 LOOP END

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • ベーシック、循環小数プログラミング

    0 !q/pを少数点表示する 1 LET X=10 2 DIM a(1 TO 100),b(0 TO 100) 3 INPUT q,p 4 LET b(0)=q 5 LET k=1 6 DO 7 LET a(k)=INT(b(k-1)*X/p) 8 LET b(k)=MOD(b(k-1)*X,p) 9 LET j=0 10 DO UNTIL j=k-1 OR b(j)=b(k) 11 LET j=j+1 12 LOOP 13 IF b(j)=b(k) THEN EXIT DO 14 LET k=k+1 15 LOOP 16 ! 結果の表示 17 PRINT "0."; 18 FOR i=1 TO j 19 PRINT a(i); 20 NEXT i 21 PRINT "{"; 22 FOR i=j+1 TO k 23 PRINT a(i); 24 NEXT i 25 PRINT "}" 26 END 上のプログラミングですが、 10~16、21~26がはっきりと理解できません。 6のdoは15のloopとつながるんですよね? q=3,p=7で考えてみたのですが、 8,9行目で a(1)=4 b(0)=3 b(1)=2 a(2)=2 b(2)=6 a(3)=8 b(3)=4 a(4)=5 b(4)=5 a(5)=7 b(5)=1 a(6)=1 b(6)=3 となり、b(0)=b(6)より、循環小数ということだと考えました。 このb(0)=b(6)の比較は10行目、13行目のどちらでしょうか? また、結果の表示で、17行~20行で、 0.a1a2a3・・と表示することはわかりましたが、循環小数のさいの{}の入れ方(21行~25行)が理解できていません。 私の理解や記入がわかりにくいかもしれませんが、 どなたか解説していただけないでしょうか。 よろしくお願いいたします。

  • 3連1次方程式を解くプログラミングについて

    最近プログラミングの勉強を始めたばかりの者です。 エラーが出ても、どこがいけないのか、自分では見つけられません。 よろしくお願いいたします。 次の3連1次程式を解くプログラムを作成しなさい。 ただし、X、Y、Zは整数とし、その範囲を-100<X、Y、Z<100とする。 4X+2Y-6Z=-28 7X-5Y-8Z=-20 5X+Y-Z=2 という問題です。 以前の質問の中で同じような問題の質問(QNo.1005159)があり、参考にさせていただいたのですが、エラーばかりで・・・ 100 FOR X=-100 TO 100 110 FOR Y=-100 TO 100 120 FOR Z=-100 TO 100 130 IF (4*X+2*Y-6*Z=-28) AND (7*X-5*Y-8*Z=-20) AND (5*X+Y-Z=2) THEN 140 140 NEXT Z 150 LET Z=Z1 160 NEXT Y 170 LET Y=Y1 180 NEXT X 190 LET X=X1 200 PRINT "X,Y,Z=";X1,Y1,Z1 END

  • 08年センター試験本試数学Bコンピュータ

    以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

  • プログラミング ニュートン法簡単な例の説明が欲しい

    これはニュートン法で√nを求めるプログラムですけど このプログラムを一行ずつ説明してもいいですか? DEF f(x)=x^2-a DEF g(x)=2*x ! g(x)=f'(x) PRINT "input" INPUT a LET x=a LET E=EPS(1)*10 <----これは何? DO  LET x1=x-f(x)/g(x)  PRINT x1   IF ABS((x1-x)/x)<E THEN EXIT DO  LET x=x1 LOOP END

  • BASIC言語について。

    IF条件式THEN命令で、条件式には、>などが使われて、命令で、LETなどが使われると覚えた方が良いのでしょうか?教えていただけると幸いなのですが。すみません。 昔の数学Bです。教えていただけると幸いなのですが。

  • プログラミングの問題

    整数nをキーボードから入力し、1からnまでの数のうち奇数だけを加えた和を計算し表示するプログラム ヒント ・変数xが奇数か偶数かは、MOD(x、2)が0か否かで判断できる。 ・FOR~NEXT構文のなかでも、 IF~THEN~ELSE~END IF 構文を使える。 という問題で、 input n let s=0 for i=1 to n までしかわかりませんでした。 いったいこのあとはどうなるのか、教えてください。 おねがいします。