Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 20

Написать свой метод Resize, изменяющий кол-во элементов массива

31.07.2020, 12:04. Показов 7813. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Помогите пожалуйста выявить в чём ошибка (System.IndexOutOfRangeException: 'Index was outside the bounds of the 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
using System;
 
namespace ConsoleApp15
{
    class Program
    {
        static int ResizeUp(ref int[] arr, ref int qtyElements)
        {
            int[] myArray = new int[qtyElements + 1];
 
            return myArray[qtyElements + 1];
        }
 
        static int ResizeDown(ref int[] arr, ref int qtyElements)
        {
            int[] myArray = new int[qtyElements - 1];
 
            return myArray[qtyElements - 1];
        }
 
        static void Main(string[] args)
        {
            Console.Write("Введите кол-во элементов в массиве: ");
 
            int qtyElements = int.Parse(Console.ReadLine());
 
            int[] myArray = new int[qtyElements];
 
            Console.WriteLine("\nБудем увеличивать или уменьшать кол-во элементов в массиве?");
 
            Console.WriteLine();
 
            string choice = Console.ReadLine();
 
            if (choice == "Увеличивать")
            {
                ResizeUp(ref myArray, ref qtyElements);
            }
            else if (choice == "Уменьшать")
            {
                ResizeDown(ref myArray, ref qtyElements);
            }
            else
            {
                Console.WriteLine("Попробуйте ещё раз!");
 
                return;
            }
        }
    }
}
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2020, 12:04
Ответы с готовыми решениями:

Метод, изменяющий знак элементов массива на противоположный
Здравствуйте, столкнулся с небольшой проблемой, на курсах прошли новую тему, но пока она дается мне с трудом, ничего не понятно. Само ТЗ)...

Написать метод, который имеет параметр двухмерного массива типа int и возвращает кол-во отрицательных элементов в нем
Написать метод, который имеет параметр двухмерного масива типу int и возращает кол. отрицательных елементов у нему

Посчитать кол-во отрицательных и кол-во положительных элементов массива. Вывести массив на экран
Дан массив 5x5, заполнен случайными числами от -10 до 10. Посчитать кол-во отрицательных и кол-во положительных элементов массива. Вывести...

14
315 / 244 / 149
Регистрация: 03.10.2017
Сообщений: 886
Записей в блоге: 1
31.07.2020, 12:47
Цитата Сообщение от pilvyts Посмотреть сообщение
return myArray[qtyElements + 1];
Ошибка в том, что не qtyElements+1, qtyElements, ибо когда вы увеличиваете размер, то у вас размер становится равным qtyElement, ибо дефолтныый размер qtyElement-1

Добавлено через 11 минут
У вас нет изменения размера.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void ResizeUp(ref int[] arr, ref int qtyElements)
        {
            qtyElements++;
            int[] myArray = new int[qtyElements];
            for (int i=0;i<qtyElements-2;i++) myArray[i]=arr[i];            
            arr=myArray;
        }
 
        static void ResizeDown(ref int[] arr, ref int qtyElements)
        {
            qtyElements--;
            int[] myArray = new int[qtyElements];
            for (int i=0;i<qtyElements;i++) myArray[i]=arr[i];
            arr=myArray;
        }
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2020, 13:14
Цитата Сообщение от pilvyts Посмотреть сообщение
ref int qtyElements
Зачем новое количество передавать через ref?
2
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 20
31.07.2020, 13:36  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Зачем новое количество передавать через ref?
Подскажите пожалуйста, что здесь не так?
C#
1
2
3
4
5
6
static int ResizeUp(ref int[] myArray)
        {
            int[] myNewArray = new int[myArray.Length + 1];
 
            return myNewArray[myNewArray.Length];
        }
0
 Аватар для memphis
740 / 284 / 83
Регистрация: 12.12.2012
Сообщений: 564
31.07.2020, 14:14
Цитата Сообщение от pilvyts Посмотреть сообщение
Подскажите пожалуйста, что здесь не так?
Как бы сами можете сравнить Array.Resize<T>(T[], Int32) Method
Обратите внимание на возвращаемый тип, на передачу параметров в метод. Найдите 10 отличий. И это.. В задании прямо сказано
Метод должен иметь возможность увеличить или уменьшить кол-во элементов массива
Т.е. это не два метода, один для увеличения, а другой для уменьшения. Это всё в одном методе.
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2020, 14:21
Цитата Сообщение от pilvyts Посмотреть сообщение
что здесь не так?
Чтобы сказать что не так, нужно сначала знать как должно быть "так".
Опишите спецификацию метода: что он должен принимать, что возвращать и на что ругаться.
Тогда уже можно говорить о реализации и проверять ее правильность.
1
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 20
31.07.2020, 15:57  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Чтобы сказать что не так, нужно сначала знать как должно быть "так".
Опишите спецификацию метода: что он должен принимать, что возвращать и на что ругаться.
Тогда уже можно говорить о реализации и проверять ее правильность.
Хорошо, сделаем один метод, который будет отвечать и за увеличение и за уменьшение.
Получается, метод Resize должен принимать массив по ссылке, который я создал в методе Main и то, на сколько я хочу его увеличить или уменьшить. Допустим, так:
C#
1
Resize(ref myArray, myArray.Length + 1);
Возвращать должен новый увеличенный или уменьшенный массив. Так?
Извините, если пишу глупости и трачу ваше время, программированием занимаюсь недавно, но помощь эксперта по .NET была бы для меня бесценна
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2020, 17:07
Цитата Сообщение от pilvyts Посмотреть сообщение
Возвращать должен новый увеличенный или уменьшенный массив. Так?
Если вы передаете массив по ссылке, то возвращать ничего не нужно — изменится передаваемая переменная.
Если хотите возвращать новый массив, то передавать по ссылке его нет необходимости.

Цитата Сообщение от pilvyts Посмотреть сообщение
и то, на сколько я хочу его увеличить или уменьшить.
На сколько или новый размер?

Цитата Сообщение от pilvyts Посмотреть сообщение
Извините, если пишу глупости и трачу ваше время
Да никаких глупостей, обычный процесс составления требований.
1
1595 / 600 / 185
Регистрация: 05.12.2015
Сообщений: 970
31.07.2020, 21:23
C#
1
2
3
4
5
6
7
8
9
10
11
      static void resizearray( ref int[] source, int resize, bool absolute )
        {
            int currentsize = source.Length;
            int newsize = absolute ? resize : currentsize + resize;
            if( newsize < 0 )
                throw new Exception( "size of array is less 0" );
            int[] dest = new int[newsize];
            int copysize = newsize > currentsize ? currentsize : newsize;
            Array.Copy( source, dest, copysize );
            source = dest;
        }
использовать
C#
1
2
3
            resizearray( ref massiv, 3, false ); // увеличить НА 3
            resizearray( ref massiv, 10, true ); // установить размер 10
            resizearray( ref massiv, -3, false ); // уменьшить НА 3
2
1 / 1 / 0
Регистрация: 14.06.2020
Сообщений: 20
01.08.2020, 12:06  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Если вы передаете массив по ссылке, то возвращать ничего не нужно — изменится передаваемая переменная.
Если хотите возвращать новый массив, то передавать по ссылке его нет необходимости.


На сколько или новый размер?


Да никаких глупостей, обычный процесс составления требований.
Хорошо. Допустим, будем изменять тот массив, который передаём по ссылке.
Тогда будет так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void Resize(ref int[] myArray, int newSize)
        {
 
        }
 
static void Main(string[] args)
        {
            Console.Write("Введите кол-во элементов в массиве: ");
 
            int qtyElements = int.Parse(Console.ReadLine());
 
            int[] myArray = new int[qtyElements];
 
            Resize(ref myArray, myArray.Length + 1);
        }
Теперь осталось описать сам метод. Правильно?
P.S. Насчёт увеличения, скорее на сколько

Добавлено через 2 минуты
Цитата Сообщение от proa33 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
      static void resizearray( ref int[] source, int resize, bool absolute )
        {
            int currentsize = source.Length;
            int newsize = absolute ? resize : currentsize + resize;
            if( newsize < 0 )
                throw new Exception( "size of array is less 0" );
            int[] dest = new int[newsize];
            int copysize = newsize > currentsize ? currentsize : newsize;
            Array.Copy( source, dest, copysize );
            source = dest;
        }
использовать
C#
1
2
3
            resizearray( ref massiv, 3, false ); // увеличить НА 3
            resizearray( ref massiv, 10, true ); // установить размер 10
            resizearray( ref massiv, -3, false ); // уменьшить НА 3
Вижу здесь синтаксис, который мне не понятен и который я ещё не изучал. Думаю, задание такого не предполагает, но всё равно спасибо
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
02.08.2020, 11:13
Лучший ответ Сообщение было отмечено pilvyts как решение

Решение

pilvyts, метод пишется в пару строк, и не надо ничего усложнять
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
using System;
 
class Program
{
    static void Main()
    {
        int[] arr = { 1, 2, 3, 4 };
 
        Resize(ref arr, 6);
        foreach (var number in arr)
            Console.WriteLine(number);
 
        Console.WriteLine();
 
        Resize(ref arr, 2);
        foreach (var number in arr)
            Console.WriteLine(number);
 
        Console.ReadKey();
    }
 
    static void Resize(ref int[] arr, int newLength)
    {
        int[] newArr = new int[newLength];
        for (int i = 0; i < arr.Length && i < newLength; i++)
            newArr[i] = arr[i];
        arr = newArr;
    }
}
1
1595 / 600 / 185
Регистрация: 05.12.2015
Сообщений: 970
02.08.2020, 21:45
Цитата Сообщение от Enifan Посмотреть сообщение
пару строк
а если newLength =-1
1
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
03.08.2020, 05:03
Цитата Сообщение от proa33 Посмотреть сообщение
а если newLength =-1
будет эксепшен, можно и свой написать - но итог везде одинаковый
1
0 / 0 / 0
Регистрация: 12.01.2023
Сообщений: 5
29.09.2023, 20:41
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        static void RESIZE(string[] Arr, int k)
        {
            string[] newArray = new string[k];
            if (k <= Arr.Length)
                for (int i = 0; i < k; i++)
                    newArray[i] = Arr[i];
            else
            {
                for (int i = 0; i < Arr.Length; i++)
                    newArray[i] = Arr[i];
            }
            Arr = newArray;
        }
/Akim
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.09.2023, 23:29
Akello_B, как этим методом пользоваться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2023, 23:29
Помогаю со студенческими работами здесь

Найти сумму,и кол-во элементов массива >1.Найти кол-во элементов массива,равных == 3 и 5
Найти сумму,и кол-во элементов массива &gt;1 (используя for) Найти кол-во элементов массива,равных == 3 и 5(используя for)

Найти сумму,и кол-во элементов массива>1,найти кол-во элементов массива,равных == 3 и 5
Найти сумму,и кол-во элементов массива &gt;1 (используя for) Найти кол-во элементов массива,равных == 3 и 5(используя for)

Определить кол-во элементов массива, которые больше среднеарифметического значения всех элементов массива
Сделать программу, к-рая случайно заполняет массив А (n&lt;30) целыми значениями. Определить кол-во элементов массива, которые больше...

Написать метод, чтобы выводило максимальное и минимальное кол-во человек
Как в С# написать метод,чтобы выводило максимальное и минимальное кол-во человек?

Массив считает кол-во отрицательных элементов массива и сумму модулей элементов массива
Помогите пожалуйста исправить программу. Массив считает кол-во отрицательных элементов массива и сумму модулей элементов массива,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru