Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

English

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2019

 

Решения | C# и VB.NET | Классы задачника

PrevNext


Вспомогательные классы задачника

Приведенные в данном пункте классы описаны в пространстве имен PT4, реализованном в сборке pt4net.dll. При создании проектов-заготовок с помощью модуля PT4Load данная сборка подключается к созданным проектам автоматически.

Класс PT: общее описание


[C#]

public class PT: object
{
// Метод, инициализирующий задание:
    public static void Task(string name);
// Методы, обеспечивающие ввод исходных данных:
    public static bool GetBool();
    public static int GetInt();
    public static double GetDouble();
    public static char GetChar();
    public static string GetString();
    public static Node GetNode();
// Метод, обеспечивающий вывод результатов:
    public static void Put(params object[] a);
// Методы, предназначенные для отладки программ:
    public static void Show(object a);
    public static void ShowLine(object a);
    public static void ShowLine();
    public static void HideTask();
}

[VB.NET]

Public Class PT
    Inherits Object
' Метод, инициализирующий задание:
    Public Shared Sub Task(name As String)
' Методы, обеспечивающие ввод исходных данных:
    Public Shared Function GetBool() As Boolean
    Public Shared Function GetInt() As Integer
    Public Shared Function GetDouble() As Double
    Public Shared Function GetChar() As Char
    Public Shared Function GetString() As String
    Public Shared Function GetNode() As Node
' Метод, обеспечивающий вывод результатов:
    Public Shared Sub Put(ParamArray a() As Object)
' Методы, предназначенные для отладки программ:
    Public Shared Sub Show(a As Object);
    Public Shared Sub ShowLine(a As Object);
    Public Shared Sub ShowLine();
    Public Shared Sub HideTask();
End Class

Класс PT предоставляет средства для инициализации требуемого задания, организации ввода-вывода данных, а также вывода отладочной информации. В программах на языках C# и VB.NET решение задания оформляется в виде процедуры Solve, в которой, как правило, и вызываются методы класса PT. В программе не требуется создавать объекты класса PT, поскольку все его методы являются классовыми.

В двух следующих пунктах описываются особенности, связанные с различными методами класса PT.

Инициализация заданий, ввод-вывод данных

Метод Task инициализирует задание с указанным именем name. Он должен вызываться в начале процедуры Solve, выполняющей это задание (до вызова методов ввода-вывода Get–Put). Если в процедуре Solve, не вызван метод Task, то при запуске программы будет выведено окно с сообщением «Не вызвана процедура Task с именем задания».

Имя задания name должно включать имя группы заданий и порядковый номер в пределах группы (например, "Begin3"). Регистр букв в имени группы может быть произвольным. Если указана неверная группа, то программа выведет сообщение об ошибке «Указана неверная тема задания» (список всех доступных групп можно получить с помощью программных модулей PT4Demo и PT4Load). Если указан недопустимый номер задания, то программа выведет сообщение, в котором будет указан диапазон допустимых номеров для данной группы. Если после имени задания в параметре name указан суффикс «?» (например, "Begin3?"), то программа будет работать в демонстрационном режиме.

Начиная с версии 4.8, метод Task может также использоваться для генерации и вывода на экран html-страницы с текстом задания или группы заданий. Для этого необходимо указать в качестве параметра name имя конкретного задания или группы заданий и суффикс «#», например, "Begin3#" или "Begin#". Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся в разделе, посвященном демонстрационному режиму задачника.

Начиная с версии 4.13, задачник обеспечивает автоматическое тестирование программы на нескольких наборах исходных данных при ее однократном запуске. Для отключения этой возможности достаточно указать в параметре Name после имени задания суффикс «!» (например, "Begin3!"); в этом случае при запуске программы она будет протестирована на единственном наборе исходных данных, и для проверки правильности решения программу потребуется запустить несколько раз (как в предыдущих версиях задачника).

Если метод Task вызывается в программе несколько раз, то все последующие его вызовы игнорируются. Исключением является ситуация, когда метод используется для генерации html-страницы с описанием нескольких заданий или групп заданий; в этом случае учитываются все вызовы данного метода.

Начиная с версии 4.12, параметр name может содержать суффикс «_ru» или «_en», позволяющий явным образом задать язык интерфейса (русский или английский соответственно) для окна задачника и выполняемого задания. В версиях 4.12–4.14 специальные суффиксы «?», «#» и «!» должны указываться перед данным суффиксом, например, "Begin3#_en"; начиная с версии 4.15, суффиксы могут указываться в любом порядке. В случае нескольких вызовов метода Task (для генерации html-страницы) учитывается только суффикс, указанный при первом вызове метода. При отсутствии суффикса используется язык интерфейса, определенный в качестве основного для данного рабочего каталога (в универсальном варианте задачника основной язык интерфейса можно настроить с помощью программного модуля PT4Load, используя его контекстное меню).

Методы группы Get обеспечивают ввод исходных данных в программу, выполняющую учебное задание. Они должны вызываться после вызова метода Task; в случае их вызова до вызова метода Task при запуске программы будет выведено сообщение об ошибке «В начале программы не вызвана процедура Task с именем задания».

Следует обратить внимание на то, что в варианте задачника для языков платформы .NET (C# и VB.NET) методы ввода оформлены как функции (в то время как варианты задачника для языков Pascal, Visual Basic и C++ для ввода используют процедуры). Это соответствует общей идеологии стандартной библиотеки .NET Framework (и библиотек других языков, например, Python или Java), в которой ввод данных всегда выполняется с помощью функций.

Используемая функция ввода должна соответствовать типу очередного элемента исходных данных; в противном случае выводится сообщение об ошибке «Неверно указан тип при вводе исходных данных» (такое сообщение будет выведено, например, если очередной элемент данных является символом, а для его ввода используется функция GetInt).

При попытке ввести больше исходных данных, чем это предусмотрено в задании, выводится сообщение об ошибке «Попытка ввести лишние исходные данные». Если исходные данные, необходимые для решения задания, введены не полностью, то выводится сообщение «Введены не все требуемые исходные данные».

Метод Put обеспечивает вывод на экран результирующих данных, найденных программой, и их сравнение с контрольными данными (т. е. с правильным решением). Как и методы группы Get, метод Put должен вызываться после вызова метода Task; в противном случае при запуске программы будет выведено сообщение об ошибке «В начале программы не вызвана процедура Task с именем задания».

Благодаря использованию параметра-массива, снабженного атрибутом params, при вызове метода Put можно указывать произвольное число параметров. Параметры могут иметь тип bool, int, long, double, char, string, Node для C# и Boolean, Integer, Long, Double, Char, String, Node для VB.NET. В качестве параметров метода Put можно указывать не только переменные, но и выражения (в частности, константы соответствующего типа, а также нулевую ссылку — null для C#, Nothing для VB.NET). Заметим, что нулевые ссылки, как и объекты типа Node, требуется выводить только в заданиях групп Dynamic и Tree (и их аналогов GCDyn и GCTree, появившихся в версии задачника 4.15). Если в списке параметров указываются параметры недопустимого типа, то при выполнении программы выводится сообщение об ошибке «В методе Put указан параметр недопустимого типа». В версии 4.19 метод Put изменен таким образом, чтобы с его помощью можно было выводить данные составных типов (см. далее раздел «Дополнительные средства для ввода и вывода структур данных (версия 4.19)»);

Тип параметра должен не только быть допустимым, но и соответствовать типу очередного элемента результирующих данных; в противном случае выводится сообщение об ошибке «Неверно указан тип при выводе результатов».

Как и в случае методов группы Get, при вызовах метода Put программа осуществляет контроль за соответствием количества требуемых и выведенных результирующих данных. Если программа выведет недостаточное или избыточное количество результирующих данных, то после проверки этих данных появится сообщение «Выведены не все результирующие данные» или, соответственно, «Попытка вывести лишние результирующие данные».

Вывод отладочной информации

Методы Show, ShowLine и HideTask были добавлены в класс PT в версии 4.9 задачника Programming Taskbook. С их помощью можно выводить отладочную информацию непосредственно в окно задачника (в специальный раздел отладки).

Метод Show отображает элемент данных в разделе отладки окна задачника. В качестве параметра a можно указывать элемент данных любого типа; этот элемент будет автоматически преобразован к своему строковому представлению.

Если текущая экранная строка в разделе отладки уже содержит некоторый текст, то выводимая строка снабжается начальным пробелом и приписывается к предшествующему тексту, за исключением случая, когда при таком приписывании размер полученного текста превысит ширину области данных (равную 80 символам). В последнем случае вывод строки осуществляется с начала следующей экранной строки; если же и в этой ситуации строка превысит ширину области данных, то строка будет выведена на нескольких экранных строках, причем разрывы текста будут выполняться по пробельным символам строки, а при отсутствии пробелов — при достижении очередного фрагмента строки длины, равной 80.

Строковый параметр a может содержать явные команды перехода на новую экранную строку. В качестве таких команд можно использовать или символ с кодом 13 («возврат каретки» — '\r' для C#, ChrW(13) для VB.NET), или символ с кодом 10 («переход на новую строку» — '\n' для C#, ChrW(10) для VB.NET), или их комбинацию в указанном порядке ("\r\n" для C#, ChrW(13) & ChrW(10) для VB.NET).

С помощью операции сцепления (+ в C#, & в VB.NET) можно выводить в раздел отладки числовые данные вместе с предшествующим комментарием, например:

[C#]

Show("a = " + a);

[VB.NET]

Show("a = " & a);

Здесь a — переменная числового типа.

Метод ShowLine является модификацией метода Show; после вывода данных в раздел отладки он дополнительно осуществляет автоматический переход на следующую экранную строку. Если метод ShowLine вызывается без параметров, то он просто обеспечивает переход на новую экранную строку в разделе отладки.

Метод HideTask обеспечивает автоматическое скрытие всех разделов окна задачника, кроме раздела отладки. Если раздел отладки в окне задачника не отображается (в частности, если программа запущена в демонстрационном режиме), то вызов метода HideTask игнорируется. Игнорируются также все повторные вызовы данного метода.

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

В версии 4.19 отладочные средства были модифицированы (см. далее раздел «Дополнительные возможности, связанные с выводом отладочной информации (версия 4.19)»).

Класс Node: общее описание


[C#]

public sealed class Node: object, IDisposable
{
// Конструкторы:
    public Node();
    public Node(int aData);
    public Node(int aData, Node aNext);
    public Node(int aData, Node aNext, Node aPrev);
    public Node(Node aLeft, Node aRight, int aData);
    public Node(Node aLeft, Node aRight, int aData,
        Node aParent);
// Свойства:
    public int Data { get; set; }
    public Node Next { get; set; }
    public Node Prev { get; set; }
    public Node Left { get; set; }
    public Node Right { get; set; }
    public Node Parent { get; set; }
// Метод, освобождающий ресурсы, используемые объектом Node:
    public void Dispose();
}

[VB.NET]

Public NotInheritable Class Node
    Inherits Object
    Implements IDisposable
' Конструкторы:
    Public Sub New()
    Public Sub New(aData As Integer)
    Public Sub New(aData As Integer, aNext As Node)
    Public Sub New(aData As Integer, aNext As Node, _
        aPrev As Node)
    Public Sub New(aLeft As Node, aRight As Node, _
        aData As Integer)
    Public Sub New(aLeft As Node, aRight As Node, _
        aData As Integer, aParent As Node)
' Свойства:
    Public Property Data() As Integer
    Public Property Next() As Node
    Public Property Prev() As Node
    Public Property Left() As Node
    Public Property Right() As Node
    Public Property Parent() As Node
' Метод, освобождающий ресурсы, используемые объектом Node:
    Public Sub Dispose() Implements IDisposable.Dispose
End Class

Класс Node используется в заданиях групп Dynamic и Tree и их аналогов GCDyn и GCTree. В заданиях на стеки и очереди (Dynamic1–Dynamic28) при работе с объектами типа Node используются только свойства Data и Next; в заданиях на двусвязные списки (Dynamic29–Dynamic80) используются свойства Data, Next и Prev. В большинстве заданий на бинарные деревья (группа Tree) используются свойства Data, Left и Right; в заданиях на обработку бинарных деревьев с обратной связью (Tree48–Tree56 и Tree70–Tree71) дополнительно используется свойство Parent. Варианты конструктора класса Node позволяют задавать значения требуемых свойств при создании объекта; прочие свойства инициализируются нулевыми значениями (числом 0 для свойства Data, нулевой ссылкой null/Nothing для остальных свойств).

Следует обратить внимание на то, что данный класс реализует интерфейс IDisposable, поэтому при завершении работы с объектом типа Node требуется вызвать его метод Dispose, освобождающий неуправляемые ресурсы, выделенные для этого объекта (исключение делается только для тех объектов, которые передаются обратно задачнику в качестве результирующих данных). Если в задании требуется вызвать метод Dispose для некоторых объектов, но этот вызов не выполняется, то при запуске программы выводится сообщение об ошибке «Не вызван метод Dispose для объекта типа Node». При выполнении заданий групп GCDyn и GCTree, появившихся в версии 4.15, использовать метод Dispose не требуется.

Все исходные и результирующие данные-ссылки в заданиях группы Dynamic имеют тип Node; их ввод и вывод должен осуществляться с помощью методов GetNode и Put класса PT.

Дополнительные средства для ввода и вывода последовательностей

Начиная с версии 4.15, для ввода и вывода последовательностей (т. е. объектов, реализующих интерфейс IEnumerable<T>), а также для их отображения в разделе отладки, доступны следующие дополнительные методы (ранее реализованные в расширении задачника Programming Taskbook for LINQ):

[C#, аналогичные методы доступны и для VB.NET]

// Дополнительные методы класса PT
        public static IEnumerable<int> GetEnumerableInt([int count]);
        public static IEnumerable<double> GetEnumerableDouble([int count]);
        public static IEnumerable<char> GetEnumerableChar([int count]);
        public static IEnumerable<string> GetEnumerableString([int count]);
// Методы расширения для класса IEnumerable<T>
        public static void Put<T>([int count]);
        public static IEnumerable<TSource> Show<TSource, TResult>([string cmt],
            [Func<TSource, TResult> selector])

Методы GetEnumerableInt, GetEnumerableDouble, GetEnumerableChar, GetEnumerableString возвращают исходную последовательность соответствующего типа. Если параметр count отсутствует, то предварительно считывается размер последовательности (целое число), после чего вводятся сами ее элементы; если параметр count явно указан, то он определяет размер последовательности, и выполняется чтение только указанного количества элементов.

Метод расширения Put может применяться к любым последовательностям и обеспечивает их вывод в раздел результатов. Если параметр count отсутствует, то вначале выводится размер последовательности (целое число), а затем — все ее элементы. Если параметр count явно указан, то выводятся первые count элементов последовательности или все ее элементы, если параметр count не принадлежит диапазону от 1 до L, где L — размер последовательности (сам размер последовательности не выводится).

Метод расширения Show может применяться к любым последовательностям и обеспечивает их вывод в раздел отладки. Этот метод возвращает исходную последовательность, поэтому он может использоваться в цепочке запросов LINQ. Вначале выводится строковый комментарий cmt (если он указан), затем размер последовательности, а затем — все ее элементы. После вывода последовательности автоматически выполняется переход на новую строку раздела отладки. Если указано лямбда-выражение selector, то выводятся не сами элементы e последовательности, а их преобразованные значения, возвращаемые функцией selector(e).

Дополнительные средства для ввода и вывода структур данных (версия 4.19)

[C#, аналогичные методы доступны и для VB.NET]

// Дополнительные методы класса PT
        public static int[] GetArrInt([int count]);
        public static double[] GetArrDouble([int count]);
        public static char[] GetArrChar([int count]);
        public static string[] GetArrString([int count]);

        public static List<int> GetListInt([int count]);
        public static List<double> GetListDouble([int count]);
        public static List<char> GetListChar([int count]);
        public static List<string> GetListString([int count]);

        public static int[,] GetMatrInt([int m [, int n]]);
        public static double[,] GetMatrDouble([int m [, int n]]);
        public static char[,] GetMatrChar([int m [, int n]]);
        public static string[,] GetMatrString([int m [, int n]]);

        public static int[][] GetArrArrInt([int m [, int n]]);
        public static double[][] GetArrArrDouble([int m [, int n]]);
        public static char[][] GetArrArrChar([int m [, int n]]);
        public static string[][] GetArrArrString([int m [, int n]]);

        public static List<List<int>> GetListListInt([int m [, int n]]);
        public static List<List<double>> GetListListDouble([int m [, int n]]);
        public static List<List<char>> GetListListChar([int m [, int n]]);
        public static List<List<string>> GetListListString([int m [, int n]]);

В версии 4.19 набор методов ввода был дополнен методами, упрощающими ввод линейных и двумерных структур данных. Новые методы реализованы аналогично описанным выше методам GetEnumerable... . Каждая группа методов обеспечивает чтение структур с элементами одного из четырех основных типов T: int, double, char и string. Реализованы пять групп методов, описанных ниже.

Методы ввода линейных структур представлены группами GetArr... и GetList... . Они могут вызываться без параметров (и в этом случае вначале выполняют чтение целого числа — размера структуры, после чего считывают все ее элементы) или с одним параметром целого типа count, определяющим размер структуры (и в этом случае считывают только сами элементы). Методы группы GetArr... возвращают одномерный массив T[], методы группы GetList... — список на базе массива List<T>.

Методы ввода двумерных структур представлены группами GetMatr..., GetArrArr... и GetListList... . Они могут вызываться без параметров и в этом случае вначале выполняют чтение двух целых чисел —, определяющих размеры структуры по первому (число строк) и по второму индексу (число столбцов), после чего считывают все элементы по строкам. При указании одного целочисленного параметра m он определяет и число строк, и число столбцов (т. е. структура соответствует квадратной матрице порядка m); метод считывает только элементы структуры. При указании двух целочисленных параметров m и n первый из них определяет число строк, второй — число столбцов, в этом случае также метод считывает только элементы структуры. Методы группы GetMatr... возвращают двумерный массив T[,], методы группы GetArrArr... — массив массивов T[][], методы группы GetListList... — список списков List<List<T>>.

Универсальный метод Put изменен таким образом, что в качестве его параметров можно указывать не только базовые типы данных int, double, char, string, bool и Node, но и любые последовательности (т. е. объекты, реализующие интерфейс IEnumerable), в том числе вложенные, а также кортежи (объекты типа Tuple и ValueTuple). В случае кортежей последовательно выводятся все их компоненты, в случае последовательностей выводятся все их элементы.

Дополнительные возможности, связанные с выводом отладочной информации (версия 4.19)

[C#, аналогичные методы доступны и для VB.NET]

// Новые и измененные методы класса PT
        public static void SetWidth(int w);
        public static void SetPrecision(int p);
        public static void Show(params object[] args);
        public static void ShowLine(params object[] args);

В версии 4.19 средства отладочного вывода были усовершенствованы. Методы Show и ShowLine теперь могут принимать произвольное число параметров, причем можно настраивать ширину вывода данных, а также число дробных знаков для вещественных чисел. Кроме того, составные данные отображаются в наглядном виде, с применением вспомогательных форматирующих элементов.

Метод SetWidth(w) задает минимальную ширину w (w >= 0) поля вывода для элементов данных, выводимых методами Show и ShowLine; по умолчанию минимальная ширина полагается равной 0. Действие указанной настройки распространяется на все последующие вызовы методов Show и ShowLine. Числовые данные выравниваются по правой границе, прочие данные — по левой.

Метод SetPrecision(d) устанавливает количество d дробных знаков при выводе вещественных чисел (при d <= 0 используется формат с плавающей точкой; число дробных знаков в этом случае равно –d или 6, если d равно 0); по умолчанию d = 2. В качестве десятичного разделителя используется точка. Действие указанной настройки распространяется на все последующие вызовы методов Show и ShowLine.

В версии 4.19 реализация методов Show и ShowLine изменена таким образом, чтобы обеспечивать форматированный вывод наборов данных, в том числе вложенных. При оформлении выводимых наборов данных используются следующие обозначения: кортежи (Tuple и ValueTuple) обрамляются круглыми скобками; для большинства типов, реализующих интерфейс Enumerable (в частности, массивов и списков List), используются квадратные скобки; исключение составляют множества (HashSet и SortedSet) и словари (в частности, Dictionary и SortedDictionary), для которых применяются фигурные скобки. Элементы словарей, как и кортежи, обрамляются круглыми скобками, кроме того, ключи (key) и значения (value) этих элементов разделяются двоеточием.

После вывода любого Enumerable-объекта выполняется автоматический переход на следующую экранную строку в разделе отладки. При наличии нескольких вложенных Enumerable-объектов уровень их вложенности оформляется с помощью дополнительных отступов.

Элементы любых наборов данных разделяются запятыми (за исключением элементов, которые реализуют интерфейс Enumerable, после которых запятая не указывается, поскольку, как было отмечено выше, такие элементы разделяются разрывами строк).

Начиная с версии 4.19, метод ShowLine выполняет дополнительный переход на следующую строку только в случае, если последним выводимым элементом данных не является Enumerable-объект, поскольку после вывода подобных объектов всегда выполняется переход на новую строку.

Ниже приводятся примеры использования метода Show для вывода различных наборов данных. Фрагмент программы, обеспечивающий отладочный вывод, имеет следующий вид (было использовано задание Matrix80, в котором дается вещественная квадратная матрица):

     Task("Matrix80");
     HideTask();
     ShowLine("Матрица вещественных чисел (width = 5):");
     var a = GetMatrDouble(GetInt());
     SetWidth(5);
     ShowLine(a);
     ShowLine("Словарь строк (width = 0):");
     var b1 = new Dictionary<int, string>();
     b1[1] = "ABCD";
     b1[3] = "123";
     b1[10] = "!*****!";
     SetWidth(0);
     ShowLine(b1);
     ShowLine("Словарь строковых массивов (width = 3):");
     var b2 = new Dictionary<int, string[]>();
     b2[1] = new string[] { "ab", "d" };
     b2[2] = new string[] { "123", "45", "7" };
     b2[22] = new string[] { "**", "#", "@@@" };
     SetWidth(3);
     ShowLine(b2);
     ShowLine("Список списков, содержащих числовые строки (width = 6):");
     var c1 = new List<List<string>>();
     c1.Add(new List<string>());
     c1[0].Add("ABCD"); c1[0].Add("123"); c1[0].Add("!****!");
     c1.Add(new List<string>());
     c1[1].Add("abcd"); c1[1].Add("56789");
     SetWidth(6);
      ShowLine(c1);
     ShowLine("Массив массивов, содержащих числовые массивы (width = 2):");
     var c2 = new int[3][][];
     c2[0] = new int[2][];
     c2[0][0] = new int[] { 1, 2, 3 };
     c2[0][1] = new int[] { 4, 5, 6 };
     c2[1] = new int[3][];
     c2[1][0] = new int[] { 7, 8, 9 };
     c2[1][1] = new int[] { 10, 11, 12 };
     c2[1][2] = new int[] { 60, 61, 62 };
     c2[2] = new int[2][];
     c2[2][0] = new int[] { 13, 14, 15, 50 };
     c2[2][1] = new int[] { 16, 17, 18, 19, 20 };
     SetWidth(2);
     ShowLine(c2);

В приведенном далее образце содержимого раздела отладки следует обратить внимание на то, что при выводе скалярных элементов или элементов-кортежей они разделяются запятыми, тогда как после каждого элемента, реализующего интерфейс Enumerable (массива или списка List), выполняется переход на новую строку. Кроме того, следует обратить внимание на использование отступов при выводе многомерных списков, а также на настройку ширины области вывода с помощью метода SetWidth.

  1>  Матрица вещественных чисел (width = 5):
  2>  [ [  2.07 ,  4.75 ,  4.15 ,  6.20 ,  0.59 ]
  3>    [  4.47 ,  3.12 ,  7.51 ,  7.98 ,  9.45 ]
  4>    [  5.50 ,  8.67 ,  2.51 ,  2.64 ,  5.90 ]
  5>    [  2.45 ,  6.45 ,  4.24 ,  4.35 ,  4.51 ]
  6>    [  2.87 ,  1.46 ,  6.67 ,  5.57 ,  5.00 ]
  7>  ]
  8>  Словарь строк (width = 0):
  9>  { ( 1 : ABCD ) , ( 3 : 123 ) , ( 10 : !*****! ) }
 10>  Словарь строковых массивов (width = 3):
 11>  { (   1 : [ ab  , d   ]
 12>  ) (   2 : [ 123 , 45  , 7   ]
 13>  ) (  22 : [ **  , #   , @@@ ]
 14>  ) }
 15>  Список списков, содержащих числовые строки (width = 6):
 16>  [ [ ABCD   , 123    , !****! ]
 17>    [ abcd   , 56789  ]
 18>  ]
 19>  Массив массивов, содержащих числовые массивы (width = 2):
 20>  [ [ [  1 ,  2 ,  3 ]
 21>      [  4 ,  5 ,  6 ]
 22>    ]
 23>    [ [  7 ,  8 ,  9 ]
 24>      [ 10 , 11 , 12 ]
 25>      [ 60 , 61 , 62 ]
 26>    ]
 27>    [ [ 13 , 14 , 15 , 50 ]
 28>      [ 16 , 17 , 18 , 19 , 20 ]
 29>    ]
 30>  ]

PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
08.03.2019