Тема: Компьютер как формальный исполнитель алгоритмов (программ).

Алгоритмы решения разных задач должны быть выполнимы в той среде, где необходимо получить результат. В этой среде должен существовать объект, который будет выполнять алгоритм. Рассмотрим пример. Пете захотелось чаю. Он вскипятил в чайнике воду, положил в чашку пакетик заварки, налил туда кипяток, добавил две чайные ложки сахара, размешал их ложкой и с удовольствием выпил свой чай. Это алгоритм действий Пети.

В данном примере все указанные действия выполняет Петя, следовательно, он и есть тот объект, который выполняет алгоритм. Петя умеет и может выполнять действия, указанные в алгоритме. Он выполняет эти действия в указанном порядке. Объект, который выполняет алгоритм называют исполнителем.

Различают формальных и неформальных исполнителей. Формальный исполнитель одну и туже команду выполняет одинаково. Неформальный исполнитель может выполнять команду по-разному.

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

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

Среда исполнителя – условия, при которых возможно исполнение алгоритма.

Система команд исполнителя (СКИ) – перечень действий, который способен понять и выполнить исполнитель.

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

Режимы работы исполнителя – режим непосредственного и программного управления. Непосредственное управление – исполнитель ждёт команды от человека и каждую команду выполняет немедленно. Программное управление – исполнителю задаётся последовательность команд (программа), а затем исполняет команды в автоматическом режиме. Некоторые исполнители работает только в одном из режимов.

1. Основные алгоритмические структуры: следование, ветвление, цикл. Изображение алгоритмических структур на блок-схемах.

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

В настоящее время существует всего три базовых алгоритмических конструкции:

    1.          следование (линейный алгоритм);
    2.          ветвление (разветвляющийся алгоритм);
    3.          повторение (циклический алгоритм).

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

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

6.gif

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

7.gif

Рассмотрим основные структуры алгоритма.
     Команда следования состоит только из простых команд. На рисунке простые команды имеют условное обозначение S1 и S2. Из команд следования образуются линейные алгоритмы. Примером линейного алгоритма будет нахождение суммы двух чисел, введенных с клавиатуры.

8.gif

Команда ветвления - это составная команда алгоритма, в которой в зависимости от условия Р выполняется или одно S1, или другое S2 действие. Из команд следования и команд ветвления составляются разветвляющиеся алгоритмы (алгоритмы ветвления). Примером разветвляющегося алгоритма будет нахождение большего из двух чисел, введенных с клавиатуры.

9.gif

Команда ветвления может быть полной и неполной формы. Неполная форма команды ветвления используется тогда, когда необходимо выполнять действие S только в случае соблюдения условия P. Если условие P не соблюдается, то команда ветвления завершает свою работу без выполнения действия. Примером команды ветвления неполной формы будет уменьшение в два раза только четного числа.

q.gif

Команда повторения - это составная команда алгоритма, в которой в зависимости от условия Р возможно многократное выполнение действия S. Из команд следования и команд повторения составляются циклические алгоритмы (алгоритмы повторения). На рисунке представлена команда повторения с предусловием. Называется она так потому, что вначале проверяется условие, а уже затем выполняется действие. Причем действие выполняется, пока условие соблюдается. Пример циклического алгоритма может быть следующий. Пока с клавиатуры вводятся положительные числа, алгоритм выполняет нахождение их суммы. 
     Команда повторения с предусловием не является единственно возможной. Разновидностью команды повторения с предусловием является команда повторения с параметром. Она используется тогда, когда известно количество повторений действия. В блок-схеме команды повторения с параметром условие записывается не в ромбе, а в шестиугольнике. Примером циклического алгоритма с параметром будет нахождение суммы первых 20 натуральных чисел.

w.gif

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

Линейный алгоритм

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

Табл.5. Линейный алгоритм

e.gif

Разветвляющийся алгоритм

Приведем пример записи разветвляющегося алгоритма для нахождения наибольшего из двух чисел.

Табл.6. Разветвляющийся алгоритм

r.gif

Циклический алгоритм

Рассмотрим алгоритм нахождения суммы первых натуральных нечетных чисел до n. Представим запись алгоритма тремя способами: в виде блок-схемы, школьного алгоритмического языка и на языке пр

Табл.7. Циклический алгоритм программирования Pascal

t.gif 

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

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

Запишем алгоритм вычисления суммы первых n натуральных чисел. Для этого воспользуемся циклом с параметром, поскольку заранее известно сколько раз будет выполняться команда нахождения суммы. Во всех звеньях цепочки поменяем цикл "пока" на цикл "для" и приведем пример перевода алгоритма с языка блок-схем на школьный алгоритмический язык и на язык программирования Pascal.

Табл.8. Алгоритм вычисления суммы первых n натуральных чисел

y.gif

2. Представление о программировании. Структурированные типы величин: константы, переменные типы величин.

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

В настоящее время существует много различных языков программирования: Кобол, С, Фортран, Visual Basic, Pascal и др.

Язык программирования - формальная знаковая система, предназначенная для записи программ. Программа обычно представляет собой некоторый алгоритм в форме, понятной для исполнителя (например, компьютера). Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над этими данными при различных обстоятельствах.

Алфавит - фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на данном языке.

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

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

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

Система программирования - это программное обеспечение компьютера, предназначенное для разработки, отладки и исполнения программ, записанных на определенном языке программирования.

Система программирования предназначена для автоматизации разработки программного обеспечения. В состав системы программирования обязательно входят язык программирования, редактор для создания и исправления текстов программ и транслятор для перевода программ на язык машинных команд.

Трансляторы - компиляторы и интерпретаторы

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

011001010101010

111110001111100

101000010100101

........................... …

101010010101001

- совершенно неудобно.

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

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

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

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

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

Основы языка программирования.

Первая версия языка Паскаль была разработана швейцарским ученым Никлаусом Виртом в 1968 году. Первоначально язык предназначался для целей обучения, поскольку он является достаточно детерминированным, т.е. все подчиняется определенным правилам, исключений из которых не так много. Основные характеристики: относительно небольшое количество базовых понятий, простой синтаксис, быстрый компилятор для перевода исходных текстов в машинный код. В 1992 г. фирма Borland International выпустила два пакета, основанных на языке Паскаль: Borland Pascal 7.0 и Turbo Pascal 7.0.

Основные элементы языка программирования Паскаль.

Любой естественный язык строится из элементарных составляющих — букв, образующих алфавит языка. Буквы используются для построения слов, слова складываются в предложения, а предложения... Из предложений состоит любой текст — письмо, роман, секретное донесение. Всякий язык программирования организован примерно так же. Имеется алфавит языка, то есть набор символов, которые можно использовать в программе. Существуют зарезервированные слова, имеющие вполне определенный смысл и определенное назначение. Их нельзя изменять: любая неточность в написании таких слов является серьезной ошибкой. В отличие от естественных языков человеческого общения, в языках программирования можно вводить свои собственные слова и придавать этим словам свой собственный смысл. Небольшую программу можно уподобить письму или маленькому рассказу. Большой проект - это роман. Как и обычное письмо, программа может быть написана хорошим или плохим «слогом» (стилем), и чем лучше стиль, тем понятнее программа, тем меньше вероятность появления в ней ошибок.

Язык Турбо Паскаль состоит приблизительно из 80 зарезервированных слов и специальных символов. Алфавит языка составляют буквы латинского алфавита, цифры, а также специальные символы, такие, например, как +, -, _. Специальными символами языка являются и некоторые пары символов. Как уже отмечалось, зарезервированные слова в языке Паскаль могут применяться только по своему прямому назначению, то есть в качестве имен операторов, названий операций и т. д.

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

Переменная — это ячейка (или несколько ячеек) оперативной памяти компьютера. Такой ячейке присвоено определенное имя, ее содержимое может изменяться в ходе выполнения программы.

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

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

Описание переменной начинается с зарезервированного слова Var. Затем следует сама переменная, ставится двоеточие, тип переменной и точка с запятой.

Var

23: Ineger;

2,3: real;

…………..

Существуют следующие типы переменных:

1.         Integer (целые) – от -32 768 до +32 768.

2.         Real (вещественные) – значения могут быть как дробные так и вещественные.

3.         Boolean (логический) – True (истина), False (ложь).

4.         Char (символьный) – @, %, $  и т.д.

5.         String (строковый) – ‘доска’

Константа отличается от переменной тем, что ее значение фиксировано и не может быть изменено в ходе выполнения программы. Перед употреблением должна быть объявлена в разделе констант const. Определены два типа констант: истинные и типизированные.

Истинная константа - Она объявляется со значением. Ее тип неизвестен, поэтому ее значение в программе менять нельзя.

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

Пример: const: p:=3,14;

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

Операторы языка Паскаль бывают простыми и составными (структурными).

Простые:

          Присваивание (p:=3,14);

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

Goto T1;

…………

………….

…………

T1:=45/12;

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

          Операторы вызова.

3. Массивы.

Массивы - это совокупности однотипных элементов. Характеризуются они следующим:

-        каждый компонент массива может быть явно обозначен и к нему имеется прямой доступ;

-        число компонент массива определяется при его описании и в дальнейшем не меняется.

Для обозначения компонент массива используется имя переменной-массива и так называемые индексы, которые обычно указывают желаемый элемент. Тип индекса может быть только порядковым (кроме longint). Чаще всего используется интервальный тип (диапазон).

Описание типа массива задается следующим образом:

type

   имя типа = array[ список индексов ] of тип

Здесь имя типа - правильный идентификатор; список индексов - список одного или нескольких индексных типов, разделенных запятыми; тип - любой тип данных.

Вводить и выводить массивы можно только поэлементно.

Пример 1. Ввод и вывод одномерного массива.

const

   n = 5;

type

   mas = array[1..n] of integer;

var

   a: mas;

   i: byte;

begin

   writeln('введите элементы массива');

   for i:=1 to n do readln(a[i]);

   writeln('вывод элементов массива:');

   for i:=1 to n do write(a[i]:5);

end.

Определить переменную как массив можно и непосредственно при ее описании, без предварительного описания типа массива, например:

var a,b,c: array[1..10] of integer;

Если массивы a и b описаны как:

var

   a = array[1..5] of integer;

   b = array[1..5] of integer;

то переменные a и b считаются разных типов. Для обеспечения совместимости применяйте описание переменных через предварительное описание типа.

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

Вместе с тем, над массивами не определены операции отношения. Сравнивать два массива можно только поэлементно.

Так как тип, идущий за ключевым словом of в описании массива, - любой тип Турбо Паскаль, то он может быть и другим массивом. Например:

type

   mas = array[1..5] of array[1..10] of integer;

Такую запись можно заменить более компактной:

type

   mas = array[1..5, 1..10] of integer;

Таким образом возникает понятие многомерного массива. Глубина вложенности массивов произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничена, однако не может быть более 65520 байт.

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

for i:=1 to m do

for j:=1 to n do a[i,j]:=random(10);

Для "красивого" вывода матрицы на экран используется такой цикл:

for i:=1 to m do begin

   for j:=1 to n do write(a[i,j]:5);

   writeln;

end;.