Skip to content

Instantly share code, notes, and snippets.

Created September 26, 2017 06:21
Show Gist options
  • Save anonymous/60d5eedc210d4247f3a86898bbda0f5a to your computer and use it in GitHub Desktop.
Save anonymous/60d5eedc210d4247f3a86898bbda0f5a to your computer and use it in GitHub Desktop.
Fortran 77 примеры описание типа

Fortran 77 примеры описание типа



Ссылка на файл: >>>>>> http://file-portal.ru/Fortran 77 примеры описание типа/


Решение задач по ТОЭ, ОТЦ, Высшей математике, Физике, Программированию...
Фортран
Fortran Краткое руководство
























Джон Бэкус , IBM. GFortran , Open Watcom , Sun Studio , XL Fortran , Intel Fortran. Создан в период с по год группой программистов под руководством Джона Бэкуса в корпорации IBM. Фортран широко используется в первую очередь для научных и инженерных вычислений. Имеется большое количество написанных на Фортране в большей части на старых версиях языка различных математических библиотек для матричной алгебры и решения систем линейных уравнений, библиотеки для решения дифференциальных уравнений , интегральных уравнений и их систем, аппроксимации функций , специальных функций , быстрых преобразований Фурье , математической статистики, и других математических дисциплин. Эти библиотеки поставляются, как правило, с компилятором. Большинство таких библиотек является фактически достоянием человечества: Современный Фортран Fortran 95 и Fortran приобрёл черты, необходимые для эффективного программирования, для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, обобщённое и модульное программирование , ООП , сохраняя, при этом, преемственность с более ранними версиями. Одной из наиболее главных концепций развития современного Фортрана — средства поддержки параллельности и векторные операции [6]. Новые стандарты языка в значительной мере сохраняют преемственность с более старыми, что позволяет использовать коды ранее написанных программ и модифицировать их [6]. При этом по мере развития языка заранее объявляются устаревшие конструкции, которые в будущем, возможно, будут удалены [7]. Фортран имеет большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами двойной и повышенной точности при бинарных операциях используется real 10 , имеет богатый инструментарий работы с массивами и внешними файлами. Вопреки распространённому мнению, современный Фортран и выше имеет полноценный инструментарий для работы с символьными данными. Изначально выразительные средства языка были не очень велики, поскольку Фортран был первым реализованным языком высокого уровня. В дальнейшем в Фортран были добавлены многие лексические конструкции, характерные для структурного, модульного, обобщённого и объектно-ориентированного программирования. Структура программ изначально была ориентирована на ввод с перфокарт и имела ряд удобных именно для этого случая свойств. Так, с 1-й по 5-ю колонку располагалась область меток, 6-я служила для маркировки текста как продолжения предыдущей строки любым символом, кроме пробела и "0" , а с 7-й по ю располагался собственно текст оператора или комментария. Колонки с й по ю могли служить для нумерации карт чтобы восстановить случайно рассыпавшуюся колоду или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство с 7-й по ю колонку , в 6-й колонке следующей карты ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке карте было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства. Именно поэтому к стандарту Фортрана, начиная с Fortran 90, с сохранением фиксированного формата исходного текста, был добавлен с вободный формат , который не регламентирует позиции строки и позволяет записывать более одного оператора на строку. Введение свободного формата и современных способов структурного программирования [6] позволило создавать код, читаемость и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких как Паскаль , C или Java. Современные среды разработки позволяют комбинировать форматы: Большое количество меток и операторов GOTO часто делало программы на Фортране трудными для понимания. Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования например, в языке Java метки и связанные с ними операторы безусловного перехода сильно видоизменены. Более того, в современных стандартах языка оставлен лишь классический оператор GOTO , применяемый во многих языках и поныне. Фортран поддерживает 5 основных элементарных встроенных типов данных: Кроме того, возможно создавать производные типы данных с помощью ключевого слова TYPE. С самого начала создания языка существовали 4 типа данных: Существует понятие разновидности типа данных или параметры типа. Это позволяет параметризовать вещественные и комплексные данные то есть указывать точность и диапазон десятичного порядка и другие данные, повышая мобильность приложений. Для всех числовых данных определены обычные арифметические операции и присваивания, существуют встроенные функции. Встроенная функция Log x в качестве аргумента x может иметь только действительное или комплексное число не целое. Для комплексных чисел число байт удваивается. Целые числа могут занимать от 1 до 4 байт. Современные компиляторы позволяют программисту оперировать числами и "учетверённой" точности. В арифметических операциях изменение типа производится по умолчанию от целого в действительное и далее комплексное число, либо применением специальной встроенной числовой функции. Так, эквивалентны следующие выражения i - целое: Строковые символьные данные задаются с указанием длины в скобках либо после атрибута типа, либо после имени строки. Для задания строки в теле программы используются одинарные или двойные кавычки. Это удобно в тех случаях, когда в самой строке присутствуют кавычки: Для строк существует встроенная операция конкатенации сложения строк: Существует 17 специализированных встроенных функций для символьных данных помимо универсальных, обрабатывающих все типы данных. Метки — это целые числа с числом цифр не более 5; символы не допускаются. Метки используются в операторах GO TO , операторах чтения, записи и форматирования, а также при обработке ошибок и исключений. Помимо меток, в Фортране имеется возможность именовать управляющие конструкции циклы, логические условия, конструкции FORALL END FORALL , WHERE END WHERE , SELECT CASE END SELECT , TYPE END TYPE и др. CHAR i и ACHAR i. Преобразуют целое в соответствующий ему символ операционной системы или символ таблицы ASCII. ICHAR i и IACHAR i. LGE A,B , LGT A,B , LLE A,B и LLT A,B. Результат функций — "истина", если длины строк L A и L B , выраженные в символах ASCII, удовлетворяют следующим неравенствам соответственно: Первая возвращает длину строки А количество символов , вторая - возвращает длину строки без завершающих пробелов, если они имеются. TRIM A , ADJUSTL A и ADJUSTR A , REPEAT A,N. Функция TRIM A возвращает строку A без завершающих пробелов. Функции ADJUSTL A и ADJUSTR A выравнивают строку удаляют пробелы слева и справа соответственно. Функция REPEAT A,N возвращает N копий строки А. Функции поиска в строке: SCAN A,B,[ back ] , INDEX A,B,[ back ] , VERIFY A,B,[ back ]. Факультативный параметр back определяет направление поиска: Функция SCAN определяет номер позиции в строке A слева или справа первого найденного символа из списка-строки В. Если результат отрицательный, то функция возвратит целочисленный 0. Функция INDEX определяет номер позиции, с которой впервые начинается полное вхождение строки В в строку А. Причём поиск может вестись как слева, так и справа, но номер позиции исчисляется всегда слева, от начала строки. При неудачном поиске функция возвратит 0. Функция VERIFY обратна функции INDEX. Так, VERIFY возвращает номер позиции такого символа строки A , которого нет в строке-маске В. Если же все различные символы строки А присутствуют в строке-маске В, то функция вернёт 0. Все эти функции являются элементными и их аргументом может быть массив символов или целых чисел. Результатом будет согласованный численный, символьный или логический массив. Стандарты Фортрана, начиная с версии , предусматривают возможность работы с символами Юникода. Помимо указанных возможностей, Фортран позволяет обрабатывать символьные данные средствами своего встроенного матричного векторного анализа , что существенно повышает гибкость обработки символьных данных. В Фортране для совместимости с программами, написанными на языке Си, существует понятие Си-строки , которая задаётся добавлением символа с после кавычки: Нулевая строка будет задана так: Подпрограммы в Фортране существовали с самого первого стандарта и поныне являются одним из главных инструментов программирования. В Фортране вызов подпрограмм, функций и передача их параметров происходят исключительно по ссылке а не по значению. Поэтому подпрограмма может изменить переданный ей аргумент в главной программе, если специальным образом это не предотвратить. Такой механизм позволяет сделать естественной нотацию при записи математических формул и сохранить при этом высокое быстродействие при работе с большими массивами данных. Подпрограммы Фортрана могут содержать в списке параметров называемых формальными параметрами и необязательные опциональные параметры, а могут вообще не содержать параметров. Стандарт языка позволяет осуществлять перегрузку процедур и операций посредством родового интерфейса, объединяя различные процедуры оперирующая каждая, например, целыми, действительными, комплексными числами и символьными переменными под одним родовым именем. В этом случае в главной программе достаточно обратиться к родовой процедуре, а характер выполняемых операций будет зависеть от типа данных, предложенных процедуре для обработки. По такому принципу сделаны все встроенные функции и подпрограммы, например, COS x. Перегрузка процедур, функций и операторов причём символы перегруженных операторов программист может предложить свои, помимо встроенных распространяется не только на встроенные типы данных, но и на типы, определённые программистом. Процедуры разделяются на подпрограммы и функции. Подпрограммы удобнее, если необходимо возвратить большое число разнородных результатов; функции — при возвращении результата одного типа в том числе массива. Вызов функции осуществляется по имени с указанием списка фактических аргументов и без использования какого-либо специального оператора. При этом результат функции должен отличаться от имени самой функции. Все встроенные функции и подпрограммы Фортрана, в том числе математические кроме обращающихся к операционной системе, функций даты и времени, а также датчиков случайных чисел являются чистыми, то есть не создают побочных эффектов. Чистые функции введены с целью повышения культуры программирования и повышения эффективности распараллеливания алгоритмов [14] [7]. В качестве аргументов подпрограмм могут быть любые встроенные типы данных, включая массивы и их секции, указатели, а также типы, определяемые программистом. Аргументами подпрограмм также могут быть функции и другие подпрограммы, кроме внутренних подпрограмм, операторной функции, родовых обобщённых процедур допускаются только специфические имена и некоторых др. Аргументы подразделяются на формальные и фактические. Аргументы заключаются в скобки после имени подпрограммы и разделяются запятыми. Имена фактических и формальных аргументов могут совпадать. Формальные аргументы — это аргументы подпрограммы функции , указанные при её описании. При отсутствии аргументов у подпрограммы, скобки могут быть опущены. У функции скобки расставляются и при отсутствии формальных аргументов. Формальный параметр-процедура называется формальной процедурой. Фактические аргументы — это аргументы, передаваемые подпрограмме или функции для выполнения при её вызове. Функция без аргументов вызывается с пустым списком в скобках, подпрограмма — без скобок. Формальные и фактические аргументы должны быть согласованы. Типы аргументов и разновидности их вида должны быть одинаковыми, массиву должен соответствовать массив или сечение массива той же конфигурации. Существуют массивы, перенимающие конфигурацию и перенимающие размер как формальные аргументы процедур. Массив, перенимающий конфигурацию — это формальный аргумент-массив, который наследует конфигурацию соответствующего ему фактического массива. У такого массива при его объявлении задаётся размерность совпадающая с размерностью фактического аргумента-массива и опускаются верхние границы. По умолчанию нижние границы равны 1, но могут быть заданы произвольными. Число и значение элементов массива, перенимающего конфигурацию, точно наследуются от фактического аргумента-массива. При этом формальный и фактический массивы-аргументы могут иметь разную размерность. Массивы, перенимающие конфигурацию и размер, не могут быть динамическими или быть указателями. Процедуры, имеющие наследующие массивы, должны иметь явный интерфейс. Строки-формальные аргументы также могут наследовать перенимать длину у соответствующего фактического аргумента-строки. При явном задании длины строки, длина строки-формального аргумента не может быть больше соответствующего фактического аргумента-строки. Аргументы бывают позиционными и ключевыми. Позиционные формальные и фактические аргументы связываются друг с другом по порядку их расположения в списке аргументов, который должен совпадать. Ключевые — по имени ключа, который совпадает с именем формального аргумента. Ключевые позволяют нарушить порядок следования аргументов или пропустить часть из них. Так, для подпрограммы с заголовком Subroutine ONE A, B, C, D вызов может быть таким: Ключевые аргументы позволяют иметь необязательные аргументы , которые могут быть опущены. В этом случае необязательные аргументы должны иметь атрибут Optional. Все конструкции языка, данные, программные единицы, операторы, встроенные функции, циклы созданы и создаются для эффективной обработки прежде всего массивов. Фортран по мере своего развития следует принципу максимального, насколько это возможно, ухода от детального поэлементного описания и обработки массивов. Такой взгляд на массивы не был свойственен ранним версиям языка; первые элементы обобщённого подхода к массивам появились в FORTRAN77; развиваются они и поныне. Массивы бывают статические и динамические. Динамические разделяются на размещаемые и автоматические образуемые при вызове подпрограммы. Элементы двумерного массива в Фортране размещаются по столбцам , а не по строкам, как, например, в Си. Таким образом, быстрее всего изменяется первый индекс массива. По умолчанию присваивание, ввод, вывод и инициализация массивов осуществляются по столбцам. Массивы могут быть нулевого размера в том числе, если нижняя граница превосходит верхнюю. Индексами границ массивов могут быть любые целые числа. По умолчанию нижняя граница равна 1. Фортран позволяет эффективно присваивать массивы без циклов посредством маскирования присваивания с помощью операторов WHERE и FORALL , а также сечений массивов и векторных индексов. Во всех случаях первоначально вычисляется правая часть выражения целиком для всех индексов массива и лишь затем выполняется присваивание для индексов, удовлетворяющих массиву-маске. Вычисления с помощью этих инструментов позволяют повышать быстродействие и облегчают компилятору работу по выделению участков программы, которые могут быть выполнены независимо, то есть распараллелены. Оператор и конструкция FORALL допускает использование только чистых процедур и функций. При маскировании присваивания в операторах WHERE , FORALL , а также в специальных встроенных функциях для массивов например, SUM логический массив-маска вычисляется до присваивания и позволяет заменять циклы с логическими условиями внутри них, что позволяет избежать дополнительной работы для предсказателя переходов микропроцессора. Векторные индексы используются для создания произвольных сечений многомерных массивов и являются их обобщениями. При использовании векторных индексов следует следить за повторяющимися значениями индексов в левой части оператора присваивания, так как в этом случае будет осуществлена попытка записи в одну ячейку памяти, возможно, разных значений. В современном Фортране имеется большое количество специализированных встроенных функций для работы с численными и символьными массивами помимо разобранных выше общих способов. Массив array может быть, если не указано иное, целочисленным, содержать действительные или комплексные числа. Если массив-маска не задан, то его значение считается тождественно истинным. Логический массив mask , если задан, должен иметь ту же форму, что и массив array , либо скарярное значение. Функции возвращают индекс первого по порядку следования элемента массива array. Для многомерных массивов array результат записывается в массив с рангом, на единицу меньшим ранга массива array исключается измерение с номером dim. Значения индексов отсчитываются по порядку от нижних границ массива. То есть в случае, если номер нижней границы массива array отличается от единицы, то для доступа к максимальному или минимальному элементу массива следует прибавить к результату функций MAXLOC и MINLOC разницу между индексом нижней границы и единицей. Массив array может быть только вещественным или целочисленным. Искомые элементы массива удовлетворяют логическому массиву-маске mask вдоль факультативного измерения dim. Тип аргумента value должен совпадать с типом массива array и может быть любого встроенного типа включая комплексный, логический или символьный. Остальные свойства функции аналогичны свойствам функций MAXLOC и MINLOC. Начиная со стандарта F, функции MAXLOC и MINLOC , как и функция FINDLOC , оперируют также и символьными данными. SUM array[, mask][, dim] и PRODUCT array[, mask][, dim] осуществляют соответственно суммирование и умножение элементов массива. Смысл аргументов функций SUM и PRODUCT тот же, что и у выше рассмотренных функций. Функция PRODUCT оперирует комплексными данными, начиная со стандарта F Перемножает две матрицы, матрицу на вектор, вектор на матрицу по правилам линейной алгебры. Аргументами функции не могут быть одновременно два вектора: Отметим, что стандартом алгоритмические реализации математических функций обычно не оговариваются и остаются на усмотрение разработчика компилятора. Массивы-аргументы и массив-результат могут быть любого встроенного типа и совпадать по типу данных, размеру и форме. Если элемент mask есть истина. При этом данные из массива from копируются в массив to. Тип данных и ранг массивов from и to должны совпадать. После переразмещения массива to массив from освобождает память и становится неразмещённым. Может быть полезна в численных методах с изменяющейся дискретизацией задачи многосеточных и адаптивных методах. В современном Фортране предусмотрены встроенные функции упаковки и распаковки многомерного массива в одномерный массив и из одномерного массива, соответственно под управлением логического условия для повышения быстродействия и экономии памяти. Необязательный одномерный массив vector должен иметь тот же тип данных, что и array , причём количество элементов в vector , если он задан, должно быть не меньше числа истинных элементов в mask. Результатом функции будет одномерный массив того же типа, что и array. Результирующий массив последовательно заполняется элементами массива array в порядке их размещения в компьютерной памяти , удовлетворяющими истинным значениям массива mask. При этом, если задан vector , из него выбираются недостающие возможно элементы в массиве-результате, причём начиная с индекса, следующего за последним по порядку истинным элементом массива array. Фортран обладает богатым встроенным инструментарием для операций ввода-вывода, в том числе для больших массивов данных. Файлы в Фортране бывают внутренние и внешние. Внутренние файлы всегда открыты по умолчанию. С обоими типами файлов используются одни и те же операторы записи WRITE и чтения READ. Внутренние файлы используются для преобразований число-строка-число и для создания смешанных числовых и символьных записей. Внешние файлы подразделяются на форматные текстовые, CR- и LF-потоки , бинарные двоичные , непосредственно отображающие оперативную память, и неформатные не двоичные. Файлы прямого доступа позволяют осуществлять операции ввода-вывода с записями с заданным номером без затирания вышерасположенных или нижерасположенных записей в файле. Стандарты языка предполагают автоматическое освобождение оперативной памяти, занятой любым типом динамического массива, после завершения работы программы или подпрограммы процедуры, функции , даже если программистом освобождение не было выполнено явно. Это позволяет избегать возникновения утечек памяти при работе с динамическими массивами средствами Фортрана при использовании указателей и в других случаях утечки возможны при небрежности программирования [8]. Атоматические массивы размещаемые компилятором создаются при вызове подпрограммы и являются её локальными объектами. Их границы определяются всякий раз при обращении к процедуре; при этом при выходе из неё они уничтожаются, а память — очищается. Автоматические массивы во время выполнения программы находятся в стеке , размещаемые с помощью оператора ALLOCATE — в куче [14]. Указатели Фортрана аналогичны указателям Си, [8] однако при решении вычислительных задач и разработке математических алгоритмов они в большинстве случаев с успехом заменяются иными инструментами Фортрана. Существует и более простая форма условного оператора: IF логическое условие оператор , где исполняемый оператор должен быть единственным после оператора IF , например, Goto метка. Конструкция выбора SELECT CASE - CASE - CASE DEFAULT - END SELECT , наоборот, отличается от конструкции SWITCH - CASE в Си-подобных языках [17] , языке Java [18] [19] и несколько напоминает по возможностям оператор CASE в Паскале [20]. Оператор CASE DEFAULT , равно как и имя конструкции, не является необходимым. Диапазоны в списках селекторов различных операторов CASE не должны пересекаться или иметь хотя бы одного общего элемента. В современном Фортране существуют две формы циклов со счётчиком итераций: Для вложенных циклов с большим уровнем вложенности последняя форма может быть более лаконичной:. Если шаг dN опущен, то по умолчанию он считается равным единице: Возможен также цикл с условием DO WHILE логическое условие - END DO , и бесконечный цикл DO - END DO , имеющие стандартную форму. Оператор CYCLE имя цикла прерывает текущую итерацию цикла и переходит к следующей итерации этого же цикла. Если имя цикла не указано, то выполняется прерывание итерации текущего цикла в котором расположен оператор CYCLE. Оператор EXIT имя цикла прерывает выполнение цикла с указанным именем и передаёт управление далее, а при отсутствии имени — прерывает текущий цикл в который вложен оператор EXIT. Операторы CYCLE и EXIT логически тождественны оператору GOTO в соответствующих обстоятельствах , но существенно облегчают понимание и обслуживание кода программистом. С момента первоначальной разработки языка, компиляторы Фортрана производит фирма IBM. Оба этих компилятора содержат очень сложные оптимизаторы, являющиеся результатом непрерывной научной работы специалистов IBM на протяжении полувека. На базе компилятора IBM Fortran XL фирмой Absoft, бизнес-партнёром IBM, создан и поставляется компилятор Absoft Pro Fortran для систем на базе процессоров PowerPC Linux, Mac OS X и Intel Linux, Mac OS X, Windows [23]. Впоследствии она отказалась от их разработки в связи с низкой прибыльностью. Наиболее известными продуктами этой линейки являются FPS 4. Каждый компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний явились причиной того, что последующие продукты появлялись на рынке под торговыми марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6. Поддержка Фортрана реализована также для всех высокопроизводительных платформ HP. Фонд свободного программного обеспечения GNU выпускал открытый компилятор Фортрана g77 , доступный практически для любой платформы и полностью совместимый с GCC. Сейчас ему на смену пришёл компилятор GFortran , в котором реализованы практически все конструкции стандарта Фортран и многие конструкции стандартов Фортран и Фортран Он также полностью обратно совместим с Фортран Также существует независимый проект g95 по созданию на основе GCC компилятора Фортран Многие системы программирования позволяют компоновать полученные в результате трансляции фортрановской программы объектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Фортран в СССР появился позже, чем на Западе, поскольку поначалу в СССР более перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло общение советских физиков в частности А. Леонтович со своими коллегами из CERN , где в х годах почти все расчёты велись с использованием программ на Фортране [25]. Первый советский компилятор с Фортрана был создан в году для машины Минск-2 , однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в году компилятора ФОРТРАН-ДУБНА для машины БЭСМ Материал из Википедии — свободной энциклопедии. Джон Бэкус , IBM Расширение файлов: GFortran , Open Watcom , Sun Studio , XL Fortran , Intel Fortran Диалекты: Speedcoding [d] Повлиял на: K2 , arr1 I1: K2 , arr2 I1: Integer V - 2: Вывод в DOS-окно будет произведён по строкам! Character 15 string Real:: Запись в строку числа Select Case N i! Блок 2 10 11 Case Блок 3 13 14 Case ! Блок 4 16 17 Case 1 , Блок 5 19 20 Case Default! Case Default - опциональный, необязательный оператор 21! Блок по умолчанию 22 End Select nameSC. N1 - начальное значение счётчика, N2 - конечное, dN - шаг параметры цикла END DO name! Параметры цикла - целые числа произвольного знака. Финансы и статистика, Программирование на Visual Fortran. Comparing Python, NumPy, Matlab, Fortran, etc. NASA Modeling Guru Nov 2, Проверено 5 июня Архивировано 10 марта года. Проверено 11 июня Архивировано 9 сентября года. Языки программирования, появившиеся в году Языки программирования по алфавиту Фортран Объектно-ориентированные языки программирования. Страницы, использующие волшебные ссылки ISBN Википедия: Статьи с переопределением значения из Викиданных Статьи с примерами кода Фортран. Навигация Персональные инструменты Вы не представились системе Обсуждение Вклад Создать учётную запись Войти. Пространства имён Статья Обсуждение. Просмотры Читать Править Править вики-текст История. В других проектах Викисклад. Эта страница последний раз была отредактирована 2 июня в Текст доступен по лицензии Creative Commons Attribution-ShareAlike ; в отдельных случаях могут действовать дополнительные условия. Свяжитесь с нами Политика конфиденциальности Описание Википедии Отказ от ответственности Разработчики Соглашение о cookie Мобильная версия.


Инструкция по сборке робота lego mindstorms nxt
На сколько отключили
Тапир описание животного
FORTRAN 77
Где используется герб
Фриланс стихи на заказ
Проблемы роста цен
Фортран
Капли квинакс инструкция
Баночный массаж от целлюлита отзывы фото
FORTRAN 77
Синема стар кадо коломна расписание
Реле ближнего света ваз 2106 где находится
Последние новости саяногорска
Решение задач по ТОЭ, ОТЦ, Высшей математике, Физике, Программированию...
Карта островов мира на русском языке
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment