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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
#1

Сдвиг нулей в конец массива - C++

25.11.2013, 16:11. Просмотров 678. Ответов 13
Метки нет (Все метки)

Извините, если данная тема уже поднималась(к сожалению, я таковой на C++ не нашёл).
Суть задачи: нужно отсортировать элементы массива таким образом, чтобы нули сдвинулись в конец, а все остальные элементы сохранили свой порядок. Проблема в том, что программа заканчивается после первого "сдвинутого" нуля.

Вот, что у меня получилось:
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
int n;
cout<<"Введите количество чисел:";
cin>>n;
int *Array= new int[n];
for(int i=0; i<n; i++)
{
    cout << "Введите число[" << i + 1 << "]" << ": ";
            cin >> Array[i];
}
int i=0;
{for(; i<(n-1); i++)
{
    if(Array[i]==0 && !(Array[i+1]==0) )
    {
        swap(Array[i], Array[i+1]);
        
        
    }
}
 
    for(int i=0; i<n; i++)
    {
        cout<<Array[i];
    }
system("PAUSE");
 delete [] Array;
return 0;
}
}
Буду очень благодарен за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 16:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сдвиг нулей в конец массива (C++):

Массив строк. Конец строки и конец массива - C++
\n - перевод на новую строку \0 - конец строки Если у меня массив строк (текст), чем заканчивается каждая строка, и как закончится...

Циклический сдвиг массива без использования вспомогательного массива - C++
Ребят, помогите пожадуйста написать лабу...Времени ктастрофически не хватает, буду очень признателен Написать функцию, которая...

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

Сортировка массива: перенести положительные числа в начало, а отрицательные - в конец массива - C++
Дан вещественный массив A(N). Отсортировать его таким образом, чтобы все положительные числа находились в начале, а отрицательные - в конце...

Отсортировать элементы массива: отрицательные – в начало массива, положительные – в конец - C++
написать две проги...Желательно в Microsoft Visual Studio. Исходный массив инициализировать случайным образом, предусмотрев возможность...

В конец массива b добавить максимальные элементы всех строк массива a - C++
Дано задание: Ввести двухмерный массив a и одномерный массив b. В конец массива b добавить максимальные элементы всех строк массива a. ...

13
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
25.11.2013, 16:29 #2
С таким условием выбора как:
C++
1
2
3
4
if(Array[i]==0 && !(Array[i+1]==0) )
{
    swap(Array[i], Array[i+1]);
}
не получится в принципе сделать нужные действия если будет 2 нуля подряд то 1 нуль останется на своем месте, если 3 нуля подряд то 2 останется на своих местах и так далее
0
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:36  [ТС] #3
Спасибо большое. Логично, не подумал. А что тогда делать?

Добавлено через 1 минуту
Привязываться как-то только к самому элементу Array[i]?

Добавлено через 1 минуту
Но один ноль, даже с такой проверкой, сбрасывается в конец. 10025 переходит в 10250(0 с 2 меняется, а затем с 5).

Добавлено через 1 минуту
Думал, может, можно сделать какой-нибудь внешний цикл, осуществляющий проверку? Но, как-то в голову не приходит. В любом случае, буду благодарен за любое решение.
0
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 16:37 #4
Цитата Сообщение от welthel Посмотреть сообщение
Спасибо большое. Логично, не подумал. А что тогда делать?

Добавлено через 1 минуту
Привязываться как-то только к самому элементу Array[i]?

Добавлено через 1 минуту
Но один ноль, даже с такой проверкой, сбрасывается в конец. 10025 переходит в 10250(0 с 2 меняется, а затем с 5).
У тебя предыдущее число же не проверяется. Сначала меняются нули местами, на втором шаге, на третьем он видит 0 и меняет его местами, на четвертом так же, а нуль на втором шаге - остается


Как-то так
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
33
34
35
36
37
38
39
// Кратность второго числа по отношению к первому
#include "stdafx.h"
#include <conio.h> 
#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main(){
int n;
 
setlocale(LC_ALL, "Russian");
 
 
cout << "Введите количество чисел:";
cin >> n;
int *Array= new int[n];
for(int i=0; i<n; i++)
{
cout << "Введите число[" << i + 1 << "]" << ": ";
cin >> Array[i];
}
int i=0;
for(i; i<(n-1); i++) {
if(Array[i]==0)
swap(Array[i], Array[i+1]);
if (Array[i-1] == 0)
swap (Array[i-1], Array[i]);
}
 
for(int i=0; i<n; i++) {
cout<<Array[i];
}
system("PAUSE");
delete [] Array;
return 0;
 
}
0
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:43  [ТС] #5
Честно говоря, не совсем Вас понял. Код работает. Проблема возникает, если нулей несколько.

Добавлено через 2 минуты
Вы все верно объяснили, но я это и сам понимаю. Меня интересует полностью рабочие варианты: иной вариант проверки, дополнительные цикл, etc.

Добавлено через 2 минуты
Спасибо, сейчас проверю.
0
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 16:43 #6
Цитата Сообщение от welthel Посмотреть сообщение
Честно говоря, не совсем Вас понял. Код работает. Проблема возникает, если нулей несколько.

Добавлено через 2 минуты
Вы все верно объяснили, но я это и сам понимаю. Меня интересует полностью рабочие варианты: иной вариант проверки, дополнительные цикл, etc.
Ну с четырьмя числами работает, если больше, нужно еще подумать
1
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:01  [ТС] #7
Спасибо, IntelCoreDuo. Всё работает.

Добавлено через 13 минут
К сожалению, проблема полностью не решилась. Если нулей больше 2 подряд, то программа не работает должным образом.

Добавлено через 22 секунды
Может, у кого-нибудь есть светлые мысли?
0
MicM
822 / 480 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
25.11.2013, 17:03 #8
Как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int main()
{
    int a[15]={0,0,0,5,0,1,2,0,3,4,0,0,3,2,0};
    int k = 0;
    int i = 0;
    while (i<15-k)
    {
        if (a[i]==0)
        {
            ++k;
            for (int j=i; j<14; j++)
                a[j]=a[j+1];
        }
        else ++i;
    }
    for (i=14; i>14-k; i--)
        a[i]=0;
    for (i=0; i<15; i++)
        std::cout <<a[i] <<" ";
    return 0;
}
0
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:07  [ТС] #9
MicM, нужен динамический массив.
0
IntelCoreDuo
11 / 11 / 0
Регистрация: 09.11.2013
Сообщений: 52
25.11.2013, 17:13 #10
Цитата Сообщение от welthel Посмотреть сообщение
MicM, нужен динамический массив.
Нужно менять 0 с последней переменной в массиве. Если последняя уже равна нулю, то менять 0 с (последней - 1). Перебором, вижу, сложновато. Хотя и здесь не без сложностей.
0
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:16  [ТС] #11
Выходит, что иного выхода, помимо создания нового массива - нет? При учёте того, что нужен динамический массив.
0
MicM
822 / 480 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
25.11.2013, 17:18 #12
ТС написал:
Цитата Сообщение от welthel Посмотреть сообщение
а все остальные элементы сохранили свой порядок.
Если нулевые элементы менять с последним элементом, то порядок следования нарушится
0
welthel
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:48  [ТС] #13
MicM, можно ли обойтись без нового массива? Или для динамического иных вариантов нет?

Добавлено через 23 минуты
Решения, без создания нового массива, нет?
0
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
25.11.2013, 21:05 #14
решение есть сделать все в одном массиве, я просто не успел написать с работы уходить пора уже было. Вот как я это вижу:
C++
1
2
3
4
5
6
7
8
9
10
11
int *Array= new int[n];
int next = 0;
while (Array[next] != 0) {
    next++;
} 
for(int i=next+1;i < n; i++) {
    if (Array[i] != 0) {
        swap (Array[next],Array[i]);
        next++;    
    }
}
Наверное как то так, сам не проверял но в голове у меня работало)))) Но мог конечно и ошибиться писал так сказать на коленках.
2
25.11.2013, 21:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 21:05
Привет! Вот еще темы с ответами:

Предусмотреть публичные методы добавления в конец массива, извлечения и удаления из массива по индексу - C++
Помогите пожалуйста! Написать класс динамического массива (массив, который может изменять свой размер в зависимости от количества...

Элементы массива, стоящие на нечётных позициях, переставить в начало массива, а на чётных - в конец - C++
Превратить массив таким образом, чтобы в его первой половине располагались элементы, стоящие в нечетных позициях, а во второй половине -...

Удаление элемента из массива и сдвиг массива - C++
Нужно удалить максимальный элемент массива и сделать сдвиг массива на одну позицию. Нужно сделать без использования vector и динамических...

Добавить в конец массива элементы, расположенные между min и max элементами исходного массива, исключая нули - C++
добавить в конец массива элементы, расположенные между минимальными и максимальными элементами исходного массива, исключая нулевые


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru