JavaScriptワークブック:初歩的な質問

このQ&Aのポイント
  • JavaScriptワークブックにおける初歩的な質問についての回答です。
  • 質問文に見られる特定のコードについて説明します。
  • 回答では、変数iの使用に関する疑問に応えます。
回答を見る
  • ベストアンサー

javascript ワークブック 問題

<HTML> <HEAD> <TITLE>繰り返し処理</TITLE> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <SCRIPT type="text/javascript"> <!-- function goukei(){ var kai = 0; var bunbo = 2; var a; for (i=1 ; i<=10 ; i++){ a = 1 / bunbo; kai = kai + a; bunbo = bunbo * 2; } alert("合計は" + kai+ "です"); } //--> </SCRIPT> </HEAD> <BODY> <H3>偶数の合計</H3> 以下のボタンをクリックすると、<BR> 1/(2のn乗)を合計した結果を表示できます。<BR> <BUTTON onclick="goukei()">計算結果</BUTTON> </BODY> </HTML> <!-- function goukei(){ var kai = 0; var bunbo = 2; var a; for (i=1 ; i<=10 ; i++){ a = 1 / bunbo; kai = kai + a; bunbo = bunbo * 2; } alert("合計は" + kai+ "です"); } //--> 学び始めたばかりで、初歩的な質問で申し訳ないのですが、 for (i=1 ; i<=10 ; i++){ 以下は、変数iを使っていないのに、どうしてiが使われているのでしょうか? 1/(2のn乗)を合計した結果を表示する問題です。2の1乗から2の10乗までです。 よく分かりません。回答お願いします。説教は不要です。

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

  • ベストアンサー
  • Kaneyan-R
  • ベストアンサー率42% (1248/2909)
回答No.1

>どうしてiが使われているのでしょうか? 変数iは、forループのループ回数に使用されています。 初期値が「1」、上限が"i<=10"つまり「10以下」、増分が"i++"で「+1ずつ」なので、1~10の10回処理が行われます。 1回目の処理では、ループに入る前の初期値 bunbo=2 で kai を出したあと、bunbo*2 で2倍にしたものを bunbo に代入しています。つまり ループ前:bunbo=2 1回目:a=1/2 bunbo=2*2 2回目:a=1/4 bunbo=4*2 3回目:a=1/8 bunbo=8*2  ・  ・  ・ 10回目:a=1/1024 bunbo=1024*2 と言う処理になります。 10回目の処理の最後で bunbo=1024*2 で11乗となりますが、11回目は「i>10」となり、ループ上限から外れ処理は行われないので、結果2の1~10乗を処理したことになります。 私がforループで同じ事をさせるなら、 function goukei(){ var kai = 0; for (i = 1;i <= 10;i++){ kai += 1 / Math.pow(2,i); } alert("合計は" + kai+ "です"); } と言ったところでしょうか。 while使うなら function goukei(){ var kai = 0; var i = 1; while(i <= 10){ kai += 1 / Math.pow(2,i); i++; } alert("合計は" + kai+ "です"); } な感じですかね。

