C/C++

Ребзи привет, гляньте код там всё норм, только на аутпуте два раза вводит один и тот же массив. Укажите на ошибку.

Пока неправильно, попробуйте еще раз!
Failed test #2 of 4. Wrong answer

This is a sample test from the problem statement!

Test input:
17
Correct output:
-3 -9 -8 -8 -9
ERROR

Your code output:
-3 -9 -8 -8 -9
ERROR
-3 -9 -8 -8 -9
Свернуть
Time Limit: 5 секунд
Memory Limit: 256 MB
#include "iostream"

#include "cstdlib"
#include "time.h"

#include "iomanip"

#define n 5
using namespace std;
int main(int argc, char* argv[]) {

int mas[n], index_1_otr = n+1, index_last_pol = n+1, k, d;
cin >> d;

srand(d);

//Заполняем массив случайными числами от -n до n

for(int i = 0; i < n; i++)

mas[i] = rand()% 21 - 10;

//Вывод массива на консоль

for(int i = 0; i < n; i++)

cout<<mas[i] << ' ';

cout << endl;

// первый отрицательный и последний положительный элемент массива

for(int i = 0; i < n; i++)

if(mas[i]<0)

{

index_1_otr = i;

break;

}

for(int i = 0; i < n; i++)

if(mas[i]>0)

index_last_pol = i;

//Меняем местами 1й отрицательный и последний положительный

if(index_1_otr == n+1)

cout<< "ERROR" << endl;

else if(index_last_pol == n+1)

cout<< "ERROR" << endl;

else{

k = mas[index_last_pol];

mas[index_last_pol] = mas[index_1_otr];

mas[index_1_otr] = k;
}

for (int i = 0; i < n; i++)

cout << mas[i] << " ";

cout << endl;
return 0;
}

Поменять местами первый отрицательный и последний положительный элементы массива.

С новой строки вывести измененный массив, разделяя элементы пробелами (пробел должен быть и после последнего элемента).

Если в массиве отсутствуют отрицательные или отсутствуют положительные элементы, то нужно вместо итогового массива вывести слово ERROR.

Sample Input 1:

25
Sample Output 1:

10 -1 -6 4 7
10 7 -6 4 -1
Sample Input 2:

17
Sample Output 2:

-3 -9 -8 -8 -9
ERROR
Pavel Nechaev
Pavel Nechaev
15
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
unsigned d;
cin >> d;
srand(d);
const int n = 5;
int box[n];
const int l = -10;
const int r = 21;
for (int i = 0; i < n; ++i) box[i] = l + rand() % (l - r);
for (int i = 0; i < n; ++i) cout << box[i] << ' ';
puts("");
int ifn = -1;
for (int i = 0; i < n; ++i) {
if (box[i] < 0) {
ifn = i;
break;
}
}
int ilp = n - 1;
while (ilp >= 0 && box[ilp] <= 0) --ilp;
if (ilp >= 0 && ifn >= 0) {
swap(box[ifn], box[ilp]);
for (int i = 0; i < n; ++i) cout << box[i] << ' ';
puts("");
} else {
puts("ERROR");
}
}
Нурбек Тлеужанов
Нурбек Тлеужанов
63 271
Лучший ответ
Pavel Nechaev от души спасибо Вам, единственное, что пришлось изменить самому box[i] = l + rand() % (l - r);
на box[i] = l + rand() % , чтобы подогнать под ответ системы. Метод swap облегчает задачу конечно, чтобы не создавать временную переменную.
   Удивляюсь Вам, Алексей, у Вас за спиной немалая практика программирования на C++, а ошибки допускаете по рассеянности… Видимо, весна…
   Уточню то, что пропущено в условиях задания, но указано в комментариях в коде: «Вводится положительное число N, объявляется массив из N элементов и заполняется случайными значениями из диапазона [–N, N]».
   С помощью директивы define Вы задаёте значение n = 5, стало быть массив состоит из 5 элементов. А вводите Вы в переменную d. Вот только что эта величина означает по-вашему? Я не разумею! Видно, что Вы используете значение d как параметр функции srand(), и что Вы ожидаете?

◉ Обычно стартовое число псевдослучайной последовательности задаётся так:   srand(time(NULL));

  Re: Заполняем массив случайными числами от -n до n

   Размер диапазона, из которого выбираются псевдослучайные числа равен 2n + 1.

◉      mas[i] = rand() % (2 * n + 1) - n;

  Алгоритмы поиска первого отрицательного и последнего положительного элементов в принципе правильные (хотя и неоптимальные). Ладно.

  А вот проверка отсутствия отрицательных или положительных получилась избыточной! Разве Вы разучились объединять условия с помощью логических операций???



if(index_1_otr == n+1 || index_last_pol == n+1)
cout << "ERROR";
else {
k = mas[index_last_pol];
mas[index_last_pol] = mas[index_1_otr];
mas[index_1_otr] = k;
for (int i = 0; i < n; i++)
cout << mas[i] << " ";
}

✓ Вот в чём Ваша главная ошибка: цикл вывода массива должен быть внутри блока else, а у Вас он отдельно, поэтому массив выводится во всех случаях!
Кыдырбеков Азат 1. Удалите уже строку #define n 5

2. Объявите n как переменную, удалите ненужную переменную d

3. Вводите значение в переменную n
Кыдырбеков Азат И ещё совет: избегайте вводить / выводить то, есть чего не требуется по условию. Тестирование по stdin/stdout чувствительно к тому, что не предусмотрено тестами.

Например, сказано, что вывод с новой строки, значит, оправдано cout << endl; в соответствующем месте.

А вот после выведенного cout << endl; лучше не указывать.