Форум программистов, компьютерный форум CyberForum.ru

Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
13.05.2012, 23:29     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #1
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.

Скажите, почему у меня выводит вот такое?

5
1
0
0
5
2
1 -33686019 2 5 0 Press any key to continue . . .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
int main()
{
int n;
cin >> n;
 
int *A = new int[n];
for (int i = 0; i < n; i++)
cin >> A[i];
 
for (int i = n; i >= 0; i--)
{
for (int j = 0; j <= i; j++)
{
if (A[j] == 0)
{
int t = A[i];
A[i] = A[j];
A[j] = t;
break;
}
}
}
 
for (int i = 0; i < n; i++)
cout << A[i] << " ";
system("pause");
delete[] A;
return 0;
}
Добавлено через 33 минуты
Откуда при выводе взялось - это число -33686019? Я так понимаю это первый ноль в него превратился?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 23:29     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Посмотрите здесь:

Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных C++
Преобразовать массив таким образом, чтобы элементы, равные нулю располагались после остальных. C++
C++ Преобразовать массив таким образом чтобы сначала располагались все элементы равные нулю а потом остальные
C++ Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
C++ Преобразовать массив таким образом, чтобы сначала располагались четные, а потом нечетные элементы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ncuX1
brony
72 / 52 / 2
Регистрация: 02.01.2012
Сообщений: 521
13.05.2012, 23:37     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #2
Цитата Сообщение от jvov Посмотреть сообщение
Откуда при выводе взялось - это число -33686019? Я так понимаю это первый ноль в него превратился?
Это "мусор". Какому-то элементу массива ничего не присвоено. По этому при объявлении массива лучше заполнять все элементы нулевыми значениями, а потом уже в ходе работы с массивом присваивать другие значения.
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
14.05.2012, 22:42  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #3
Цитата Сообщение от ncuX1 Посмотреть сообщение
Это "мусор". Какому-то элементу массива ничего не присвоено. По этому при объявлении массива лучше заполнять все элементы нулевыми значениями, а потом уже в ходе работы с массивом присваивать другие значения.
Но, я же заполняю его сам, то есть там его не должно быть. И при любом количестве элементов массива выводит это число(-33686019) и все время на том месте где был первый ноль.
Как можно это исправить?

Добавлено через 12 минут
Перед заполнением массива, заполнил его нулями - проблему не решило. По прежнему выдает мусор

Добавлено через 3 минуты
И ещё проверил, если ноль не вводить, то все красиво выводит. Как только в массива ввожу ноль - сразу это "число" появляется.

Добавлено через 22 часа 41 минуту
Скажите, а сам алгоритм правильный? Может, я что-то не так составил?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
15.05.2012, 04:52     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
int main()
{
    int arr[]{0, 5, 1, 0, 5, -9, 0, 2};
    std::size_t size = sizeof(arr) / sizeof(*arr);
    int i, j, tmp;
    for(i = 1; i < size; ++i)
    {
        tmp = arr[i];
        for(j = i - 1; j >= 0 && !arr[j] && tmp; --j)
        {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = tmp;
    }
    for(auto val : arr)
    {
        std::cout << val << "  ";
    }
    return 0;
}
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
15.05.2012, 05:39     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #5
Цитата Сообщение от jvov Посмотреть сообщение
for (int i = n; i >= 0; i--
вот здесь i = 5
соответственно A[i] == A[5]
шестой элемент массива а размер всего 5 выход за границы отсюда и мусор
и это будет при любом n
нужно так
C++
1
for (int i = n-1; i >= 0; i--)
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
15.05.2012, 10:06  [ТС]     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных #6
Цитата Сообщение от ValeryS Посмотреть сообщение
вот здесь i = 5
соответственно A[i] == A[5]
шестой элемент массива а размер всего 5 выход за границы отсюда и мусор
и это будет при любом n
нужно так
C++
1
for (int i = n-1; i >= 0; i--)
Спасибо большое!
Yandex
Объявления
15.05.2012, 10:06     Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных
Ответ Создать тему
Опции темы

Текущее время: 12:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru