koarashi_project

小嵐くんのプログラミングスキル向上プロジェクト

no1 CUI

no2 Directory

no3 shell

C言語:配列

今日はC言語を先にします. ねらいは配列です.

配列

先週は変数を勉強しました.今日紹介する配列は変数がたくさん並んだものです. 変数は値や文字を入れておく箱と覚えてください. 箱では,その種類と名前を指定しました. おなじ箱がたくさん必要になったと考えてください. その場合に配列を使います.配列は英語でarrayといいます.

足場確保

先週のハロープログラムを改良することから始めましょう. 私が作った,1から9までを表示するプログラムを再度見ましょう.

for_loop/hello_world_3.c

に置いているので,以下のようにあらたにarrayというdirectoryを作ってそこにコピーします.

 mkdir array
 cp for_loop/hello_world_3.c array

名前を付け替えて,中身を確認します.

 cd array
 cp hello_world_3.c array_1.c
 cat array_1.c
#include <stdio.h>

int main(void){
  printf("Hello world.\n");
  for (int i=1;i<10;i++){
    printf("%d\n",i);
  }
}

動くかどうかコンパイルして試してみましょう.

 gcc array_1.c
 ./a.out

無事動くはずです.これを改良していきます.

配列の基本

さて配列ですが,最初に宣言をします.

 printf("Hello world.\n");

の部分を次のように変更します.

 int data[10];

そしてこの中身を表示させてみましょう. それにはprintfのiの代わりにdata[i]と置き換えます. できたコードは次のようになります.

#include <stdio.h>

int main(void){
  int data[10];
  for (int i=1;i<10;i++){
    printf("%d\n",data[i]);
  }
}

動かしてみてください.少し変な表示かもしれません.これをちゃんと表示するように変更していきます. まず,printfの部分を次のようにiとdata[i]を同次に表示させるように変更します.

   printf("%d:%d\n",i,data[i]);

これをarray_2.cとして保存して,動かしてみてください.

配列の鍵カッコの中に番号を指定します.0番目から初めて,1番目,2番目です. 10個の配列を作ったので,最後が9番です. 何番目かを示す数字をインデックス,日本語では添え字と読んでいます.

配列の中身,これを要素と呼びます. 0番から9番まで表示するようにforの中身を

 for (int i=0;i<10;i++){

としましょう.array_3.cで保存します.

さらに初期化の部分を

 int data[10]={};

としてください.ちゃんと0が入っているのを確認できるでしょうか.

配列の基本を問う課題

data[10]={0,1,2,3,4,5,6,0,1,2,3,4,5,6};としてみてください.何が起こりますか?

配列の要素数や,for-loopの終端を調整して様子を確認してください.

配列の応用課題 サイコロの出た目の記録

ここでの最終目標は,サイコロを振って出た目を記録していくプログラムの作成です.

  1. rand関数の解説
    1. サイコロなんかのランダムな挙動は乱数を使ってシミュレートします.乱数はrand関数で用意されています.randという名前はrandomという単語をちょん切っています.
    2. rand関数を使うには,<stdlib.h>をincludeしておく必要があります.
    3. randは呼び出されるごとに0からRAND_MAXまでの整数を一つランダムに返します.
  2. rand関数の振る舞い確認
    1. loopは初め10程度の少なめで1から6までの乱数が出ているかを確認します.
    2. サイコロのように1から6までの乱数に変換するには,rand()%6+1を使います.
    3. %は剰余演算子と呼ばれ,割り算したあまりを出します.
    4. rand()%6だと結果は0から5までなんで,一を足しています.
  3. 出た目の記録
    1. 7つの要素を持った配列dataに記録していきます.
    2. 出た目の数だけが問題なんで,目をtmpに入れて,それにindexとするdataの要素を一つ上げていきます.
    3. 一つあげる計算は+=1で行います.
    4. これを繰り返して,後で結果を表示させます.
  4. うまくいっているようならloop上限の数を上げて全部の要素が均等に大体1/6つまり0.1666666667になることを確認してください.

結果はこんな感じです.

#include <stdio.h>
#include <stdlib.h>

int main(void){
  int data[7]={0,0,0,0,0,0,0};
  for (int i=0;i<10;i++){
    int tmp = rand()%6+1;
    printf("%d:%d\n",i,tmp);
    data[tmp]+=1;
  }
  printf("\n");
  for (int i=1;i<7;i++){
    printf("%d:%d\n",i,data[i]);
  }
}

配列の要素を指定する添字と,要素自身を変化させる方法を理解してください.

Last modified:2017/06/09 10:50:47
Keyword(s):
References:[LectureNotes]