Prof. Shigeto R. Nishitani's website - koarashi_project Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}
!小嵐くんのプログラミングスキル向上プロジェクト
!![[no1 CUI|koarashi_project_no1_cui]]
!![[no2 Directory|koarashi_project_no2_directory]]
!![[no3 shell]]

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

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

!!!足場確保
先週のハロープログラムを改良することから始めましょう.
私が作った,1から9までを表示するプログラムを再度見ましょう.
for_loop/hello_world_3.c
に置いているので,以下のようにあらたにarrayというdirectoryを作ってそこにコピーします.
<<< bash
mkdir array
cp for_loop/hello_world_3.c array
>>>
名前を付け替えて,中身を確認します.
<<< bash
cd array
cp hello_world_3.c array_1.c
cat array_1.c
>>>

<<< c
#include <stdio.h>

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

動くかどうかコンパイルして試してみましょう.
<<< bash
gcc array_1.c
./a.out
>>>
無事動くはずです.これを改良していきます.

!!!配列の基本
さて配列ですが,最初に宣言をします.
  printf("Hello world.\n");
の部分を次のように変更します.
  int data[10];
そしてこの中身を表示させてみましょう.
それにはprintfのiの代わりにdata[i]と置き換えます.
できたコードは次のようになります.
<<< c
#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になることを確認してください.

結果はこんな感じです.
<<< c
#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]);
  }
}
>>>
配列の要素を指定する添字と,要素自身を変化させる方法を理解してください.

//!今後のメモ
//フィルター,パイプ,shell, 配列,関数,引数