48. Структурная схема персонального компьютера. Канал связи Â Языки и программирование
Программы для ЭВМ записываются по определенным правилам на каком-нибудь из языков программирования. Человек пишет программу, которую, как правило, машина не может сразу прочитать и выполнить. Перед тем, как выполнить программу, она должна быть записана в двоичном коде в соответствии с командами, понятными машине. Такое преобразование выполняется специальной программой-переводчиком, или транслятором. С точки зрения транслирования языки программирования можно разделить на три группы.
Машинные языки. В таких языках команды непосредственно записываются в машинных (двоичных) кодах. В зависимости от вычислительной системы и типа команды машинная команда занимает от двух до шести байтов памяти. Обычно она состоит из кода операции и адресной части. Код операции указывает вид выполняемого действия. Адресная часть обычно содержит два адреса. Они соответствуют номерам ячеек памяти, в которых расположены операнды. Составление программ в машинных кодах представляет собой очень трудоемкую работу и в настоящее время практически не используется. Для машинных языков по сути транслятор не нужен.
Машинно-ориентированные языки. Программу, написанную на машинно-ориентированном или проблемно - ориентированном языке, называют Исходной программой. Программу, переведенную на машинный язык, т. е. представленную в кодах ЭВМ, называют Объектной программой.
Коды операций машинно – ориентированного языка представляются легко запоминаемы сокращениями (мнемониками). Например, оператор суммирования кодируется мнемоникой ADD (addition), операции пересылки содержимого из одной ячейки памяти в другую – MOV (move). Местонахождение операндов (источников и приемников) указывается при помощи символических адресов. Символический адрес обозначают именем. Имя связано в программе с ячейкой памяти. Имена выбираются произвольно в рамках определенных правил.
Каждый оператор исходной программы, составленный на машинно-ориентированном языке, соответствует одной машинной команде в объектной программе. Трансляторы в машинно-ориентированных языках называют Ассемблерами. Они производят трансляцию «один в один». При этом символические адреса заменяются действительными, а мнемонические коды операций – фактическими. Использование машинно-ориентированного языка по сравнению с проблемно - ориентированным увеличивает затраты времени на программирование в несколько раз. Однако программы, написанные на машинно-ориентированном языке, примерно во столько же раз эффективнее по затратам памяти и времени счета.
Проблемно-ориентированные языки. Эти языки мало зависят от свойств конкретной ЭВМ и обычно просты в изучении. Их структура ориентирована на определенный круг задач. Например, язык Java ориентирован на оформление Web – страниц в Интернете, язык Бейсик – для диалоговых программ, язык Паскаль – для обучения основам написания структурированных программ.
Трансляция программ, написанных на любом проблемно – ориентированном языке, осуществляется по принципу «один ко многим», поскольку любая команда здесь преобразуется в несколько машинных команд. Такие языки называют языками высокого уровня, в отличие от машинно-ориентированных языков, которые называют языками низкого уровня.
Трансляторы для языков высокого уровня называют также Компиляторами. Как правило, исходная программа компилируется целиком в объектную программу, которую после обработки редактором связей можно запускать на выполнение.
Однако есть одна разновидность трансляторов, которые преобразуют в машинный код не всю программу сразу, а только отдельную команду, которую сразу же запускают на выполнение, после чего происходит переход к обработке следующей команды. При этом объектная программа не создается. Такие трансляторы называются Интерпретаторами. Примером интерпретирующего языка является Бейсик.
Логическая схема программы является графическим представлением структурных признаков программы, выраженным при помощи условных обозначений (блоков), содержащих некоторый текст, и ориентированных линий.
Логическую схему программы иногда называют блок-схемой или структурной схемой. Она составляется перед программированием задачи. Логическая схема нагляднее самой программы. Поэтому ошибки значительно легче найти на схеме, чем в программе. Другое преимущество логической схемы состоит в том, что она может быть реализована в виде, не зависящем от языка программирования.
Обычно блоки рисуют от руки. Около каждого блока могут быть помещены пояснения. Содержание текста в блоке не стандартизировано и зависит, например, от того, должна ли схема давать только общее представление о программе или подробно описывать ее структуру с ориентацией на определенный язык программирования. При решении сложных задач обычно рисуют несколько логических схем с различным уровнем детализации. Каждый оператор будущей программы отражать в схеме не следует.
Из рассмотренных блоков можно собирать различные структуры. Основные понятия и правила построения структур не зависят от конкретного содержания программы. Важным этапом при программировании является абстрагирование от содержания соответствующей задачи и определение структуры программы. Можно показать, что схема любой программы образуется только из трех структур: последовательности, разветвления и цикла.
Если часть программы не содержит разветвлений, то она называется последовательностью операторов. Если после проверки некоторые условия пути расходятся, а затем где-то сходятся, то возникает разветвление. Каждый путь называется веткой. Если некоторая часть программы выполняется многократно и после проверки некоторого условия осуществляется выход из нее, то такую часть называют циклом.
На рисунке приведен цикл общего вида.
Такой цикл не имеет особого названия. К построению такого цикла в программах прибегают редко. Обычно программы составляют так, чтобы в теле цикла присутствовала только одна из двух последовательностей операторов – либо верхняя, либо нижняя. Если разветвление стоит в конце циклического участка, то говорят о цикле с постусловием (сначала выполнить, а затем проверить условие); этот цикл выполняется один или более раз. Если отсутствует верхняя группа операторов, то говорят о цикле с предусловием (сначала условие, а затем выполнение); этот цикл выполняется нуль или более раз, поскольку при невыполнении условия цикла цикл не может выполниться ни разу. В языках программирования используется еще один тип цикла, в котором число повторений известно до первого прохождения; такой цикл называется счетным. В счетном цикле есть параметр цикла. Начальное и конечное значения параметра, а также величина шага его изменения должны быть известны перед первым прохождением циклического участка.
Логическая схема счетного цикла имеет вид:
Здесь N – верхняя граница параметра цикла, I – параметр цикла, i1– начальное значение параметра цикла, di – шаг цикла.
Этот же цикл в обычных обозначениях имеет вид:
Такой цикл действует следующим образом.
Сначала параметр цикла получает начальное значение, которое сравнивается с конечным. Если конечное значение не достигнуто, происходит вход в тело цикла и его выполнение, а затем значение параметра увеличивается на величину шага цикла. После этого идет проверка на достижение верхней границы и, если она не достигнута, выполнение последовательности операторов повторяется. В случае достижения верхнего значения параметром цикла происходит выход из цикла.
Теперь рассмотрим несколько примеров типичных вычислительных алгоритмов.
Пример. Упорядочение трех чисел. В ячейках памяти с символическими адресами А, В и С записаны три числа. Их необходимо упорядочить так, чтобы по окончании работы программы в ячейке А находилось самое маленькое число, в ячейке В – среднее, а в ячейке С - наибольшее.
Основная идея состоит в том, что в начале сравниваются значения переменных А и В, затем А и С и, наконец, В и С. Если два числа расположены правильно, т. е. удовлетворяют поставленному условию, то проводится следующее сравнение. В противном случае перед следующим сравнением числа меняются местами. Обмен местами производится специальной подпрограммой (процедурой). Для обмена необходима вспомогательная ячейка с именем Н.
С точки зрения структурного программирования логическая схема данной программы состоит из последовательности пяти блоков: блока ввода, трех блоков обмена и блока вывода. Если необходимо упорядочить четыре числа, то необходимо уже шесть перестановок. В общем случае при n числах необходимо Перестановок. Поэтому алгоритм, который рассматривается в данном примере, не может решить общую задачу упорядочивания. В данном случае логическая схема имеет вид:
Логическая схема процедуры обмена содержимого двух ячеек памяти с символическими именами X, Y имеет вид:
ПРОЦЕДУРА ОБМЕН X, Y
Текст программы на языке Паскаль:
Program Ordering;
Var
a, b, c: Real;
Procedure Obmen (var x, y: Real);{ заголовок }
{ процедуры обмена}
Var
h: Real;
Begin
h:=x; { обмен содержимым}
x:=y; { ячеек }
y:=h {памяти }
End; { конец процедуры обмена}
Begin { начало основной программы}
readln (a, b,c); { ввод чисел a, b,c}
if Then obmen (a, b); {проверка }
if Then obmen (a, c); {выполнение }
if then obmen (b, c); {условий }
writeln (a, b,c) {вывод результатов}
End.
Пример. Сумма произведений. В самых разных задачах математики и статистической обработки данных часто возникает необходимость образования суммы произведений
При произвольном количестве числовых пар . Необходимо подсчитать сумму и количество слагаемых, а также вывести рассчитанные значения.
Обозначим текущие вводимые значения пар чисел буквами А и В. Здесь следует приравнять нулю содержимое ячеек памяти, предназначенных для подсчета текущего значения суммы SUM и количества N введенных пар чисел. Далее должна быть введена первая пара чисел. Таким образом инициализируются переменные А и В. В программе достаточно двух ячеек А и В для хранения очередной пары.
Сразу после ввода следует произвести опрос на конец набора данных. Если он достигнут, то необходимо вывести сумму и количество слагаемых. Далее следует выйти на конец программы.
Центральным оператором в программе является оператор накопления суммы произведений в теле цикла: SUM= SUM + A*B. Он прибавляет очередное слагаемое к предыдущему содержимому той ячейки памяти, в которой находится текущая сумма. Необходимо еще увеличить на единицу показания счетчика. После этого можно вернуться к вводу следующей пары чисел. Логическая схема следующий вид:
Текст программы на Паскале:
Program Summa;
Var
n: Integer; a, b, sum: Real;
Begin {начало программы}
n:=0; {инициализация}
sum:=0; {переменных}
read (a, b); {ввод первой пары чисел}
while not eof {начало цикла по условию}
Begin
sum:= sum+a*b;
n:=n+1;
read (a, b) {ввод очередной пары чисел}
End;
writeln (‘сумма=’,sum,’ пар чисел-‘,n)
End.
< Предыдущая | Следующая > |
---|