プロが教えるわが家の防犯対策術!

プログラミング初心者ですが、個人的にJavascriptでタイピングソフトを作っています。
色々と調べながら作ってきたのですが、どうしても問題の出題を重複しないようにするプログラムがわかりません。どなたか御教授お願い致します。
参考に現在の出題方法を記載しておきます↓

mondai=new Array();
mondaij=new Array();
mondailist=new Array();
mondailist="しゅんかしゅうとう,じゃくにくきょうしょく
,ごんごどうだん,あびきょうかん,";
kanjilist="春夏秋冬,弱肉強食,言語道断,阿鼻叫喚";
}
function typetest(){

empty();

mondaia=mondailist.split(",");
mondaib=kanjilist.split(",");

function putsellect(){//問題選出関数
randompar=Math.floor(Math.random()

*mondai.length);
sellect=mondaia[randompar];
japan=mondaib[randompar];
}

A 回答 (4件)

どこまで意図通りに動作しているのかを確認しましょう



問題と回答を splitで分割していますがこの分割後の保存している変数はどこで宣言しているのでしょう

また typetestで分割した変数と putSelectで出力用に使っている変数と食い違っているように思います
typetestでは mondaiとmondaijに格納しています
putSelectではmondaiaとmondaibで参照しています
どちらかに統一する必要があります

またこの変数はどこで定義したのでしょう
使用する変数は varで宣言して使ったほうがいいように思います
# 変数宣言しなくても使えてしまうので変数名のタイプミスなどを
# 発見しにくいですけど

関数内で定義したローカル変数は 別の関数無いでは参照出来ません

var Test1 = "A";
function foo() {
  var Test2, Test3;
  Test2 = "B";
  Test3 = bar();
}

function bar() {
   return Test1 + Test2;
}

とあった場合 Test1はグローバル変数になり fooかbarの関数の中からもアクセス出来ます
しかし Test2,Test3は 関数fooのローカル変数になりますので 関数fooの中でのみ使用可能な変数です
Test3 = bar();設定される内容は"AB"ではなく"A"となります
なぜなら 関数barのなかまたはグローバル変数にTest2の定義(または代入)が無いためです
    • good
    • 0
この回答へのお礼

javascriptでタイピングソフトを作る講座を見ながら行なったので、自分でもまだ理解できてない部分が多々ありまして。質問されたことにお答えできない私が本当に情けないです。
もう少し勉強をしてからredfox63さんの回答をもう一度見直そうと思います。ご親切にここまでお付き合い頂いて感謝しております。
そのお気持ちに応える事ができず悔しい限りです。

本当に申し訳ありません。
ありがとうございましたm(_ _)m

お礼日時:2008/01/22 23:49

makeArrayはtypetest関数の外で定義します



var ar, nar;
function makeArray(mondai){
  // 先の投稿の内容
}

function typetest() {
  mondai=mondailist.split(",");
  mondaij=kanjilist.split(",");
  makeArray( mondai );

  for( n = 0; n < mondai.length; n++ ) {
    putSelect( n );
  }
}

といった具合に使います
# セレクトのつづりは SellctではなくSelectだと思いますよ
    • good
    • 0
この回答へのお礼

ここまでお付き合い頂き、本当に有難う御座います。
スペルミスのご指摘をありがとうございます。
何度も何度もお答え頂いているにも関わらず、どうしてもエラー発生や動作しなくなるといった現象が起こるので今回の私の記述を最後に、ご覧頂いてミスを指摘して頂きたいと存じます。


var ar, nar;
function makeArray(mondai){
  var n, m, t;
  ar = new Arrray();
  nar = new Array();
  // 乱数と順序用の配列を初期化
  for ( n = 0; n < mondai.length; n++ ) {
    ar[n] = math.random();
    nar[n] = n;
  }
  // ここでソートを行う
  for( n = 0; n < mondai.length -1; n++ ) {
    for ( m = n + 1; m < mondai.length; m++ ) {
      if ( ar[n] > ar[m] ) {
        t = ar[n]; ar[n] = ar[m]; ar[m] = t;
        t = nar[n]; nar[n] = nar[m]; nar[m] = t;
      }
    }
  }
}

}

function typetest(){ 
mondai=mondailist.split(",");
mondaij=kanjilist.split(",");
   makeArray( mondai );

  for( n = 0; n < mondai.length; n++ ) {
    putSelect( n );
}
}
function putselect( n ) {
  select = mondaia[ nar[n] ];
  japan = mondaib[ nar[n] ];
}
本当に申し訳ありません。
宜しくお願い致します。

お礼日時:2008/01/22 22:44

最終的にはご提示のコードのrandamparの部分をnar[n]に置き換えるということになります



初期化処理時にmakeArrayを呼び出してnarを作成します

putselect()関数に何番目の問題なのかのパラメータ付け加えます

function putselect( n ) {
  select = mondaia[ nar[n] ];
  japan = mondaib[ nar[n] ];
}
といった具合に呼び出せばいいでしょう
    • good
    • 0
この回答へのお礼

ご親切にどうもありがとうございます。
ご説明して頂いた通りに入れたつもりなのですが、どうしてもエラーが発生して問題が出題されません。これはどこに問題があるのでしょうか?申し訳ありませんがまた回答お願いいたします。

mondai=new Array();
mondaij=new Array();
mondailist=new Array();
mondailist="しゅんかしゅうとう,じゃくにくきょうしょく
,ごんごどうだん,あびきょうかん";
kanjilist="春夏秋冬,弱肉強食,言語道断,阿鼻叫喚
}
function typetest(){

empty();

mondai=mondailist.split(",");
mondaij=kanjilist.split(",");

var ar, nar;
function makeArray(modai) {
  var n, m, t;
  ar = new Arrray();
  nar = new Array();
  // 乱数と順序用の配列を初期化
  for ( n = 0; n < mondai.length; n++ ) {
    ar[n] = math.random();
    nar[n] = n;
  }
  // ここでソートを行う
  for( n = 0; n < mondai.length -1; n++ ) {
    for ( m = n + 1; m < mondai.length; m++ ) {
      if ( ar[n] > ar[m] ) {
        t = ar[n]; ar[n] = ar[m]; ar[m] = t;
        t = nar[n]; nar[n] = nar[m]; nar[m] = t;
      }
    }
  }
}


function putsellect(n){//問題選出関数

sellect=mondai[ nar[n] ];
japan=mondaij[ nar[n] ];
}

お礼日時:2008/01/22 14:35

順序用の配列と乱数用の配列を用意して


順序用の配列を乱数用の配列を元にソートしてみればいいのではないかと思います

var ar, nar;
function makeArray(modai) {
  var n, m, t;
  ar = new Arrray();
  nar = new Array();
  // 乱数と順序用の配列を初期化
  for ( n = 0; n < mondai.length; n++ ) {
    ar[n] = math.random();
    nar[n] = n;
  }
  // ここでソートを行う
  for( n = 0; n < mondai.length -1; n++ ) {
    for ( m = n + 1; m < mondai.length; m++ ) {
      if ( ar[n] > ar[m] ) {
        t = ar[n]; ar[n] = ar[m]; ar[m] = t;
        t = nar[n]; nar[n] = nar[m]; nar[m] = t;
      }
    }
  }
}

nar[n] に重複しない乱数が生成可能ですよ
    • good
    • 0
この回答へのお礼

お早い回答をありがとう御座います。
大変申し訳ないのですが、記述して下さったプログラムは質問に書いてあるプログラムのどの部分に入れれば良いのですか?大変恐縮ですが、続けてお答え願えますでしょうか。
本当に初心者で申し訳ありません。

お礼日時:2008/01/21 23:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!