0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 13

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

05.04.2014, 21:16. Показов 2708. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru