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

Переместить нулевые элементы в конец массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.69
GaDinka
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 64
11.02.2011, 08:46     Переместить нулевые элементы в конец массива #1
Добрый день! Я уже к вам за помощью обращалась и вот пишу в очередной раз. Пишу код программы, но программма отказывается его выполнять так как имеются ошибки в коде. Задача состоит в следующем: имеется одномерный массив. Все элементы, равные нулю, нужно переместить в конец массива. У меня получается вот такая программа, но она не работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int mas[20],mas2[20]; int pos; int size = 5;
 
void main(){
    int j = 0;
    srand(time(0));
    for(int i=0;i<size;i++) mas[i] = rand()%10;//Заполняем случайными числами
    for(int i=0;i<size;i++) printf("%i ",mas[i]);//Выводим массив
    
    for(int i=pos;i<size-1;i++) if mas[i]==0
    {
        mas[size]=mas[i]; mas[i+1] = mas[i]; 
    size--;
    }
    else printf("Nulevih elementov net!");
    for(int i=0;i<size;i++) printf("%i ",mas[i]);//Выводим массив на экран
    printf("\n");
}
Помогите пожалуйста исправить ошибки! Буду очень благодарна.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2011, 08:46     Переместить нулевые элементы в конец массива
Посмотрите здесь:

одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец массива in c++ C++
C++ добавить в конец массива элементы, расположенные между минимальными и максимальными элементами исходного массива, исключая нулевые
C++ Переместить элементы массива
В одномерном массиве все отрицательные элементы переместить в начало массива, а остальные – в конец с сохранением порядка следования C++
Создать два новых массива, в один из которых поместить положительные элементы массива, а в другой отрицательные и нулевые элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Runa
 Аватар для Runa
130 / 82 / 3
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:04     Переместить нулевые элементы в конец массива #2
скобочки пропустила)
C++
1
if (mas[i]==0)
Добавлено через 16 минут
а вообще логика не та, если нужно решение, пиши
GaDinka
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 64
11.02.2011, 09:07  [ТС]     Переместить нулевые элементы в конец массива #3
Напишите тогда, пожалуйста, своё решение.
Runa
 Аватар для Runa
130 / 82 / 3
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:11     Переместить нулевые элементы в конец массива #4
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
int mas[20], mas2[20]; 
int pos = 0; int size = 5;
 
void main()
{
    int j = 0,f = 0;
    srand(time(0));
    for ( int i=0; i < size; i++) mas[i] = rand()%10;//Заполняем случайными числами
    for ( int i=0; i<size; i++) printf("%i ",mas[i]);//Выводим массив
    
    for(int i=pos; i<size-1; i++) 
    {
        if (mas[i]==0)
        {
            for (int q = i; q < size - 1; q++) //запускаем цикл, чтобы передвинуть каждый элемент на одну позицию
            {
                mas[q] = mas[q + 1];
            }
            mas[size - 1] = 0; // в последний пишем ноль
            f = 1; // признак наличия нулевого элемента
        }
    }
    //сообщение выводится в зависимости от признака
    if ( f == 0 ) printf ("\nNulevih elementov net!\n");
    else printf ("\nPeredvinuli:\n");
 
    for( int i=0; i < 5; i++) printf("%i ", mas[i]);//Выводим массив на экран
    printf("\n");
    getch();
}
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
11.02.2011, 09:31     Переместить нулевые элементы в конец массива #5
Maruna, А если два подряд идущих 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
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int mas[20],mas2[20];
int pos; int size = 7;
 
void main(){
        int i, j = 0, p=size-1, l=size;
        srand(time(0));
        for(int i=0;i<size;i++) 
        {
            mas[i] = rand()%5;//Заполняем случайными числами
            printf("%d ",mas[i]);//Выводим массив
        }    
        for(i=0; i<l; i++) 
            if (mas[i]==0)
            {
                for (j=i; j<size; j++)
                    mas[j]=mas[j+1];
                i--;
                l--;
                mas[size-1]=0;
            }
        if (mas[size-1])
            printf("Nulevih elementov net!");
        printf("\n");
        for(int i=0;i<size;i++) 
            printf("%d ",mas[i]);//Выводим массив на экран
        printf("\n");
}
Runa
 Аватар для Runa
130 / 82 / 3
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:46     Переместить нулевые элементы в конец массива #6
ага, недоглядела
-=ЮрА=-
Заблокирован
Автор FAQ
11.02.2011, 09:56     Переместить нулевые элементы в конец массива #7
Я ни на что не претендую но думаю мой код наиболее прост и оптимален для решения данной задачи!
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
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
 
int mas[20],mas2[20]; 
int pos; int size = 20;
 
void main()
{
    int i,j = 0;//j - áóäåò ñ÷¸ò÷èêîì Г*óëåâûõ ºëåìåГ*òîâ
    srand(time(0));
    printf("Ishodni massiv\r\n");
    for(i=0;i < size; i++) 
    {
        mas[i] = rand()%10;//Г‡Г*ïîëГ*ГїГҐГ¬ ñëó÷Г*Г©Г*ûìè Г·ГЁГ±Г«Г*ìè
        printf("mas[%d] = %d\r\n",i,mas[i]);//ГЌГі ГЁ âûâîäè Г±ГҐГЎГҐ Г±Г°Г*çó, Г§Г*Г·ГҐГ¬ ГҐГ№Вё 1 öèêë???
    }
    for(i = 0;i < size - j; i++)
    {
        if(mas[i] == 0)
        {
            j++;
            mas[i] = mas[size - j];
            mas[size - j] = 0;
        }
    }
    if(j == 0) 
        printf("\r\nNulevih elementov net!");
    printf("Preobrazovanni massiv\r\n");
    for(i = 0;i < size; i++) 
        printf("mas[%d] = %d\r\n",i,mas[i]);//Âûâîäèì Г¬Г*Г±Г±ГЁГў Г*Г* ГЅГЄГ°Г*Г*
    printf("\nVvedite luboe chislo dlya prodlzhenia");
    scanf("%d",i);
}
Это текстовой результат работы программы
Ishodni massiv
mas[0] = 0
mas[1] = 4
mas[2] = 8
mas[3] = 3
mas[4] = 4
mas[5] = 1
mas[6] = 7
mas[7] = 2
mas[8] = 7
mas[9] = 8
mas[10] = 6
mas[11] = 6
mas[12] = 8
mas[13] = 3
mas[14] = 1
mas[15] = 1
mas[16] = 2
mas[17] = 8
mas[18] = 8
mas[19] = 3
Preobrazovanni massiv
mas[0] = 3
mas[1] = 4
mas[2] = 8
mas[3] = 3
mas[4] = 4
mas[5] = 1
mas[6] = 7
mas[7] = 2
mas[8] = 7
mas[9] = 8
mas[10] = 6
mas[11] = 6
mas[12] = 8
mas[13] = 3
mas[14] = 1
mas[15] = 1
mas[16] = 2
mas[17] = 8
mas[18] = 8
mas[19] = 0

Vvedite luboe chislo dlya prodlzhenia
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
11.02.2011, 15:00     Переместить нулевые элементы в конец массива #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
24
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
 
int main(){
    const int size=20;
    int mas[size];
    srand(time(0));
    for(int i=0; i<size; i++){
        mas[i] = rand()%10;
        printf("%i ", mas[i]);
    }
    printf("\n");
    stable_sort(mas, mas+size, [](int a, int b){return !b;});
    if(mas[size-1]){
        printf("Nulevih elementov net!");
    }
    else{
        for(int i=0; i<size; i++)
        printf("%i ", mas[i]);
    }
}
GaDinka
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 64
11.02.2011, 20:53  [ТС]     Переместить нулевые элементы в конец массива #9
Спасибо огромное ребята! Даже не думала, что эта тема так вам понравиться! Ещё раз спасибо!
GaDinka
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 64
25.05.2011, 20:38  [ТС]     Переместить нулевые элементы в конец массива #10
Ещё раз здравствуйте! Почему то преподавателю не нравиться коды, которые вы высылали. Она объяснила, что алгоритм должен быть такой: если встречается элемент равный 0, то мы все элементы идущие после него сдвигаем на одну позицию влево. А потом когда у нас в конце списка останутся пустые элементы массива, то мы на их места должны записать нули. Я написала код программы, но она опять не зачла. Вот код (привожу только часть смещения и замены элементов):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i=0; i<size; i++)
{
if (mas[i]==0)
{mas[i]=mas[i+1];
}
}
for (i=0; i<size; i++)
{
if(mas[i]==NULL)
{mas[i]=0;
}
}
else
printf ("Нулевых элементов нет\n");
Понимаю, что после 4 строчки ещё что-то должно быть, но не могу понять что именно. В моём коде получается ,что я просто добавляю ещё один элемент, равный следующему,, а не сдвигаю элементы массива. Какие буду ваши предложения по поводу "модернизации" этого кода?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 02:37     Переместить нулевые элементы в конец массива
Еще ссылки по теме:

C++ Для каждого из массивов все отрицательные элементы переместить в начало массива, а все положительные — в конец
Отрицательные элементы массива переместить в конец C++
Переместить в конец двумерного массива все нули C++

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

Или воспользуйтесь поиском по форуму:
Runa
 Аватар для Runa
130 / 82 / 3
Регистрация: 28.08.2009
Сообщений: 363
26.05.2011, 02:37     Переместить нулевые элементы в конец массива #11
вот мой вариант
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 j = 0, p=size-1, l=size;
        srand(time(0));
        for(int i=0;i<size;i++) 
                {
                        mas[i] = rand()%5;//Заполняем случайными числами
                        printf("%d ",mas[i]);//Выводим массив
                } 
        int countNull = 0;
        for (int i=0; i<l; i++)
        {
            if (mas[i]==0)
            {
                for (int q = i; q < size - 1; q++) //просто сдвигаем весь массив
                    mas[q]=mas[q+1];   
                i--; // возвращаемся на одну позицию назад, на случай если два нуля подряд
                l--; // тогда и проверять
                countNull++; //считаем сколько было нулей, чтобы потом их дописать с конца
            }
        }
                 
                //пишем нули с конца массива столько раз, сколько было нулей
        for (int i=size - 1; i>0 && countNull > 0; i--, countNull --)  //i отвечает за перемещение по массиву, countNull за количество нулей
        {
                mas[i]=0;
        }
        printf("\n");
        for(int i=0;i<size;i++) 
                        printf("%d ",mas[i]);//Выводим массив на экран
        printf("\n");
Yandex
Объявления
26.05.2011, 02:37     Переместить нулевые элементы в конец массива
Ответ Создать тему
Опции темы

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