Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Многомерный массив

   Многомерные массивы

Многомерные массивы так же часто используются, как и одномерные. Вот примеры: в школьных журналах написаны Фамилия и класс; любые базы данных; Вообще, многомерные массивы - это массивы массивов. Т.е. каждый индексный номер содержит массив. Вот пример уже из языка Си:

int i[2][4] = {{1,2,3,4}, {5,6,7,8}};

Т.е. тут мы создаем двумерный массив размером 2х4. Т.е. 2 строчки по 4 элемента каждая.

В принципе, остальное тут так же. Давайте теперь рассмотрим, как в многомерном массиве вводить и выводить элементы:

#include <conio.h>
#include <stdio.h>

int main()
{
    int arr[2][4];

    for (int i = 0; i < 2; i++){
       for (int j = 0; j < 4;j++ ){
          scanf ("%d", &arr[i][j]);
       }
    }
    for (int i = 0; i < 2; i++){
       for (int j = 0; j < 4;j++ ){
          printf ("%d ", arr[i][j]);
       }
       printf ("\n");
    }
    getch();

return 0;
}

Все очень похоже на одномерный массив. Только в многомерном массиве мы создаем двойной цикл, первый - это проход по столбцу, а второй - это проход по элементам массива (идем по строке).

Во всех моих примерах при изменении размера многомерного массива, например вместо arr[2][4], хочу сделать arr[7][6]. Так вот, что бы сделать такое изменения придется изменять абсолютно все циклы, так как они ориентируются по старым данным. Но есть способ исправить эту проблему.

Для этого в языке С/C++ есть директива предпроцессора define. Давайте рассмотрим его на примере:

#include <conio.h>
#include <stdio.h>

#define SIZE_A 2
#define SIZE_B 2

int main()
{
    int arr[SIZE_A][SIZE_B];

    for (int i = 0; i < SIZE_A; i++){
       for (int j = 0; j < SIZE_B;j++ ){
          scanf ("%d", &arr[i][j]);
       }
    }
    for (int i = 0; i < SIZE_A; i++){
       for (int j = 0; j < SIZE_B;j++ ){
          printf ("%d ", arr[i][j]);
       }
       printf ("\n");
    }
    getch();

return 0;
}

Т.е. мы можем поменять значения только в одном месте, и они автоматом поменяются во всех остальных местах. Причем подстановка будет происходить на этапе компиляции

Осталось научиться передавать многомерные массивы в функцию. Вот как это делается:

void printArr (int arr[][2]){ //тело; }

Тут обязательным условием является написание во втором индексе количества элементов, иначе компилятор выдаст ошибку. Ах да, вызывается функция из программы, так же как и одномерный массив:

printArr(arr);

Вот и все, что хотелось вам рассказать о многомерных массивах. Лучше всего любой материал по программированию запоминается на практике.

Задания:

  1. попробуйте попробовать заполнить и вывести массив, но не при помощи индексов, а при помощи указателей. Это довольно сложно, но если долго мучиться, то точно получится
  2. у нас есть массив 4х4. вычислите сумму элементов главной диагонали (1х1, ... , 4х4)
  3. составьте функцию, которая принимает двумерный массив. Функция заменяет все простые числа в массиве нулями

Предвидущие уроки:

  1. Одномерные массивы

Следующие уроки:

  1. Работа со строками в c (си)
  2. Функции работы со строками
При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru