0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
1

Удалить N элементов массива, начиная с номера K

16.10.2013, 16:52. Показов 5086. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется массив заполняемый случайным образом. Задание удалить N элементов, начиная с номера K.
Как только дело доходит до удаления, программа крешится. Я пытаюсь переписать старый массив в новый (так и надо), просто исключая не нужные числа.

Полный текст программы

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int size = 0; Random rnd = new Random(); bool fl = false, ok = true;
            int sw = 0;
            int[] mas = null;
            do
            {
                try
                {
                    Console.WriteLine("введите 1, если хотите случайное заполнение массива. Введите 2, если хотите заполнить массив сами.");
                    sw = Convert.ToInt32(Console.ReadLine());
                    ok = true;
                }
                catch (FormatException)
                {
                    Console.WriteLine("неправильный ввод");
                    ok = false;
                }
            }
            while (!ok);
            do
            {
                try
                {
                    Console.WriteLine("введите размер массива");
                    size = Convert.ToInt32(Console.ReadLine());
                    ok = true;
                }
                catch (FormatException)
                {
                    Console.WriteLine("неправильный ввод");
                    ok = false;
                    break;
                }
                if (size <= 0)
                {
                    Console.WriteLine("число <= 0");
                    ok = false;
                }
            }
            while (!ok);
            do
            {
                switch (sw)
                {
                    case 1:
                        mas = new int[size];
                        for (int i = 0; i < size; i++)
                            mas[i] = rnd.Next(100);
                        foreach (int x in mas)
                            Console.Write(x + " ");
                        Console.WriteLine();
                        fl = true;
                        break;
                    case 2:
                        mas = new int[size];
                        for (int i = 0; i < size; i++)
                        {
                            Console.WriteLine("введите число");
                            mas[i] = int.Parse(Console.ReadLine());
                        }
                        foreach (int x in mas)
                            Console.Write(x + " ");
                        Console.WriteLine();
                        fl = true;
                        break;
                    default: Console.WriteLine("Введите 1 или 2");
                        sw = Convert.ToInt32(Console.ReadLine());
                        break;
                }
            }
            while (fl == false);
            Console.WriteLine("введите кол-во элементов для удаления");
            int n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("введите номер с которого удалять");
            int k = Convert.ToInt32(Console.ReadLine());
            int [] arr = null;
            for (int i = 0, j = 0; (i < k) || (k + n < i) || (i < size); i++)
            {
                arr[j] = mas[i];
                j++;
            }
            foreach (int x in arr)
                Console.Write(x + " ");
 
        }
    }
}



момент в котором возникла сложность

C#
1
2
3
4
5
6
7
8
9
10
11
12
Console.WriteLine("введите кол-во элементов для удаления");
            int n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("введите номер с которого удалять");
            int k = Convert.ToInt32(Console.ReadLine());
            int [] arr = null;
            for (int i = 0, j = 0; (i < k) || (k + n < i) || (i < size); i++)
            {
                arr[j] = mas[i];
                j++;
            }
            foreach (int x in arr)
                Console.Write(x + " ")
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2013, 16:52
Ответы с готовыми решениями:

Удалить из массива N элементов, начиная с номера K
Помогите пожалуйста написать программу на С# Удалить N элементов, начиная с номера K

Как удалить N элементов, начиная с номера K
Работа с массивами. 1) Как удалить N элементов, начиная с номера K? 2) Добавить элемент с номером...

Удалить N элементов массива начиная с номера K
2.Удалить N элементов, начиная с номера K и вывести полученный массив на печать.

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

15
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
16.10.2013, 16:55 2
C#
1
int[] arr = new int[size-n];
1
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
16.10.2013, 16:57 3
Похоже вот здесь зарыта собака
Цитата Сообщение от msh666 Посмотреть сообщение
C#
1
int [] arr = null;
1
0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
16.10.2013, 16:58  [ТС] 4
Спасибо. но по прежнему возникает краш. Может я что-то в цикле for не так написал?
0
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
16.10.2013, 17:10 5
Попробуйте так, но может где-то не точно с условием, в студии не проверял.
C#
1
2
3
4
5
6
7
8
9
10
if(arr.Length>n & k+n<=arr.Length)
{
    int j=0;
    int [] mass = new int[arr.Length-n];
    for(int i=0; i<arr.Length; i++){
        if(i>=k & i<=arr.Length-(k+n)) continue;
        else mass[j]=arr[i];
        j++;}
    arr=mass;   
}
0
0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
16.10.2013, 17:29  [ТС] 6
Теперь в выводе остаются только Нули. Возможно еще где-то мой косяк. Вы брали еще один массив (mass). Изначально он у меня уже есть, только называется он (mas). Собственно из него то и нужно получить новый массив (arr). Если я изменяю ваш mass на mas, то он ругает за то, что такой уже есть. Если же все таки заменяю mass на mas, но убираю строку, где инициализирует mass(int [] mass = new int[arr.Length-n]). То при разном вводе, он показывает то нули, то сначала нули, а потом пару цифр из массива.

Добавлено через 5 минут
поменял местами в вашем коде mas и arr, потихоньку работает, но криво, при большинстве тестов краш.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
16.10.2013, 18:31 7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

На сколько мне известно нельзя часть массива удалить, можно только не нужную часть массива заполнить нулями, по этому надо использовать 2 массива, первый заполняем числами, в нем ищем и если находим переписываем интересующие нас числа во второй массив, выглядит примерно так:

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
43
44
45
46
47
48
49
50
51
52
53
54
using System;
 
 
class ClassToTestCSHARP {   static void Main()  {
 
int[] mas = new int[100];
int[] newMas;
int find;
 
Random rnd = new Random();
 
/* сначала заполняем массив случайными цифрами */ 
for (int i = 0; i < mas.Length; i++)
{ mas[i] = rnd.Next(0, 101);
Console.WriteLine(i + " = " + mas[i]);  }
Console.WriteLine();
 
Console.WriteLine("Введите искомое значение: ");
find = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();
 
/* осуществляем поиск */
int j = 0;
while (true)
{
    /* если не нашли и поиски выходят за массив, сообщаем об этом и прерываем поиск */
if (j == mas.Length)
{ Console.WriteLine("Искомое значение не найдено в массиве"); j = 0; break; }
 
else
{
    /* если вдруг нашли искомое число */
    if (mas[j] == find)
    {
        newMas = new int[j];
 
        for (int f = 0; f < newMas.Length; f++)
        { newMas[f] = mas[f]; }
 
        for (int h = 0; h < newMas.Length; h++)
        { Console.WriteLine(h + " = " + newMas[h]); }
 
        break;
    }
 
        /* если проверяемый элемент не равен искомому переходим к следующему элементу */
    else 
    { j++; continue; }
 
}
 
}
 
Console.ReadKey();  }   }
Добавлено через 4 минуты
или можно так:
C#
1
mas = newMas;
тогда первичные данные массива mas будут потеряны, а новыми данными массива будут данные newMas.

так лучше (правильнее) делать чем в первом варианте (это как раз и будет "удаление" не нужных элементов), вот весь код:

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
43
44
45
46
47
48
49
50
51
52
53
54
using System;
 
class ClassToTestCSHARP {   static void Main()  {
 
int[] mas = new int[100];
int[] newMas;
int find;
 
Random rnd = new Random();
 
/* сначала заполняем массив случайными цифрами */ 
for (int i = 0; i < mas.Length; i++)
{ mas[i] = rnd.Next(0, 101);
Console.WriteLine(i + " = " + mas[i]);  }
Console.WriteLine();
 
Console.WriteLine("Введите искомое значение: ");
find = Convert.ToInt32(Console.ReadLine());
 
 
/* осуществляем поиск */
int j = 0;
while (true)
{
    /* если не нашли и поиски выходят за массив, сообщаем об этом и прерываем поиск */
if (j == mas.Length)
{ Console.WriteLine("Искомое значение не найдено в массиве"); j = 0; break; }
 
else
{
    /* если вдруг нашли искомое число */
    if (mas[j] == find)
    {
        newMas = new int[j];
 
        for (int f = 0; f < newMas.Length; f++)
        { newMas[f] = mas[f]; }
        mas = newMas;
        break;
    }
 
        /* если проверяемый элемент не равен искомому переходим к следующему элементу */
    else 
    { j++; continue; }
 
}
 
}
 
Console.WriteLine();
for (int h = 0; h < mas.Length; h++)
{ Console.WriteLine(h + " = " + mas[h]); }
 
Console.ReadKey();  }   }
1
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
16.10.2013, 18:33 8
buntar,
C#
1
 if(i>=k & i<=arr.Length-(k+n)) зачем отнимать от размера индекс последнего элемента?
