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

Создайте универсальную функцию PrintAnyArr (печать любого массива, кроме усеченных)

05.04.2014, 21:16. Показов 2661. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, всем доброго времени суток, нужна ваша помощь) Имеется следующее задание:
1. Создайте универсальную функцию PrintAnyArr (печать любого массива, кроме усеченных);
Методические указания: Второй параметр функции должен быть типа Array. Для того, чтобы отличить размерность массива (отличить вектор от матрицы) слудует использовать свойство Rank. К элементам массива A, имеющего класс Array, нет возможности прямого доступа в обычной манере - A [<индексы>], но зато есть специальные методы GetValue (<индексы>) и SetValue (<индексы>).
2. Дополнительно. Попробуйте модифицировать функцию, таким образом чтобы она могла печатать усеченные массивы. (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
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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ArrayTest
{
    class Program
    {
        class Arrs
        {
          
            public static void PrintAnyArr(string name, Array A)
            {
                Console.WriteLine(name);
                int n = A.Rank; 
                if (n == 1) 
                {
                    var en = A.GetEnumerator();
                    
                    en.MoveNext();
                    if (en.Current.GetType() == Type.GetType("System.Int32"))
                        for (int i = 0; i < A.GetLength(0); i++)
                            Console.Write(A.GetValue(i) + " ");
                    else
                        foreach (int[] mas in A)
                        {
                            for (int i = 0; i < mas.GetLength(0); i++)
                                Console.Write(mas.GetValue(i) + " ");
                            Console.WriteLine();
                        }
                }
                if (n == 2) //матрица
                {
                    for (int i = 0; i < A.GetLength(0); i++)
                    {
                        for (int j = 0; j < A.GetLength(1); j++)
                        {
                            Console.Write(A.GetValue(i, j) + " ");
                        }
                        Console.WriteLine();
                    }
                } 
 
            }
 
 
 
        }
 
 
        static void Main(string[] args)
        {
            
            int[] A = { 6, 2, 9 };
            int[,] B = { { 4, 2, 3 }, { 4, 8, 6 } };*/
           int[][] C = new int[3][]
            {
                new int[] {1,2,3},
                new int[] {4,5,6,7,8},
                new int[] {9}
            };
           
            Arrs.PrintAnyArr("Одномерный массив", A);
            Console.WriteLine(); 
            Arrs.PrintAnyArr("Матрица",B);
            Console.WriteLine();
            Arrs.PrintAnyArr("Усеченный массив",R);   
 
        }
    }
}
Суть моего вопроса о помощи заключается в следующем. Преподаватель сказал, что неверно выполнено дополнительное задание, т.е. если будет, к примеру, существовать какой-то изрезанный массив с вот такой вот инициализацией : int[][,][] C = new int[][,][]{......} т.е. какой-нибудь трехмерный и т.д., то такая функция для его печати работать не будет. Вроде как решить эту проблему как-то через рекурсию.. Только вот я не пойму как
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2014, 21:16
Ответы с готовыми решениями:

Переписать универсальную функцию сортировки одномерного массива с Си на паскаль
Собственно требуется помощь, я переписал, но ругается на 42, 52, 53, 54 строки(в реализации на паскале). Не могу понять почему. Укажите...

Переделать функцию вывода блоков в универсальную
Доброго времени суток На сайте отображение вкладок происходит по следующим функциям: var current = 'content_news'; function show(id){...

Создать универсальную функцию для любой DGV
Доброго времени суток Есть одна функция, допустим, functionDGV() и она сделана под конкретный DGV (DataGridView3) но как сделать...

10
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.04.2014, 22:11
Кизим, вызывай рекурсивно

Добавлено через 2 минуты
Кизим, с трехмерные массивы как предполагается выводить на плоский экран, интересно...

Добавлено через 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
        private static void PrintAnyArr(Array array)
        {
            var firstElm = array.GetValue(0);
            if (firstElm is Array)
                foreach (Array a in array)
                {
                    PrintAnyArr(a);
                }
            else
            {
                switch (array.Rank)
                {
                case 1:
                    foreach (var v in array)
                        Console.Write(v + " ");
                    break;
                case 2:
                    for (int i = 0; i < array.GetLength(0); i++)
                    {
                        for (int j = 0; j < array.GetLength(1); j++)
                            Console.Write(array.GetValue(i, j) + " ");
                        Console.WriteLine();
                    }
                    break;
                default:
                    throw new NotSupportedException("Массивы размерностью 3 и более не поддерживаются, т.к. экран плоский. Эта ветка может быть дополнена после изобретения 3D-дисплеев");
                }
            }
        }
Добавлено через 3 минуты
либо более безопасный вариант, хотя и менее красивый:
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
 private static void PrintAnyArr(Array array)
        {
            switch (array.Rank)
            {
            case 1:
                foreach (var v in array)
                {
                    var a = v as Array;
                    if (a != null)
                        PrintAnyArr(a);
                    else
                        Console.Write(v + " ");
                }
                break;
            case 2:
                for (int i = 0; i < array.GetLength(0); i++)
                {
                    for (int j = 0; j < array.GetLength(1); j++)
                    {
                        var v = array.GetValue(i, j);
                        var a = v as Array;
                        if (a != null)
                            PrintAnyArr(a);
                        else
                            Console.Write(v + " ");
                    }
                    Console.WriteLine();
                }
                break;
            default:
                throw new NotSupportedException(
                    "Массивы размерностью 3 и более не поддерживаются, т.к. экран плоский. Эта ветка может быть дополнена после изобретения 3D-дисплеев");
            }
        }
1
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 13
05.04.2014, 22:18  [ТС]
Psilon, ахах))) да вот я тоже не пойму, каким образом вывести можно трехмерный массив.. ну наверное он имел в виду, что моя ф-я не подойдет для печати любого вида изрезанного массива)) я просто с рекурсией не дружу особо, поэтому и не соображу как лучше сделать(( спасибки за помощь
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.04.2014, 18:18
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
static void PrintAnyArr(string name, Array arr)
{
    int[] idx = new int[arr.Rank];
 
    var buffer = new StringBuilder(name).AppendLine();
    ArrayToString(arr, buffer, idx, 0, 0);
 
    Console.WriteLine(buffer);
}
static void ArrayToString(Array arr, StringBuilder buffer, int[] idx, int i, int tabCount)
{
    const char tab = ' ';
 
    if (i == idx.Length)
    {
        var value = arr.GetValue(idx);
        if (value is Array)
        {
            var temp = (Array)value;
            ArrayToString(temp, buffer, new int[temp.Rank], 0, tabCount);
        }
        else
            buffer.Append(tab, tabCount).Append(arr.GetValue(idx));
    }
    else
    {
        buffer.Append(tab, tabCount).AppendLine("{");
        while (idx[i] < arr.GetLength(i))
        {
            ArrayToString(arr, buffer, idx, i + 1, tabCount + 1);
            buffer.AppendLine(idx[i]++ == arr.GetUpperBound(i) ? string.Empty : ",");
        }
        idx[i] = 0;
        buffer.Append(tab, tabCount).Append("}");
    }
}
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
static void Main()
{
    int[] A = { 6, 2, 9 };
 
    int[,] B = { { 4, 2, 3 }, { 4, 8, 6 } };
 
    int[][] C = new int[3][]
    {
        new int[] {1,2,3},
        new int[] {4,5,6,7,8},
        new int[] {9}
    };
 
    int x = 0;
 
    long[, ,] D = new long[5, 4, 3];
    for (int i = 0; i < D.GetLength(0); i++)
        for (int j = 0; j < D.GetLength(1); j++)
            for (int k = 0; k < D.GetLength(2); k++)
                D[i, j, k] = x++;
 
    int[][,][] E = new int[3][,][];
    var r = new Random();
    for (int i = 0; i < E.Length; i++)
    {
        E[i] = new int[r.Next(2, 5), r.Next(2, 5)][];
        for (int j = 0; j < E[i].GetLength(0); j++)
        {
            for (int k = 0; k < E[i].GetLength(1); k++)
            {
                E[i][j, k] = new int[r.Next(2, 10)];
                for (int z = 0; z < E[i][j, k].Length; z++)
                    E[i][j, k][z] = x++;
            }
        }
    }
 
    PrintAnyArr("SZ", A);
    Console.ReadLine();
    PrintAnyArr("Matrix", B);
    Console.ReadLine();
    PrintAnyArr("Jagged", C);
    Console.ReadLine();
    PrintAnyArr("Multi", D);
    Console.ReadLine();
    PrintAnyArr("Mixed", E);
Сильно не пинайте
1
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
06.04.2014, 21:15
Цитата Сообщение от Psilon Посмотреть сообщение
с трехмерные массивы как предполагается выводить на плоский экран, интересно...
легко и непринужденно http://ideone.com/h2i4pu
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.04.2014, 22:07
Цитата Сообщение от pycture Посмотреть сообщение
легко и непринужденно
Атас.
Похоже, пора ознакомиться с F#.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.04.2014, 23:11
pycture, это не трехмерный массив

Добавлено через 1 минуту
kolorotur, F# только инициализирует массив, а вся магия происходит в
Haskell
1
printfn "Array 1 : \r\n%A"
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.04.2014, 07:14
Цитата Сообщение от Psilon Посмотреть сообщение
это не трехмерный массив
А препод сказал трехмерный : "...дополнительное задание, т.е. если будет, к примеру, существовать какой-то изрезанный массив с вот такой вот инициализацией : int[][,][] C = new int[][,][]{......} т.е. какой-нибудь трехмерный и т.д..."
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.04.2014, 08:18
pycture, трехмерный, Это у которого rank == 3, ваш Кэп.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.04.2014, 10:01
Цитата Сообщение от Psilon Посмотреть сообщение
трехмерный, Это у которого rank == 3
А без разницы. На экране одинакого выглядит http://ideone.com/DQlT7b
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.04.2014, 10:18
pycture, нет, вы маппите 3d массив на несколько 2d, и выводите уже их. С тем же успехом можно выводить матрицу в одну строку

Нетрудно показать, что матрица размерности N может без потерь отображена только на n-мерную поверхность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2014, 10:18
Помогаю со студенческими работами здесь

написать универсальную функцию для вычисления выражений
написать универсальную функцию для вычисления выражений(См ниже). В main() обеспечить вызов этой функции и отображение результатов...

Создайте функцию, возвращающую позицию максимального элемента двумерного массива
Создайте функцию, возвращающую позицию максимального элемента двумерного массива целых чисел n * m. Если таких элементов несколько, то...

Сделать универсальную функцию, которая может ввести и одномерный и двухмерный массивы
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #define N 100 void vvod(int *m,int n); int...

Прошу оценить/дополнить универсальную функцию для добавления/чтения с базы
Доброй ночи. Начинаю изучать тему sql-инъекций. Хотелось бы создать универсальную функцию, в которую можно было бы оборачивать любые...

Создайте функцию, позволяющую определить являются ли строки данного двумерного массива отсортированным по возрастанию
Создайте функцию, которая позволяет определить являются ли строки данного двумерного массива отсортированным по возрастанию. Функция...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь 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. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru