С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/58: Рейтинг темы: голосов - 58, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 3

Удалить из массива нулевые элементы, передвинув на их место следующие элементы без нарушения порядка

19.02.2012, 11:41. Показов 11223. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ищу решение еще одной задачи =)

Задан массив действительных чисел. Удалить из массива нулевые элементы, передвинув на их место следующие элементы без нарушения порядка их следования. В результате должен получиться массив меньшего размера, не содержащий нулей. Заводить новый массив не разрешается.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2012, 11:41
Ответы с готовыми решениями:

Удаление из массива нулевых элементов, передвинув на их место следующие элементы
Удалить из одномерного массива A(n) нулевые элементы, передвинув на их место следующие элементы без нарушения порядка их следования. В...

Удалить из массива нулевые элементы, передвинув на их место следующие элементы без нарушения порядка их следования
Удалить из массива A(n) нулевые элементы, передвинув на их место следующие элементы без нарушения порядка их следования. В результаты...

Удалить из массива нулевой элемент, передвинув на его место следующие элементы
Удалить из массива А(п) нулевой элемент передвинув на их место следующие элементы без нарушения порядка их следования.

10
 Аватар для FtarG
138 / 138 / 42
Регистрация: 02.11.2010
Сообщений: 316
19.02.2012, 12:19
Не уверен устроет ли преподавателя использование LINQ и все же это вариант решения.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] Mass = { 1.1, 2, 0, 3.0, 4, 7, 0, 1, 0 };
            Console.WriteLine("Исходный массив:");
            foreach (double item in Mass)
            {
                Console.Write("{0}\t", item);
            }
 
            var Result = from n in Mass
                         where n != 0
                         select n;
 
            Console.WriteLine();
            Console.WriteLine("Обработанный массив:");
            foreach (double item in Result)
            {
                Console.Write("{0}\t", item);
            }
            Console.ReadKey();
        }
    }
}
Но можно и без использования языка запросов:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] Mass = { 1.1, 2, 0, 3.0, 4, 7, 0, 1, 0 };
            Console.WriteLine("Исходный массив:");
            foreach (double item in Mass)
            {
                Console.Write("{0}\t", item);
            }
 
            Console.WriteLine();
            Console.WriteLine("Обработанный массив:");
            foreach (var item in Mass)
            {
                if (item != 0)
                {
                    Console.Write("{0}\t", item);
                }
            }
 
            Console.ReadKey();
        }
    }
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.02.2012, 12:38
FtarG, мне кажется, что подход с простой выборкой в данном случае не верен, так как в задании явно сказано, что необходим сдвиг элементов в массиве.

Самое очевидное решение "в лоб":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Main()
{
    double[] arr = { 1.1, 2, 0, 3.0, 4, 7, 0, 1, 0 };
    Console.WriteLine(string.Join(" ", arr));
 
    int size = arr.Length;
    for (int i = 0; i < size; i++) {
        if (arr[i] == 0) {
            Array.Copy(arr, i+1, arr, i, size - i - 1);
            size--;
        }
    }
 
    for (int i = 0; i < size; i++)
        Console.Write("{0} ", arr[i]);
    Console.WriteLine();
    Console.ReadKey(true);
}
Разумеется, это можно оптимизировать до сложности О(n), обходя массив лишь один раз и производя сдвиг каждый раз как встретится ноль. Но пусть это сделает сам ТС на оценку "отлично"
0
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 3
19.02.2012, 12:39  [ТС]
Спасибо громное, все понятно, в предыдущей теме задавал вопрос по поводу решения другой задачи, принцип работы так и не понял, если можешь переделай код, чтобы он был проще и понятнее
Дано натуральное число n. Сколько различных цифр встречается в его десятичной записи?

C#
1
2
3
4
5
6
7
8
9
10
int[] digits = new int[10];
int number = Convert.ToInt32(Console.ReadLine());
 
while (number > 0) {
        int rem;
        number = Math.DivRem(number, 10, out rem);
        digits[rem]++;
}
for (int i = 0; i < digits.Length; i++)
        Console.WriteLine("{0}: {1}", i, digits[i]);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.02.2012, 12:57
Kailed, ответил в той же теме, чтобы не плодить оффтоп.
1
1 / 1 / 0
Регистрация: 24.04.2016
Сообщений: 5
24.05.2016, 15:50
Я проверил все выше приведенные программы,и они действуют только если в массиве 1 нуль, а если их будет несколько, то программа будет работать неправильно. Вообщем я тут заморочился и написал полную программу:
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
35
36
37
38
39
40
41
42
static void Main(string[] args)
        {        
            Console.WriteLine("Введите размер массива");
            int n = Convert.ToInt16(Console.ReadLine());
            int i;
            int[] mas = new int[n];
 
            Console.WriteLine("Заполните массив");
            for (i = 0; i < n; i++)
            {
                Console.WriteLine("Введите {0} элемент массива:", i + 1);
                int element = Convert.ToInt16(Console.ReadLine());
                mas[i] = element;
            }
 
            Console.WriteLine("Исходный массив:");         // вывод всех элементов массива
            for (i = 0; i < n; i++)
                Console.Write("   " + mas[i]);
            Console.WriteLine();
 
            i = 0;     // индекс элемента
            int k = n; // индекс последнего элемента
             while (i < k)
            {
                if (mas[i] == 0)  // ищем нулевой элемент
                {
                    for (int j = i ; j <= k-2; j++)  //j - новый индекс
                    {
                        mas[j] = mas[j + 1];  // сдвигаем все, что правее нуля, влево   
                    }
                    k--;              // уменьшаем индекс
                   
                }
                 else i++;             
            }
 
             n = k;
            Console.WriteLine("Массив без нулей:");
            for (i = 0; i < n; i++)
                Console.Write("   " + mas[i]);
            Console.ReadKey();
        }
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.05.2016, 18:53
Цитата Сообщение от DIdRoB Посмотреть сообщение
Я проверил все выше приведенные программы,и они действуют только если в массиве 1 нуль, а если их будет несколько, то программа будет работать неправильно.
В каком случае предложенный мной код выдаст неправильный результат?
0
1 / 1 / 0
Регистрация: 24.04.2016
Сообщений: 5
25.05.2016, 10:17
Если в массиве будет больше 1 нуля, то последующие нули Ваша программа не удалит из массива

Добавлено через 2 минуты
В моем же коде, он производит проверку каждый раз и сдвигает массив при обнаружении нуля
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.05.2016, 10:57
Цитата Сообщение от DIdRoB Посмотреть сообщение
Если в массиве будет больше 1 нуля, то последующие нули Ваша программа не удалит из массива
А вы ее пробовали запустить или на глаз определили?


Хотя да, если будет больше 1 нуля подряд, то будут пропуски.
Исправляется декрементом i в условии.
0
1 / 1 / 0
Регистрация: 24.04.2016
Сообщений: 5
26.05.2016, 12:45
Цитата Сообщение от kolorotur Посмотреть сообщение
Хотя да, если будет больше 1 нуля подряд, то будут пропуски.
об этом я и писал
0
6 / 5 / 3
Регистрация: 05.05.2011
Сообщений: 38
15.11.2018, 09:09
Здравствуйте! Извиняюсь что на С, но возможно чем то поможет:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sort (int size, double *arr)
{  
   int n = 0, m = 0;
   for (int i=0; i<size; i++)//обходим массив один раз
   {
        if(arr[i]==0)n++;
        else
             if(n)
             {
                   m = i-n;
                   arr[m] = arr[i];
             }
         if(n==size)return;//если все нули выходим из функции
         for (int i=m+1; i < t; i++) arr[i]=0; // здесь проходим от последнего места копирования чтобы удалить все 0
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2018, 09:09
Помогаю со студенческими работами здесь

Дан массив, содержащий нулевые элементы. “Сожмите” его, передвинув нулевые элементы в конец массива
Знаю, где ошибка, но не могу придумать, как исправить. Если выпадает два соседних нуля, то после сдвига счетчик перескакивает на следующее...

Сформировать из строк двумерного массива, содержащих нулевые элементы, одномерный массив. Нулевые элементы не выводить (удалить их)
Вот что у меня получилось, но это полная фигня... Помогите пожалуйста! var a:array of integer; b:array of integer; ...

Положительные элементы исходного массива оставить без изменения, нулевые элементы увеличить на единицу
Дан массив X(N,M). Сформировать одномерный массив следующим образом: положительные элементы исходного массива оставить без изменения,...

Удалить из одномерного массива все четные элементы, без изменения порядка
Удалить из одномерного массива все четные элементы, без изменения порядка. Саму программу написал,но она работает некорректно. т.е....

Удалить из одномерного массива все четные элементы без изменения порядка
Написать программу используя функции, но не использовать указатели 2. Удалить из одномерного массива все четные элементы, без изменения...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru