Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-20_enzhi.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
62.37 Кб
Скачать

1)Алгори́тм — набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное число действий.

Алгоритм обладает следующими свойствами:

1. Дискретность. Это свойство состоит в том, что алгоритм должен представлять процесс решения задачи как последовательное выполнение простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, т.е. преобразование исходных данных в результат осуществляется во времени дискретно.

2. Определенность. Каждое правило алгоритма должно быть четким, однозначным.

3. Результативность. Алгоритм должен приводить к решению за конечное число шагов.

4. Массовость. Алгоритм решения задачи разрабатывается в общем виде, т.е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными.

5. Правильность. Алгоритм правильный, если его выполнение дает правильные результаты решения поставленной задачи.

2) Существует четыре основных способа записи алгоритмов. Выбор способа зависит от разработчика или от исполнителя. Понятно, что алгоритм формирования таблицы умножения на 3, записанный учебной алгоритмическом языке или языке программирования, будет непонятным для третьеклассника так же, как алгоритм, записанный нашим родным языком или приготовленный в виде схемы, непонятный для компьютера. Основные способы записи алгоритмов: • словесный (родном языке); • с помощью схем (графический); • языком псевдокоде; • языком программирования

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

3)    Базовые структуры алгоритмов — это определенный набор блоков и стандартных способов их соединения для выполнения типичных последовательностей действий.

К основным структурам относятся следующие:

    • линейные

    • разветвляющиеся

    • циклические

4) Метод нисходящего проектирования программ основан на идее уровней абстракции, которые становятся уровнями модулей в разрабатываемой программе. На этапе проектирования строится схема иерархии, которая изображает эти уровни и позволяется сконцентрироваться сначала на том, что надо сделать  в программе, затем разрабатывать решение. При этом методе проектирования исходная задача, подлежащая решению, делится на ряд подзадач, которые подчиняются главной задаче. Это разбиение называют декомпозицией. Далее эти задачи делятся еще на более мелкие и т.д. до тех пор, пока не получатся задачи,  для решения которых требуются небольшие модули 3-5 строк. Такой метод позволяет упростить решение сложных задач. Паскаль имеет различные средства для деления программы на части. На верхнем уровне деления (больших задач) – это модули, на нижнем уровне (элементарных подзадач) – это процедуры и функции.

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

 

Описание процедур

Процедуры описываются в специальном разделе описательной части программы вслед за разделом описания переменных. Любая процедура аналогично программе состоит из заголовка и тела.

Заголовок процедуры:

                        procedure <имя> (<список формальных параметров>)

·        procedure – это служебное слово,

·        <имя процедуры> определяется в соответствии с общими правилами описания идентификатора,

·        <список формальных параметров> - это перечень имен для обозначения исходных данных и результатов работы процедуры с указанием их типов.

Допускается описание процедур, которые не содержат списка формальных параметров:

procedure <имя>

 

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

5) При восходящем синтаксическом анализе дерево вывода (разбора) входной цепочки строится снизу вверх, начиная с листьев и восходя к корню.

Рассмотрим КС-грамматику G1, правила вывода которой приведены на рис 4.1. Это однозначная грамматика, поэтому каждая выводимая цепочка имеет единственное дерево вывода и единственный правый вывод.

Например, правый вывод цепочки ((baa)b) имеет вид:

