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の終端を調整して様子を確認してください.
配列の応用課題 サイコロの出た目の記録
ここでの最終目標は,サイコロを振って出た目を記録していくプログラムの作成です.
- rand関数の解説
- サイコロなんかのランダムな挙動は乱数を使ってシミュレートします.乱数はrand関数で用意されています.randという名前はrandomという単語をちょん切っています.
- rand関数を使うには,<stdlib.h>をincludeしておく必要があります.
- randは呼び出されるごとに0からRAND_MAXまでの整数を一つランダムに返します.
- rand関数の振る舞い確認
- loopは初め10程度の少なめで1から6までの乱数が出ているかを確認します.
- サイコロのように1から6までの乱数に変換するには,rand()%6+1を使います.
- %は剰余演算子と呼ばれ,割り算したあまりを出します.
- rand()%6だと結果は0から5までなんで,一を足しています.
- 出た目の記録
- 7つの要素を持った配列dataに記録していきます.
- 出た目の数だけが問題なんで,目をtmpに入れて,それにindexとするdataの要素を一つ上げていきます.
- 一つあげる計算は+=1で行います.
- これを繰り返して,後で結果を表示させます.
- うまくいっているようなら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]);
}
}
配列の要素を指定する添字と,要素自身を変化させる方法を理解してください.
Keyword(s):
References:[LectureNotes]