2020/09/03

エド君と学ぶC講座6

今回の内容 配列 関数の作成



アイスなエド君おいしそう…


エド君「なんか変なこと言ってるやつがいるが今回は配列の話だ。配列は変数を1つにまとめて番号を振ることで管理しやすくなるものという感覚で覚えてくれれば良い。例えばだがオレやコイツのように2人だけならデータもそんなに多くなくて良いがもし10人、100人文のデータが必要になった場合に変数をそんだけ作っていたら大変だし無駄すぎる。それを簡単にするためのものだ。例えばだが…今回はエル捜索隊(エルソードのメンツのいるチーム的なやつ)の男性陣の身長とその平均を出すプログラミングを作る。」
エド君の身長しか知らんわ。
エド君「他のやつにももう少し興味持て。」
ブーメラン刺さってね?
エド君「うるせぇ!」

#include<stdio.h>

int main(void) {
    int i;
    int height[7];
    int sum = 0;

    printf("身長を入力してください。\n");
    for (i = 0; i <7; i++) {
        printf("%d番", i + 1);
        scanf("%d", &height[i]);
        sum += height[i];
    }
    printf("平均:%.1f", (double)sum / 7);
    return 0;
}



エド君「…ん?男は6人しかいねぇはずだが…」
あ、最後の私だな。
エド君「オマエは関係ねぇだろうが!!」
ひどいな!?仲間だろう!?
エド君「エルソ知らねぇやつが混乱するからそういうこと言うんじゃねぇ!」
でもほらエド君私平均に近い。
エド君「じゃあオマエ抜いてもあまり数値変わんねぇな。」
ひでぇ!!(なお実際に6人で計算した場合は171.7でした。ほんとにあんま変わんなかった。)

こう見ると大人組でかくない?うちの子でも180超えそんないないんだけど。
一番平均に近いのはエド君かあ。カワイイ。
エド君「何がカワイイかわかんねぇが解説していくぞ。今回使ったheight[7]ってやつが配列だ。これで7つの身長を入れる箱ができたわけだな。ちなみに箱の数字は0から始まるから厳密にはa[n-1]まで、つまり今回だと0~6の範囲の数字となる。」

int a[3]={1,2,3};

エド君「このように最初に初期化することもできる。入れてない所は0で初期化がされる。」
なるほど。そういや途中でコピーさせたいときはそのまま代入演算子でいける?
エド君「ああ、それだがforで1つずつコピーする必要があるな。」
めんどいな…
エド君「キーボードから入力する際も今回みたいにforを使うのがやりやすいな。#defineというのを使ってマクロで数字を置換することもできる。」

#include<stdio.h>
#define NUMBER 7
int main(void) {

    int i;
    int height[NUMBER];
    int sum = 0;

    printf("身長を入力してください。\n");
    for (i = 0; i < NUMBER; i++) {
        printf("%d番", i + 1);
        scanf("%d", &height[i]);
        sum += height[i];
    }

    printf("平均:%.1f", (double)sum / NUMBER);
    return 0;
}

エド君「今回は7という数字をNUMBERで置き換えた。」
でもこれめんどくさくない?むしろ文字数増えてるし。メリットあるのか?
エド君「こうすることのメリットだが数字を置き換えたいときにdefineのとこの数字さえ変えれば全部置き換わるから楽というところだな。さっきのだと全部の数字を変える必要があったからな。」



エド君「あと数字を入力された逆の並びでだすこともできるぞ。」

#include<stdio.h>

int main(void) {
    int i;
    int a[7];
    int sum = 0;

    for (i = 0; i <7; i++) {
        printf("a[%d]:", i );
        scanf("%d", &a[i]);
       
    }
 
    for (i = 0; i < 3; i++) {
        int b = a[i];
        a[i] = a[6 - i];
        a[6 - i] = b;
    }
    printf("反転結果\n");
    for (i = 0; i < 7; i++)
        printf("a[%d]=%d\n", i, a[i]);
    return 0;
}


おおすごい。どういう技術だこれ。
エド君「今回の場合7個あるから2つめのforでi番目と6-i番目を入れ替えるプログラムを用意した。」


エド君「さっきまでは一次元の配列だったが活用すれば多次元の配列も作れるぞ。」

int a[3][2]={{1,2},{3,4},{5,6}};

エド君「こういう感じだな。2個はいる配列が3個あるって解釈になる。」
なるほど…



エド君「さてと配列の話はこれくらいだな。実際のとこなんだがここら辺まで分かっていれば自分で関数を作ってちょっと複雑なプログラムもできるようになる。」
関数を作る?
エド君「ああ。むしろ本格的なものを作るなら自作する必要が出てくるからな。簡単に大きい数字を判別する関数を自作してみるぞ。」


#include<stdio.h>

int max(int x, int y) {
if (x > y)
return x;
else
return y;
}

int main(void) {
int a, b;
printf("エド君「数字を2つ入力しろ。」\n");
printf("a:"); scanf("%d", &a);
printf("b:"); scanf("%d", &b);
printf("エド君「大きい方の数字は%dだ。」",max(a, b));

return 0;
}

エド君「int mainの所とは別にmaxという関数で大きさの比較をするようにしたぞ。mainの中でmaxが出てきたところで呼び出すシステムになっているから先に書いたから先に動くということはない。あと自作関数はmainの後ろに置くこともできるんだが…」

#include<stdio.h>

int max(int x,int y);

int main(void) {
int a, b;
printf("エド君「数字を2つ入力しろ。」\n");
printf("a:"); scanf("%d", &a);
printf("b:"); scanf("%d", &b);
printf("エド君「大きい方の数字は%dだ。」",max(a, b));

return 0;
}

int max(int x, int y) {
if (x > y)
return x;
else
return y;
}

エド君「どっちみちmainの前に関数の宣言がいるから前に書いた方が手間が省けるんだけどな。まあこういうのを応用すればいろいろな関数を自分で作れるようになって幅が広くなる。あとポインタとか構造体とかもあるんだが…こういうのはややこしいからな。またそのときになれば話すとするか。」