Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2014, 17:23   #1
Мария Бондарева
 
Регистрация: 26.11.2014
Сообщений: 3
По умолчанию Переставить значение массива

Переставить значение элементов заданного одномерного массива, так чтобы все нулевые оказались в конце массива, а не нулевые в начале, не нарушая порядок, в котором они были
Мария Бондарева вне форума Ответить с цитированием
Старый 26.11.2014, 18:31   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в цикле идём по массиву проверяем, не нулевой ли элемент.
встретили нулевой - запускаем второй подцикл - ищем первый не нулевой после него.
нашли - меняем местами нулевой и найденный ненулевой.
если не нашли - бинго, задача выполнена, прерываем цикл.

продолжаем, пока не прервались (см. выше) или пока не дошли до конца массива.
конец.

Надеюсь, нигде не напутал..
p.s. алгоритм не очень оптимальный, но, на мой взгляд, вполне рабочий.

p.p.s. если можно использовать второй (дополнительный) массив, то задача решается абсолютно тривиально.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2014, 18:55   #3
Мария Бондарева
 
Регистрация: 26.11.2014
Сообщений: 3
По умолчанию

а вы можете написать программу, пожалуйста. А то я совсем новичок в этом деле. А нужно сдавать отчет по этой лабораторной
Мария Бондарева вне форума Ответить с цитированием
Старый 26.11.2014, 19:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а вы можете написать программу
А ты можешь написать ввод массива?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2014, 20:45   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Так как язык программирования не уточнялся...

Попробую реализовать описанный алгоритм.
Код:
package ru.bugrimov;

public class Main {
    public static void main(String [] args) {
        int arr[] = {1, 2, 3, 0, 9, -1, 0, 7, -3, 0, 2, 9, 7, -3, 0};

        // Вывод массива на экран
        System.out.print("Исходный массив: ");
        for (int anArr : arr) {
            System.out.print(" [" + anArr + "]");
        }

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                for (int j = arr.length - 1; j > i; j--) {
                    if (arr[j] != 0) {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                        break;
                    }
                }
            }
        }
        System.out.println();
        System.out.print("Конечный массив: ");
        // Вывод массива на экран
        for (int anArr : arr) {
            System.out.print(" [" + anArr + "]");
        }
    }
}
Получилось что-то вроде этого...

p1.jpg

Если есть вопросы по коду, спрашивайте.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 26.11.2014, 22:16   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Bugrimov, Вы при реализации сделали отклонение от алгоритма, которое привело к неверной работе.

в дополнительном цикле нужно обязательно искать от текущего элемента (у Вас поиск от конца массива). Ваш код намного эффективней (я выше писал, что мой алгоритм неэффективен), но он нарушает последовательность элементов массива, а в задаче:
Цитата:
... не нарушая порядок, в котором они были
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2014, 11:21   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Признаю свою ошибку, исправлю...

Сделал изменения... Но вы правы, много лишних действий.
Код:
for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                for (int j = (i + 1); j < arr.length; j++) {
                    if (arr[j] != 0) {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                        break;
                    }
                }
            }
        }
Снимок1.jpg
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 27.11.2014 в 20:02.
Bugrimov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переставить местами наименьший и наибольший элементы массива. loya Паскаль, Turbo Pascal, PascalABC.NET 1 25.12.2013 01:59
Дан массив А [N,N] переставить местами А[1,1] и минимальный элемент массива olegatorka Visual C++ 3 07.11.2012 22:21
Переставить элементы массива в обратном порядке Mayers Общие вопросы C/C++ 3 06.05.2012 12:15
Нужно переставить столбцы массива в Visual Basic vital22222 Помощь студентам 0 09.12.2010 21:37