C言語上級編 - C言語配列(5): 2次元(多次元)配列の初期化と配列に基づく総合的な例題→帽子選択問題

ここに画像の説明を挿入

1. 本記事のコンパイル環境

この記事のコンパイル環境は、統合開発環境: Visual Studio 2019 を使用しています。
ここに画像の説明を挿入

Visual Studio 2019の公式サイトへのリンクは以下の通り

Visual Studio 2019 公式 Web サイトのリンク
ここに画像の説明を挿入

Visual Studio 2019 統合開発環境の特長は、

  • Visual Studio 2019 は、既定で Live Share コード コラボレーション サービスをインストールします。
  • ユーザーがコードをすばやく記述できるようにする新しいウェルカム ウィンドウ、改善された検索機能、一般的なパフォーマンスの改善。
  • Visual Studio IntelliCode AI ヘルプ。
  • より優れた Python 仮想化と Conda サポート。
  • また、WinForms や WPF などを含む .NET Core 3.0 プロジェクトのサポート。

2. 二次元配列の初期化

  • 2 次元配列は、1 次元配列と同様に初期化されます。
  • 違いは、各行の初期値を中かっこ {} で囲み、すべての行を 1 対の中かっこで囲むことです。
	// 二维数组的初始化
	int numbers[3][4] =
	{
    
    
		{
    
    10,20,30,40}, // 第一行的值 
		{
    
    15,25,35,45}, // 第二行的值 
		{
    
    47,48,49,50}  // 第三行的值 
	};
  • 初期化行の要素の値の各セットは中かっこで囲まれ、すべての初期値は別の中かっこのペアで囲まれています。行の値はカンマで区切られ、各行の値はカンマで区切る必要があります。
  • 指定された初期値が行の要素数よりも少ない場合、これらの値は各行の最初の要素から順に各要素に割り当てられ、初期値を指定していない残りの要素は0 に初期化されます。

指定のみ - 値。配列全体を 0 に初期化できます。

int numbers[3] [4] = {
    
    0};

3. 三次元配列の初期化

  • 3 次元配列は、2 次元配列を拡張したものです。
  • 3 次元配列は、3 レベルのネストされた括弧で初期化されます。
  • 内側の括弧には、各行の初期値が含まれています。

三次元配列の初期化は以下の通り

// 三维数组初始化
	int numbers[2][3][4] = 
	{
    
    
		{
    
    
			// 第一个块3行
			{
    
    10,20,30,40},
			{
    
    15,25,35,45},
			{
    
    47,48,49,50}
			},
			{
    
    
			// 第二个块3行
			{
    
    10,20,30,40},
			{
    
    15,25,35,45},
			{
    
    47,48,49,50}
		}
	};
  • 初期化された値が外側の中括弧に 1 つずつ配置されていることがわかります. 外側の括弧は 3 行を含む 2 つのブロックで構成されています. 各ブロックも括弧内に配置されており, 各ブロック内の各行も括弧内に配置されています.そのため、3 次元配列には 3 レベルのネストされた括弧があります。
  • 一般的に言えば、たとえば、6 次元配列は、要素の初期値を格納するためにネストされたブラケットの 6 つのレイヤーを使用します。
    各行の括弧は省略できますが、エラーが発生しにくいため、各行の値を括弧で囲む方が安全です。

4. for ループを使用して、3 次元配列の要素値の合計を求めます

4.1、配列要素値の合計を求める for ループ

for ループを使用して 3 次元配列の要素値の合計を求めるコードは次のとおりです。

	int sum = 0;

	// 使用for循环求三维数组元素值的和
	for (int i = 0; i < 2; i++)
	{
    
    
		for (int j = 0; j < 3; j++)
		{
    
    
			for (int k = 0; k < 4; k++)
			{
    
    
				sum += numbers[i][j][k];
			}
		}
	}

	printf("使用for循环求三维数组元素值的和为:%d\n", sum);
  • 各ループは、1 つの配列次元を反復します。
  • i の値ごとに、j によって制御されるサイクルが完全に実行され、i の値ごとに、k によって制御されるサイクルが完全に実行されます。

4.2. 配列要素値の合計を計算する for ループの実行結果

配列要素の値の合計を計算する for ループの実行結果は次のとおりです。

ここに画像の説明を挿入

5. sizeof 演算子を使用して、3 次元配列の要素値の合計を求めます

5.1. sizeof 演算子は、配列要素値の合計を計算します

sizeof 演算子を使用して 3 次元配列の要素値の合計を求めるコードは次のとおりです。

	// 使用sizeof运算符求三维数组元素值的和
	sum = 0;
	for (int i = 0; i < sizeof(numbers) / sizeof(numbers[0]); i++)
	{
    
    
		for (int j = 0; j < sizeof(numbers[0]) / sizeof(numbers[0][0]); j++)
		{
    
    
			for (int k = 0; k < sizeof(numbers[0][0]) / sizeof(numbers[0][0][0]); k++)
			{
    
    
				sum += numbers[i][j][k];
			}
		}
	}

	printf("使用sizeof运算符求三维数组元素值的和为:%d\n", sum);
  • 数値配列は、2 次元配列の配列と考えることができます。
  • 式 sizeof(numbers) は数値配列全体が占めるバイト数を取得し、sizeof(numbers[0]) は 2 次元部分配列が占めるバイト数を取得するため、式 sizeof(numbers)/sizeof (numbers[0]) gets 最初の次元の要素数。
  • 同様に、各 2 次元部分配列を 1 次元配列の 1 次元配列と考えることができます。2 次元配列のバイト数をそのサブ配列のバイト数で割り、数値の 2 番目の次元であるサブ配列の数を取得します。
  • 最後に、3 次元の値は、1 次元のサブ配列のバイト数を要素のバイト数で割ることによって得られます。

5.2. sizeof 演算子は、配列要素の値の合計の演算結果を計算します

配列要素の値の和を計算するsizeof演算子の演算結果は以下の通り

ここに画像の説明を挿入

6. 配列合成例:帽子購入

ここに画像の説明を挿入

6.1. 問題の説明

配列合成の例: ハット選択の問題の説明は次のとおりです。

  • 大きすぎる帽子をかぶると危険です。目を覆い、誰かが何かにぶつかり、けがをしたり、場合によっては死に至る可能性があります。
  • 同様に、小さすぎる帽子をかぶると、常に頭痛がしたり、愚かに見えたりする可能性があります. The program in this example will use a array to calculate the size of the hat. その単位は、米国と英国で一般的に使用されてい6 1/2ます7 7/8
  • この例のプログラムでは、帽子の円周をインチで入力するだけで、帽子の寸法が表示されます。

6.2. プログラム設計プロセス

6.2.1. 配列で定義されるハットサイズ

配列で定義された帽子のサイズのコードは次のとおりです。

	// 用数组定义的帽子大小与字符相同
    /*
    数组存储帽子的大小从6 1/2到7 7/8
    每一行定义一个大小相同的字符
    通过对三行使用相同的索引来选择大小。
    例如索引2选择6又3/4。
    */
    char size[3][12] = 
    {
    
               
       {
    
    '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7'},
       {
    
    '1', '5', '3', '7', ' ', '1', '1', '3', '1', '5', '3', '7'},
       {
    
    '2', '8', '4', '8', ' ', '8', '4', '8', '2', '8', '4', '8'}
    };

    // 数值为1/8英寸
    int headsize[12] =
    {
    
    
        164,166,169,172,175,178,181,184,188,191,194,197
    };

6.2.2. 関連変数の定義

関連する変数を定義するコードは次のとおりです。

	float cranium = 0.0;                // 头围,十进制英寸
    int your_head = 0;                  // 头的八分之一
    bool hat_found = false;             // 表示找到合适的帽子

6.2.3. 頭囲を入力する

頭囲を入力するコードはこんな感じ

	// 输入头部的周长
    printf("输入您的眉毛以上的头部周长,以英寸为十进制值: ");
    scanf(" %f", &cranium);


    your_head = (int)(8.0 * cranium);      // 换算成八分之一英寸

6.2.4. 帽子のサイズを探す

帽子のサイズを検索するコードはこんな感じ

	 /*
        搜索帽子的尺寸:
            要么你的头对应第一个头大小元素,要么你的头大于一个头大小元素,小于或等于下一个头大小元素。
            在本例中,大小是第二个头大小值。          
    */
    unsigned int i = 0;                     // 循环计数器
    if (your_head == headsize[i])           // 检查最小尺寸拟合
        hat_found = true;
    else
    {
    
    
        for (i = 1; i < 12; ++i)
        {
    
    
            // 在头部尺寸数组中查找头部尺寸
            if (your_head > headsize[i - 1] && your_head <= headsize[i])
            {
    
    
                hat_found = true;
                break;
            }
        }
    }

6.2.5. 帽子の検索結果を出力する

帽子のサイズを検索するコードはこんな感じ

	// 输出探寻帽子的结果
    if (hat_found)
        printf("\n你的帽子大小是 %c %c%c%c\n\n",size[0][i], size[1][i], (size[1][i] == ' ') ? ' ' : '/', size[2][i]);
    // If no hat was found, the head is too small, or too large
    else
    {
    
    
        if (your_head < headsize[0])        // 检查是否太小
            printf("\n太小啦!你就是众所周知的针头。恐怕没有帽子给你了。\n\n");
        else                               // 它一定太大了
            printf("\n太大啦!用专业术语来说,你是个笨蛋。恐怕没有帽子给你了。\n\n");
    }

6.3. プログラム実行結果

配列合成の例: 帽子ショッピング プログラムの実行結果は次のとおりです。

  1. キャップサイズフィットの実行結果
    ここに画像の説明を挿入

  2. 帽子のサイズが大きすぎる実行結果
    ここに画像の説明を挿入

  3. 帽子のサイズが小さすぎる実行結果
    ここに画像の説明を挿入

セブン、完全なプログラム

ここに画像の説明を挿入

この記事の完全なプログラムは次のとおりです。

5.1 Main.h ファイル プログラム

#ifndef MAIN_H
#define MAIN_H


#include <stdio.h>
#include <stdlib.h>


#endif

5.2 Main.c ファイル プログラム

#define _CRT_SECURE_NO_WARNINGS

#include "Main.h"

int main()
{
    
    
	system("color 3E");

	// 二维数组的初始化
	//int numbers[3][4] =
	//{
    
    
	//	{10,20,30,40}, // 第一行的值 
	//	{15,25,35,45}, // 第二行的值 
	//	{47,48,49,50}  // 第三行的值 
	//};

	//int numbers[3][4] = { 0 };

	// 三维数组初始化
	int numbers[2][3][4] = 
	{
    
    
		{
    
    
			// 第一个块3行
			{
    
    10,20,30,40},
			{
    
    15,25,35,45},
			{
    
    47,48,49,50}
			},
			{
    
    
			// 第二个块3行
			{
    
    10,20,30,40},
			{
    
    15,25,35,45},
			{
    
    47,48,49,50}
		}
	};



	int sum = 0;

	// 使用for循环求三维数组元素值的和
	for (int i = 0; i < 2; i++)
	{
    
    
		for (int j = 0; j < 3; j++)
		{
    
    
			for (int k = 0; k < 4; k++)
			{
    
    
				sum += numbers[i][j][k];
			}
		}
	}

	printf("使用for循环求三维数组元素值的和为:%d\n", sum);


	// 使用sizeof运算符求三维数组元素值的和
	sum = 0;
	for (int i = 0; i < sizeof(numbers) / sizeof(numbers[0]); i++)
	{
    
    
		for (int j = 0; j < sizeof(numbers[0]) / sizeof(numbers[0][0]); j++)
		{
    
    
			for (int k = 0; k < sizeof(numbers[0][0]) / sizeof(numbers[0][0][0]); k++)
			{
    
    
				sum += numbers[i][j][k];
			}
		}
	}

	printf("使用sizeof运算符求三维数组元素值的和为:%d\n", sum);

	system("pause");
	return 0;
}


5.3 Hat.h ファイル プログラム

#ifndef HAT_H
#define HAT_H


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


#endif

5.4 Hat.c ファイル プログラム

#define _CRT_SECURE_NO_WARNINGS

#include "Hat.h"


int main()
{
    
    
	system("color 3E"); 


    // 用数组定义的帽子大小与字符相同
    /*
    数组存储帽子的大小从6 1/2到7 7/8
    每一行定义一个大小相同的字符
    通过对三行使用相同的索引来选择大小。
    例如索引2选择6又3/4。
    */
    char size[3][12] = 
    {
    
               
       {
    
    '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7'},
       {
    
    '1', '5', '3', '7', ' ', '1', '1', '3', '1', '5', '3', '7'},
       {
    
    '2', '8', '4', '8', ' ', '8', '4', '8', '2', '8', '4', '8'}
    };

    // 数值为1/8英寸
    int headsize[12] =
    {
    
    
        164,166,169,172,175,178,181,184,188,191,194,197
    };

    float cranium = 0.0;                // 头围,十进制英寸
    int your_head = 0;                  // 头的八分之一
    bool hat_found = false;             // 表示找到合适的帽子

    // 输入头部的周长
    printf("输入您的眉毛以上的头部周长,以英寸为十进制值: ");
    scanf(" %f", &cranium);


    your_head = (int)(8.0 * cranium);      // 换算成八分之一英寸

    /*
        搜索帽子的尺寸:
            要么你的头对应第一个头大小元素,要么你的头大于一个头大小元素,小于或等于下一个头大小元素。
            在本例中,大小是第二个头大小值。          
    */
    unsigned int i = 0;                     // 循环计数器
    if (your_head == headsize[i])           // 检查最小尺寸拟合
        hat_found = true;
    else
    {
    
    
        for (i = 1; i < 12; ++i)
        {
    
    
            // 在头部尺寸数组中查找头部尺寸
            if (your_head > headsize[i - 1] && your_head <= headsize[i])
            {
    
    
                hat_found = true;
                break;
            }
        }
    }

    // 输出探寻帽子的结果
    if (hat_found)
        printf("\n你的帽子大小是 %c %c%c%c\n\n",size[0][i], size[1][i], (size[1][i] == ' ') ? ' ' : '/', size[2][i]);
    // If no hat was found, the head is too small, or too large
    else
    {
    
    
        if (your_head < headsize[0])        // 检查是否太小
            printf("\n太小啦!你就是众所周知的针头。恐怕没有帽子给你了。\n\n");
        else                               // 它一定太大了
            printf("\n太大啦!用专业术语来说,你是个笨蛋。恐怕没有帽子给你了。\n\n");
    }

	system("pause");
	return 0;
}

8. まとめ

ここに画像の説明を挿入

この記事では、C言語の高度なプログラミング配列の多次元配列の初期化方法を主に紹介します。
2 次元配列を初期化する方法を紹介します。
3 (多) 次元配列を初期化する方法について説明します。

この記事はここで終わります。

  • この記事の 2 次元 (多次元) 配列の初期化と配列ベースの包括的な例 -> 帽子選択の問題を期待しています。
  • C言語の学習に役立ちます。
  • あなたのサポートは私の創造の最大の動機です。
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_47419053/article/details/127342617