C言語学習日記(bssk)
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

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の添え字とする。そして、それを記憶対象の各桁ごとに代入する。


こういう考え方をみると、すごいなぁって思うんですよね。

1 | 2 | 3 | 4 | 5 | 最初次のページへ >>