С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/121: Рейтинг темы: голосов - 121, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68

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

11.02.2011, 08:46. Показов 25576. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Я уже к вам за помощью обращалась и вот пишу в очередной раз. Пишу код программы, но программма отказывается его выполнять так как имеются ошибки в коде. Задача состоит в следующем: имеется одномерный массив. Все элементы, равные нулю, нужно переместить в конец массива. У меня получается вот такая программа, но она не работает:

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");
}
Помогите пожалуйста исправить ошибки! Буду очень благодарна.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2011, 08:46
Ответы с готовыми решениями:

одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец массива in c++
одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец...

Переместить нулевые элементы в начало массива
#include &lt;iostream&gt; #include&lt;time.h&gt; #include&lt;random&gt; using namespace std; int main() { int min, array,sum=0,f,s,q=0; ...

Нулевые элементы переместить в начало массива
В одномерном массиве все нулевые элементы переместить в начало массива, порядок остальных элементов должен оставаться первоначальным. ...

10
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:04
скобочки пропустила)
C++
1
if (mas[i]==0)
Добавлено через 16 минут
а вообще логика не та, если нужно решение, пиши
1
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
11.02.2011, 09:07  [ТС]
Напишите тогда, пожалуйста, своё решение.
0
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09: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
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();
}
0
302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
11.02.2011, 09:31
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");
}
1
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:46
ага, недоглядела
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.02.2011, 09:56
Я ни на что не претендую но думаю мой код наиболее прост и оптимален для решения данной задачи!
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
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 9
11.02.2011, 15:00
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]);
    }
}
0
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
11.02.2011, 20:53  [ТС]
Спасибо огромное ребята! Даже не думала, что эта тема так вам понравиться! Ещё раз спасибо!
0
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
25.05.2011, 20:38  [ТС]
Ещё раз здравствуйте! Почему то преподавателю не нравиться коды, которые вы высылали. Она объяснила, что алгоритм должен быть такой: если встречается элемент равный 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 строчки ещё что-то должно быть, но не могу понять что именно. В моём коде получается ,что я просто добавляю ещё один элемент, равный следующему,, а не сдвигаю элементы массива. Какие буду ваши предложения по поводу "модернизации" этого кода?
0
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
26.05.2011, 02:37
вот мой вариант
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");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2011, 02:37
Помогаю со студенческими работами здесь

Поместить нулевые элементы в конец массива
Задача состоит в том, чтобы отсортировать массив: Пользователь задает массив N - размера, вводит N Элементов. А затем Сортировка массива....

В одномерном массиве все нулевые элементы переместить в начало массива
В одномерном массиве все нулевые элементы переместить в начало массива, дополнительный массив использовать не разрешается.

В каждой строке все элементы, не равные нулю, переписать в начало строки, а нулевые элементы – в конец массива
Дан двумерный массив. В каждой строке все его элементы, не равные нулю, переписать (сохраняя порядок) в начало строки, а нулевые элементы –...

Отрицательные элементы массива переместить в конец
Дан массив A(n). Переместить все его элементы таким образом, чтобы в конце массива были все его отрицательные числа, сохранив при этом...

Переместить максимальные элементы в конец массива
Дан одномерный массив a Переместить максимальные элементы в конец, сдвинув остальные элементы влево. Помогите,пожалуйста!!!(С++)


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru