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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2018, 22:03   #1
PadavanPanda
 
Регистрация: 16.05.2018
Сообщений: 5
По умолчанию Сжать массив и сжатые элементы в конце вывести нулями

Зачада: Сжать элементы, которые по модулю меньше 1 и вывести их нулями в конце.
Вот кусок кода:

Random randEx = new Random();
int n = randEx.Next(5, 10);
double[] Array = new double[n];
Console.Write("Massiv iz n-elementov: ");
for(int i = 0; i < Array.Length; i++)
{
Array[i] = randEx.Next(-10, 10) * randEx.NextDouble();
Console.Write(Array[i] + " ");
}

Console.Write("\nSortirovka: ");
for(int i = 0; i < Array.Length; i++)
{
if (Math.Abs(Array[i]) < 1.0)
{
for (int j = 0; j < Array.Length - 1; j++)
{
Array[j] = Array[j + 1];
}
Array[Array.Length - 1] = default(double);
}
Console.Write(Array[i] + " ");
}

Проблема заключается вот в чем: если 2 элемента, которые подходят по условию для сжатия идут подряд, то первое идет в конец и обнуляется, а следующее остается на месте. Прохожу по алгоритму, вроде все верно. В чем моя ошибка?
На скрине удачно поймал:
0-ой элемент - Ок
1-ый элемент - Er
2-ой элемент - Ок
3-ий элемент - Er
4-ый элемент - Ок
Изображения
Тип файла: jpg modul.jpg (48.6 Кб, 134 просмотров)

Последний раз редактировалось PadavanPanda; 22.05.2018 в 22:05. Причина: пояснение
PadavanPanda вне форума Ответить с цитированием
Старый 23.05.2018, 06:09   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

i-- перед выходом из if
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 23.05.2018, 14:09   #3
PadavanPanda
 
Регистрация: 16.05.2018
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
i-- перед выходом из if
Неа, не покатит. Индекс уходит за границы массива.
PadavanPanda вне форума Ответить с цитированием
Старый 23.05.2018, 16:10   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

у вас нет сортировки (удаления только "ненужных" <1.0 )

для проверки данного утверждения достаточно:
  • вынести итоговый вывод из цикла (сделать для него отдельный цикл).
  • выводить ВЕСЬ массив на каждой итерации основного цикла(рекомендуется чтобы понять что же не так).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 23.05.2018, 16:27   #5
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от PadavanPanda Посмотреть сообщение
Неа, не покатит. Индекс уходит за границы массива.
бывает
имхо, FOR не тот цикл для таких заданий. Набросок, но можно рефакторить
Код:
public static void Main(string[] args)
        {
            Random randEx = new Random();
            int n = randEx.Next(5, 5);
			int shift = 0;
            double[] Array = new double[n];
            Console.Write("Massiv iz n-elementov: ");
            for(int i = 0; i < Array.Length; i++)
            {
                Array[i] = randEx.Next(-15, 10) * randEx.NextDouble();
                Console.Write(Array[i]+"; ");
            }

            Console.Write("\nSortirovka: ");
            int ind = 0;
            while (ind < Array.Length-shift)
            {
                if (Math.Abs(Array[ind]) < 1.0)
                {
					shift++;
                    for (int j = ind; j < Array.Length - shift; j++)
                    {
                        Array[j] = Array[j + 1];
                    }
                    Array[Array.Length - shift] = default(double);
                }
                else
                    ind++;
            }
            for(int i = 0; i < Array.Length; i++)
            {
                Console.Write(Array[i]+"; ");
            }
        }
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 01.06.2018, 18:14   #6
PadavanPanda
 
Регистрация: 16.05.2018
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
бывает
имхо, FOR не тот цикл для таких заданий. Набросок, но можно рефакторить
Код:
public static void Main(string[] args)
        {
            Random randEx = new Random();
            int n = randEx.Next(5, 5);
			int shift = 0;
            double[] Array = new double[n];
            Console.Write("Massiv iz n-elementov: ");
            for(int i = 0; i < Array.Length; i++)
            {
                Array[i] = randEx.Next(-15, 10) * randEx.NextDouble();
                Console.Write(Array[i]+"; ");
            }

            Console.Write("\nSortirovka: ");
            int ind = 0;
            while (ind < Array.Length-shift)
            {
                if (Math.Abs(Array[ind]) < 1.0)
                {
					shift++;
                    for (int j = ind; j < Array.Length - shift; j++)
                    {
                        Array[j] = Array[j + 1];
                    }
                    Array[Array.Length - shift] = default(double);
                }
                else
                    ind++;
            }
            for(int i = 0; i < Array.Length; i++)
            {
                Console.Write(Array[i]+"; ");
            }
        }
Спасибо! Разобрался Думал что проще делается.
PadavanPanda вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо "сжать" целочисленный массив, выбросив из него нулевые элементы TunelLord Паскаль, Turbo Pascal, PascalABC.NET 6 22.01.2016 18:36
Удалить из массива все элементы, последняя цифра которых нечетная и сжать массив.(через процедуры и функции) Proskurina Паскаль, Turbo Pascal, PascalABC.NET 5 23.09.2012 12:43
Удалить из массива все элементы, последняя цифра которых нечетная и сжать массив Proskurina Помощь студентам 4 21.09.2012 23:02
элементы вектора с нулями Владюшка Помощь студентам 5 28.01.2010 14:35