多次元配列 - (2013/06/07 (金) 11:39:16) の編集履歴(バックアップ)
並び替え
数値の大きさを比べて大きさの順に並べ替えることをソートといいます。
配列の中の数値をソートできると便利なことが多いので、ここで説明しておきます。
配列の中の数値をソートできると便利なことが多いので、ここで説明しておきます。
int Array[10] = {}; printf("10個の整数を入力してください。\n"); for(int i = 0; i < 10; i++) { scanf("%d",&Array[i]); } int tmp = 0; for(int i = 0; i < 9; i++) { for(int j = i+1; j < 10; j++) { if(Array[j] < Array[i]) { tmp = Array[j]; Array[j] = Array[i]; Array[i] = tmp; } } } printf("ソートして表示します。\n"); for(int i = 0; i < 10; i++) { printf("%d\n",Array[i]); }
今回使ったのはバブルソートという方法です。 昇順に並べるようにしてあります。
ソートの方法はほかにもあるので余裕のある人は自分で調べてみましょう。
ソートの方法はほかにもあるので余裕のある人は自分で調べてみましょう。
多次元配列
配列の応用として多次元配列というものがあります。
配列は変数を複数作るものですが、多次元配列は配列を複数作るものです。
ここでは2次元配列を例に説明します。
多次元配列も普通の配列と同じように数値を代入することができます。
配列は変数を複数作るものですが、多次元配列は配列を複数作るものです。
ここでは2次元配列を例に説明します。
多次元配列も普通の配列と同じように数値を代入することができます。
int Array[2][3]; Array[0][0] = 5; Array[0][1] = 7; Array[0][2] = 3; Array[1][0] = 4; Array[1][1] = 9; Array[1][2] = 8; 表示するときも普通の配列とほとんど変わりません。 printf("%d\t%d\t%d\n",Array[0][0],Array[0][1],Array[0][2]); printf("%d\t%d\t%d\n",Array[1][0],Array[1][1],Array[1][2]);
しかし、長くなりがちなのでなるべく短くなるようにまとめてみましょう。
/*---------------------------*/
int Array[3][4] = {{7,6,0,4},{3,5,9,1},{2,8,3,6}};
for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("%d\n",Array[i][j]); } }
/*---------------------------*/
多次元配列を初期化する場合は { } の中にさらに { } をいれます。
2次元配列の場合は下のように整えた方が見やすくなる場合があります。
/*---------------------------*/
int Array[3][4] = {{7,6,0,4}, {3,5,9,1}, {2,8,3,6}};
/*---------------------------*/
- その他の型の配列
配列を作るれるのは int型だけではありません。
double型 や char型の配列も作ることができます。
double型 の配列は int型とほとんど変わらないので、char型の配列について説明します。
char型 は半角英数の文字を入れることができる変数です。それが配列になると「文字列」を入れることができます。
「文字」と「文字列」では扱いに違いがあります。
/*------------------------------*/
char cha;
char str[5];
cha = 'A'; //1文字しか入らない
str[0] = 'A';
str[1] = 'B';
str[2] = 'C';
str[3] = 'D';
str[4] = '\0'; //最後には必ず \0 を入れる
printf("%c\n",cha); //1文字だけなら %c
printf("%s\n",str); //文字列は %s
/*------------------------------*/
文字列の最後には必ず \0 を入れなくてはいけません。
NULLcharacter、ヌル文字などと呼ばれています。
この \0 に配列の要素を1つ使うため、
4文字入れたい場合は要素数が5以上の配列を、100文字入れたい場合は要素数が101以上の配列を用意しなくてはいけません。
- 文字列の初期化
文字列もほかの配列と同じように初期化できます。
/*-----------------------------------*/
char str[5] = {'A','B','C','D','\0'};
printf("%s\n",str);
/*-----------------------------------*/
[ ] の中に何も書かず初期化すれば、自動的に必要な要素数を確保してくれます。
/*-----------------------------------*/
char str[] = {'A','B','C','D','\0'};
printf("%s\n",str);
/*-----------------------------------*/
' ' ではなく " " を使うことで、,(カンマ)を入れる必要もなく、\0 も自動的に入れてくれます。
/*-----------------------------------*/
char str[5] = {"ABCD"};
printf("%s\n",str);
/*-----------------------------------*/
さらに [ ] の中を書かないことで要素数を自動で確保してくれます。
/*-----------------------------------*/
char str[] = {"ABCD"};
printf("%s\n",str);
/*-----------------------------------*/
- 文字列入力
ユーザーからの文字列入力を受け付けるには scanf をつかいます。
/*-----------------------------------*/
char str[255];
printf("英数で254文字以内の文字列を入力してください。\n");
scanf("%s",str); // & は付けない
printf("%sが入力されました。\n",str);
/*-----------------------------------*/
ユーザーの入力する文字列の長さがわからないため、要素数は多めに宣言します。
- 文字列の操作
文字列の最後には \0 を入れる決まりになっています。
つまり、最後には必ず \0 が入っているのです。
それを利用すると次のようなことができます。
/*---------------------------------------*/
char str[255];
printf("文字列を入力してください。\n");
scanf("%s",str);
int i = 0;
while(str[i] != '\0') { printf("%c",str[i]);
i++; }
/*---------------------------------------*/
これは文字列の中の文字を一つ一つ表示しています。
scanf で文字列を受け付けるときは %s を使いますが、& は付けないので注意してください。
二次元配列を使うことで複数の文字列をループの中で扱えます。
/*------------------------------------*/
char str[3][255];
printf("文字列を3つ入力してください。\n");
for(int i = 0; i < 3; i++) { scanf("%s",str[i]); }
printf("入力された文字列は\n");
for(int i = 0; i < 3; i++) { printf("%d番目が%s\n",i,str[i]); }
printf("です。\n");
/*------------------------------------*/
練習問題
次のようなプログラムを作ってください。
第1問
ユーザーから実数値を5個入力してもらい、降順で並べて、小数点以下第2位まで表示。
次のようなプログラムを作ってください。
第1問
ユーザーから実数値を5個入力してもらい、降順で並べて、小数点以下第2位まで表示。
第2問
ユーザーに整数値を10個入力してもらい、平均より大きいものだけ選んで表示。
ユーザーに整数値を10個入力してもらい、平均より大きいものだけ選んで表示。
第3問
ユーザーに文字列を入力してもらい、文字列の中に A の文字があったら B に変えて表示。
ユーザーに文字列を入力してもらい、文字列の中に A の文字があったら B に変えて表示。