Создание двумерных массивов на языке C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь создавать и работать с двумерными массивами на языке C. Вы начнете с объявления двумерных массивов, а затем изучите различные способы их инициализации. Далее вы узнаете, как обращаться к элементам массивов и изменять их. Наконец, вы примените свои знания для вычисления средних оценок по двум предметам и расширения функциональности двумерных массивов. Это лабораторное занятие дает полное понимание работы с двумерными массивами на языке программирования C.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c/BasicsGroup -.-> c/data_types("Data Types") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/structures("Structures") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/data_types -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/for_loop -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/arrays -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/structures -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/pointers -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/memory_address -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/math_functions -.-> lab-438259{{"Создание двумерных массивов на языке C"}} c/output -.-> lab-438259{{"Создание двумерных массивов на языке C"}} end

Объявление двумерных массивов

На этом шаге вы научитесь объявлять двумерные массивы на языке C. Двумерные массивы - это по сути массивы массивов, которые позволяют хранить данные в структуре, похожей на таблицу с строками и столбцами.

Начнем с создания нового файла на языке C для демонстрации объявления двумерных массивов:

touch ~/project/two_dimensional_arrays.c

Теперь напишем наше первое объявление двумерного массива:

#include <stdio.h>

int main() {
    // Declare a 3x4 integer two-dimensional array
    int grades[3][4];

    return 0;
}

В этом примере grades - это двумерный массив с 3 строками и 4 столбцами. Это означает, что он может хранить в общей сложности 12 целочисленных значений (3 × 4 = 12).

Познакомимся с разными способами объявления двумерных массивов, добавив следующий код в файл:

// Method 1: Declaration with initialization
int matrix[2][3] = {
    {1, 2, 3},   // First row
    {4, 5, 6}    // Second row
};

// Method 2: Partial initialization
int scores[3][3] = {
    {10, 20, 30},
    {40, 50}     // Remaining elements will be zero
};

// Method 3: Flattened initialization
int simple_matrix[2][3] = {1, 2, 3, 4, 5, 6};

Скомпилируйте и запустите программу для проверки:

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

Пример вывода будет пустым, так как мы не добавили никаких инструкций для вывода на экран.

Основные моменты при объявлении двумерных массивов:

  • Первая скобка представляет строки
  • Вторая скобка представляет столбцы
  • Вы можете инициализировать массив частично или полностью
  • Неинициализированные элементы автоматически устанавливаются в ноль
  • Общее количество элементов = количество строк × количество столбцов

Инициализация двумерных массивов

На этом шаге вы научитесь различным методам инициализации двумерных массивов на языке C, основываясь на навыках объявления, полученных на предыдущем шаге.

Давайте изменим предыдущий файл, чтобы рассмотреть разные техники инициализации.

Теперь замените существующий код следующими методами инициализации:

#include <stdio.h>

int main() {
    // Method 1: Complete initialization
    int scores[3][4] = {
        {85, 92, 78, 90},    // First row
        {76, 88, 95, 82},    // Second row
        {63, 71, 89, 93}     // Third row
    };

    // Method 2: Partial initialization
    int temperatures[2][3] = {
        {25, 30, 22},        // First row
        {28}                 // Partial second row
    };

    // Method 3: Flattened initialization
    int matrix[2][3] = {1, 2, 3, 4, 5, 6};

    // Method 4: Initialize all elements to zero
    int zeros[3][3] = {0};

    // Print the first method to demonstrate
    printf("Student Scores:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", scores[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Скомпилируйте и запустите программу:

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

Пример вывода:

Student Scores:
85 92 78 90
76 88 95 82
63 71 89 93

Основные методы инициализации:

  1. Полная инициализация: Укажите значения для каждой строки.
  2. Частичная инициализация: Неуказанные элементы устанавливаются в ноль.
  3. Плоская инициализация: Значения заполняются построчно.
  4. Инициализация нулями: Все элементы устанавливаются в ноль.

Важные моменты:

  • Вы можете частично инициализировать массивы.
  • Неуказанные элементы автоматически устанавливаются в ноль.
  • Общее количество инициализаторов не может превышать размер массива.
  • Вложенные фигурные скобки помогают уточнить инициализацию по строкам.

Обращение к элементам двумерного массива

На этом шаге вы научитесь обращаться к отдельным элементам двумерного массива с использованием индексации и вложенных циклов на языке C.

Давайте обновим предыдущий файл, чтобы продемонстрировать обращение к элементам.

Добавьте следующий код, чтобы рассмотреть разные способы обращения к элементам массива:

#include <stdio.h>

int main() {
    // Create a 3x4 student grades array
    int grades[3][4] = {
        {85, 92, 78, 90},    // First student's grades
        {76, 88, 95, 82},    // Second student's grades
        {63, 71, 89, 93}     // Third student's grades
    };

    // Method 1: Direct element access
    printf("First student's first grade: %d\n", grades[0][0]);
    printf("Second student's third grade: %d\n", grades[1][2]);

    // Method 2: Accessing elements using nested loops
    printf("\nAll grades using nested loops:\n");
    for (int student = 0; student < 3; student++) {
        for (int subject = 0; subject < 4; subject++) {
            printf("Student %d, Subject %d: %d\n",
                   student + 1, subject + 1, grades[student][subject]);
        }
    }

    // Method 3: Modifying array elements
    grades[2][3] = 95;  // Update last grade of third student
    printf("\nUpdated third student's last grade: %d\n", grades[2][3]);

    return 0;
}

Скомпилируйте и запустите программу:

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

Пример вывода:

First student's first grade: 85
Second student's third grade: 95

All grades using nested loops:
Student 1, Subject 1: 85
Student 1, Subject 2: 92
Student 1, Subject 3: 78
Student 1, Subject 4: 90
Student 2, Subject 1: 76
Student 2, Subject 2: 88
Student 2, Subject 3: 95
Student 2, Subject 4: 82
Student 3, Subject 1: 63
Student 3, Subject 2: 71
Student 3, Subject 3: 89
Student 3, Subject 4: 95

Updated third student's last grade: 95

Основные моменты при обращении к элементам двумерного массива:

  • Используйте два индекса: array[row][column]
  • Первый индекс представляет строку (вертикально)
  • Второй индекс представляет столбец (горизонтально)
  • Индексация начинается с 0
  • Вложенные циклы полезны для обхода всего массива
  • Вы можете напрямую считывать и изменять отдельные элементы

Вычисление средних оценок по двум предметам

На этом шаге вы научитесь использовать двумерные массивы для вычисления средних оценок нескольких студентов по разным предметам.

Давайте обновим предыдущий файл, чтобы вычислить средние оценки по предметам.

Добавьте следующий код для вычисления и вывода средних оценок:

#include <stdio.h>

#define STUDENTS 5
#define SUBJECTS 3

int main() {
    // Create a two-dimensional array for student marks
    int marks[STUDENTS][SUBJECTS] = {
        {85, 92, 78},
        {76, 88, 95},
        {63, 71, 89},
        {90, 84, 77},
        {82, 79, 91}
    };

    // Arrays to store subject averages
    float subject_averages[SUBJECTS];

    // Compute average for each subject
    for (int subject = 0; subject < SUBJECTS; subject++) {
        int subject_total = 0;

        // Sum marks for current subject
        for (int student = 0; student < STUDENTS; student++) {
            subject_total += marks[student][subject];
        }

        // Calculate average
        subject_averages[subject] = (float)subject_total / STUDENTS;
    }

    // Display subject averages
    printf("Subject Averages:\n");
    for (int subject = 0; subject < SUBJECTS; subject++) {
        printf("Subject %d: %.2f\n", subject + 1, subject_averages[subject]);
    }

    // Bonus: Find highest and lowest subject average
    float highest_avg = subject_averages[0];
    float lowest_avg = subject_averages[0];
    int highest_subject = 0;
    int lowest_subject = 0;

    for (int subject = 1; subject < SUBJECTS; subject++) {
        if (subject_averages[subject] > highest_avg) {
            highest_avg = subject_averages[subject];
            highest_subject = subject;
        }
        if (subject_averages[subject] < lowest_avg) {
            lowest_avg = subject_averages[subject];
            lowest_subject = subject;
        }
    }

    printf("\nHighest Average: Subject %d (%.2f)\n",
           highest_subject + 1, highest_avg);
    printf("Lowest Average: Subject %d (%.2f)\n",
           lowest_subject + 1, lowest_avg);

    return 0;
}

Скомпилируйте и запустите программу:

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

Пример вывода:

Subject Averages:
Subject 1: 79.20
Subject 2: 82.80
Subject 3: 86.00

Highest Average: Subject 3 (86.00)
Lowest Average: Subject 1 (79.20)

Демонстрируемые ключевые концепции:

  • Использование вложенных циклов для обработки двумерных массивов
  • Вычисление средних значений по строкам и столбцам
  • Поиск наибольшего и наименьшего средних значений
  • Приведение типов для вычисления средних значений с плавающей точкой
  • Определение констант для размеров массива

Расширение функциональности двумерных массивов

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

Давайте обновим предыдущий файл, чтобы продемонстрировать эти продвинутые концепции.

Замените предыдущий код этим комплексным примером:

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

#define ROWS 3
#define COLS 4

// Function to print a two-dimensional array
void printArray(int arr[ROWS][COLS]) {
    printf("Array Contents:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", arr[i][j]);
        }
        printf("\n");
    }
}

// Function to transpose a two-dimensional array
void transposeArray(int original[ROWS][COLS], int transposed[COLS][ROWS]) {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            transposed[j][i] = original[i][j];
        }
    }
}

int main() {
    // Static two-dimensional array
    int matrix[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // Print original array
    printf("Original Array:\n");
    printArray(matrix);

    // Transpose the array
    int transposed[COLS][ROWS];
    transposeArray(matrix, transposed);

    // Print transposed array
    printf("\nTransposed Array:\n");
    for (int i = 0; i < COLS; i++) {
        for (int j = 0; j < ROWS; j++) {
            printf("%4d ", transposed[i][j]);
        }
        printf("\n");
    }

    // Dynamic memory allocation for 2D array
    int **dynamicMatrix;
    dynamicMatrix = (int **)malloc(ROWS * sizeof(int *));
    for (int i = 0; i < ROWS; i++) {
        dynamicMatrix[i] = (int *)malloc(COLS * sizeof(int));
    }

    // Initialize dynamic matrix
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            dynamicMatrix[i][j] = i * COLS + j + 1;
        }
    }

    // Print dynamic matrix
    printf("\nDynamic Matrix:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%4d ", dynamicMatrix[i][j]);
        }
        printf("\n");
    }

    // Free dynamically allocated memory
    for (int i = 0; i < ROWS; i++) {
        free(dynamicMatrix[i]);
    }
    free(dynamicMatrix);

    return 0;
}

Скомпилируйте и запустите программу:

gcc two_dimensional_arrays.c -o two_dimensional_arrays
./two_dimensional_arrays

Пример вывода:

Original Array:
   1   2   3   4
   5   6   7   8
   9  10  11  12

Transposed Array:
   1   5   9
   2   6  10
   3   7  11
   4   8  12

Dynamic Matrix:
   1   2   3   4
   5   6   7   8
   9  10  11  12

Демонстрируемые ключевые продвинутые концепции:

  • Передача двумерных массивов в функции
  • Транспонирование массива
  • Динамическое выделение памяти для двумерных массивов
  • Управление памятью с использованием malloc() и free()
  • Гибкие техники манипулирования массивами

Резюме

В этом практическом занятии (лабораторной работе) вы научились объявлять двумерные массивы на языке C. Двумерные массивы представляют собой массивы массивов, которые позволяют хранить данные в структуре, похожей на таблицу, с строками и столбцами. Вы изучили различные методы объявления и инициализации двумерных массивов, включая полную инициализацию, частичную инициализацию и плоскую инициализацию. Также вы узнали, что неинициализированные элементы автоматически устанавливаются в ноль, а общее количество элементов в двумерном массиве определяется произведением количества строк и столбцов.

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