Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
1

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

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

Author24 — интернет-сервис помощи студентам
Извините, если данная тема уже поднималась(к сожалению, я таковой на 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2013, 16:11
Ответы с готовыми решениями:

Сдвиг элемента массива в конец этого массива
В общем, такая вот проблема появилась. Задача: если элемент массива содержит в своей записи цифру...

Добавить вместо удаленных нулей -1 в конец массива
class Program { private static void genArr(int arr) { Random...

Сдвиг целой строки двухмерного массива в конец
В моем коде определяется самое маленькое число массива и обнуляется вся строка чисел, которой...

Битовый сдвиг - вывод достаточного количества нулей
Вопрос конечно лаймерский, но все же как сделать, что бы в консоли вместо 101 было 00000101, и...

13
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
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
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:36  [ТС] 3
Спасибо большое. Логично, не подумал. А что тогда делать?

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

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

Добавлено через 1 минуту
Думал, может, можно сделать какой-нибудь внешний цикл, осуществляющий проверку? Но, как-то в голову не приходит. В любом случае, буду благодарен за любое решение.
0
12 / 12 / 2
Регистрация: 09.11.2013
Сообщений: 85
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
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 16:43  [ТС] 5
Честно говоря, не совсем Вас понял. Код работает. Проблема возникает, если нулей несколько.

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

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

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

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

Добавлено через 22 секунды
Может, у кого-нибудь есть светлые мысли?
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
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
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:07  [ТС] 9
MicM, нужен динамический массив.
0
12 / 12 / 2
Регистрация: 09.11.2013
Сообщений: 85
25.11.2013, 17:13 10
Цитата Сообщение от welthel Посмотреть сообщение
MicM, нужен динамический массив.
Нужно менять 0 с последней переменной в массиве. Если последняя уже равна нулю, то менять 0 с (последней - 1). Перебором, вижу, сложновато. Хотя и здесь не без сложностей.
0
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:16  [ТС] 11
Выходит, что иного выхода, помимо создания нового массива - нет? При учёте того, что нужен динамический массив.
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
25.11.2013, 17:18 12
ТС написал:
Цитата Сообщение от welthel Посмотреть сообщение
а все остальные элементы сохранили свой порядок.
Если нулевые элементы менять с последним элементом, то порядок следования нарушится
0
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 7
25.11.2013, 17:48  [ТС] 13
MicM, можно ли обойтись без нового массива? Или для динамического иных вариантов нет?

Добавлено через 23 минуты
Решения, без создания нового массива, нет?
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2013, 21:05
Помогаю со студенческими работами здесь

Определить, сколько нулей в последовательности. Конец ввода 666
Определить, сколько нулей в последовательности.Конец ввода 666

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

Логический сдвиг влево,логический сдвиг вправо,алгоритм обмена двух переменных,циклический сдвиг
Битовые сдвиги.FW4,msstudio 13,на C# 1)Реализовать быстрое умножение на 2(логический сдвиг влево)...

Выполнить сдвиг элементов массива влево на 1 ячейку, начиная с позиции максимального элемента массива
Дан массив действительных чисел размера n. Выполнить сдвиг элементов массива влево на 1 ячейку,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru