プレイ日記
真面目にプログラムしたのはじめてやし、上げましたw ゲーム片手に勉強したかっただけですはいww一応【公開キー】N3444383
2そうだね
プレイ済み
返信[1]
親投稿
バグあれば対策と一緒に教えてもらえるとありがたいです!!
0そうだね
プレイ済み
返信[2]
親投稿
otta777 otta777a
一度記録した問題を解いてから問題を変えるまたはタイトルに戻るで 問題を記録する場合に何も書かずにAを押すと以前入力した内容が 残ったままになっているため何も書かずにAボタンを押しても 記録が終わることが出来ません。 IF命令の条件を満たさないためです。 問題を入力し直す場合はQ1$~Q20$,A1$~A20$の中身を空にする (文字列""を代入する)必要がありますね。
1そうだね
プレイ済み
返信[3]
親投稿
otta777 otta777a
プログラムを書いていて気付かれたかと思いますが変数名だけが違ってて 処理は同じ部分が何カ所かあったかと思います。 配列変数は分かりますか? Q1$→Q$[1] A1$→A$[1] Q20$→Q$[20] A20$→A$[20] の様に変数名に番号を付けて処理することができる機能があります。 そして Q$[I],A$[I]と表記すれば変数Iの数値によって参照する文字列変数が 変えられます。 【続く】
1そうだね
プレイ済み
返信[4]
親投稿
otta777 otta777a
【続き】 INPUT Q1$,A1$ INPUT Q2$,A2$ 3~19まで繰り返し INPUT Q20$,A20$ は DIM Q$[21],A$[21] FOR I=1 TO 20 INPUT Q$[I],A$[I] NEXT と表記できプログラムも格段に短くなります。 配列変数を使うときは配列変数を使う前にDIM命令で配列変数を 使用する宣言をして下さい。
1そうだね
プレイ済み
返信[5]
親投稿
なら50こに拡張とかできそうですか??
0そうだね
プレイ済み
返信[6]
親投稿
バグ修正 公開しました
0そうだね
プレイ済み
返信[7]
親投稿
otta777 otta777a
20個を50個に変更することも出来ますよ。 その場合はDIM命令で宣言する配列変数の個数とFOR命令で繰り返しを する回数を変更して下さい。
1そうだね
プレイ済み
返信[8]
親投稿
なんでQ$[20]じゃなくてQ$[21]なんですか??A$[]もおなじです。 あと、正解判定50こを楽に書くほうほうないですか?
0そうだね
プレイ済み
返信[9]
親投稿
neet#ニート# HIMAJIN.MIV
DIM Q$[20]でもいいですし、本来なら0~19を使うところを分かりやすく、0~20で(0は無視)問題数目と同化させているのだと思います。
2そうだね
プレイ済み
返信[10]
親投稿
otta777 otta777a
DIM命令で配列変数の使用を宣言すると0から順番に番号が付くため 1~20を使いたい場合には21としています。
1そうだね
プレイ済み
返信[11]
親投稿
otta777 otta777a
正解判定の一例です。FOR命令と配列変数を上手く使うと同じ処理をまとめて記述できますよ。
1そうだね
プレイ済み
返信[12]
親投稿
43行目でエラーの理由がわからない。
0そうだね
プレイ済み
返信[13]
親投稿
最新版ぅPしました。
0そうだね
プレイ済み
返信[14]
親投稿
otta777 otta777a
43行目のV=[I]でSyntax errorが発生しています。 変数Vに問題の数を代入するのでしたらV=Iで大丈夫ですよ。 [I]という表現は配列変数のI番目の変数を表現するときに使います。
2そうだね
プレイ済み
返信[15]
親投稿
問題と解答をセーブ出来るようにしたいんですが、全くわからない。
0そうだね
プレイ済み
返信[16]
親投稿
otta777 otta777a
SAVE命令には文字列変数1個を一つのテキストファイルとして 保存する機能があります。 文字配列変数をそのままテキストファイルとして保存出来ないので 文字列変数に問題と解答を順番に区切りを付けて結合して 最後にこれで終わりと分かるように終了文字を結合してから SAVE命令で保存します。 BUF$="" FOR I=1 TO V BUF$=BUF$+Q$[I]+","+A$[I]+"," '問題+区切り+回答+区切り NEXT BUF$=BUF$+"*" '終了文字 FNAME$="TXT:ファイル名" SAVE FNAME$,BUF$
1そうだね
プレイ済み
返信[17]
親投稿
ロードはそのまま INPUT"ファイル名は";fail$ LOAD"TXT:";fail$ みたいな感じですか??
0そうだね
プレイ済み
返信[18]
親投稿
otta777 otta777a
LOADの場合はLOAD "TXT:ファイル名",文字列変数 で文字列変数1個に結合した文字列が読み込まれますんで これを文字列配列変数に展開する必要があります。 LOAD "TXT:ファイル名",BUF$ P=0:N=0 REPEAT P1=INSTR(P,BUF$,",") IF P1==-1 THEN BREAK P2=INSTR(P1+1,BUF$,",") Q$[N]=MID$(BUF$,P,P1-P) A$[N]=MID$(BUF$,P1+1,P2-P1-1) P=P2+1:N=N+1 UNTIL P>LEN(BUF$)
0そうだね
プレイ済み
返信[19]
親投稿
otta777 otta777a
ちょっと難しいかもしれませんINSTR関数で文字列の中にある区切り記号の 位置を取得する方法があるのでその機能を使って問題と答えを切り出して 配列変数に展開しています。
1そうだね
プレイ済み
返信[20]
親投稿
113行目でエラーが起きる;;
0そうだね
プレイ済み
返信[21]
親投稿
otta777 otta777a
DIM命令で配列変数Q$と配列変数A$の個数は幾つで宣言していますか? この場合はDIM Q$[101],A$[101]としないと Subscript out of rangeが出ます。 あとエラーが出た場合にはどんなエラーが出たかも書いていただけると 原因を突き止めやすくなります。 【訂正】 115行目は不要です。 ★終了文字を連結しなくても文字列の終わりを判別する方法がありました) 121行目 P=0:N=1にして下さい。 ★配列変数の1から展開するためN=1とします。
1そうだね
プレイ済み
返信[22]
親投稿
こんなエラー。上に付け加えた行あったので114になってるけど前の画像の113とおなじです。
0そうだね
プレイ済み
返信[23]
親投稿
otta777 otta777a
FOR命令でIを1~100まで変化させて文字配列変数Q$[I],A$[I]を 参照しているのでDIM命令の文字列変数の名前と個数を 幾つにしているか確認してみて下さい。
1そうだね
プレイ済み
返信[24]
親投稿
セーブできました!!でもロードが……typeなんとかってやつで、0,120(LOAD2)みたいな感じ
0そうだね
プレイ済み
返信[25]
親投稿
otta777 otta777a
申し訳ないです。 120行目を LOAD "TXT:W_CARD" OUT BUF$ に変更して下さい。
0そうだね
プレイ済み
返信[26]
親投稿
126でtypeミスマッチ
0そうだね
プレイ済み
返信[27]
親投稿
otta777 otta777a
プログラム中で文字列変数A$またはQ$を使っているところはありませんか? 配列変数を使うと同名の変数は使用できません。 これはSmileBASICの仕様です。 例) DIM A$[10]:A$="AAA" Typemismatchエラーになる
0そうだね
プレイ済み
返信[28]
親投稿
どこですか?
0そうだね
プレイ済み
返信[29]
親投稿
otta777 otta777a
残念ですが原因が分からないですね。 問題のあるプログラムをアップロードして公開してもらえれば こちらで見てみます。
0そうだね
プレイ済み
返信[30]
親投稿
これです
0そうだね
プレイ済み
返信[31]
親投稿
otta777 otta777a
DIM命令はプログラムの先頭で行いましょう。 プログラムをRUNしてLOAD:Yを選択した場合にDIM命令を実行せずに 文字配列変数を操作しようとするためにType mismatchエラーが出ます。 他に気になった部分も 114行目 FOR I=1 TO Vとしないと問題も解答も入力されていない 問題が記録されてしまいます。 65行目のQA$[I]=""をFORの前に置くと変数Iの値によっては Subscript out of rangeエラーになります。FOR~NEXT命令の間に 入れて下さい。 130行目の次にV=N-1を追加して下さい。ロードで読み込んだときの 問題数を変数Vに入れる処理が抜けていました。
0そうだね
プレイ済み