(AS(Ab) ((SaA)b) ((Saa)b) ((baa)b)

 

    Заметим, что на каждом шаге вывода подчеркнутый нетерминал заменяется правой частью правила, номер которого записан над знаком отношения непосредственного вывода.

Для получения разбора этой цепочки восходящим способом будем просматривать входную цепочку слева направо, отыскивая самую левую подцепочку, совпадающую с правой частью какого-либо правила вывода грамматики, после чего свернем найденную подцепочку к нетерминалу из левой части соответствующего правила. Эти действия будем повторять до тех пор, пока входная цепочка не свернется к начальному символу грамматики. Обозначив отношение непосредственной свертки через , получим следующую последовательность сверток для цепочки ((baa)b):

((baa)b) ((Saa)b ((SaA)b) (Ab) S ,

в которой каждое вхождение правой части используемого правила подчеркнуто. Очевидно, что получился правый разбор цепочки, являющийся обращением ее правого вывода.

В терминах деревьев восходящий анализ заключается в последовательном построении частичных деревьев из листьев и частичных деревьев, построенных на более ранних шагах. На рис. 4.2 приведена последовательность частичных деревьев, которые получаются при восходящем анализе цепочки ((baa)b).

Заметим, что свертку не всегда можно выполнить единственным cпособом. Например, в грамматике G2 (рис. 4.3) при восходящем анализе цепочки acbb символ c можно свернуть к символу S (правило (2)) или к символу В (правило (6)). Рис. 4.2

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

Большинство детерминированных восходящих анализаторов базируются на понятии основы.

 Определение.

Пусть S r* Aw r* xw – правый вывод в КС-грамматике G = < T, N, S, R >. Тогда вхождение в цепочку называетсяосновой цепочки w, а правило A – основывающим правилом этой цепочки:.

Таким образом, основывающее правило цепочки - это последнее правило, примененное в правом выводе цепочки, а основа цепочки - вхождение правой части этого правила в цепочку. Если грамматика однозначна, у цепочки может быть не более одного правого вывода, а следовательно, не более одной основы и одного основывающего правила.

Детерминированный восходящий анализ, базирующийся на поиске основы, можно реализовать с помощью расширенного ДМП-преобразователя, входная лента которого имеет концевой маркер.

 При построении расширенного ДМП-преобразователя реализующего восходящий метод синтаксического анализа, возникает проблема получения преобразователем дополнительной информации для выделения основы. Существующие алгоритмы восходящего анализа по-разному решают эту задачу. Алгоритм синтаксического анализа дляLR(k)-грамматик использует специальный магазинный алфавит и k первых символов непросмотренной части входной цепочки, а алгоритм анализа типа “перенос – свертка”, предназначенный для грамматик предшествования, использует символы, расположенные ниже символа из верхушки магазина.

6) На сегодняшний день самой популярной методикой программиро­вания является структурное программирование "сверху - вниз". Эта технология программирования представляет собой процесс пошагово разбиения алгоритма на все более мелкие части с целью получить такие элементы, для которых можно легко написать конкретные пред­писания.  Структурная алгоритмизация основывается на двух принципах:  1) последовательная детализация "сверху - вниз";  2) ограниченность базового набора структур для построения алгоритмов любой степени сложности.  Из принципов вытекают требования структурного программирования:  1) программа должна составляться мелкими шагами; таким об­разом, сложная задача разбивается на достаточно простые, легко воспринимаемые части;  2) логика программы должна опираться на минимальное число достаточно простых базовых управляющих структур.  Базовый набор структурной алгоритмизации содержит линейные, разветвляющиеся и циклические структуры.  Можно перечислить основные свойства и достоинства структур­ного программирования:  1) возможность преодоления барьера сложности программ;  2) возможность демонстрации правильности программ на раз­личных этапах решения задачи;  3) наглядность программ;  4) простота модификации (внесение изменений) программ;

Структурированный алгоритм – это алгоритм, представленный как следования и вложения базовых алгоритмических структур. У структурированного алгоритма статическое состояние (до актуализации алгоритма) и динамическое состояние (после актуализации) имеют одинаковую логическую структуру, которая прослеживается сверху вниз ("как читается, так и исполняется"). При структурированной разработке алгоритмов правильность алгоритма можно проследить на каждом этапе его построения и выполнения.

7) Модульное программирование предполагает создание для ка­ждого такого участка отдельной автономной программы — модуля. Специально созданная программа объединяет все модули в целое и управляет их работой.

Процесс последовательного построения алгоритма может выглядеть следующим образом: алгоритм сначала формули­руется в самых «крупных» командах, при этом в записи ал­горитма могут использоваться команды, выходящие за рамки возможностей исполнителя. Затем на каждом последующем этапе отдельные детали алгоритма уточняются, при этом не­доступные исполнителю команды записываются как вызов вспомогательных алгоритмов. После этого строятся вспомо­гательные алгоритмы. Процесс продолжается до тех пор, по­ка все алгоритмы не будут состоять из команд, понятных исполнителю. Такой способ построения алгоритма называет­ся методом последовательного уточнения алгоритма (поша­говой детализацией, нисходящей разработкой). Данный под ход к проектированию алгоритмов позволяет повысить каче­ство и надежность разрабатываемых программ. Кроме того, появляется возможность использовать отдельные модули программы при решении других задач.

8) Алгоритмическое обеспечение, созданное применительно к конкретному объекту управления, позволяет определить необходимые структуру и состав вычислительно-управляющего комплекса ( технического обеспечения АСУТП), выработать требования к быстродействию, объему памяти и надежности УВМ. На основе этих требований производится выбор УВМ и тем самым завершается решение поставленной задачи синтеза АСУТП

Сравнительные оценки алгоритмов

При использовании алгоритмов для решения практических задач мы сталкиваемся с проблемой рационального выбора алгоритма решения задачи. Решение проблемы выбора связано с построением системы сравнительных оценок, которая в свою очередь существенно опирается на формальную модель алгоритма.

Система обозначений в анализе алгоритмов

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

Классификация алгоритмов по виду функции трудоёмкости

В зависимости от влияния исходных данных на функцию трудоемкости алгоритма может быть предложена следующая классификация, имеющая практическое значение для анализа алгоритмов:

1.Количественно-зависимые по трудоемкости алгоритмы

2.Параметрически-зависимые по трудоемкости алгоритмы

3. Количественно-параметрические по трудоемкости алгоритмы

Асимптотический анализ функций

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

9) Память или время

Многие алгоритмы предлагают выбор между объёмом памяти и скоростью. Задачу можно решить быстро, использую большой объём памяти, или медленнее, занимая меньший объём.

Оценка порядка

При сравнении различных алгоритмов важно знать, как их сложность зависит от объёма входных данных.

Объёмная сложность рекурсивных алгоритмов

Для всех рекурсивных алгоритмов очень важно понятие объёмной сложности. При каждом вызове процедура запрашивает небольшой объём памяти, но этот объём может значительно увеличиваться в процессе рекурсивных вызовов. По этой причине всегда необходимо проводить хотя бы поверхностный анализ объёмной сложности рекурсивных процедур.

Средний и наихудший случай

Оценка сложности алгоритма до порядка является верхней границей сложности алгоритмов. Если программа имеет большой порядок сложности, это вовсе не означает, что алгоритм будет выполняться действительно долго. На некоторых наборах данных выполнение алгоритма занимает намного меньше времени, чем можно предположить на основе их сложности.

10)  Движущие силы эволюции ЯП    Чтобы понимать тенденции развития ЯП, нужно знать движущие силы их эволюции. Для выяснения этого вопроса будем рассматривать ЯП с различных точек зрения.     Во-первых, ЯП является инструментом программиста для создания программ. Для создания хороших программ нужны хорошие ЯП. Поэтому одной из движущих сил эволюции ЯП является стремление разработчиков к созданию более совершенных программ.     Во-вторых, процесс разработки программы можно сравнивать с промышленным производством, в котором определяющими факторами являются производительность труда коллектива программистов, себестоимость и качество программной продукции. Создаются различные технологии разработки программ (структурное, модульное, объектно-ориентированное программирование и другие), которые должны поддерживаться ЯП. Поэтому второй движущей силой эволюции ЯП является стремление к повышению эффективности процесса производства программной продукции.      В-третьих, программы можно рассматривать как аналог радиоэлектронных устройств обработки информации, в которых вместо радиодеталей и микросхем используют конструкции ЯП (элементная база программы). Как и электронные устройства, программы могут быть простейшими (уровня детекторного приемника) и очень сложными (уровня автоматической космической станции), при этом уровень инструмента должен соответствовать сложности изделия. Кроме того, человеку удобнее описывать моделируемый объект в терминах предметной области, а не языком цифр. Поэтому третьей движущей силой, ведущей к созданию новых, специализированных, ориентированных на проблемную область и более мощных ЯП, является увеличение разнообразия и повышение сложности задач, решаемых с помощью ЭВМ.     В-четвертых, совершенствование самих ЭВМ приводит к необходимости создания языков, максимально реализующих новые возможности ЭВМ.     В-пятых, программы являются интеллектуальным продуктом, который нужно накапливать и приумножать. Но программы, как и технические изделия, обладают свойством морального старения, одной из причин которого является их зависимость от типа ЭВМ и операционной среды. С моральным старением программ борются путем их модернизации и выпуска новых версий, однако при высокой динамике смены типов ЭВМ и операционных сред разработчики будут только тем и заниматься, что модернизировать старые программы. Поэтому, ЯП должен обеспечивать продолжительный жизненный цикл программы, и стремление к этому является пятой движущей силой развития ЯП. 

  История развития ЯП     Известно, что первым программистом была женщина - леди Ада Лавлейс, дочь лорда Байрона. Она разрабатывала программы для одного из первых механических компьютеров, созданного в начале XIX века английским ученым Чарльзом Беббиджом. Однако настоящее программирование в современном понимании началось с момента создания первой электронной вычислительной машины. Но теме не менее, имя этой замечательной женщины - Ada - присвоено одному из самых мощных современных ЯП, который является базовым для министерства обороны США.     Первые ЭВМ, созданные человеком, имели небольшой набор команд и встроенных типов данных, но позволяли выполнять программы на машинном языке. Машинный язык (МЯ) - единственный язык, понятный ЭВМ. Он реализуется аппаратно: каждую команду выполняет некоторое электронное устройство. Программа на МЯ представляет собой последовательность команд и данных, заданных в цифровом виде. Например, команда вида 1А12 в 16-ричном виде или 0001101000010010 в двоичном виде означает операцию сложения (1А) содержимого регистров 1 и 2.     Данные на МЯ представлены числами и символами. Операции являются элементарными и из них строится вся программа. Ввод программы в цифровом виде производился непосредственно в память с пульта ЭВМ либо с примитивных устройств ввода. Естественно, что процесс программирования был очень трудоемким, разобраться в программе даже автору было довольно сложно, а эффект от применения ЭВМ был довольно низким. Этот этап в развитии ЯП показал, что программирование является сложной проблемой, трудно поддающейся автоматизации, но именно программное обеспечение определяет в конечном счете эффективность применения ЭВМ. Поэтому на всех последующих этапах усилия направлялись на совершенствование интерфейса между программистом и ЭВМ - языка программирования.     Стремление программистов оперировать не цифрами, а символами, привело к созданию мнемонического языка программирования, который называют ассемблером, мнемокодом, автокодом. Этот язык имеет определенный синтаксис записи программ, в котором, в частности, цифровой код операции заменен мнемоническим кодом. Например, команда сложения записывается в виде AR 1,2 и означает сложение (Addition) типа регистр-регистр (Register) для регистров 1 и 2. Теперь программа имеет более удобочитаемую форму, но ее не понимает ЭВМ. Поэтому понадобилось создать специальную программу транслятор, который преобразует программу с языка ассемблера на МЯ. Эта проблема потребовала, в свою очередь, глубоких научных исследований и разработки различных теорий, например теорию формальных языков, которые легли в основу создания трансляторов. Практически любой класс ЭВМ имеет свой язык ассемблера. На сегодняшний день язык ассемблера используется для создания системных программ, использующих специфические аппаратные возможности данного класса ЭВМ.     Следующий этап характеризуется созданием языков высокого уровня (ЯВУ). Эти языки являются универсальными (на них можно создавать любые прикладные программы) и алгоритмически полными, имеют более широкий спектр типов данных и операций, поддерживают технологии программирования. На этих языках создается неисчислимое множество различных прикладных программ.     Принципиальными отличиями ЯВУ от языков низкого уровня являются:        · использование переменных;        · возможность записи сложных выражений;        · расширяемость типов данных за счет конструирования новых типов из базовых;        · расширяемость набора операций за счет подключения библиотек подпрограмм;        · слабая зависимость от типа ЭВМ.     С усложнением ЯП усложняются и трансляторы для них. Теперь в набор инструментов программиста, кроме транслятора, входит текстовый редактор для ввода текста программ, отладчик для устранения ошибок, библиотекарь для создания библиотек программных модулей и множество других служебных программ. Все вместе это называется системой программирования. Наиболее яркими представителями ЯВУ являются FORTRAN, PL/1, Pascal, C, Basic, Ada.     Может возникнуть вопрос: почему создано столько различных языков одного класса? Почему нельзя создать один язык на все случаи жизни? Ответ на этот вопрос может быть таким же, как и на вопрос о различных языках народов мира: так уж получилось. Каждый из разработчиков ЯВУ стремился создать самый лучший и самый универсальный язык, который позволял бы быстро получать самые эффективные, надежные и безошибочные программы. Однако в процессе этого поиска выяснилось, что дело не в самом языке, а в технологии его использования. Поэтому дальнейшее развитие языков стало определяться новыми технологиями программирования.     Одновременно с развитием универсальных ЯВУ стали развиваться проблемно-ориентированные ЯП, которые решали экономические задачи (COBOL), задачи реального времени (Modula-2, Ada), символьной обработки ( Snobol), моделирования (GPSS, Simula, SmallTalk), численно-аналитические задачи (Analitic) и другие. Эти специализированные языки позволяли более адекватно описывать объекты и явления реального мира, приближая язык программирования к языку специалиста в проблемной области.     Другим направлением развития ЯП является создание языков сверхвысокого уровня (ЯСВУ). На языке высокого уровня программист задает процедуру (алгоритм) получения результата по известным исходным данным, поэтому они называются процедурными ЯП. На ЯСВУ программист задает отношения между объектами в программе, например систему линейных уравнений, и определяет, что нужно найти, но не задает как получить результат. Такие языки еще называют непроцедурными, т.к. сама процедура поиска решения встроена в язык (в его интерпретатор). Такие языки используются, например, для решения задач искусственного интеллекта (Lisp, Prolog) и позволяют моделировать мыслительную деятельность человека в процессе поиска решений.     К непроцедурным языкам относят и языки запросов систем управления базами данных (QBE, SQL). 

11) МАШИННЫЙ ЯЗЫК, язык программирования для представления программ в форме, допускающей их непосредственную реализацию аппаратными средствами конкретной ЭВМ. Программа на машинном языке представляет собой последовательность машинных команд, поэтому иногда машинным языком называют систему команд ЭВМ. Перевод исходной программы, подлежащей выполнению на ЭВМ, осуществляется автоматически самой ЭВМ с помощью ассемблера.

Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, Java, Microsoft .NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских).

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

Двоичный язык - в настоящее время программистами не применяется Шестнадцатеричный язык-упрощение за счет представления четырех двоичных цифр одной шестнадцатеричной. Используется в качестве дополнения к языкам высокого уровня для программирования критичных к времени выполнения фрагментов алгоритмов. Язык Ассемблера - предназначен для представления в удобочитаемой символической форме программ, написанных на машинном языке. Язык Макроассемблера - расширение языка Ассемблера. Позволяет определять и использовать новые, более мощные команды. Язык программирования C- разработан в начале 70-х. Сочетает достоинства современных высокоуровневых языков (в части структур данных и управляющих структур) и возможность доступа  к аппаратным средствам машины на уровне языка Ассемблера. Однако синтаксис языка таков, что затрудняет программирование и понимание составленных программ. Язык Basic (Beginner’s All-purpose Symbolic Instruction Code-многоцелевой язык символических инструкций для начинающих). Разработан в 1964 г. для использования новичками. Первоначально работа велась только в режиме интерактивной (диалоговой) интерпретации. В смысле строгости и стройности является антиподом языка Pascal. Несмотря на это, Basic очень популярен, в особенности на ПК. Существует множество его диалектов, несовместимых между собой. Современные диалекты Basic’а весьма развиты и мало чем напоминают  своего предка. Язык Fortran (Formula Translator) разработан в 1956 г. Считается “рабочей лошадью” научных работников за счет своей “приспособленности” к ведению сложных вычислений и широко используется до настоящего времени, несмотря на свою ограниченность и ”корявость”. Язык Pascal разработан в 1970 г. Норбертом Винером, назван в честь французского математика Блеза Паскаля. В Паскале полностью реализована концепция структурного программирования не только путем упорядочения связей между фрагментами программы, но и за счет структуризации данных. Один из наиболее популярных языков программирования.  Язык  Modula-2 создан в 1979 г. также Норбертом Винером. По существу - развитие Паскаля. Его особенности состоят в высокой модульности программ и наличии средств описания параллельных процессов. Язык Ada разработан в 1979 г. по заказу Министерства обороны США для использования во встроенных системах с управляющими ЭВМ, что требует режима поддержки режима реального времени. Назван в честь Августы Ады Лавлейс (дочери Байрона), которая была ассистентом Чарльза Бэббиджа и по праву считается первым в мире программистом. Рассматривается как универсальный язык программирования. Данный язык вводит строгую дисциплину программирования, что препятствует написанию “плохих программ”. Несмотря на достоинства, программистов отталкивает его громоздкость Язык Logo разработан с целью обучения детей и используется в настоящее время. Отличается простотой, но весьма богатыми возможностями, среди которых процедуры, графические средства и т. д.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]