0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

この記事について

「C言語の基礎を学ぼう」をテーマに、自身の知識 + α をアドベントカレンダーにまとめます。
25日間でC言語をマスターしよう - Qiita Advent Calendar 2025 - Qiita

こんな方を対象としています

  • コンピュータがプログラムをどのように動かしているか知りたい/知らない方

  • プログラミングをしてみたい方

  • C言語初心者の方

キーワード

  • 配列

説明

配列

同じ型の変数をいくつか使いたい場合、 配列 を利用します。

下記は、5日間の気温を表示するプログラムです。

#include <stdio.h>
int main(void) {
    int t[5] = {12, 15, 14, 9, 10};
    int i;
    for (i = 0; i < 5; i++) {
        printf("t[%d] : %d\n", i, t[i]);
    }
    return 0;
}
t[0] : 12
t[1] : 15
t[2] : 14
t[3] : 9
t[4] : 10

配列の特徴です。

  • 宣言時に要素の数を決める(上記の例であれば5つ)

  • 変数名[要素番号] で各要素にアクセスできる

  • 要素番号は 0から始まる

配列の初期化には主に3通りの方法があります。

1つ目は宣言時にすべての要素の値を指定する方法です。

#include <stdio.h>
int main(void) {
    int t[5] = {12, 15, 14, 9, 10};
    int i;
    for (i = 0; i < 5; i++) {
        printf("t[%d] : %d\n", i, t[i]);
    }
    return 0;
}
t[0] : 12
t[1] : 15
t[2] : 14
t[3] : 9
t[4] : 10

2つ目は宣言時に一部の要素の値を指定する方法です。
このとき、 指定しなかった要素は0で初期化されます。

#include <stdio.h>
int main(void) {
    int t[5] = {12, 15};
    int i;
    for (i = 0; i < 5; i++) {
        printf("t[%d] : %d\n", i, t[i]);
    }
    return 0;
}
t[0] : 12
t[1] : 15
t[2] : 0
t[3] : 0
t[4] : 0

その特性を利用して、 {0} で初期化することですべての要素を0にすることができます。

#include <stdio.h>
int main(void) {
    int t[5] = {0};
    int i;
    for (i = 0; i < 5; i++) {
        printf("t[%d] : %d\n", i, t[i]);
    }
    return 0;
}
t[0] : 0
t[1] : 0
t[2] : 0
t[3] : 0
t[4] : 0

3つ目の方法は宣言後に初期化する方法です。for文がよく使われます。

#include <stdio.h>
int main(void) {
    int t[5];
    int i;
    for (i = 0; i < 5; i++) {
        t[i] = i * 2 ;
    }
    for (i = 0; i < 5; i++) {
        printf("t[%d] : %d\n", i, t[i]);
    }
    return 0;
}
t[0] : 0
t[1] : 2
t[2] : 4
t[3] : 6
t[4] : 8

2次元配列

配列を要素にした配列を2次元配列といいます。

#include <stdio.h>
int main(void) {
    int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            printf("a[%d][%d] : %d  ", i, j, a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
a[0][0] : 1  a[0][1] : 2  
a[1][0] : 3  a[1][1] : 4
a[2][0] : 5  a[2][1] : 6

2次元配列は表のようなものを扱う際に便利です。

2次元配列も通常の配列と同じように初期化できます。

#include <stdio.h>
int main(void) {
    int a[3][2] = {1, 2, 3, 4, 5, 6};
    int b[3][2] = {0};
    int c[3][2];
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            c[i][j] = i * 10 + j;
        }
    }
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 2; j++) {
            printf("a[%d][%d] : %d  ", i, j, a[i][j]);
            printf("b[%d][%d] : %d  ", i, j, b[i][j]);
            printf("c[%d][%d] : %d\n", i, j, c[i][j]);
        }
    }
    return 0;
}
a[0][0] : 1  b[0][0] : 0  c[0][0] : 0
a[0][1] : 2  b[0][1] : 0  c[0][1] : 1
a[1][0] : 3  b[1][0] : 0  c[1][0] : 10
a[1][1] : 4  b[1][1] : 0  c[1][1] : 11
a[2][0] : 5  b[2][0] : 0  c[2][0] : 20
a[2][1] : 6  b[2][1] : 0  c[2][1] : 21

3次元以上の配列

2次元配列を要素に持つ配列を3次元配列といいます。

int main(void) {
    int a[4][3][2];
    return 0;
}

4次元、5次元、 ・・・ のように定義可能ですが、4次元以上の配列はあまり使われない気がします。

練習

1. 多倍長演算

符号なしint型(4バイト)では、最大値は43億程度です。
それ以上の大きな数を扱う手法に 多倍長演算 があります。

下記のように多倍長演算は実装されます。

  • 配列を用意します

  • 配列の各要素に0~9の値を入れます

  • [0]が1の位、[1]が10の位、[2]が100の位・・・のように扱います

多倍長演算の足し算を実装してみましょう。

a  : 05649493873058818947
b  : 07550433658892417312
add: 13199927531951236259

ポイント

足し算の筆算のアルゴリズムで1桁ずつ計算をします。
繰り上がりが発生することに注意しましょう。

初期値の設定をランダムにする場合は疑似乱数を利用しましょう。
下記のように使用します。

#include <stdio.h>
#include <stdlib.h> // srand()、rand()に必要
#include <time.h> // time()に必要
int main(void) {
    int r;

    // 疑似乱数生成準備としてシード値を設定する。
    // シード値にはプログラム実行時刻を用いることが多い。
    // (実行ごとにランダムにするため)
    srand((unsigned int)time(NULL));

    // rand()で乱数を生成する。
    // 生成した値を加工して欲しい乱数にする。
    // 今回は10で割ることで0~9の乱数を生成する。
    r = rand() % 10;

    printf("%d", r);
    return 0;
}
8

解答例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
    int a[20] = {0}, b[20] = {0}, result[20] = {0};
    int i; // for文用
    int k = 0; // 繰り上がり
    srand((unsigned int)time(NULL));
    for (i = 0; i < 19; i++) {
        // 0~9でランダムに初期化
        a[i] = rand() % 10;
        b[i] = rand() % 10;
    }
    // 足し算
    for (i = 0; i < 20; i++) { // 下位桁から計算
        int sum = a[i] + b[i] + k;
        result[i] = sum % 10; // 繰り上がり分を除いて代入
        k = sum / 10; // 繰り上がり
    }
    // 結果表示
    printf("a  : ");
    for (i = 19; i >= 0; i--) { // 上位桁から表示
        printf("%d", a[i]);
    }
    printf("\n");
    printf("b  : ");
    for (i = 19; i >= 0; i--) { // 上位桁から表示
        printf("%d", b[i]);
    }
    printf("\n");
    printf("add: ");
    for (i = 19; i >= 0; i--) { // 上位桁から表示
        printf("%d", result[i]);
    }
    return 0;
}
a  : 05649493873058818947
b  : 07550433658892417312
add: 13199927531951236259

おわりに

配列を扱う際、宣言した要素数より大きい値にアクセスしないように気を付けましょう。要素番号が0から始まるのに慣れたいですね。

参考文献

↓↓↓ はじめてプログラミングを学んだときに読んだ本です ↓↓↓
詳細(プログラミング入門 C言語)|プログラミング|情報|実教出版

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?