Поиск наибольшего и наименьшего элементов массива на языке C

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

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

Введение

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

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

Finding the largest and smallest elements in an array

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/operators -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/if_else -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/for_loop -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/arrays -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/user_input -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} c/output -.-> lab-123271{{"Поиск наибольшего и наименьшего элементов массива на языке C"}} end

Настройка структуры программы

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

Сначала перейдите в каталог проекта и создайте новый файл с именем main.c:

cd ~/project
touch main.c

Теперь откройте файл main.c в редакторе и добавьте следующий код:

#include <stdio.h>

int main() {
    // We'll declare an array with a maximum capacity of 50 elements
    int array[50];
    // Variables to store the size of the array and loop counter
    int size, i;
    // Variables to store the largest and smallest elements
    int largest, smallest;

    printf("Finding Largest and Smallest Elements in an Array\n");
    printf("------------------------------------------------\n\n");

    return 0;
}

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

  • #include <stdio.h> включает стандартную библиотеку ввода-вывода, которая предоставляет такие функции, как printf() и scanf().
  • Функция main() является точкой входа в нашу программу.
  • Мы объявляем целочисленный массив с именем array с вместимостью 50 элементов.
  • Переменная size будет хранить количество элементов, которые пользователь хочет ввести.
  • Переменная i будет использоваться в качестве счетчика цикла.
  • Переменные largest и smallest будут хранить максимальное и минимальное значения, найденные в массиве.

Сохраните файл после добавления этого кода. Это создает основу для нашей программы.

Получение ввода от пользователя

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

Откройте файл main.c в редакторе и измените его, добавив следующий код перед оператором return 0;:

// Ask user for the size of the array
printf("Enter the size of the array (max 50): ");
scanf("%d", &size);

// Validate the input size
if (size <= 0 || size > 50) {
    printf("Invalid array size. Please enter a size between 1 and 50.\n");
    return 1;
}

// Get array elements from the user
printf("\nEnter %d elements of the array:\n", size);
for (i = 0; i < size; i++) {
    printf("Element %d: ", i + 1);
    scanf("%d", &array[i]);
}

// Display the entered array
printf("\nThe array you entered is: [ ");
for (i = 0; i < size; i++) {
    printf("%d ", array[i]);
}
printf("]\n\n");

Этот код:

  1. Запрашивает у пользователя размер массива.
  2. Проверяет, что размер находится в диапазоне от 1 до 50.
  3. Просит пользователя поочередно ввести каждый элемент массива.
  4. Отображает введенный массив пользователю для подтверждения.

Скомпилируем и запустим нашу программу, чтобы увидеть, что у нас получилось на данный момент:

gcc main.c -o main
./main

Вы должны увидеть запрос на ввод размера массива. Введите небольшое число, например 5, а затем введите 5 значений. Программа отобразит введенный вами массив.

Например, если вы введете 5 в качестве размера, а затем введете значения 10, 25, 5, 17 и 9, вы должны увидеть следующий вывод:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

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

Поиск наибольшего элемента

Теперь добавим код для поиска наибольшего элемента в массиве. Стратегия следующая:

  1. Предположим, что первый элемент является наибольшим.
  2. Сравним каждый последующий элемент с текущим наибольшим.
  3. Если найден больший элемент, обновим значение наибольшего.

Добавьте следующий код в файл main.c перед оператором return 0;:

// Initialize largest with the first element of the array
largest = array[0];

// Find the largest element
printf("Finding the largest element...\n");
for (i = 1; i < size; i++) {
    if (array[i] > largest) {
        largest = array[i];
        printf("New largest found at position %d: %d\n", i + 1, largest);
    }
}

printf("\nThe largest element in the array is: %d\n\n", largest);

Этот код инициализирует переменную largest первым элементом массива. Затем он проходит по массиву, начиная со второго элемента (индекс 1), сравнивая каждый элемент с текущим наибольшим значением. Если найден больший элемент, он обновляет переменную largest и выводит сообщение.

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

gcc main.c -o main
./main

Введите размер массива и его элементы, как и раньше. Например, если вы введете значения 10, 25, 5, 17 и 9, вы должны увидеть вывод, похожий на следующий:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Finding the largest element...
New largest found at position 2: 25

The largest element in the array is: 25

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

Поиск наименьшего элемента

Теперь, когда мы нашли наибольший элемент, добавим код для поиска наименьшего элемента в массиве. Стратегия аналогична:

  1. Предположим, что первый элемент является наименьшим.
  2. Сравним каждый последующий элемент с текущим наименьшим.
  3. Если найден меньший элемент, обновим значение наименьшего.

Добавьте следующий код в файл main.c перед оператором return 0;:

// Initialize smallest with the first element of the array
smallest = array[0];

// Find the smallest element
printf("Finding the smallest element...\n");
for (i = 1; i < size; i++) {
    if (array[i] < smallest) {
        smallest = array[i];
        printf("New smallest found at position %d: %d\n", i + 1, smallest);
    }
}

printf("\nThe smallest element in the array is: %d\n", smallest);

Этот код инициализирует переменную smallest первым элементом массива. Затем он проходит по массиву, начиная со второго элемента (индекс 1), сравнивая каждый элемент с текущим наименьшим значением. Если найден меньший элемент, он обновляет переменную smallest и выводит сообщение.

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

gcc main.c -o main
./main

Введите размер массива и его элементы, как и раньше. Например, если вы введете значения 10, 25, 5, 17 и 9, вы должны увидеть вывод, похожий на следующий:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Finding the largest element...
New largest found at position 2: 25

The largest element in the array is: 25

Finding the smallest element...
New smallest found at position 3: 5

The smallest element in the array is: 5

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

Оптимизация программы и полный код

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

Откройте файл main.c и замените весь его контент на следующую оптимизированную версию:

#include <stdio.h>

int main() {
    // We'll declare an array with a maximum capacity of 50 elements
    int array[50];
    // Variables to store the size of the array and loop counter
    int size, i;
    // Variables to store the largest and smallest elements
    int largest, smallest;

    printf("Finding Largest and Smallest Elements in an Array\n");
    printf("------------------------------------------------\n\n");

    // Ask user for the size of the array
    printf("Enter the size of the array (max 50): ");
    scanf("%d", &size);

    // Validate the input size
    if (size <= 0 || size > 50) {
        printf("Invalid array size. Please enter a size between 1 and 50.\n");
        return 1;
    }

    // Get array elements from the user
    printf("\nEnter %d elements of the array:\n", size);
    for (i = 0; i < size; i++) {
        printf("Element %d: ", i + 1);
        scanf("%d", &array[i]);
    }

    // Display the entered array
    printf("\nThe array you entered is: [ ");
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("]\n\n");

    // Initialize largest and smallest with the first element
    largest = smallest = array[0];

    // Find both the largest and smallest elements in a single pass
    printf("Searching for largest and smallest elements...\n");
    for (i = 1; i < size; i++) {
        // Check for largest
        if (array[i] > largest) {
            largest = array[i];
            printf("New largest found at position %d: %d\n", i + 1, largest);
        }

        // Check for smallest
        if (array[i] < smallest) {
            smallest = array[i];
            printf("New smallest found at position %d: %d\n", i + 1, smallest);
        }
    }

    // Display results
    printf("\nResults:\n");
    printf("- The largest element in the array is: %d\n", largest);
    printf("- The smallest element in the array is: %d\n", smallest);

    // Calculate and display the range
    printf("- The range (difference between largest and smallest) is: %d\n", largest - smallest);

    return 0;
}

Эта оптимизированная версия:

  1. Использует один цикл для поиска как наибольшего, так и наименьшего элементов, что делает программу более эффективной.
  2. Инициализирует как largest, так и smallest первым элементом массива.
  3. Добавляет вычисление диапазона (разности между наибольшим и наименьшим значениями).

Скомпилируем и запустим нашу оптимизированную программу:

gcc main.c -o main
./main

Введите размер массива и его элементы, как и раньше. Например, если вы введете значения 10, 25, 5, 17 и 9, вы должны увидеть вывод, похожий на следующий:

Finding Largest and Smallest Elements in an Array
------------------------------------------------

Enter the size of the array (max 50): 5

Enter 5 elements of the array:
Element 1: 10
Element 2: 25
Element 3: 5
Element 4: 17
Element 5: 9

The array you entered is: [ 10 25 5 17 9 ]

Searching for largest and smallest elements...
New largest found at position 2: 25
New smallest found at position 3: 5

Results:
- The largest element in the array is: 25
- The smallest element in the array is: 5
- The range (difference between largest and smallest) is: 20

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

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

Итог

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

  1. Вы настроили базовую структуру программы с необходимыми объявлениями переменных.
  2. Вы написали код для получения от пользователя размера массива и его элементов.
  3. Вы реализовали алгоритм для поиска наибольшего элемента в массиве.
  4. Вы реализовали аналогичный алгоритм для поиска наименьшего элемента в массиве.
  5. Вы оптимизировали программу, объединив оба поиска в один цикл, и добавили дополнительную функциональность.

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

  • Массивы и обход массивов
  • Использование циклов для итерации
  • Условные операторы
  • Оптимизация алгоритмов
  • Получение и валидация пользовательского ввода

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

Вы можете расширить эту программу, добавив такие функции, как:

  • Нахождение среднего значения всех элементов массива
  • Сортировка массива
  • Нахождение медианного значения
  • Подсчет количества вхождений определенных значений

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