0
0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
16.10.2013, 18:51  [ТС] 9
Не совсем то что мне нужно. Мне необходимо удалить некий промежуток из N чисел начиная с числа стоящего под номером K.

Давайте сделаем так, чтоб и мне и всем было понятнее.

Мы ввели и заполнили массив (mas) и ввели числа N и K. Новый массив поместим в массив arr. Какая будет остальная часть кода?

т.е например mas размером 10 будет: 1 2 3 4 5 6 7 8 9 10. Число N=5, k=3. должно получиться массив arr : 1 2 8 9 10.
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
16.10.2013, 19:46 10
Цитата Сообщение от msh666 Посмотреть сообщение
Давайте сделаем так, чтоб и мне и всем было понятнее.
Мы ввели и заполнили массив (mas) и ввели числа N и K. Новый массив поместим в массив arr. Какая будет остальная часть кода?
т.е например mas размером 10 будет: 1 2 3 4 5 6 7 8 9 10. Число N=5, k=3. должно получиться массив arr : 1 2 8 9 10.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Program
    {
        static void Main(string[] args)
        {
            int[] mas = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 
            int N = 5;
            int k = 3;
 
            for (int i = 0; i < mas.Length; i++)
            {
                try
                {
                    if (i == k)
                        i += N;
                    Console.Write(mas[i] + "\t");
                }
                catch { }
            }
 
            Console.ReadKey();
        }
    }
индекс начинается с нуля
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
16.10.2013, 20:08 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
 
 
class ClassToTestCSHARP {   static void Main()  {
 
int[] mas = new int[10];
 
int first = -1;
int second = -1;
 
int firstFind = 0;
int secondFind = 0;
 
Random rnd = new Random();
/* заполняем массив случайными цифрами */
for (int i = 0; i < mas.Length; i++)
{   mas[i] = rnd.Next(0, 101);
Console.WriteLine(i + ". " + mas[i]);  }
Console.WriteLine();
 
 
Console.Write("Введите первое искомое значение: ");
firstFind = Convert.ToInt32(Console.ReadLine());
/* поиск первого */
for (int q = 0; q < mas.Length; q++)
{   if (mas[q] == firstFind)
{ first = q; Console.WriteLine("\t" + "Позиция первого искомого значения: " + first); break; }
}
if (first == -1) { Console.WriteLine("Искомое значение не найдено в массиве"); Console.ReadKey(); return; }
 
 
Console.Write("Введите второе искомое значение: ");
secondFind = Convert.ToInt32(Console.ReadLine());
/* поиск второго */
for (int w = 0; w < mas.Length; w++)
{   if (mas[w] == secondFind)
{ second = w; Console.WriteLine("\t" + "Позиция второго искомого значения: " + second); break; }
}
if (second == -1) { Console.WriteLine("Искомое значение не найдено в массиве"); Console.ReadKey(); return; }  
 
if (first == second)
{   Console.WriteLine("не знаю что.."); }
 
/* меняем местами что бы первая позиция была меньше второй */
if (first > second)
{   int t = first;
first = second;
second = t; }
 
 
if (first < second)
{
int[] temp = new int[((mas.Length - (second - first))-1)];
 
int e = 0;
 
for ( ; e < first; e++)
{ temp[e] = mas[e]; }
 
for (int z = second+1; z < mas.Length; z++, e++)
{   temp[e] = mas[z];  }
 
mas = temp;
}
 
 
Console.WriteLine();
for (int u = 0; u < mas.Length; u++ )
{ Console.WriteLine(u + ". " + mas[u]); }
 
 
Console.ReadKey();  }   }
1
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
16.10.2013, 20:52 12
Мой скромный вариант

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public static void Main(string[] args)
        {
            int[] array = new int[10];
 
            for (int i = 0; i < array.Length; i++)
                array[i] = i;
 
            int[] resultArray = DeleteElements(array, 5, 2);
        }
 
        public static int[] DeleteElements(int[] array, int startElement, int count)
        {
            int[] resultArray = new int[array.Length - count];
 
            Array.Copy(array, 0, resultArray, 0, startElement);
            Array.Copy(array, startElement + count, resultArray, startElement, array.Length - startElement - count);
 
            return resultArray;
        }
0
0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
17.10.2013, 15:21  [ТС] 13
еще варианты?
P.S Должно все переписать во второй массив
P.P.S Нельзя использовать Array

Добавлено через 11 минут
Diman777


Ваш метод вполне работает, но можно ли как-то сделать, чтобы удаляло не со следующей позиции после указанной, а именно с той, что указана?
0
60 / 59 / 15
Регистрация: 04.05.2010
Сообщений: 161
17.10.2013, 15:44 14
Diman777, как я понял массив не изменяет, просто выводит не все его элементы. Для того чтобы выполнить ваше задание необходимо обязательно использовать второй массив. Вообще считается что Array в C# неизменяемые по размеру(потому что выделяется определнное количество памяти во время создания массива). Можно с помощью метода Array.Resize() удалить элементы с конца массива

Кликните здесь для просмотра всего текста
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
   class Program
    {
        static int Main(string[] args)
        {
            test();
            Console.ReadKey();
            return 0;
        }
 
        static void test()
        {
            int[] myArray = new int[10];
            Random r = new Random();
            for (int i = 0; i < myArray.Length; i++)
            {
                myArray[i] = r.Next(10);
            }
 
            WriteArray(myArray);
 
            int N = 2;//кол-во элементов для удаления
            int K = 3;//номер элмента удаления
            if (K + N > myArray.Length)
            {
                Console.WriteLine("Неправильная сумма K+N");
                return;
            }
            int[] myNewArray = new int[10 - N];
            myNewArray  = deleteElements(myArray, K, N);
 
            WriteArray(myNewArray);
 
        }
 
        private static int[] deleteElements(int[] myArray, int K, int N)
        {
            int[] output = new int[myArray.Length - N];
            int j = 0;            
            for (int i = 0; i < myArray.Length; i++)
            {
 
                if (i >= K && i <= (N + K))
                {
                    continue;
                }
 
                output[j] = myArray[i];
                j++;
            }
            return output;
 
        }
 
        private static void WriteArray(int[] myArray)
        {
            for (int i = 0; i < myArray.Length; i++)
            {
                Console.WriteLine(myArray[i]);
            }
            Console.WriteLine("---------------");
        }
    }
0
369 / 341 / 108
Регистрация: 12.02.2013
Сообщений: 653
17.10.2013, 15:54 15
Цитата Сообщение от msh666 Посмотреть сообщение
Ваш метод вполне работает, но можно ли как-то сделать, чтобы удаляло не со следующей позиции после указанной, а именно с той, что указана?
можно...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Program
    {
        static void Main(string[] args)
        {
            int[] mas = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 
            int N = 5;
            int k = 3;
 
            for (int i = 0; i < mas.Length; i++)
            {
                try
                {
                    if (i == k - 1)
                        i += N;
                    Console.Write(mas[i] + "\t");
                }
                catch { }
            }
 
            Console.ReadKey();
        }
    }
Добавлено через 5 минут
Цитата Сообщение от msh666 Посмотреть сообщение
P.S Должно все переписать во второй массив
тогда так
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
        static void Main(string[] args)
        {
            int[] mas = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 
            int N = 5;
            int k = 3;
 
            int[] nmas = new int[mas.Length - N];
 
            for (int i = 0, t = 0; i < mas.Length; i++)
            {
                try
                {
                    if (i == k - 1)
                        i += N;
 
                    nmas[t] = mas[i];
                    t++;
                }
                catch { }
            }
 
            Console.WriteLine(string.Join("\t", nmas));
 
            Console.ReadKey();
        }
    }
1
0 / 0 / 2
Регистрация: 12.11.2012
Сообщений: 61
17.10.2013, 16:05  [ТС] 16
нельзя использовать array
0
17.10.2013, 16:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2013, 16:05
Помогаю со студенческими работами здесь

В динамическом массиве удалить N элементов, начиная с номера K (ошибка)
Помогите, как исправить ошибку? Нужно из массива arr , который перед этим формируется рандомно....

Как применяя erase удалить в векторе n элементов, начиная с номера k?
Помогите, как это записать, чтобы не возникало ошибок? arr.erase(arr.begin() + k, arraySize -...

Сформировать одномерный динамически массив и удалить из него К элементов, начиная с заданного номера
1.Сформировать одномерный динамически массив. Удалить из него К элементов, начиная с заданно-го...

Исключить из массива M элементов, начиная с номера K
1)Выполнить обработку элементов прямоугольной матрицы A,имеющей N строк и M столбцов.Добавить к...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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