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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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() {...

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

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

10
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:04 2
скобочки пропустила)
C++
1
if (mas[i]==0)
Добавлено через 16 минут
а вообще логика не та, если нужно решение, пиши
1
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
11.02.2011, 09:07  [ТС] 3
Напишите тогда, пожалуйста, своё решение.
0
134 / 87 / 22
Регистрация: 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();
}
0
302 / 160 / 62
Регистрация: 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");
}
1
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
11.02.2011, 09:46 6
ага, недоглядела
0
Заблокирован
Автор 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
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
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]);
    }
}
0
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
11.02.2011, 20:53  [ТС] 9
Спасибо огромное ребята! Даже не думала, что эта тема так вам понравиться! Ещё раз спасибо!
0
1 / 1 / 0
Регистрация: 01.02.2011
Сообщений: 68
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 строчки ещё что-то должно быть, но не могу понять что именно. В моём коде получается ,что я просто добавляю ещё один элемент, равный следующему,, а не сдвигаю элементы массива. Какие буду ваши предложения по поводу "модернизации" этого кода?
0
134 / 87 / 22
Регистрация: 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");
0
26.05.2011, 02:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2011, 02:37
Помогаю со студенческими работами здесь

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

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

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

Переместить максимальные элементы в конец массива
Дан одномерный массив a Переместить максимальные элементы в конец, сдвинув остальные элементы...

Перенести нулевые элементы в конец массива (исправить ошибку)
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех...

Преобразовать массив, переставив все нулевые элементы в конец массива
Помогите с программами с использованием указателей 1. Преобразовать массив, переставив все нулевые...


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

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