5_2_2 プラスワントレーニング②
2節後半は、前半で作ったプラスワントレーニングの改良を行います。
具体的には
試行回数を10回限定から、ユーザーの任意の回数(1回ごとに続けるかどうか求める)行う
ように変えます。
これだけならそう難しくないのですが、
成績結果表示は、すべて表示するとスペースが足りなくなるので、直近10回分のみ行う
ということにします。
この「直近」という考え方が、今回の学習ポイントですね。
成績を保存する配列(要素数10)への格納方法の問題なのですが、いきなり成績を格納ってのを考えると難しいので、単純にユーザーに任意の回数ほど数値を入力してもらい、それの直近10回を表示する仕組みを考えます。
具体的に、次の2通りの方法が考えられます。
① 新しい数は常に、配列の最後へ格納し、ひとつずつ前にずらしていく
→ 新しく読み込むたびに、計10回ほど数値の代入を行わなければならず、効率が悪い
ただし、順番はすっきり並んでいるので、表示するときは便利
② 配列の一つ目から順番に入れて格納し、最後まで行ったら、一番初めに戻り、また順に格納していく
0 ・ 1 ~ ・ 9 ・ 0 ・ 1
①はループ処理で簡単にできます。
②の考え方が、なかなか思いつかず、なるほどなぁと思います。
具体的には
scanf("%d", no[i % 10]);
i ++;
とするのですが、剰余の考え方の便利さってすごいですよね。
次に、表示する際がまた問題なのですが、ここではちょっと複雑な処理になります。
条件判断として、10回以上入力を求めたか、否かの判断を行い
前者ならば、1回目からN回目までを単純にループで表示
後者ならば、入力回数-10回目から10回分表示
ってことになります。表示部分も一工夫あるんですが・・・ま、格納と剰余の考え方で・・・自分ひとりでは思いつきませんね。
5_2 プラスワントレーニング
今日も地道に勉強
2節では、単純記憶トレーニングを少し発展させて、表示された数値に1を足した結果を答えとし、入力を求めるプログラムを作ります。
細かい仕様としては、
・ 例えば
11 25 36
と3つの数値を表示し
12 26 37
という答えの入力を求める(入力方法は1つめ、2つめ、3つめと個別に入力)
・ 一度に表示する数値の数は可変とする
・ 出題を、10回ほど繰り返し、各回の成績と、総合成績(3つの数値なら、×10で30回の正誤)を表示する
ぐらいですかね。この段階では特に難しいことはありません。
考えるのは、成績の発表の仕方ぐらいです。
単純に、30回中正答何回とやるのが簡単ですが、グラフにするという方法が例示されています。
グラフといっても
出題1:☆☆☆
出題2:☆☆
と、横へ伸びるものと、
☆
☆ ☆
☆ ☆
出題 1 2
と、縦へ伸びるもの、ふたつあり、特に後者が興味深いですね。さて、今日はここまで、次が難しい。
5_1_2 単純記憶トレーニング②
さて、地道に迅速に・・・
第5章第1節後半です。
まず、前半で、数字4桁あるいは任意の桁数を、短時間表示させ、それを答えさせるというコードを書きました。
そこで問題となったのは、数字4桁の場合は簡単だけど、任意の桁数となると、ランダム生成できないということ。それを解決するために
n[0] = '1' + rand() % 9;
以後任意の回(桁)数ループ
というように、文字列配列を一桁ずつ指定していくという方法を取りました。
('1' に 0~8を足しているのは、asciiコードで'1'は「49」となり、以後1ずつ増えていくため)
後半では、数字ではなく、任意の文字数のアルファベットを記憶対象とします。
ここでも問題となるのは、記憶対象となる文字列のランダム生成です。答えの照合とかは、strcmp関数で大丈夫です。普通に考えれば、
ltr[0] = 'A' + rand() % 26;
26はアルファベットの数(A~Zまでの数)
で良さそうですが、文字コードによっては、連続して設定されていない場合があるようです。したがって、下記の方法を取ります。
char str[] = "A・・・Z"; ← さきに文字列配列に、それぞれの文字を格納
ltr[0] = str[rand() % strlen(str)]; ← ランダムで、0~25までの数字を生成し、文字列配列strの添え字とする。そして、それを記憶対象の各桁ごとに代入する。
こういう考え方をみると、すごいなぁって思うんですよね。
