Ответы на билеты (1-ый семестр ВФ). 1. Определение информатики, составные части и краткая история развития 3
Скачать 1.09 Mb.
|
Ключевые слова (Keyword) используются в фортране и имеют свое функциональное предназначение, находясь, как правило, в неисполняемой части программы (описательной). Так, указание REAL L указывает, что значение переменной L – действительное. Зарезервированные слова (reserved word) могут использоваться только в контексте, предусмотренном правилами (семантикой) языка. Объект данных – комбинация данных, атрибутов, описывающих их свойства, и методов, раскрывающих их поведение. Объектам данных, а также программам или отдельным их частям и т.п. сопоставляются имена (или идентификаторы), правила образования которых несколько различны в разных языках. Наиболее характерными типами данных являются следующие. Элементарные типы данных – типы данных, не определяемые в других типах и существующие практически во всех императивных языках: Числовые типы: целые – Integer; действительные – REAL (с фиксированной и плавающей точкой); комплексные (COMPLEX) и с двойной точностью (DOUBLE PRECISION) – только в фортране; булевские, или логические, типы – TRUE, FALSE. Символьные типы – запоминаются с помощью цифрового кодирования. Массивы (array, dimension), структурированные типы данных – однородное множество данных, в котором каждый элемент идентифицируется его положением по отношению к первому элементу. Все языки имеют три типа выражений. Арифметические выражения задают порядок действия над элементами данных и состоят из операндов, круглых скобок и знаков операций, традиционных для всех языков +, -, *,/,** или ^. Логические выражения (булевские) состоят из операндов, логических операций и операций отношения (сравнение 2-х операндов). Символьные выражения (литеры) порождают значения, имеющие литерный тип данных. Разделители – элементы любого языка программирования, предназначенные для разделения отдельных эл-ов выражений внутри строки, для разделения строк, отдельных фрагментов программ и т.п. В качестве разделителей используют пробелы, точки, запятые, двоеточия, точки с запятой, разнообразные скобки и т.п. Операторы в алгоритмических языках могут быть: а) простыми (присваивания) б) ввода-вывода (read, write, print) в) структурными (условные операторы или операторы повтора).
См. предыдущий вопрос.
Императивное программирование — это парадигма программирования, которая, в отличие от декларативного программирования, описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. Развитие языков программирования происходит по ряду направлений. С одной стороны, происходит значительное расширение возможностей традиционных (императивных) языков программирования, таких как FORTRAN, Pascal, C, которые иногда называют языками высокого уровня, так как они не связаны с кодом конкретной машины, но, тем не менее, они ориентированы на так называемую «архитектуру фон Неймана» и связаны с кодированием предварительно разработанного математического алгоритма решаемой задачи. При реализации программы на компьютере требуются программные средства для перевода ее в код конкретного компьютера – трансляторы. Все популярные языки программирования используют латинский алфавит, ряд специальных символов, которые имеются на клавиатуре, а также английские слова и выражения (real, integer, if, then, else, do и т.п.), представляющие собой ключевые, или зарезервированные слова. Ключевые слова (Keyword) используются в Фортране и имеют свое функциональное предназначение, находясь, как правило, в неисполняемой части программы (описательной). Зарезервированные слова (reserved word) могут использоваться только в контексте, предусмотренном правилами (семантикой) языка. Ряд языков (например, ADA) могут содержать так называемые предопределенные слова, значения которых могут переопределяться пользователями. Программы оперируют с объектами данных. Объект данных – комбинация данных, атрибутов, описывающих их свойства, и методов, раскрывающих их поведение. Объектам данных, а также программам или отдельным их частям и т.п. сопоставляются имена (или идентификаторы), правила образования которых несколько различны в разных языках. Все типы данных разделяются на две категории – на константы, не изменяемые в процессе работы программы, оформленные по определенным правилам, и переменные. Все языки имеют три типа выражений: Арифметические выражениязадают порядок действий над элементами данных и состоят из операндов (константы, переменные и т.п.), круглых скобок и знаков операций, традиционных (с очень небольшими отличиями) для всех языков +, -, *, /. Для Фортрана и Бейсика в стандарте предусмотрены знаки возведения в степень – **, ^. Арифметические операции могут быть унарными (unary), содержащими один операнд – U**2, бинарными (binary), содержащими два операнда – a + b, и тернарными (ternary, три операнда) в языках С, С++ и Java. Логические выражения (булевские) состоят из операндов (констант, переменных, элементов массивов и т.п.), логических операций (not, and, or и т.п.) и операций отношения. Операции отношения выполняют сравнение двух операндов, а с помощью логических операций составляются более сложные логические выражения. Результатом выполнения логических выражений являются значения True или False. Символьные выражения (литерные) порождают значения, имеющие литерный тип данных. Разделители – элементы любого языка программирования, предназначенные для разделения отдельных элементов выражений внутри строки, для разделения строк, отдельных фрагментов программ и т.п. В качестве разделителей используются пробелы, точки, запятые, двоеточия, точки с запятой, разнообразные скобки и т.п. Операторы в алгоритмических языках могут быть: а) простыми (наиболее характерным оператором этого вида является оператор присваивания, он предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, идентификатор которой расположен в левой части); б) ввода-вывода, в качестве которых наиболее часто используются термины read, write, print; в) структурными, или составными, которые представляют собой структуры, построенные из других операторов по строго определенным правилам (к таким операторам относятся условные операторы и операторы повтора). Условные операторы и циклы: ( .eq.( =) ; .ne.(<>) ; .gt.(>) .lt.). В основе создаваемых языков, как правило, лежит некоторая основополагающая идея или, как говорят теоретики программирования, парадигма.
Операторы в алгоритмических языках могут быть: а) простыми (наиболее характерным оператором этого вида является оператор присваивания, он предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, идентификатор которой расположен в левой части); б) ввода-вывода, в качестве которых наиболее часто используются термины read, write, print; в) структурными, или составными, которые представляют собой структуры, построенные из других операторов по строго определенным правилам (к таким операторам относятся условные операторы и операторы повтора). На рисунке представлены разновидности структурных операторов (на примере Паскаля).
Основная причина, по которой разрабатываемое ПО разбивается на модули, это борьба со сложностью ПО. Модульный стиль программирования заключается в том, что алгоритм любой исходной задачи представляется как композиция алгоритмов простых подзадач, последовательно выделенных из исходной задачи. Каждая подзадача может быть реализована с помощью функций и процедур или с помощью модулей. Принципы модульного программирования позволяют получать программные комплексы минимальной сложности. Принципы: а) усиление внутренних связей в каждом модуле (иначе принцип называется повышением прочности модуля); б) ослабление взаимосвязи между модулями (иначе этот принцип называется ослаблением сцепления модулей). В модуле определяются типы, данные, процедуры (подпрограммы subroutine, function), интерфейсы. Структура модуля и пример: MODULE имя [определения] ... [CONTAINS процедуры модуля] END [MODULE [имя]] MODULE global REAL, DIMENSION(100) :: a, b, c INTEGER :: list(100) LOGICAL :: test END MODULE global Схема структуры модуля показывает, что все содержащиеся в модуле процедуры (подпрограммы и функции) размещаются между ключевыми операторами CONTAINS и END MODULE. Пример модуля cartesian с процедурой swap: MODULE cartesian TYPE point REAL :: x, y END TYPE point CONTAINS SUBROUTINE swap( p1, p2 ) TYPE(point), INTENT(INOUT):: p1, p2 TYPE(point) :: tmp tmp = p1 p1 = p2 p2 = tmp END SUBROUTINE swap END MODULE cartesian В этом модуле дается описание типа pointкак структуры, содержащей два поля x, yтипаREAL, а также процедура swap с двумя параметрами p1, p2, из которых каждый описан имеющим тип pointи атрибут INTENT(вид параметра) со значением INOUT(входной IN и выходной OUT одновременно, или изменяемый). Тип pointзадан и для локальной переменнойtmp. Символом :: отделяется перечисление свойств переменных от списка переменных. Использование cartesian. Использование описаний и процедур модуля должно идти после объявления о намерении использовать модуль (оператор USE) виспользующей процедуре. PROGRAM graph USE cartesian TYPE(point) :: first, last ... CALL swap( first, last) ... END PROGRAM graph Две разновидности модулей: первый модуль – подпрограмма функции, которая определяется следующим образом: t FUNCTION f(a1,a2…an), где t – тип функции: Integer, Real, Double Precision, Complex, Logical; по умолчанию Real или Integer, определяется первой буквой имени функции; FUNCTION – ключевое слово; f – имя функции; a1,a2, …, an – формальные параметры. Структура: FUNCTION Name(a1, a2, …, an) исполнимая часть Name=Result Return End После выполнения основной (исполнимой) части имени функции присваивается значение полученного результата ее работы (Result). Оператор Return передает результат в вызывающую программу (End –завершение текста подпрограммы при трансляции). Второй вид модулей универсального назначения, в Фортране называется SUBROUTINE, в Паскале – PROCEDURE (в отличие от SUBROUTINE подпрограмма PROCEDURE является внутренним программным модулем, доступ к которому возможен только из самой вызывающей программы, в состав которой он входит). В языке С, хотя все модули называются функциями, имеется два особых вида таких модулей, вызываемых из главной программы (main) с возможностями SUBROUTINE и PROCEDURE. В подпрограммах типа SUBROUTINE снимается ограничение подпрограммы функции, которая обеспечивает единственный результат, присваиваемый имени функции. Это вызвано тем, что ряд задач связан с необходимостью получения большего количества выходных результатов (например, графические процедуры, матричные вычисления, решения систем линейных уравнений, дифференциальных уравнений и т.п.). Программа SUBROUTINE оформляется следующим образом: SUBROUTINE S(a1,a2, …, an) Тело подпрограммы Исполнительная часть RETURN END где SUBROUTINE – ключевое слово; S – имя подпрограммы (не имеет типа и никак не связано с входными и выходными параметрами); a1,a2, …, an – формальные параметры, используемые при работе подпрограммы, включая и выходные параметры (результаты вычислений). Формальные и фактические параметры должны быть согласованы между собой (так же, как и в подпрограмме функции) по типу, количеству и порядку следования. Естественно выходные (вычисляемые) параметры фигурируют в главной программе только в виде имен (не имеющих значений до начала работы модуля). RETURN и END – выполняют те же функции, что и в подпрограмме функции.
Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. В соответствии с данной методологией: 1. Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций: последовательное исполнение (следование) — однократное выполнение операций в том порядке, в котором они записаны в тексте программы; ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия; цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла). 2. Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т.н. подпрограмм (процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы 3. Разработка программы ведётся пошагово, методом «сверху вниз». Перечислим некоторые достоинства структурного программирования: 1. Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и облегчает понимание её другими разработчиками. 2. В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные — дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (сама программа – блок-схема). 3. Сильно упрощается процесс тестирования и отладки структурированных программ. Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственного усложнения программного обеспечения. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ. Наиболее сильной критике со стороны разработчиков структурного подхода к программированию подвергся оператор GOTO (оператор безусловного перехода), имевшийся тогда почти во всех языках программирования. Неправильное и необдуманное использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ, по тексту которых практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
ООП — подход к программированию, в котором основными концепциями являются понятия объектов и классов Абстракция процесса и данных. Объекты представляют собою упрощенное, идеализированное описание реальных сущностей предметной области. Если соответствующие модели адекватны решаемой задаче, то работать с ними оказывается намного удобнее, чем с низкоуровневым описанием всех возможных свойств и реакций объекта. Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка и добавляя, при необходимости, новые свойства и методы. Набор классов, связанных отношением наследования, называют иерархией. Наследование призвано отобразить такое свойство реального мира, как иерархичность. Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода.
Машинно–независимые языки – это средство описания алгоритмов решения задач и информации, подлежащей обработке. Они удобны в использовании для широкого круга пользователей и не требуют от них знания особенностей организации функционирования ЭВМ и вычислительных систем. Подобные языки получили название высокоуровневых языков программирования. Программы, составляемые на таких языках, представляют собой последовательности операторов, структурированные согласно правилам рассматривания языка (задачи, сегменты, блоки и т.д.). Операторы языка описывают действия, которые должна выполнять система после трансляции программы на машинный язык. Машинно-независимые языки можно разбить на: 1. Проблемно–ориентированные языки. С расширением областей применения вычислительной техники возникла необходимость формализовать представление постановки и решение новых классов задач. Необходимо было создать такие языки программирования, которые, используя в данной области обозначения и терминологию, позволили бы описывать требуемые алгоритмы решения для поставленных задач, ими стали проблемно–ориентированные языки. Эти языки, ориентированные на решение определенных проблем, должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. Проблемных языков очень много, например: |