Программирование >>  Структурное программирование 

1 ... 129 130 131 [ 132 ] 133 134 135 ... 342


Пример2 Ячейка

Номер

Команда

+1009

(Прочитать А)

+1010

(Прочитать В)

+2009

(Загрузить А)

+3110

(Вычесть В)

+4107

(Передать управление в 07 при отрицательном результате)

+1109

(Печать А)

+4300

(Останов)

+1110

(Печать В)

+4300

(Останов)

+0000

(Переменная А)

+0000

(Переменная В)

Эта программа на ЯМП считывает два числа с клавиатуры, определяет и печатает большее значение. Заметим, что использование команды Ч-4107 как условной передачи управления очень похоже на оператор if в С++. Теперь напишите программы на ЯМП, которые выполняют следующие задачи:

a) Используйте цикл, управляемый меткой, для чтения 10 положительных чисел, вычисления их суммы и печати ее.

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

c) Прочитайте последовательность чисел, определите и напечатайте наибольшее из них. Первое прочитанное число указывает количество чисел, которое должно быть обработано.

5.19. (Программа, моделирующая компьютер) Может быть это покажется на первый взгляд нахальством, но в этой задаче вы должны будете построить свой собственный компьютер. Нет, вы не будете паять его из отдельных компонентов. Вы будете использовать мощную технику программного моделирования для создания программной модели Простотрона. Вы не будете разочарованы. Ваш программа, моделирующая Простотрон, будет играть роль этого компьютера и вы на самом деле сможете выполнять, проверять и отлаживать на нем программы на ЯМП, которые вы написали в упражнении 5.18.

Когда вы запустите свою программу, моделирующую Простотрон, она должна начать с печати:

*** Добро пожаловать в Простотрон! ***

*** Пожалуйста, вводите по одной команде (или слову *** *** данных)вашей программы. Я буду печатать номера *** *** ячеек и знак вопроса (?). После этого Вы можете *** ввести слово в эту ячейку. Введите метку -99999 *** в конце ввода прогргшмы. ***



+1009

+1010

+2009

+3110

+4107

+1109

+4300

+1110

+4300

+0000

+0000

-99999

Загрузка i

*** Начинается выполнение программы ***

Программа на ЯМП размещена (загружена) в массив memory. Теперь Простотрон выполняет вашу программу. Выполнение начинается с команды в ячейке 00 и, как в С++, продолжается последовательно, пока управление не будет передано другой части программы операцией передачи управления.

Используйте переменную acciunulator для представления регистра аккумулятора. Используйте переменную instructionCounter (счетчик команд), чтобы отслеживать ячейку памяти, которая содержит выполняемую команду. Используйте переменную operationCode (код операции), содержащую текущую выполняемую команду, т.е. две левые цифры в слове команды. Используйте переменную operand (операнд), содержащую номер ячейки памяти, с которой оперирует текущая команда. Таким образом, operand - это две крайние правые цифры выполняемой в данный момент команды. Не выполняйте команды непосредственно из памяти. Лучше передайте следующую команду, которая должна выполняться, из памяти в переменную по имени uistructionRegister (регистр команд). Затем отделите две цифры слева и поместите их в operationCode, отделите две цифры справа и поместите их в operand.

Когда Простотрон начнет выполнение, отдельные регистры содержат следующие начальные значения:

accumulator +0000

instructionCounter 00

instructionRegister +0000

operationCode 00

operand 00

Теперь рассмотрим в деталях выполнение первой команды ЯМП - +1009 расположенной в ячейке памяти 00. Это называется циклом выполнения команды.

InstructionCounter сообщает нам ячейку следующей команды, которая будет выполняться. Мы считываем содержимое этой ячейки из memory, используя оператор С++

instructionRegister = memory[instructionCounter];

Моделируйте память Простотрона одномерным массивом memory, содержащим 100 элементов. Теперь предположите, что программа работает, и давайте рассмотрим пример диалога, соответствующий программы примера 2 из упражнения 5.18:



Глава 5

Код операции и операнд извлекаются из регистра команд с помощью операторов

operationCode = instructionRegister / 100; operand = instructionRegister % 100;

Теперь Простотрон должен определить, какой код операции прочитан (говорят также записан, загружен и т.д.). Это делает структура switch, различающая 12 операций ЯМП.

В этой структуре switch моделируется выполнение команд ЯМП следующим образом (остальные команды мы оставляем читателю для самостоятельной разработки):

чтение: cin >> memory[operand];

загрузка: accumulator = memory[operand];

сложение: accumulator += memory [operand] ;

Различные команды передачи управления: их мы обсудим кратко позже.

останов: Эта команда печатает сообщение

*** Простотрон закончил работу ***

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

Продолжим рассмотрение выполнения первой команды нашей программы, а именно -И009 в ячейке 00. Как мы указывали, оператор switch моделирует это выполнением оператора С++

cin memory[operand] ;

Знак вопроса (?) должен отображаться на экране до того, как будет выполняться cin, в качестве приглашения пользователя к вводу. Простотрон ждет, когда пользователь напечатает значение и нажмет клавишу ввода Enter. После этого значение считывается в ячейку 09.

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

++instructionCounter;

Это завершает моделирование выполнения первой команды. Весь процесс (т.е. цикл выполнения команды) начинается заново со считывания следующей выполняемой команды.

Теперь рассмотрим, как моделируются команды передачи управления. Все, что нам нужно сделать, - это установить соответствующее значение в счетчике команд. Поэтому команда безусловной передачи управления (40) моделируется внутри switch следующим образом:

instructionCounter = operand;



1 ... 129 130 131 [ 132 ] 133 134 135 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика