第12回 配列

  • 今回は、

「配列」を行います。

いままで行ったC言語文法

(1)変数の扱い方 
ポイント:-箱を用意して(宣言)、使う。
-整数と実数を区別する int と double
(2)繰り返し: whileループ, forループ 
(3)条件分岐: if文
(4)printf の使い方

プログラムの基本自体は、ほぼこれだけ。
(1)データの入力: ソースに書きこむ。
(2)データをつかるようにコンピュータにのせる(変数)
(3)変数にのせたデータを加工する:(制御構造 for while if)
(4)出力する (printf )

これまので、一通りできるようになった。

具体的には、

  • データの入力:ソースに書きこむ。
  • 変数:データをコンピュータにのせる:int double
  • 条件にあわせて加工:制御構造: for, while if
  • 出力: printf

基本的にいままでの組み合わせ理屈の上では、なんでもできる。。


ただ、理論上はできても、やっぱり不便。。
それなので、それぞれをもっとよくしていく。
例えば、「入力->ファイルから入力したい!」、「一つの処理の流れの短縮ダイヤルみたいなのを作りたい!」、「ファイルに出力したい」、「たくさんのデータをまとめてつかいたい!」

  • ということで、今回は変数のパワーアップ。たくさんの変数を番号で区別してまとめて扱う方法「配列」を勉強します。例えば,配列はIDに変数をたくさんまとめて使いたいときに使います.例えば,企業1の売上,企業2の売上,企業3の売上,...

  • 配列

「配列」とは、番号づけられた変数です。 これまでは、一つの数字に一つの変数を用意してきた。
たとえば、10個の整数[52,51,42,45,56,45,30,23,52,50]の和を計算する場合は、

int a=52;
int b=51;
int c=42;
int d=45;
...

int sum=a+b+c+d+...;
printf("合計は%d\n",sum);

とひとつひとつやってきた。 でも、これだと整数が1000個とかたくさんになるときつい。
そこで、変数を数字で区別できるといいんじゃないか->配列。

以下のように書く。

変数名[番号]

例えば,具体的には,
a[0],a[1],a[2],a[3],... という形。


配列の使い方:
まずは、普通の変数と同じように、「配列使うよ、よろしく」と宣言が必要。
宣言のしかたは,その際は、箱の型とが箱が何個いるかを伝えるのポイント。

型 a[配列の数];

例えば,

int a[100]

だったら、aの数字つきの箱を整数型で100個用意して

a[0],a[1],...,a[99]

が使えるようになる。

配列へのアクセスは,

注意:普通の変数にa0,a1,a2,..という名前をつけても,
a[i]的にiを変数でアクセスできない。

配列だと

#include<stdio.h>
int main(){
 int a[100]; //100個の配列を用意,宣言が一回でいい。
 a[0]=3; 
  a[1]=2;
  a[2]=5;
  a[3]=0;
  a[4]=2:

  //2番目の箱を表示,スタートが0なので。
 printf("%d\n",a[1]);

 //5番目の箱を表示, 
  printf("%d\n",a[4]);
 return 0;
}


同じことを普通の変数だと

#include<stdio.h>
int main(){
 int a0;
 int a1;
 int a2;
 int a3;
 int a5;

 a0=3; 
  a1=2;
  a2=5;
  a3=0;
  a4=0; 

 printf("%d\n",a1);
 printf("%d\n",a4);

 return 0;
}

もう少し省略できる

int a[5];
 a[0]=3; 
a[1]=2;
a[2]=5;
a[3]=0;
a[4]=2:

の部分を

int a[5]={3,2,5,0,2} //5個の要素を持つ配列を用意して,それを代入する.

と書ける.


応用として,配列のデータの合計を求める.
例2:合計の計算
http://www.cc.kyoto-su.ac.jp/~yamada/programming/array.html より。

#include <stdio.h>

int main()
{
    int a[10] = {4, 2, 11, 4, 15, 7, 9, 12, 3, 6};
    int i, sum;

    sum = 0;
    for (i = 0; i < 10; i++) {
        sum =sum+ a[i];                        /* 総和の計算 */
    }
    printf("合計は %3d\n", sum);

    return 0;
}


例題1)算数と国語と社会のそれぞれの児童の合計点
              を配列を用いたプログラムで計算せよ.
>>
A君 B君 C君 D君 E君 F君 G君 H君 I君 J君 K君
生徒番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14
算数(点) 10 20 30 40 5 32 2 3 32 56 32 2 32 12 31
国語 (点)0 30 40 60 7 62 4 5 34 82 52 2 42 35 12
社会 (点)32 42 60 70 72 12 9 2 42 92 61 43 32 21 12

ヒント1 echo "10 20 30 40 5 32 2 3 32 56 32 2 32 12 31" | sed "s/ /,/g"
ヒント2 int sansuu[11]={10,20,30,40,5,...}

ヒント3
疑似コード

 配列:整数型 算数=[10 20 30 40 5 32 2 3 32 56 32 2 32 12 31]
 配列:整数型 国語=[0 30 40 60 7 62 4 5 34 82 52 2 42 35 12 ]
 配列:整数型 社会=[32 42 60 70 72 12 9 2 42 92 61 43 32 21 12]
  
 整数型 生徒数=15
  整数型 合計点
 iが1から[生徒数]まで以下の{..}の間を繰り返す
  {    合計点=算数[i]+国語[i]+社会[i]
         
          "生徒番号yyyの3教科の合計点は=xxx点です.[改行]"と出力.
     //yyyには生徒番号1から13,xxxには合計の点数が入ります,yyyはiに対応し,xxxは合計点に対応")         
     }

出力例

生徒番号1の3教科の合計点は=324点です. 
生徒番号2の3教科の合計点は=123点です.
生徒番号3の3教科の合計点は=32点です. 
...

例1-2)三教科の合計点50点以上が合格者とします.生徒番号ごとに合格者と不合格者を判定を出力するコードをかけ.
疑似コード

 配列:整数型 算数=[10 20 30 40 5 32 2 3 32 56 32 2 32 12 31]
 配列:整数型 国語=[0 30 40 60 7 62 4 5 34 82 52 2 42 35 12 ]
 配列:整数型 社会=[32 42 60 70 72 12 9 2 42 92 61 43 32 21 12]
  
 整数型 生徒数=15
  整数型 合計点
 iが1から[生徒数]まで以下の{..}の間を繰り返す
  {    合計点=算数[i]+国語[i]+社会[i]
         
          もし,合計点が50点より小さかったら以下の{...}内のコードを実行
     { "xxxさんは不合格です.[改行]"と出力 //xxxはiの数字を出力}
     それ以外は
          {"xxxさんは合格です.[改行]"と出力 //xxxはiの数字を出力}         
     }

出力例

1さんは不合格です.
2さんは合格です.
3さんは不合格です.
...
...


例題1-3)合計点が50点以上,国語の点数が40点以上の場合のみ合格とするときに,合格と不合格の判定プログラムを書け.
ヒント if(合計点が50点以上 かつ 国語の点数40点以上) とする.

  • 「かつは &&」例: (x>2 && y>5)

例題1-4)合計点が50点以上かつ国語の点数が40点以上 もしくは,算数×国語=56点以上の場合のみ合格とするときに,合格と不合格の判定プログラムを書け.
ヒント if(合計点が50点以上 かつ 国語の点数40点以上) とする.

  • 「または ||」例: (x>2 || y>5)
  • if((合計点が50点以上 かつ 国語の点数40点以上) または 算数×国語>=56)

scanf 関数の参考ページ
http://ratan.dyndns.info/MicrosoftVisualC++/nyuryoku.html

例題2-2)2つの入力をうけつけその数字の和を計算するプログラムをつくれ
ヒント)
変数aを入力
変数bを入力
a+bを出力

例題2-3)10つの数字の入力をうけつけその数字の和を計算するプログラムをつくれ
ヒント)
配列 a[10]
ループ 0から9 はじめ
a[0]からa[9]まで入力
ループおわり

a[0]~a[10]の和を求める(ループを使用).