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

Как создать метод, который принимает, а также возвращает массив?

04.06.2012, 16:08. Показов 39509. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как создать метод, который принимает массив, совершает с ним разные метаморфозы (указанно в задаче, какие именно) и выводит результат в виде массива? Массив числовой, двумерный.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2012, 16:08
Ответы с готовыми решениями:

Напишите метод, который принимает массив как аргумент и возвращает N
Вам задан массив (который будет иметь длину не менее 3, но может быть очень большой), содержащий целые числа. Массив либо полностью состоит...

Реализовать функцию, которая принимает массив, а также число n, и возвращает индекс
Реализовать функцию, которая принимает массив (плюс его длину) , а также число n, и возвращает индекс числа в массиве или -1, если такого...

Метод, который принимает на вход имя и зарплату и возвращает строку
нужно дополнить код в месте "..."

27
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 16:17
Если нужно изменить элементы, при этом не изменяя размер массива или объект, на который указывает аргумент, то делать ничего особенного не надо, так как массив - ссылочный тип:
C#
1
2
3
4
5
public void Foo(int[] arr)
{
   for (int i = 0; i < arr.Length; i++)
      arr[i]++;
}
Если нужно получить на вход один массив, а вернуть совсем другой, то надо изменить возвращаемый тип:
C#
1
2
3
4
5
6
7
public int[] Foo(int[] arr)
{
   int[] arr1 = new int[arr.Length];
   for (int i = 0; i < arr.Length; i++)
      arr1[i] = arr[i] + 1;
   return arr1;
}
Если нужно изменить оригинальный массив, то надо ссылку на него передать по ссылке (такая вот тавтология):
C#
1
2
3
4
5
6
7
public void Foo(ref int[] arr)
{
   int[] arr1 = new int[arr.Length];
   for (int i = 0; i < arr.Length; i++)
      arr1[i] = arr[i] + 1;
   arr = arr1;
}
Выбирайте что нужно конкретно вам.
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
04.06.2012, 16:23
как вариант.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] myStartArr = { {10, 20 }, { 30, 40 } };
            int[,] newArr = MyMethod(myStartArr);
        }
 
        private static int[,] MyMethod(int[,] arr)
        {
            Console.WriteLine("Массив изменется");
            int[,] outArr=arr;
            outArr[0, 0] =50;
            return outArr;
 
        }
    }
}
можно еще передавать массив по ссылке, и тогда модифицировать уже имеющийся массив. а сам метод заметить на void
0
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 6
04.06.2012, 16:33  [ТС]
Спасибо.

Цитата Сообщение от kolorotur Посмотреть сообщение
Если нужно изменить оригинальный массив, то надо ссылку на него передать по ссылке (такая вот тавтология):
C#
1
2
3
4
5
6
7
public void Foo(ref int[] arr)
{
   int[] arr1 = new int[arr.Length];
   for (int i = 0; i < arr.Length; i++)
      arr1[i] = arr[i] + 1;
   arr = arr1;
}
Как я понял, если метод принимает массив с "ref", то это означает, что он будет его изменять, да? Тогда нужно будет просто написать "Foo(massive)", чтобы произвести над ним все действия? И можно ли в вашем примере обойтись без создания второго массива arr1, а сразу менять в первом?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 16:38
Цитата Сообщение от NameNick Посмотреть сообщение
если метод принимает массив с "ref", то это означает, что он будет его изменять, да?
Нет, это означает, что метод может его изменить, а может и не изменить.

Цитата Сообщение от NameNick Посмотреть сообщение
Тогда нужно будет просто написать "Foo(massive)", чтобы произвести над ним все действия?
C#
1
Foo(ref massive);
Цитата Сообщение от NameNick Посмотреть сообщение
И можно ли в вашем примере обойтись без создания второго массива arr1, а сразу менять в первом?
Можно.

Но я не зря привел несколько примеров и написал в каком случае какой больше всего подходит.
Что именно вы собираетесь делать с массивом?
1
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 6
04.06.2012, 16:40  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Что именно вы собираетесь делать с массивом?
Собираюсь изменить несколько элементов, не меня остальные и не меняя размер.
Спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 16:46
Значит вам больше всего подойдет первый вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main()
{
   int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
   Console.WriteLine("До изменений:");
   Array.ForEach(arr, Console.WriteLine);
 
   Foo(arr);
 
   Console.WriteLine("После изменений:");
   Array.ForEach(arr, Console.WriteLine);
}
 
static void Foo(int[] arr)
{
   for (int i = 0; i < arr.Length; i++) arr[i]++;
}
0
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 6
04.06.2012, 16:55  [ТС]
Понятно, воспользуюсь первым. Но получается, что третий вариант аналогичен первому, только добавлено "ref". В чём же разница?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 17:02
Разница в том, что в третьем варианте параметр передается по ссылке, то есть изменив его, изменится и оригинальный.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main()
{
   int[] arr = new int[10];
   Console.WriteLine("arr.Length = {0}", arr.Length);
 
   Console.WriteLine("Foo(arr)");
   Foo(arr);
   Console.WriteLine("arr.Length = {0}", arr.Length);
 
   Console.WriteLine("Foo(ref arr)");
   Foo(ref arr);
   Console.WriteLine("arr.Length = {0}", arr.Length);   
}
 
static void Foo(int[] x)
{
   x = new int[5];
}
 
static void Foo(ref int[] x)
{
   x = new int[5];
}
0
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 6
04.06.2012, 17:08  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
то есть изменив его, изменится и оригинальный.
Так мне это и нужно же! но я всё равно не понял, чем это отличается от первого. В первом же мы тоже меняем оригинальный, разве нет?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
04.06.2012, 17:15
надеюсь правильно понимаю, если что поправят

в первом случае вы передаете ссылку, указывающую на массив, но не можете ее изменять
поскольку вы передали ссылку вы таки можете изменить элементы массива (такой фокус проходит только со ссылочными типами), но не сам массив
во втором случае вы можете изменить ссылку, которую получили в качестве аргумента, таким образом это может быть ссылка на массив другого размера например
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
04.06.2012, 17:44
В первом случае методу будет передана побитовая копия массива оригинала. Любые действия с этой копией никак не отразятся на массиве оригинале.
во втором варианте передается ссылка на массив оригинал. То есть адрес ячейки памяти первого элемента. Поэтому любые изменения аргумента, изменят значение в соответствующей ячейке памяти для элемента массива. Поэтому, массив, переданный по ссылке и измененный внутри метода модифицирует оригинал.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 17:50
NameNick, проведу аналогию с файловой системой.
Допустим, где-то на диске имеется папка с файлами - это ваш массив в памяти.
На рабочем столе лежит ярлык, ведущий в эту папку - это ваша переменная arr.
Можно сделать копию этого ярлыка, открыть по ней папку и удалить все файлы. Если потом перейти в эту же папку по первому ярлыку, она будет пустой, согласны? Это мы меняем содержимое массива, обращаясь к нему по разным ссылкам.
Однако ссылки (ярлыки) - тоже сами по себе физические объекты. То есть можно взять созданную копию ярлыка и переименовать ее, изменить иконку и даже поменять папку, в которую этот ярлык ведет. Все эти манипуляции никаким образом не повлияют на оригинальный ярлык, так?

Вот и с методами так же: если передается ссылка на массив, то передается копия этой ссылки. То есть все, что мы с ней будем делать в методе никак не затронет оригинальную ссылку. Что, конечно же, не мешает нам получить по этой ссылке доступ к массиву (папке) и изменить его содержимое.

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

Так понятнее?
2
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
04.06.2012, 18:29
с прямыми руками ref - економия памяти
0
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 6
04.06.2012, 18:48  [ТС]
Спасибо, всё понятно, воспользовался ref'ом.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 19:01
Goal, экономия 32-х бит стека (64 на x64) на переменную в обмен на меньшую читаемость кода и большую возможность возникновения побочных эффектов ("любимое" слово IT-руководителя: риск)?
Попробуйте предложить эту идею руководителю проекта. О реакции напишите


NameNick, лучше все-таки без ref.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.06.2012, 19:24
Цитата Сообщение от Goal Посмотреть сообщение
с прямыми руками ref - економия памяти
Хм, поясните, откуда экономия? Массив же и так ссылочный.
В случае с ref только нужно дополнительное время на разыменовывание указателя.
0
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
04.06.2012, 19:27

Не по теме:

ето были предположения) свои слова забираю назад:)



Добавлено через 32 секунды
какой проект? я только на 3й курс перешел
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.06.2012, 19:50
Цитата Сообщение от turbanoff Посмотреть сообщение
поясните, откуда экономия?
В случае с ref не происходит копирование ссылки.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.06.2012, 01:17
Цитата Сообщение от kolorotur Посмотреть сообщение
В случае с ref не происходит копирование ссылки.
Да ссылка не копируется.
Но что-то же должно передаваться в метод?
Копируется ссылка на ссылку, что влечет за собой дополнительное лишнее разыменовывание.

C#
1
2
3
4
5
6
7
8
9
    public static void t1(int[] arr){}
    public static void t2(ref int[] arr){}
 
    public static void Main(string[] args)
    {
        int[] a = new int[0];
        t1(a);
        t2(ref a);
    }
Вот что выдала студия:
Assembler
1
2
3
4
5
6
7
8
9
10
0000003f  mov         eax,dword ptr [ebp-44h] 
00000042  mov         dword ptr [ebp-40h],eax 
        t1(a);
00000045  mov         ecx,dword ptr [ebp-40h] 
00000048  call        FFD7AFF0 
0000004d  nop 
        t2(ref a);
0000004e  lea         ecx,[ebp-40h] 
00000051  call        FFD7AFF8 
00000056  nop
Все как я и говорил. Никакого профита от ref нет - только замедление.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2012, 01:17
Помогаю со студенческими работами здесь

Как сделать метод который принимает массив int и сортирует его по возрастанию?
Как сделать метод который принимает массив int и сортирует его по возрастанию?

Создаем объект cow, у которого есть метод message, который принимает аргументом text и возвращает его
Создаем объект cow, у которого есть метод message, который принимает аргументом text и возвращает его. Создаем 2 блока try catch: ...

Метод принимает трехмерный массив, возвращает одномерный
помогите решить задачу. не могу понять как метод принимает трехмерный массив, возвращает одномерный. public static void main(String...

Создайте метод, который принимает массив и предикат
Есть задание: Создайте метод, который принимает массив и предикат (указатель функции), и возвращает true, если предикат возвращает true для...

Создайте метод, который принимает в качестве параметра массив и использует
Создайте метод, который принимает в качестве параметра массив и использует В одномерном массиве, состоящем из n вещественных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru