Вот задание: Дан массив из N целых чисел. Найти среднее арифметическое элементов массива, кратных числу k. Поменять знак у всех элементов массива между первым максимальным и последним максимальным элементами. Если первый отрицательный элемент имеет четный индекс, то поменять местами части массива относительно этого элемента. Удалить из массива нулевые элементы. Отсортировать первую половину массива по возрастанию.
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main () {
setlocale(LC_ALL, "Rus");
int N, k;
cout << "Введите количество элементов" << endl;
cin >> N;
vector <int> v(N);
cout << "Введите элементы" << endl;
for (int i = 0; i < N; i++)
{
cin >> v[i];
}
cout << "Значения второго вектора " << endl;
for (int i = 0; i < N; i++) {
cout << v[i] << " ";
}
cout << endl<< "какому числу должно быть кратное? k= " << endl;
cin >> k;
double sum = 0;
int kol = 0;
for (int i = 0; i <N; i++)
{
if (v[i]%k == 0) {
sum += v[i];
kol += 1;
}
}
cout << sum / kol << endl;
cout << "Максимум " << *max_element(v.begin(), v.end()) << endl;
cout << "Mинимум: " << *min_element(v.begin(), v.end()) << endl;
_getch();
return 0;
}
Остановился на 3 предложении. Собственно вопросы: 1) *min_element(v.begin(), v.end()) - обязательно использует разыменование? Смотрел примеры - не везде используется. 2) Как подступиться к 3 заданию (предложению)? Правильно я понял, что, например, в copy нельзя запихнуть цикл, а только методы?; 3) Если бы я использовал диапазон, где первый элемент указала минимальный, а последний максимальный, то работал бы он, если они не в том бы порядке расположены были? К примеру, в copy указано с мин до макс, а на деле макс будет раньше минимального.
Спасибо!
*min_element(v.begin(), v.end())
- обязательно использует разыменование?
min_element
возвращает итератор. Разыменовывание нужно, если вы хотите получить значение, лежащее по этому итератору. Если вам нужен сам итератор, то оно, очевидно, не нужно.
"Если первый отрицательный элемент имеет четный индекс, то поменять местами части массива относительно этого элемента."
Как подступиться к 3 заданию (предложению)? Правильно я понял, что, например, в copy нельзя запихнуть цикл, а только методы?
Не понимаю вопрос. Во-первых, std::copy
сам проходит с помощью цикла по всем элементам диапазона. Зачем еще один (видимо вложенный) цикл? Во-вторых, что мешает поместить цикл в функцию, которую вы передаете в std::copy
?
Я бы создал еще один вектор, скопировал в него две половинки массива через std::copy(..., std::back_inserter(new_vector))
, и заменил старый вектор на новый. Это проще всего.
3) Если бы я использовал диапазон, где первый элемент указала минимальный, а последний максимальный, то работал бы он, если они не в том бы порядке расположены были? К примеру, в copy указано с мин до макс, а на деле макс будет раньше минимального.
Это бы не сработало. Стандартные функции, принимающие пару итераторов, требуют, чтобы первый был именно началом диапазона, а второй - концом.
Нужно использовать что-то вроде
if (начало > конец)
std::swap(начало, конец);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Пишу сервер на qtВопрос такой, могу ли я по очереди проинициализировать два socket и использовать их вместе
Есть класс List и класс NodeКак я не пытался описать деструкторы, методы del_first и del_last работают некорректно