Supaki電記 ブログ店

Supaki電記とは、オーディオ、パソコンをはじめとする、さまざまなものをレビューしている、何の利益のない電気屋さんである。このブログでは、レビューの他、日記や、プログラミング、最近気になったことなど、最新情報をお届けします。

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

プログラミング初心者によるC言語勉強74 

・これまでのまとめ

・配列を宣言して、各要素に値を代入できます。
・{}内に初期歌詞を指定して、配列を初期化することができます。
・初期化子が足りない場合は、足りない数だけ0が収納されます。
・文字列に置き換えられるマクロを定義できます。
・多次元配列を作成して扱うことができます。
・文字列配列の未尾には¥0を格納します。
・文字列配列は、""を使った文字列を指定して初期化できます。
・文字列を操作するときは、最後が¥0であることを利用します。

配列を利用すると、同じ種類の多くのデータを扱うことができます。
また、C言語では、これまでに良く使ってきた文字列を利用するときにも、
配列の機能が欠かせません。配列はC言語に欠かせない便利な仕組みなのです。
スポンサーサイト
[ 2009/11/13 23:58 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強72 

・文字列を入力する
文字列を無事に出力することができたでしょうか?
つぎに、文字列をキーボードから入力して扱うコードを作成してみることにしましょう。
次のコードでは、ユーザーが入力した文字列を出力します。

~ソースコード~
#include <stdio.h>

int main(void)
{
    char str[100];

    printf("文字列を入力してください。\n");

    scanf("%s", str);

    printf("入力した文字列は%sです。\n", str);

    return 0;
}

~実行画面~
文字列を入力してください。
Hello
入力した文字列はHelloです。
続行するには何かキーを押してください . . .

このコードで使う配列は、str[100]のように、要素数を大きめに確保しておく必要があります。
配列には要素数をこえて値を代入できなかったことを思い出してください。
ユーザーが入力する文字列全体を必ず収納できるように、大きい配列を用意しておかなければならないのです。
文字列を入力するときにも、出力するときと同じように、変換しようとして、%sを使います。
カンマの跡に、配列名を記述すると、入力した文字列が配列str[]に順番に格納され、最後に\0がつくのです。
ただし、整数や小数、文字を入力したときの場合と異なり、カンマのあとの配列名には&記号をつけません。
入力コードを記述するときには、十分注意してください。

重要点
文字列を入力する場合は、変換しようとして、%sを使う。
scanfで入力する際、配列名には&をつけない。
[ 2009/11/11 23:39 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強71 

・文字列配列を出力する

~ソースコード~
#include

int main(void)
{
char str[6];

str[0]='H';
str[1]='e';
str[2]='l';
str[3]='l';
str[4]='o';
str[5]='\0';

printf("入力した文字列は%sです。\n", str);

return 0;
}

~実行画面~
入力した文字列はHelloです。
続行するには何かキーを押してください . . .

文字列配列は、printf関数で出力することができます。ただし、変換仕様には、%sをつかってくだい。

なお、このコードは、""を使って初期化する方法でかくこともできます。

重要点 文字列を出力する場合は、変換しようとして、%sを使う。
[ 2009/11/10 23:13 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強70 

・文字列配列を初期化する
文字列は次のように初期化して、char型の配列に収納することもできます。

char str[6] = {'H','e','l','l','o','\0'};
char str[] = {'H','e','l','l','o','\0'};
char str[6] = "Hello";
char str[] = "Hello";

これらは、どれも"Hello"という文字列を扱うために、char型の配列str[6]を初期化したものです。
文字列の場合は、通常の配列の初期化方法のほか、上のように
""で囲んで初期化する
と言う方法を使うことができるようになっているのです。
””を使って文字列配列を初期化した場合には、自動的にNULL文字(\0)がつけられることになっています。
なお、””を使う収納方法は、初期化のときにだけ利用することができます。
次のように、””をつかってあとから文字列を代入することができませんので、注意してください。

char str[6] = "Hello";
/* 誤り */
/* str = "Hello" */
[ 2009/10/28 23:07 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強69 

・文字列と配列の関係を知る
今回は、配列を応用した仕組みについて学びましょう。
実は、いままで何度も登場したC言語の「文字列」は、配列と深いかかわりをもっています。
文字列とは、

"Hello"

のような文字の並びのことでしたね。C言語では、このような英数字の文字列を、
「char型の配列」で扱うことができる
と言う仕組みになっています。「char型」は前にも紹介したように、「文字」を表す型です。
文字列は文字の並びから成り立っているので、この方の配列で扱うことができるのです。
たとえば、上のHelloと言う文字列は次のようにして扱います。

char str[6];

str[0]='H';
str[1]='e';
str[2]='l';
str[3]='l';
str[4]='o';
str[5]='\0';

char型の配列を宣言したあと、各要素に1つずつ文字を代入しています。これで、配列str[]で"Hello"という文字列を扱えるようになるのです。
ただし、C言語では、日本語の文字列の場合は、扱いが異なる場合があるので、ここでは英数字だけを扱うことにしておきます。
ところで、この配列の最後に代入した'\0'とはなんでしょうか?
この文字はNULL文字と呼ばれています。
C言語では、文字列配列の最後を表すために、
必ず最後に'\0'という値をつける
ことになっているのです。
この「'\0'」をわすれないでください。とくに配列を宣言するときには、注意が必要です。
この「'\0'」の文のハコもわすれずに用意する必要があるからです。
たとえば、"Hello"のような5文字からなる文字列を扱う場合を考えてみてください。
この場合、5文字からなる文字列だからと言って、要素を5個しか持たないはいれつでは文字列を扱うことができません。このとき、配列要素は最低6個用意する必要があります。
最低「文字列の長さ+1」個の要素が必要となるのです。

重要点
文字列ではchar型の配列として扱う。
文字列配列の最後の要素は'\0'とする。
文字列配列の要素数は、「文字列の長さ+1」以上必要となる。
[ 2009/10/27 23:19 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強68 

・多次元配列のしくみを知る。
もうひとつ配列の応用を学びましょう。これまでに学んだ配列は一列に並んだハコのようなイメージでした。
さらに配列は、2次元以上に並んだイメージである多次元配列として指定することもできます。
2次元配列であれば、表計算ソフトの表のようなイメージを思い浮かべるといいでしょう。
さらに3次元配列であれば、X軸・Y軸・Z軸であらわされる立体を思い浮かべるといいかもしれません。
多次元配列の宣言は次のようになります。

~構文~
型名 配列名[要素数][要素数];

実際に多次元配列の宣言をしてみてください。

int test[2][5];

こlの2次元の配列は、int型の値を2×5=10個記憶することができる配列です。
多次元配列は、さまざまな利用方法が考えられます。
たとえば、複数科目のテストの点を整理することができるでしょう。
また、数学の行列式の計算などに応用することも考えられるでしょう。
ここでは簡単な例として、さきほどの5人分のテストの成績について、「国語」「算数」という2つの科目の点数を整理してみることにします。
2次元の配列に値を代入するようすをみてください。

~ソースコード~
#include <stdio.h>
#define SUB 2
#define NUM 5

int main(void)
{
    int test[SUB][NUM];
    int i;

    test[0][0] = 80;
    test[0][1] = 60;
    test[0][2] = 22;
    test[0][3] = 50;
    test[0][4] = 75;
    test[1][0] = 90;
    test[1][1] = 55;
    test[1][2] = 68;
    test[1][3] = 72;
    test[1][4] = 58;

    for(i=0; i<NUM; i++){
        printf("%d番目の人の国語の点数は%dです。\n", i+1, test[0][i]);
        printf("%d番目の人の算数の点数は%dです。\n", i+1, test[1][i]);

    }

    return 0;

}

~実行画面~
1番目の人の国語の点数は80です。
1番目の人の算数の点数は90です。
2番目の人の国語の点数は60です。
2番目の人の算数の点数は55です。
3番目の人の国語の点数は22です。
3番目の人の算数の点数は68です。
4番目の人の国語の点数は50です。
4番目の人の算数の点数は72です。
5番目の人の国語の点数は75です。
5番目の人の算数の点数は58です。
続行するには何かキーを押してください . . .

このコードでは、test[0][●]に国語の点数を、test[1][●]に数学の点数を収納することにしました。
これをfor文で繰り返して出力しています。
2次元以上の配列への値の代入や出力も使い方は基本的に同じです。
添字を指定して、値を代入したり、出力したりすれば良いのです。
また、多次元配列を初期化することもできます。
多次元配列では、通常の配列の初期化で使った{}の中にもう一度{}を記述する形となります。
下のコードは、これの多次元配列を初期化する記述です。

int test[2][5] = {
                  {80,60,22,50,75},{90,55,68,72,58}
};
int test[][5] = {
                  {80,60,22,50,75},{90,55,68,72,58}
};

最初の配列の要素数については、1間配列と同じように、数を省略して、記述することができるようになっています。
多次元配列では、C言語の内部的には、1次元配列の各要素がさらに配列として扱われているので、このようなことができるのです。

重要点 多次元の配列を宣言して利用できる。
[ 2009/10/26 23:42 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強67 

配列の内容をソートする
この節では、これまでの知識を使って、配列を応用するコードを記述してみましょう。
配列を使って、テストの点数を並べ替えてみることにします。
値を並べ替えることをソートと言います。
配列は要素に複数の値を収納することができるので、並べ替えをするコードに利用すると便利です。

~ソースコード~
#include
#define NUM 5

int main(void)
{
int test[NUM];
int tmp;
int i, j, s, t;

printf("%d人の点数を入力してください。\n", NUM);
for(i=0; i scanf("%d", &test[i]);
}

for(s=0; s for(t=s+1; t if(test[t] > test[s]){
tmp = test[t];
test[t] = test[s];
test[s] = tmp;

}
}
}

for(j=0; j printf("%d番目の人の点数は%dです。\n", j+1, test[j]);
}

return 0;
}

~実行画面~
5人の点数を入力してください。
22
80
57
60
50
1番目の人の点数は80です。
2番目の人の点数は60です。
3番目の人の点数は57です。
4番目の人の点数は50です。
5番目の人の点数は22です。
続行するには何かキーを押してください . . .

このコードは、配列の要素を大きい順にソートするコードです。
事項結果をみると、たいしかに点数の多い順に出力されていますね。

以下省略・・・

要素を入れ替えるためには、入れ替えるものと同じ方の作業用のエリア(変数)が必要になります。
そのためこのソートでは、作業用の変数tmpを使っています。
[ 2009/10/18 23:47 ] プログラミング | TB(0) | CM(0)

プログラミング初心者によるC言語勉強66 

・マクロを利用する
さて、これまでのコードでは、繰り返しの文を使って配列を扱ってきました。つぎのように配列の大きさである「5」と言う数値を使って、コードを記述してきたわけです。

int test[5] = {80,60,22,50,75};
int i;

for(i=0; i<5; i++){
printf("%d番目の人の点数は%dです。\n", i+1, test[i]);
}

しかし、もし異なるテストについてのコードを新しく作成しなければならなくなった場合はどうしたらよいでしょうか?
このコードを再利用することができそうですが、そのためには、80,60・・・といったテストの点数を書き換えてから、コード中にあるすべての「5」という数字を、新しいテストの受験者数に証正しなければなりません。しかし、コード中から「5」という単純な数字をみつけるのはとても大変な作業です。
こんなとき、次のようにコードを記述しておくと大変便利です。

~ソースコード~
#include
#define NUM 5

int main(void)
{
int test[NUM] = {80,60,22,50,75};
int i;

for(i=0; i printf("%d番目の人の点数は%dです。\n", i+1, test[i]);
}

return 0;
}

~実行画面~
1番目の人の点数は80です。
2番目の人の点数は60です。
3番目の人の点数は22です。
4番目の人の点数は50です。
5番目の人の点数は75です。
続行するには何かキーを押してください . . .

このコードの実行結果は、これまでと同じです。しかしここでは、配列の要素を「NUM」という職別子を「5」に置き換えるように指定したためです。

#defineという指定は、
コードを翻訳する前に、「置き換え」をする
と言う機能をもっています。つまり、コードでは「NUM」と指定した部分がすべて「5」に置き換えたれてから、実際にコードが翻訳されてプログラムが作成されえるようになっています
このようにしておけば、あとでこのコードを書き換えるのは簡単です。
つまり、コードの戦闘にある#defineの行の「5」の数値を書き換えるだけで、コードをもっと多くの受験者を管理するプログラムに変更できます。コード中で「5」という数値を使っている部分すべて探し出して、いちいち「10」、「20」に書き直す必要がないのです。

#defineを使って指定する名前をマクロといいます。 #defineは、コード内のマクロを、数値や文字などを含めた文字列に単純に置き換える機能をもっています。なおマクロ名にはすべて大文字を使うことが慣例です。

~構文~
#define マクロ名 置換する文字列

配列の要素数を変更することは良くある小物です。このようなとき、マクロを使ったコードを作成しておけば、コード証正が楽になります。
なお、前にも説明したように、コードの中で#がついている部分はコンパイラが翻訳を行なう前に、プリプロセッサによって、処理される行をあらわしています。#defineの部分がプリプロセッサによって置き換えられた跡で、コードが翻訳されるようになっているのです。他のコード部分と異なり、プリプロセッサが処理する行の最後には、セミコロン(;)をつけません。

重要点 #defineでマクロを定義することができる。
[ 2009/10/17 18:38 ] プログラミング | TB(0) | CM(2)

プログラミング初心者によるC言語勉強65 

・初期歌詞が足りない場合は?
ところで、配列の要素数より、少ない初期化子しか記述しなかった場合には、どうなるでしょうか?
そのような場合、あまった要素については、0という値が自動的に収納されることになっています。

int test[5] = {80,60,22};

たとえば、上のような初期化をした場合には、最後の二つのハコには0という値が収納されるわけです。

重要点 初期化子が少ない場合には、残りの要素が0が収納される。
[ 2009/10/08 23:18 ] プログラミング | TB(0) | CM(2)

プログラミング初心者によるC言語勉強64 

・配列を初期化する
配列にはいろいろな記述方法があります。
まず、配列の初期化について学びましょう。
前は、「配列の宣言」と「値の代入」を別々のコードに記述しました。
はいれつではこの二つの作業をまとめて行うことができるようになっています。
これが配列の初期化です。

~構文~
型名 配列名[要素数]={値0, 値1, ・・・ };

これまでみてきたテストの点数を扱う配列は、次のように初期化することができます。

int test[5] = {80,60,22,50,75};

{}のなかに値を並べて各要素の値を記述します。すると、配列が準備されたときに80,60・・・という値が要素に収納されるのです。
{}中に指定する値は、初期化子と呼ばれています。
上では、80,60・・・が初期化子です。
また、配列を初期化する場合には、[]中に配列要素の数を指定しなくてもかまいません。
要素数を指定しない場合は、
初期化子の数に応じた要素が自動的に準備される
と言うことになっているからです。つまり、次の初期化子は、上のコードとまったく同じ意味になります。

int test[] = {80,60,22,50,75};

ここで、コードを作成してみましょう。

~ソースコード~
#include <stdio.h>

int main(void)
{
    int test[5] = {80,60,22,50,75};
    int i;

    for(i=0; i<5; i++){
        printf("%d番目の人の点数は%dです。\n", i+1, test[i]);
    }

    return 0;
}

~実行画面~
1番目の人の点数は80です。
2番目の人の点数は60です。
3番目の人の点数は22です。
4番目の人の点数は50です。
5番目の人の点数は75です。
続行するには何かキーを押してください . . .

このコードは、前に作成したコードと同じ結果となります。
初期化することで、コードがスッキリと記述できるということがわかります。

重要点 配列を初期化すると、宣言と値の格納が同時に行える。
[ 2009/10/06 23:36 ] プログラミング | TB(0) | CM(2)
プロフィール

Supaki

Author:Supaki
M128星から、地球に迷い込んで日本にやってきたが人間に引き取られて以後、人間として暮らしている。
外見は人間とそっくりである。

FC2カウンター
ブロとも申請フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。