関連するQ&A

  • jslintのエラーについて質問

    以下のソースコードであるエラーが出ました。それが何故エラーなのかがわからないので質問します。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>STEP5演習</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <script type="text/javascript"> <!-- var a,b,kai; a=10; b=4; function tashizan(){ kai=a+b; alert("答えは"+kai+"です"); } function hikizan(){ kai=a-b; alert("答えは"+kai+"です"); } function kakezan(){ kai=a*b; alert("答えは"+kai+"です"); } function warizan(){ kai=a/b; alert("答えは"+kai+"です"); } fanction amari(){ kai=a%b; alert("答えは"+kai+"です"); } //--> </script> </head> <BODY> <H3>変数の演算</H3> a=10、b=4について、<BR> 変数「a」と「b」の計算結果を表示します。<BR> <BR> <BUTTON onclick="tashizan()">足し算</BUTTON> <BUTTON onclick="hikizan()">引き算</BUTTON> <BUTTON onclick="kakezan()">掛け算</BUTTON> <BUTTON onclick="warizan()">割り算</BUTTON> <BUTTON onclick="amari()">余り</BUTTON> </BODY> </html> 質問:エラーとして『Expected an identifier and instead saw '<!'.』(javsscript構文内の「<!--」のやつです)と出ました。何故ですか? 何がエラーかぜんぜんわからない。 投稿日時 - 2012-07-10 22:34:33

  • java script 1から100までの計算

    子供の科学で以前1から100までの計算をするプログラムを紹介していましたが その最後に自分で入力した数字を入れるとその数値から計算してくれるようになると 書いてありましたが、どうやってもできません。誰かご教授願いますでしょうか? 今はここまでつくりました。入力した数値が反映されるように宣言はしたのですが答えが めちゃくちゃでどうしようもありません。 <html> <head> <title>1から100まで足すといくつ?</title> <script language="JavaScript"> function Goukei(){ kotae=0; for(i="a1";i<"a2";i++){ kotae=kotae+i } alert("1から100まで足した合計は"+kotae+"です"); } </script> </head> <body> <form name ="F1"> <input type="text" value="1" name="a1"><br> <input type="text" value="5" name="a2"><br> <input type="button" name="B1" value="答えを表示" onClick="Goukei()"> </from> </body> </html>

  • Javascriptのスコープについて。

    私は何か大きな勘違いをしているでしょうか? for(var i=0; i<10; i++){ for(var i=0; i<10; i++){ alert(i); } } 単純なこのサンプルで、ループは総計100回回るはずだと思うのですが、 外側ループのローカル変数であるiが、なぜか内側ループのローカル変数iと同一視され、 結果10回しか回りません。 どこがおかしいでしょうか。 比較対象として、以下を実行しました。 var i=3; (function(){ var i = 2; alert(i); })(); alert(i); 結果は2, 3となりました。 スコープは機能しています。 前者はfor文だからおかしくなったのでしょうか? ・・・while文で書き下すと、あ、for文の()中で宣言するカウンタ変数というのは、該当for文のスコープの外に出ちゃっているんですね・・・。 つまり、for(var i・・・)と宣言したカウンタ変数のスコープは、for(){}のスコープではなく、その一個外に所属すると。。 こういう解釈でよいのでしょうか?よろしくお願い致します。m(_ _)m var i=0; while(i<10){ var i=0; while(i<10){ alert(i); i++; } i++; }

  • テキストエリア(複数行)からの数を計算したい。

    テキストエリア(複数行)からの数を計算したい。 テキストエリア(複数行)から 1100 200 300 など複数の数値が送られてきます。 それを var a = document.input.prices.value; //alert(a); var resArray = a.split(\n); var goukei =0; for(i=0;i<resArray.length;i++){ goukei = goukei + resArray[i]; } こんな風にして合計したいのですが、うまくできません。 どうすればよいのでしょうか。 よろしくお願いいたします。m(_ _)m

  • javascriptについて

    <script type="text/javascript"> <!-- function df(){ var scr=100; if(document.ad.y.checked){ var sty=document.ad.a; for(var i=0;i<3;i++){ if(sty[i].checked){ scr+=20+10*i; break; } } } document.ad.ad1.value=scr; } --> </script> </head> <body> <form action="#" method="POST" name="ad"> <h4>毎日歯を磨きますか?</h4> <p><input type="checkbox" name="y" value="">はい<br> <input type="checkbox" name="n" value="">いいえ</p> <h4>何回</h4> <p>1回<input type="radio" name="a" value=""><br> 2回<input type="radio" name="a" value=""><br> 3回<input type="radio" name="a" value=""></p> <p>何<input type="text" size="20" name="ad1">点</p> <p><input type="button" value="配点" onClick="df()">&nbsp;<input type="reset" value="リセット"></p> </form> </body> </html> プログラムとしては成功しているんですが 解らないところが for(var i=0;i<3;i++) のところです。ラジオボタンに添え字を使って計算をしているという プログラムなのでしょうが たとえばlengthではなくあえて数字を入れてるのは 配列ではないからでしょうか? もう一点 formをつかって button やimage などを使うと 間違いを指摘してもデーターが流れて言ってしまいます。 return falseなど工夫はしてますが データーをtextに入っている文面を消さずに修正させるいい方法はありませんか お願いします。

  • JavaScript

    下記のプログラム(ボタン早押しゲーム)に以下のようなプログラムを入れたいのですが、どうすれば良いでしょうか? ・正しい順番にボタンが押されていれば毎回シャッフル(押されたボタンが色が変わり押せなくする。) 間違いならアラートで違うとメッセージを出す。 <script type="text/javascript"> // 初期化処理 var suji = "(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)"; var pushed = ""; // 押されたボタン管理 var startTime; // ゲーム開始時間を管理 var labelArray = suji.split(""); // 数字を一文字ずつ分割 $("startButton").onclick = start; nextGame(); // スタートボタンを表示する // 開始準備 function nextGame() { $("buttons").innerHTML = ""; $("startButton").style.visibility = "visible"; } // ゲーム開始 function start() { $("startButton").style.visibility = "hidden"; // 配列に数字を代入して順番をシャッフル arrayShuffle(labelArray); // ボタンを作る for (var i = 0; i < labelArray.length; i++) { var b = document.createElement("button"); b.innerHTML = labelArray[i]; b.onclick = button_clickHandler; $("buttons").appendChild(b); } startTime = (new Date()).getTime(); } // ボタンが押された時の処理 function button_clickHandler(e) { var ch = e.target.innerHTML; // 押されたボタンの文字 var tmp = pushed + ch; // 順番が正しいかどうか判定する if (suji.substr(0, tmp.length) != tmp) { alert("違います。次は、" + suji.substr(pushed.length,1)); return; } e.target.disabled = true; e.target.style.backgroundColor = "#202020"; pushed = tmp; if (pushed == suji) { var now = new Date().getTime(); var tm = Math.floor((now - startTime) / 1000); alert("おめでとうございます。\n" + tm + "秒でクリア"); nextGame(); } } // 配列をシャッフルする function arrayShuffle(bs) { for (var i = 0; i < bs.length; i++) { var r = Math.floor(Math.random()*bs.length); var tmp = bs[i]; bs[i] = bs[r]; bs[r] = tmp; } } function $(id) { return document.getElementById(id); } </script>

  • javascript で wait() をさせたい

    無限ループを使用せずに、次のような作業を、プログラムした順に行なう方法がわかりません。 function test(id) { writeX("1", "a1") ; wait(3000) ; writeX("3", "a3") ; writeX("4", "a4") ; writeX("5", "a5") ; writeX("6", "a6") ; } function writeX(x, id) { document.getElementById(id).value = x ; } function wait(t) { setTimeout( function() { writeX("waited", "a2") }, t ) ; } --------------- <input type= "text" id= "a1" ></input><br> <input type= "text" id= "a2" ></input><br> <input type= "text" id= "a3" ></input><br> <input type= "text" id= "a4" ></input><br> <input type= "text" id= "a5" ></input><br> <input type= "text" id= "a6" ></input><br> <button onclick="test()" > Test </button> ********* どのような方法で、wait() が終わるまで次の処理を待たせることができるか教えて下さい。 よろしくお願いします。

  • 教えてください。javascriptで困っています

    javascript初心者です。たくさんある変数をfor文を使って計算させたいと思っています。計算はfor分の中でしたいのですが、うまくいきません。以下のようなことをしたいのですが。evalなどを使うのでしょうか。調べるキーワードがわからなかったので、投稿させていただきました。教えてください。よろしくお願いします。 var x1=1; var x2=2; var x3=3; var x4=4; var x5=5; var y1=1; var y2=2; var y3=3; var y4=4; var y5=5; var z1; var z2; var z3; var z4; var z5; for(var i=0 i<5 i++){ "z"+i = "x"+i + "y"+i; } alert(z1); alert(z2); alert(z3); alert(z4); alert(z5);

  • javascriptで合計を出力したいです

    まず最初にソース載せます⇓ <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-type" content="text/html; charset=shift-jis"> <title>総合演習</title> </head> <body bgcolor="#FFFFFF"> <script type="text/javascript"> var ninzu2; var ninzu; ninzuu2=Number(ninzu); ninzu=prompt('人数を入力してください', '3');//人数を入力 var points2; var points; points2=Number(points) var points=new Array(); for(var i=0; i<ninzu; i++){ var anaswer; points[i] = anaswer; anaswer = prompt("点数を入力してください",""); var anaswer2; anaswer2=Number(anaswer); } var sum2; var sum=0; sum2=Number(sum); for(i=0; i<points.length; i++){ sum=+points[i]; } document.write(sum); </script> </body> </html> エラーはいっさいありません。ただ計算式が間違ってるだけです 3回入力し、1回目10, 2回目20、 3回目30と入力すると出力結果は20が返ってきました。 要件は入力した数字分の合計を求めるという物です。 けど20が返ってくるってことは平均を出力しているってことですよね? 考えてもわからなくってアドバイスお願いします。

  • JavaScriptで占いページを作成

    JavaScriptで占いページを作成しようと思っています。 探した結果、下記サイトが一番合っていたのですが、pointの所でつまずいてしまいました。 どうかお力をお貸しください。 http://jsfiddle.net/XwfzW/ ボタンを押す度にポイントが加算されるのですが、1クリックで100ポイント。2クリックめで100+(100+5)の205ポイントになってしまいます。 この結果(2クリック目)で100+5の105にするにはどうすれば良いでしょうか?(3クリック目では100+5+4の109が正解です) 宜しくお願いいたします。 HTML <span id="question"></span><br><br> <span id="optionA"></span><input type="button" value="選択" id="optionAButton"> <span id="optionB"></span><input type="button" value="選択" id="optionBButton"><br><br> <span id="point"></span>ポイント JavaScript -var questions = { '1': { text: '問1:山と海、どちらが好き?', options: [ {text: '山', point: 100, next: '2a'}, {text: '海', point: 50, next: '2b'} ] }, '2b': { text: '問2b:ガンガン泳ぐ派?ビーチでまったり派?', options: [ {text: '泳ぐ', point: 5, next: '2a'}, {text: 'まったり', point: 7, next: '1'} ] }, '2a': { text: '問2a:○○○○?', options: [ {text: '△△△', point: 4, next: '1'}, {text: '□□□', point: 2, next: '2b'} ] } } var point = 0; function setQuestion(questionId) { var question = questions[questionId]; $('#question').text(question.text); $('#point').text(point); var optionA = question.options[0]; $('#optionA').text(optionA.text); $('#optionAButton').click(function() { point += optionA.point; setQuestion(optionA.next); }); var optionB = question.options[1]; $('#optionB').text(optionB.text); $('#optionBButton').click(function() { point += optionB.point; setQuestion(optionB.next); }); } $(function() { setQuestion('1'); })

専門家に質問してみよう