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

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

04.06.2012, 16:08. Показов 39419. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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 с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru