C/C++

С++ массивы. Программа не проходит тест

ВОПРОС: не проходит тест, ПОЧЕМУ И КАК ИСПРАВИТЬ?
5
2 4 6 8 10
ПИШЕТ: Segmentation fault (core dumped)


Выведите значение наименьшего нечетного элемента списка, а если в списке нет нечетных элементов - выведите число 0.


Формат входных данных
В первой строке вводится количество элементов в массиве. Во второй строке вводятся элементы массива.









#include <iostream>

#include <vector>

using namespace std;

int main() {

int n = 0, x = 0;

cin >> n;

vector <long double> a;

for (double i = 0; i < n; i++) {

long int oy = 0;

cin >> oy;

if (oy % 2 != 0) {

a.push_back(oy);

}

}

for (long double j = 1; j < a.size(); j++) {

for (long double u = 0; u < (a.size()) - 1; u++) {

if (a[u] > a[u + 1]) {

swap(a[u], a[u + 1]);


}

}

}


if (a[0] != NULL) {

cout << a[0];

}

else {

cout << "0";

}


return 0;

}
Зачем вектор? Зачем сортировка? Всё делается намного проще.

int n, t, min = 0;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> t;
if (t % 2 && (t < min || min == 0)) { min = t; }
}
cout << min;
Kamran Meherremov
Kamran Meherremov
88 524
Лучший ответ
Индексы всегда целые, поэтому НЕ используйте тип double для итераций по индексам из за возникающих ошибок округления.
Если вы отсеиваете элементы уже на этапе их ввода, то массив и вовсе не нужен.
Если массив заполняется по какому-то условию, то прежде чем его использовать следует убедиться, что это условие вообще было выполнено и массив не пуст.
Пустой массив не содержит элементов вообще, поэтому и обращаться к ним нельзя.
NULL - это пафосная форма записи цифры 0. Она вовсе не означает "пустоту" или отсутствие чего-то.

 #include 
using namespace std;

int main()
{
int n, x;
int min = numeric_limits::max();
//первоначальное значение min должно быть таким, чтобы гарантированно измениться
//в ходе программы, если условие на нечет хоть один раз будет выполнено. Можно задать
//его максимально возможной величиной хранимой в инт, как здесь. Но даже в этом случае
//существует вероятность неправильной работы, так как это число - нечетное.
//cout > n;
//bool flag = false;
for (int i = 0; i < n; i++)
{
cin >> x;
x & 1 && x < min ? min = x : NULL;
//if(x&1)
// if(!flag) {flag = true; min = x;} else if (min>x) min = x;
}
cout
Денис Сипиёв
Денис Сипиёв
51 416
Kamran Meherremov А если исходный список содержит единственное нечётное число, равное numeric_limits<int>::max()?
Если в списке все элементы чётны, вектор a будет совсем пустым без элементов, и в сравнении a[0] != NULL получается обращение к несуществующему элементу.

А в целом - зачем вся эта возня с перестановками, минимум за один проход ищется, не за a.size(); можно совсем без векторов обойтись, при вводе все проверки сразу делать.
Денис Пигарев
Денис Пигарев
9 861
Денис Пигарев
 #include  
using namespace std;
int main() {
int n, min = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (1 == x % 2 && (0 == min || x < min)) {
min = x;
}
}
cout
Дархан Досымбеков Понятно, просто эта мысль первой пришла в голову. А можно как-то изменить проверку if (a[0] != NULL) {


cout << a[0];


}

чтобы код работал?