Доброго времени суток. Сегодня мы продолжаем нашу рубрику на тему С++ и на повестке дня ещё одна задача с одномерным массивом.
Перед тем как начнём, напомню, что примеры под моим авторством пишутся на 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.
Последний цикл приравнивает исходный массив к созданному нами «временному» и выводит значения в консоль.
Вот и всё =)
Скачать исходники
Будьте первым, кто оставит комментарий