Skip to content

Одномерный массив. Задача 2

Доброго времени суток. Сегодня мы продолжаем нашу рубрику на тему С++ и на повестке дня ещё одна задача с одномерным массивом.

Перед тем как начнём, напомню, что примеры под моим авторством пишутся на Linux, то есть для реализации на Windows следует изменить всего пару строк.
Итак, задача:

В одномерном массиве, состоящем из n вещественных элементов вычислить:
1) Максимальный элемент массива.
2) Сумму элементов массива, расположенных до последнего положительного элемента массива.
Сжать массив, удалив из его все элементы модуль, которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями.

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(void){
    static int N = 10;
    int mas[N];
    int i;
    for (i = 0; i < N; i++){
        mas[i] = rand() % 21 - 10;
        cout << mas[i] << "  ";
    }

Сначала объявляем библиотеки, необходимые нам для работы: iostream — отвечает за ввод и вывод какой либо информации в консоль или поток, cstdlib — библиотека со стандартными функциями, cmath — математические функции. Далее определяем наше пространство имён и переходим уже непосредственно к основному коду.

N— количество элементов массива, используем статик static так как N должна быть константой. Инициализируем сам массив и запускаем цикл, в котором «рандомно» вводятся целые числа в массив. rand() %21 -10 — означает промежуток этих чисел от -10 до 10.

Результат «рандома» будет всегда один и тот же. Для того чтобы он был каждый раз разный загляните в эту статью, где автор использовал команду srand().

int max, sum, k;
    cout << "\n";
    max = mas[0];
    sum = 0;
    for (i = 0;i < N; i++){
        if (max < mas[i]) max = mas[i];
        if (mas[i] > 0) k = i;
    }
    for (i = 0;i < k; i++){
        sum = sum + mas[i];
    }
    cout << "Вот такой вот макс =" << max << "\n";
    cout << "Вот такая вот сумма =" << sum << "\n";

В этом отрывке мы находим сумму элементов и максимальный элемент одномерного массива C++

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

С нахождением суммы в массиве сложнее, так как дано ограничение «до последнего положительного элемента», следовательно найдём индекс этого элемента и запишем его в переменную k. И последний цикл в этом отрывке как раз находит нужную сумму, проходя по циклу до k. И выводим их.

int a,b;
    int mas2[N];
    for (i = 0;i < N; i++){
        mas2[i] = 0;
    }
    k = 0;
    cout << "Задайте левую границу интервала =";cin >> a;
    cout << "\nЗадайте правую границу интервала =";cin >> b;
    for (i = 0;i < N; i++){
        if (!(abs(mas[i]) >= a && abs(mas[i]) <= b) and mas[i] != 0) {
            mas2[k] = mas[i];
            k++;
        }
    }
    cout << endl;
    for (i = 0;i < N; i++){
        mas[i] = mas2[i];
        cout << mas[i] << "  ";
    }
    cout << "\n";

И финал: сжать массив, удалив элементы, входящие в заданный нами интервал.

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

В начале обнуляем новый массив, так как там может хранится «мусор». Обнуляем k просто, чтобы не создавать новую переменную. Задаём наши границы и запускаем цикл с фильтром. abs() — модуль, && — логический оператор И, синоним And. Так же помимо того, что элемент не должен входить в интервал, он не должен быть равен 0. Если элемент прошёл фильтр, то он записывается в «новый» массив, увеличиваем индекс k.

Последний цикл приравнивает исходный массив к созданному нами «временному» и выводит значения в консоль.

Вот и всё =)

Скачать исходники

Опубликовано вC++

Будьте первым, кто оставит комментарий

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *