Проблема при решении задачи, некорректная работа логического ИЛИ
я начинающий программист и мне нужна ваша помощь по нахождению ошибки в моём коде (по-моему мнению ошибка в условии), только не ругайтесь сильно) Сама задача: Дан массив целых чисел, каждое из которых отлично от нуля. Если в массиве отрицательные и положительные члены чередуются (+, -, +, -, … или -, +, -, +, …), то получить новый массив, совпадающий с данным. Иначе получить новый массив из отрицательных элементов данного массива, сохранив порядок их следования.
#include <iostream>
using namespace std;
int main()
{
int size1 = 0, size2 = 0;
int *X; int *Y;
cout << "Set up the size of array: "; cin >> size1;
cout << endl;
X = new int[size1];
Y = new int[size2];
cout << "fill in your array: ";
for (int i = 0; i < size1; i++) {
cin >> X[i];
}
size2 = size1;
for (int i = 0; i < size1; i++) {
if (X[i] < 0 && X[i + 1] > 0 || X[i] > 0 && X[i + 1] < 0) {
Y[i] = X[i];
}
else
if (X[i] < 0) {
Y[i] = X[i];
size2++;
}
}
cout << endl;
cout << "Your array now = {";
for (int i = 0; i < size2; i++) {
cout << Y[i] << "\t";
}
cout << "}";
system("pause");
return(0);
}
Ответы (1 шт):
Автор решения: Mikhailo
→ Ссылка
Можно так:
#include <iostream>
using namespace std;
int sign(int x) {
return x < 0 ? -1 : +1;
}
int main() {
int size1 = 0, size2 = 0;
int* X;
int* Y;
cout << "Set up the size of array: ";
cin >> size1;
cout << endl;
X = new int[size1];
cout << "fill in your array: ";
for (int i = 0; i < size1; i++) {
cin >> X[i];
if (X[i] < 0) size2++; // Ищем число отрицательных
}
bool ok = true;
for (int i = 1; i < size1; i++) {
if (sign(X[i - 1])*sign(X[i]) > 0) {
ok = false; // Нет чередования знака
break;
}
}
if (ok) {
size2 = size1;
Y = new int[size2];
for (int i = 0; i < size1; ++i) Y[i] = X[i];
}
else {
Y = new int[size2];
for (int i = 0, j = 0; i < size1; ++i) if (X[i] < 0) Y[j++] = X[i];
}
cout << "Your array now = {";
for (int i = 0; i < size2; i++) {
cout << Y[i] << ", ";
}
cout << "}\n";
}