Работа с массивами в языке C

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

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

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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/variables("Variables") c/BasicsGroup -.-> c/data_types("Data Types") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-438330{{"Работа с массивами в языке C"}} c/data_types -.-> lab-438330{{"Работа с массивами в языке C"}} c/for_loop -.-> lab-438330{{"Работа с массивами в языке C"}} c/arrays -.-> lab-438330{{"Работа с массивами в языке C"}} c/output -.-> lab-438330{{"Работа с массивами в языке C"}} end

Введение в синтаксис объявления массива

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

Что такое массив?

Массив - это набор переменных, к которым можно обращаться по индексу. Все элементы в массиве имеют один и тот же тип. Представьте себе книжную полку, где каждая полка может хранить книги одного жанра - это похоже на то, как работает массив в программировании. Каждую "книгу" (или элемент) можно получить доступ по ее позиции (индексу) на полке.

Синтаксис объявления массива

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

type arrayName[arraySize];
  • type: Тип данных элементов массива (например, int, float, char). Это определяет, какой тип данных может хранить массив.
  • arrayName: Имя массива, которое вы будете использовать для обращения и манипулирования массивом.
  • arraySize: Количество элементов, которое может хранить массив, определяющее общую емкость хранения массива.

Пример: Объявление и инициализация массива

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

Откройте WebIDE и выполните следующие действия:

  1. Щелкните правой кнопкой мыши в проводнике файлов и выберите "Новый файл".
  2. Назовите файл arrays_intro.c.
  3. Щелкните на файле, чтобы открыть его в редакторе.

Теперь напишем простую программу, которая демонстрирует объявление и инициализацию массива:

#include <stdio.h>

int main() {
    // Declaring an integer array with 5 elements
    int numbers[5] = {10, 20, 30, 40, 50};

    // Printing array elements
    printf("Array elements:\n");
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }

    return 0;
}

Разберем объявление массива:

  • int numbers[5]: Это объявляет целочисленный массив с именем numbers, который может хранить 5 элементов. Это похоже на создание полки с 5 местами для хранения целочисленных значений.
  • {10, 20, 30, 40, 50}: Это инициализирует массив определенными значениями, заполняя каждое "место на полке" заранее определенным числом.
  • Первый элемент numbers[0] равен 10, второй numbers[1] равен 20 и так далее. Помните, что индексация массивов в языке C начинается с 0.

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

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

gcc arrays_intro.c -o arrays_intro
./arrays_intro

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

Array elements:
numbers[0] = 10
numbers[1] = 20
numbers[2] = 30
numbers[3] = 40
numbers[4] = 50

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

Инициализация целочисленного массива значениями

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

Откройте WebIDE и создайте новый файл:

  1. Щелкните правой кнопкой мыши в проводнике файлов и выберите "Новый файл".
  2. Назовите файл array_initialization.c.
  3. Щелкните на файле, чтобы открыть его в редакторе.

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

#include <stdio.h>

int main() {
    // Method 1: Full initialization
    int scores[5] = {85, 92, 78, 90, 88};

    // Method 2: Partial initialization (remaining elements set to 0)
    int temperatures[5] = {72, 75, 80};

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

    // Printing the arrays
    printf("Scores array:\n");
    for (int i = 0; i < 5; i++) {
        printf("scores[%d] = %d\n", i, scores[i]);
    }

    printf("\nTemperatures array:\n");
    for (int i = 0; i < 5; i++) {
        printf("temperatures[%d] = %d\n", i, temperatures[i]);
    }

    printf("\nAges array:\n");
    for (int i = 0; i < 5; i++) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }

    return 0;
}

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

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

gcc array_initialization.c -o array_initialization
./array_initialization

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

Scores array:
scores[0] = 85
scores[1] = 92
scores[2] = 78
scores[3] = 90
scores[4] = 88

Temperatures array:
temperatures[0] = 72
temperatures[1] = 75
temperatures[2] = 80
temperatures[3] = 0
temperatures[4] = 0

Ages array:
ages[0] = 0
ages[1] = 0
ages[2] = 0
ages[3] = 0
ages[4] = 0

Разберем основные концепции инициализации массивов, которые должен знать каждый начинающий программист, с учетом данного кода:

  • Метод 1: Полная инициализация int scores[5] = {85, 92, 78, 90, 88};: Здесь мы объявляем массив с именем scores размером 5 и инициализируем его 5 конкретными значениями. Это простой способ присвоить определенные значения каждому элементу массива при его объявлении. Каждый элемент массива устанавливается в соответствии с порядком значений в фигурных скобках.
  • Метод 2: Частичная инициализация int temperatures[5] = {72, 75, 80};: В этом случае массив temperatures размером 5 инициализируется только тремя значениями. Язык C обрабатывает это, устанавливая оставшиеся элементы (с индексами 3 и 4) в ноль. Частичная инициализация полезна, когда вы знаете первые несколько значений и хотите, чтобы остальные по умолчанию были равны нулю.
  • Метод 3: Инициализация всех элементов нулями int ages[5] = {0};: Это инициализирует массив с именем ages размером 5, где все элементы устанавливаются в ноль. Это удобный способ, если вам нужно, чтобы все значения в массиве изначально были равны нулю. Это очень распространено в ситуациях, таких как подсчет или начальные состояния структур данных.
  • Размер массива фиксирован при объявлении: Важно помнить, что после объявления массива с определенным размером (например, [5]), этот размер не может быть изменен впоследствии. Вы не можете добавить или удалить элементы из массива без создания нового массива.
  • Индексация всегда начинается с 0: Как вы уже видели, доступ к элементам массива осуществляется с помощью индексов, и эти индексы всегда начинаются с 0 для первого элемента. В массиве scores scores[0] относится к первому элементу, scores[1] - ко второму и так далее.

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

Доступ к элементам массива с использованием индексов

В языке C массивы имеют нулевую индексацию, то есть первый элемент находится по индексу 0, второй - по индексу 1 и так далее. Эта концепция может показаться нелогичной вначале, но это стандартная конвенция во многих языках программирования, которая имеет корни в низкоуровневом управлении памятью.

Откройте WebIDE и создайте новый файл:

  1. Щелкните правой кнопкой мыши в проводнике файлов и выберите "Новый файл".
  2. Назовите файл array_indexing.c.
  3. Щелкните на файле, чтобы открыть его в редакторе.

Напишем программу, которая демонстрирует индексацию и манипуляцию массивами:

#include <stdio.h>

int main() {
    // Declare and initialize an array of student grades
    int grades[5] = {85, 92, 78, 90, 88};

    // Accessing individual array elements
    printf("First grade (index 0): %d\n", grades[0]);
    printf("Third grade (index 2): %d\n", grades[2]);

    // Modifying array elements
    printf("\nBefore modification:\n");
    for (int i = 0; i < 5; i++) {
        printf("grades[%d] = %d\n", i, grades[i]);
    }

    // Modify a specific element
    grades[1] = 95;  // Change the second grade
    grades[4] = 87;  // Change the last grade

    printf("\nAfter modification:\n");
    for (int i = 0; i < 5; i++) {
        printf("grades[%d] = %d\n", i, grades[i]);
    }

    // Calculate average grade
    int total = 0;
    for (int i = 0; i < 5; i++) {
        total += grades[i];
    }
    float average = (float)total / 5;
    printf("\nAverage grade: %.2f\n", average);

    return 0;
}

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

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

gcc array_indexing.c -o array_indexing
./array_indexing

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

First grade (index 0): 85
Third grade (index 2): 78

Before modification:
grades[0] = 85
grades[1] = 92
grades[2] = 78
grades[3] = 90
grades[4] = 88

After modification:
grades[0] = 85
grades[1] = 95
grades[2] = 78
grades[3] = 90
grades[4] = 87

Average grade: 87.00

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

Основные моменты о индексации массивов с упором на конкретные строки кода:

  • Индексация массивов начинается с 0: Первый элемент массива grades доступен с помощью grades[0], а не grades[1]. Строка printf printf("First grade (index 0): %d\n", grades[0]); демонстрирует этот важный момент.
  • Доступ к отдельным элементам с использованием array[index]: Строка printf("Third grade (index 2): %d\n", grades[2]); показывает, как получить доступ к определенному элементу по заданному индексу. Здесь мы получаем доступ к третьему элементу по индексу 2.
  • Изменение элементов массива путем присвоения новых значений: Строки grades[1] = 95; и grades[4] = 87; показывают, как изменить значения, хранящиеся в массиве. Значение по индексу 1 обновляется до 95, а значение по индексу 4 - до 87. Это прямой доступ и изменение с использованием индекса и оператора присваивания.
  • Будьте осторожны при доступе к индексам за пределами массива: Если вы попытаетесь получить доступ к grades[5] (помните, что массив имеет 5 элементов с индексами от 0 до 4), вы, скорее всего, вызовете ошибку (это называется "переполнением буфера" или "доступом за пределы массива"). Доступ к несуществующему индексу приведет к непредсказуемому поведению.
  • Используйте циклы для эффективного перебора элементов массива: Циклы for, такие как тот, который используется для вывода массива, являются эффективным способом последовательного прохода по каждому элементу массива от индекса 0 до 4:
for (int i = 0; i < 5; i++) {
    printf("grades[%d] = %d\n", i, grades[i]);
}

Этот цикл использует переменную i в качестве индекса от 0 до 4.

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

Вывод элементов в цикле for

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

Откройте WebIDE и создайте новый файл:

  1. Щелкните правой кнопкой мыши в проводнике файлов и выберите "Новый файл".
  2. Назовите файл array_loop_print.c.
  3. Щелкните на файле, чтобы открыть его в редакторе.

Напишем программу, которая демонстрирует различные способы вывода элементов массива:

#include <stdio.h>

int main() {
    // Declare and initialize an array of temperatures
    int temperatures[5] = {72, 75, 80, 68, 85};

    // Method 1: Using a standard for loop with index
    printf("Method 1: Printing with index\n");
    for (int i = 0; i < 5; i++) {
        printf("Temperature %d: %d degrees\n", i + 1, temperatures[i]);
    }

    // Method 2: Printing array with descriptive labels
    printf("\nMethod 2: Printing with labels\n");
    char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    for (int i = 0; i < 5; i++) {
        printf("%s's temperature: %d degrees\n", days[i], temperatures[i]);
    }

    // Method 3: Calculating and printing additional information
    printf("\nMethod 3: Calculating average temperature\n");
    int total = 0;
    for (int i = 0; i < 5; i++) {
        total += temperatures[i];
        printf("Adding %d degrees\n", temperatures[i]);
    }
    float average = (float)total / 5;
    printf("Average temperature: %.1f degrees\n", average);

    return 0;
}

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

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

gcc array_loop_print.c -o array_loop_print
./array_loop_print

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

Method 1: Printing with index
Temperature 1: 72 degrees
Temperature 2: 75 degrees
Temperature 3: 80 degrees
Temperature 4: 68 degrees
Temperature 5: 85 degrees

Method 2: Printing with labels
Monday's temperature: 72 degrees
Tuesday's temperature: 75 degrees
Wednesday's temperature: 80 degrees
Thursday's temperature: 68 degrees
Friday's temperature: 85 degrees

Method 3: Calculating average temperature
Adding 72 degrees
Adding 75 degrees
Adding 80 degrees
Adding 68 degrees
Adding 85 degrees
Average temperature: 76.0 degrees

Основные моменты о циклах for и массивах, с упором на код:

  • Переменная цикла i начинается с 0 и увеличивается до длина_массива - 1: Стандартная инициализация цикла for (int i = 0; i < 5; i++) в Методе 1 обеспечивает обход цикла от первого элемента (индекс 0) до последнего элемента (индекс 4) массива temperatures, выводя каждый элемент. Условие i < 5 определяет, как долго цикл будет продолжаться.
  • Вы можете использовать индекс цикла для доступа к элементам массива: В цикле for temperatures[i] используется для доступа к элементу с соответствующим индексом i на каждой итерации цикла. Это показывает, как счетчик цикла служит индексом массива.
  • Циклы отлично подходят для выполнения операций над целыми массивами: Метод 3 показывает, как с использованием цикла for можно вычислить сумму и вывести дополнительную информацию в процессе обхода массива. Цикл for используется для обхода всех элементов массива и вычисления суммы.
  • Вы можете комбинировать циклы с вычислениями и дополнительными массивами: Метод 2 комбинирует цикл for с дополнительным массивом days, а Метод 3 выполняет вычисление в процессе цикла. Это показывает, как можно использовать массивы и циклы вместе.

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

Продвинутые операции с массивами

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

Напишем программу для поиска максимального и минимального значений в массиве:

cd ~/project
touch find_max_min.c
#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int max = numbers[0];
    int min = numbers[0];

    for (int i = 1; i < 5; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }
        if (numbers[i] < min) {
            min = numbers[i];
        }
    }

    printf("Maximum value: %d\n", max);
    printf("Minimum value: %d\n", min);

    return 0;
}

Этот код демонстрирует простую, но мощную технику для поиска максимального и минимального значений в массиве. Инициализируя max и min первым элементом массива и затем сравнивая каждый последующий элемент, мы можем эффективно определить экстремальные значения в массиве.

Основные строки кода:

  • Инициализация: int max = numbers[0]; int min = numbers[0]; - Переменные max и min инициализируются первым элементом массива. Этот шаг предоставляет начальную точку для сравнения.
  • Цикл сравнения: for (int i = 1; i < 5; i++) - Этот цикл for начинается с индекса 1 (второй элемент) и продолжается до конца массива. Это гарантирует, что каждое последующее значение проверяется по сравнению с существующими значениями max и min.
  • Поиск максимума: if (numbers[i] > max) { max = numbers[i]; } - Этот блок проверяет, является ли текущий элемент больше текущего max. Если это так, переменная max обновляется значением текущего элемента.
  • Поиск минимума: if (numbers[i] < min) { min = numbers[i]; } - Аналогично, этот блок проверяет, является ли текущий элемент меньше текущего min, и обновляет min, если найдено меньшее значение.

Далее напишем программу для сортировки массива по возрастанию с использованием алгоритма пузырьковой сортировки (bubble sort):

cd ~/project
touch bubble_sort.c
#include <stdio.h>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

int main() {
    int numbers[5] = {50, 20, 30, 10, 40};

    bubbleSort(numbers, 5);

    printf("Sorted array:\n");
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }

    return 0;
}

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

Основные строки кода:

  • Внешний цикл: for (int i = 0; i < n-1; i++) - Этот внешний цикл контролирует количество проходов по массиву. Цикл выполняется до n - 1 раз (где n - размер массива), так как наибольший элемент будет находиться в своей конечной позиции после каждого прохода.
  • Внутренний цикл: for (int j = 0; j < n-i-1; j++) - Внутренний цикл выполняет фактические сравнения и обмены. По мере того, как наибольшие элементы "всплывают" в конец, диапазон внутреннего цикла уменьшается, поэтому мы используем n - i - 1 вместо n.
  • Сравнение: if (arr[j] > arr[j+1]) - Это утверждение проверяет, является ли текущий элемент больше следующего элемента.
  • Обмен: Строки int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; выполняют обмен двух элементов, когда arr[j] больше arr[j+1]. Временная переменная temp используется, чтобы не потерять одно из значений при обмене.

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

gcc find_max_min.c -o find_max_min
./find_max_min

gcc bubble_sort.c -o bubble_sort
./bubble_sort

Пример вывода для поиска максимума и минимума:

Maximum value: 50
Minimum value: 10

Пример вывода для сортировки:

Sorted array:
numbers[0] = 10
numbers[1] = 20
numbers[2] = 30
numbers[3] = 40
numbers[4] = 50

Эти примеры иллюстрируют основные операции с массивами, которые являются строительными блоками более сложных техник обработки данных в программировании на языке C.

Резюме

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