前回は、配列のお話に入りました。
今回も、配列のお話の続きを見ていきましょう。
では、前回の終わりの方のプログラムを見てみましょう。
プログラム名:sample07.c
#include <stdio.h>
int main(void)
{
char s[10];
char y[10] = "どら焼き";
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
s[3] = 'a';
s[4] = 'y';
s[5] = 'a';
s[6] = 'k';
s[7] = 'i';
s[8] = '!';
s[9] = '\0';
printf("1:%s\n",s);
s[0] = 't';
s[1] = 'e';
s[3] = 'i';
printf("2:%s\n",s);
printf("3:%s\n",y);
return 0;
}
このようなプログラムでした。
画面表示はこのようになります。
1:dorayaki!
2:teriyaki!
3:どら焼き
まず、画面表示の1行目は、「1:dorayaki!」となっています。
これをプログラム上で確認しましょう。
プログラムでは、文字型の配列「s」を作っています。要素数は「10」です。
この各要素に一文字ずつ文字を入れて文字列を構成しています。
各要素に文字を入れるには、「添字」を使う必要があります。
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
・
・
・
このように、添え字は「0」から始まることに注意して下さい。
「文字型配列sの0番目の要素にdをいれる」
言葉で表現すると、このように言うことができます。
これを続けて、最終的に配列sの9番目の要素に「\0」を入れて配列に値の代入は終わります。
ここで「\0」という文字が出てきました。
これは一体何でしょうか。
これは、「文字列がここで終了ですよ」ということを知らせるマークみたいなものです。
C言語で文字列を扱う場合必要になるので覚えておきましょう。
これは決まりですので、文字列の最後には「\0」を入れます。
画面表示の2行目は、「2:teriyaki!」となっています。
プログラム上で確認してみましょう。
プログラムでは、中ほどに
s[0] = 't';
s[1] = 'e';
s[3] = 'i';
このような記述になっています。
ここでは何をしているのでしょうか?
そうです、ここでは要素の値を変更しているのです。
ちなみに、「文字」のこともプログラミングでは「値(あたい)」といいます。変数の中身のことを全般に値といいます。
添字を使って、変更したい要素変数の中身を変えています。
変数は、もともと値が入っていると、後からその変数に別の値を代入する操作をすると「上書き」されるので覚えておいてください。
このように、添字を使うと個別に値の操作をすることが出来るのです。
そして、画面表示の3行目は、「3:どら焼き」となっています。
プログラム上で確認しましょう。
プログラムでは、まず、変数の宣言部分に注目します。
char y[10] = "どら焼き";
このような記述になっています。
これは何をしているのでしょうか?
大体想像がつきますね。
以前にプログラミングの勉強では、プログラムを読むことも大切な勉強方法のひとつだといいました。
そして、読むときに必要な考え方として「想像する」というのも大事な要素なのです。
本などを読むときにも「想像」が必要になってきたりするのと同じような感じで捉えるといいと思います。なんとなくでいいので。
で、この記述は、言葉で表現すると「文字型の要素数10の配列yを作り、文字列”どら焼き”を、それぞれの要素に代入する」という意味になります。
分かりにくいですね。
ここでは、「宣言」と「初期化(一番最初に値を入れる作業のこと)」が同時に行われているのです。
宣言と同時に値を入れているのです。
ここでプログラムを良く眺めてみると、何かお気づきになられましたでしょうか?
ようく眺めてみてください。
文字型の配列を作るというのはいいのですが、値を代入するのに、値に「日本語」を使っていますし、文字列の最後は「\0」でないといけないという決まりも守られていません。
何故でしょうか?
これは、このような記述をするときは、自動的にコンパイラが判断をして値の操作を行ってくれているのです。
ここで、話を逸らします。
コンピュータの世界で、日本語(ひらがな、カタカナ、漢字など)は「2バイト文字」と言います。
反対に、英数文字(半角の数字、半角のアルファベットなど)は「1バイト文字」と言います。
半角と全角の違い分かりますでしょうか?
キーボードの左上の方に「半角/全角」というキーがあります。
このキーを押すと、日本語が入力できたり出来なくなったりします。
日本語の入力が出来ない状態の文字を「半角」、日本語が入力できる状態の文字を「全角」といいます。
半角は、全角の半分の情報量を扱います。
全角は、半角の2倍の情報量を扱います。
見た目では、「8」は全角文字、
「8」は半角文字です。
文字の大きさを比べると、だいたい表示領域は半分くらいですね。
さて、このことを踏まえてプログラムに戻りましょう。
プログラミングで漢字などを扱う場合、「2バイト」の変数が必要になります。
文字型の変数は「1バイト」なので、日本語を扱うときには変数2つ分必要になってきます。
で、配列の各要素に値を入れるやり方だと、1バイトの領域には入れられないので不都合が起こってしまいます。
ここで可能にする記述の仕方が、宣言と同時に初期化してしまう方法です。
しかし、更に疑問が出てきます。
宣言以外の時には値を入れることは出来ないのでしょうか?
答えは、出来ます。
記述は、こうします。
まず、宣言で
char *ss;
と、記述します。変数の作成ですね。
次に、値を代入します。
ss = "回転焼き";
などと記述します。
あとは、printf関数などで、
printf("5:%s\n",ss);
と記述すると、その文字列が画面に表示されます。
では、実際にプログラムを組んでみましょう。
sample07.cを変更して、名前を付けて保存しましょう。
プログラム名:sample07a.c(ファイル名に注意して下さい。)
#include <stdio.h>
int main(void)
{
char s[10];
char y[10] = "どら焼き";
char *c;
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
s[3] = 'a';
s[4] = 'y';
s[5] = 'a';
s[6] = 'k';
s[7] = 'i';
s[8] = '!';
s[9] = '\0';
printf("1:%s\n",s);
s[0] = 't';
s[1] = 'e';
s[3] = 'i';
printf("2:%s\n",s);
printf("3:%s\n",y);
c = "ドラ焼き";
printf("4:%s\n",c);
c = "回転焼き";
printf("5:%s\n",c);
return 0;
}
どのような表示になりましたか?
なんだかよく分からないかもしれませんが、「ふ〜ん、こんなものか」くらいで考えてくださいね。
今回は、前回のループの続きと配列について少し見ていこうと思います。
まずは、前回のおさらいです。
前回は、「ループ」の「前判定」と「後判定」を見ていきました。
前判定ループとは、ループに入る直前で、ループの終了条件を評価します。
後判定ループとは、ループに一度入り、ループの終わりで終了条件を評価します。
では、前回の最後の例題プログラムを見てみましょう。
お分かりになったでしょうか?
ファイル名:sample05a.c(ファイル名に注意して下さい)
#include <stdio.h>
int main(void)
{
int a;
int b;
a = 1;
b = 0;
printf("1〜10まで順番に足し算します。\n");
do{
b = a + b;
printf("%d回目:現在の値は %d です。\n",a,b);
a++;
}while( );
printf("合計は、%d です。\n",b);
return 0;
}
このようなプログラムでした。
早速答えですが、do-while文のwhileの括弧の中には、
a<=10
という条件式が入ります。
do{
b = a + b;
printf("%d回目:現在の値は %d です。\n",a,b);
a++;
}while(a<=10);
これが正しい文です。
この文は、「後判定ループ」です。
一度、ループ内を通って、ループの終わりで条件の判断をしています。
では、実際の「後判定」をプログラムをいじって確認しましょう。
それでは、前回と同様に条件式を「a>=10」に変更し動かしてみましょう。
どのようになったでしょうか?
このようになります。
1〜10まで順番に足し算します。
1回目:現在の値は 1 です。
合計は、1 です。
このように、一度ループ内を通っているのが分かると思います。
前回の前判定ループでは、同じように条件式を「a>=10」に設定してみると、
1〜10まで順番に足し算します。
合計は、0 です。
というふうに、ループ内の処理は一度も行われませんでした。
しかし、今回の表示結果をみると、1回目が表示されていますね。
ですから、後判定ループの場合は、必ず一度は処理が行われるのです。
プログラムは、条件分岐とループを使って、あたかもパズルを組むように、様々な処理が出来るので、それぞれの特徴を理解できるようにしましょう。
では、ここから「配列」について見ていきましょう。
まず、C言語で配列を作る方法です。
配列は変数なので、作り方は通常の変数と同じようにします。
今回は「文字型」の配列を作って、画面に文字を表示してみましょう。
作り方はこうです。
char s[10];
プログラムの最初の方で、このように記述すると変数(配列)が作られます。
ちなみに、プログラムの最初の方で、あらかじめ変数を作ることを「宣言」といいます。
「宣言」とは、プログラムの最初の方で、コンピュータに対し、「今から、こういう変数名の変数を使うよ」というふうに教えているのです。
コンピュータは指示通りにしか動きませんから、「宣言」のない状態だと変数が作ることができないので、コンピュータはどうすればいいのか分からなくなってしまいます。ですので、「宣言」は変数などを作る際には、必ず必要になるので覚えておきましょう。
配列は、変数の集まりだと以前お話しました。
で、先程の記述を見てください。
この文の意味ですが、「文字型の変数sを10個作り、ひとまとめにしたもの」という意味になります。
慣れてくると、「要素数10の配列s」という風に考えられるようになります。
では実際のプログラムを記述してみましょう。
ファイル名:sample06.c
#include <stdio.h>
int main(void)
{
char s[10];
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
s[3] = 'a';
s[4] = 'y';
s[5] = 'a';
s[6] = 'k';
s[7] = 'i';
s[8] = '!';
s[9] = '\0';
printf("%s\n",s);
return 0;
}
これを実行すると、
dorayaki!
という文字が画面に表示されます。
このように配列は扱われます。
プログラムをじっくりと見て下さい。
何かお気づきになったでしょうか?
そうです、各要素には「背番号」のように数字が付いています。
この数字のことを「添字(そえじ)」と言います。
配列は、各要素に対し通常の変数と同じように値を扱うことが出来ます。
その時に必要になるのが「添字」なのです。
この背番号のようなものを変数名の後ろの[]の中に記述すれば、操作することが出来るようになります。
そして、今一度良く見てみてください。
もう一点、お気づきになったでしょうか?
各要素に対して、一文字ずつ文字を変数の中に格納しています。
ここで添字に注目してください。
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
・
・
・
という風に、添字が「0」から始まっています。
C言語では、各要素に対して添字を使って操作する場合は、その添字は「0」から始まる決まりになっています。
char aa[200];
char bb[50];
char cc[3];
このような配列があったとします。
各配列の1番目に「z」という文字を入れたいとします。
このときは、このように指定します。
aa[0] = 'z';
bb[0] = 'z';
cc[0] = 'z';
こうすれば、それぞれの配列の一番最初の要素には「z」を入れることが出来るのです。
このように、C言語では、要素の最初の番号は「0」から始まるのが決まりになっていますので注意しておいてください。
まとめましょう。
「宣言」では、「型・変数名(配列名)・要素の個数」を指定し、実際の扱う場面では、添字を使って各要素を操作します。添字は「0」から始まります。
先程の配列の例では、
「char」 が 型
「aa」 が 変数名
「[200]」 が 要素数
添字は、
aa[0]〜aa[199] までの200個となります。
ちなみに言葉で表現する場合には、「aaの0番目の要素」というふうに表現します。
それでは、以下のプログラムを記述して動かしてみましょう。
sample06.cのプログラムに追加すれば手間を少し省くことができます。その際ファイル名を間違えないようにしてくださいね。
プログラム名:sample07.c
#include <stdio.h>
int main(void)
{
char s[10];
char y[10] = "どら焼き";
s[0] = 'd';
s[1] = 'o';
s[2] = 'r';
s[3] = 'a';
s[4] = 'y';
s[5] = 'a';
s[6] = 'k';
s[7] = 'i';
s[8] = '!';
s[9] = '\0';
printf("1:%s\n",s);
s[0] = 't';
s[1] = 'e';
s[3] = 'i';
printf("2:%s\n",s);
printf("3:%s\n",y);
return 0;
}
どのような表示になりましたか?