Взаимодействие основных частей ЭВМ при выполнении программы

Министерство образования РФ



Хабаровский государственный технический университет





Институт (факультет) Институт информационных технологий

Кафедра Компьютерное проектирование и сертификация машин

Специальность Металлорежущие станки и инструменты



















Взаимодействие основных частей ЭВМ при выполнении программы





Пояснительная записка к курсовой работе



По дисциплине «Информатика»



КР. 991096.00.00.00 ПЗ











Выполнил:

студент группы МРС-91

Егоров О.В.

зачетная книжка № 991096

Руководитель работы:

доцент

Кетов А.В.













Хабаровск 2000





Задание на курсовую работу

Разработать обучающую программу на тему "Взаимодействие основных частей ЭВМ при выполнении программы".

Руководитель:

Реферат

Пояснительная записка к курсовой работе содержит 22 листа формата А4, 2 рисунка, 1 использованный источник, 1 приложение. 

ПРОГРАММА ДЛЯ ЭВМ, ПАСКАЛЬ, АЛГОРИТМИЧЕСКИЙ ЯЗЫК, ПРОГРАММИРОВАНИЕ, ИНФОРМАТИКА. 

Целью курсовой работы является разработка программы для ЭВМ средней сложности с удобным пользовательским интерфейсом. 

Это достигается путем проектирования, разработки и отладки на языке Паскаль обучающей  программы на тему: «Взаимодействие основных частей ЭВМ при выполнении программы».

Приведена блок-схема процедуры для вывода главного меню. В приложении приведен исходный текст программы на Turbo Pascal.



Содержание

	Введение	3

	Блок – схема процедуры «MainMenu» (вывода на экран главного меню)	3

	Описание программы	4

	1. Назначение	4

	2. Запуск программы	4

	3. Работа с программой	4

	3.1 Выбор пункта меню «Обучение»	4

	3.2 Выбор пункта меню «Проверка знаний»	5

	Заключение	5

	Список использованных источников	5

	Приложение А. Исходный текст программы	6

































КР.991096.00.00.00 ПЗ













Изм.

Лист

№ докум.

Подп.

Дата



Разраб.

Егоров О.В.





ВЗАИМОДЕЙСТВИЕ

ОСНОВНЫХ

ЧАСТЕЙ ЭВМ

ПРИ ВЫПОЛНЕНИИ

ПРОГРАММЫ

Пояснительная записка

Лит.

Лист

Листов

Провер.

Кетов А.В.









У



2

22

Принял

Кетов А.В.







ХГТУ

Кафедра КПСМ

МРС-91













Утв.





























C := ReadKey

НачалоВведение

Целью курсовой работы является разработка программы для ЭВМ средней сложности с удобным интерфейсом на языке программирования Паскаль.

Блок – схема процедуры «MainMenu»                                           (вывода на экран главного меню)









Да

If c := #0





C := ReadKey

ExtentedKey :=True





Да

If ExtentedKey





If c := #72

Нет

Да



K := K - 1





If c := #80

Нет

Да





K := K + 1





If C := #13

Да



If K := 1



Да

Нет



Play





If K := 2

Нет

Да





TestMode



If K := 1

Нет

Да



If K < 1

Да



Exit



K := 3





If K > 3

Да



K := 1





If C := #27

Нет

Да







Конец















КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



3







Описание программы

1. Назначение

Данная программа показывает и обучает, как взаимодействуют основные части ЭВМ при выполнении программы. 

Программа написана на языке Turbo Pascal [1] для персональных ЭВМ, совместимых с IBM PC, и операционной системой MS DOS.

2. Запуск программы

Находясь в каталоге с программой, в ответ на подсказку DOS набрать computer.exe и нажать клавишу Enter. Выход из программы по нажатию клавиши Esc.

3. Работа с программой

После запуска программы на экране появляется главное меню выбора:



Ваш Выбор:

Обучение

Проверка знаний

Esc – Выход



















КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



4



Выбор пунктов меню производится с помощью курсорных клавиш Вверх, Вниз и нажатия клавиши Enter для запуска нужной части программы. Для выхода из программы достаточно нажать клавишу Esc или выбрать в меню опцию с надписью «Esc – Выход».

3.1 Выбор пункта меню «Обучение»

Обучающая часть программы имеет вид:





















Внизу экрана находятся функциональные клавиши 

Помощь (F1), Назад (), Вперед (), Выход (Esc): 

Помощь (F1) – получить справку,

Назад () – вернуться назад,

Вперед () – вывести следующую информацию,

Выход (Esc) – выйти из обучения.








3.2 Выбор пункта меню «Проверка знаний»

Тест имеет вид:



Выбор ответа производится клавишами 1, 2 и 3. При необходимости выйти можно нажать клавишу Esc и выйти из теста. 



Вопрос # {номер вопроса}. {Текст вопроса}

{Вариант ответа №1}.

{Вариант ответа №2}.

{Вариант ответа №3}.















Ваш результат:

	Всего вопросов 	5

	Количество правильных ответов	#

	Оценка	#По окончании теста выводится окно итога, которое имеет вид:











Заключение

В курсовой работе была спроектирована, разработана и отлажена на языке программирования Паскаль обучающая программа на тему: «Взаимодействие основных частей ЭВМ при выполнении программы».

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

Список использованных источников

1. Марченко А.И. Программирование в среде Turbo Pascal 7.0. Учебное пособие. – К.: ВЕК+, М.: ДЕСС, 1999. - 496 с.









































КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



5







Приложение А. Исходный текст программы

program LEAN_Ecm;



uses Crt, Graph, Sm_Graph, Sm_Const;

{-------------------} {uses}



var

  I: Integer;

  FuncKeyWindow: array [1..3] of TImage;  {Массив картинок функциональных клавиш}

  Temp: array [1..2] of TImage;           {Массив вспомогательный}

{-------------------} {var}



procedure BildWin;

const

  TxtCol: Word = Red;	     {Цвет текста}

  RTACol: Word = Yellow;     {Цвет прямоугольников}

  BACCol: Word = Black;      {Цвет фона}

  {Рисуем главную картинку}

begin

  SetBkColor(BACCol);

  SetColor(BRDCol);

  Rectangle(X0, Y0, X0 + 385, Y0 + 300);

  Rectangle(X0, Y0 + 305, GetMaxX - X0, YS - 5);

  SetColor(MemCol);

   {Ячейки памяти}

  SetLineStyle(1, 0, 0);

  for I := 1 to 4 do {Ячейки памяти}

    begin

      Line(X0 + 130 + 16 * I, Y0 + 120, X0 + 130 + 16 * I, Y0 + 200);

      Line(X0 + 130, Y0 + 120 + 16 * I, X0 + 210, Y0 + 120 + 16 * I)

    end;

   {CPU}

  SetColor(CPUCol);

  MoveTo(X0 + 83, Y0 + 203); {0}

  LineTo(X0 +  7, Y0 + 203); {1}

  LineTo(X0 +  7, Y0 + 117); {2}

  LineTo(X0 + 40, Y0 + 117); {3}

  LineTo(X0 + 40, Y0 + 45);  {4}

  LineTo(X0 + 127, Y0 + 45); {5}

  LineTo(X0 + 127, Y0 + 27); {6}

  LineTo(X0 + 213, Y0 + 27); {7}

  LineTo(X0 + 213, Y0 + 73); {8}

  LineTo(X0 + 127, Y0 + 73); {9}

  LineTo(X0 + 127, Y0 + 55); {10}

  LineTo(X0 + 50, Y0 + 55);  {11}

  LineTo(X0 + 50, Y0 + 117); {12}

  LineTo(X0 + 83, Y0 + 117); {12}

  LineTo(X0 + 83, Y0 + 203); {13}

  SetLineStyle(0, 0, 0);

   {Прямоугольники}

  SetColor(RTACol);

  Rectangle(X0 +  10, Y0 + 120, X0 +  80, Y0 + 200); {УУ(ЦУУ)}

  Rectangle(X0 +  55, Y0 + 120, X0 +  80, Y0 + 130); {КОП}

  Rectangle(X0 + 130, Y0 + 120, X0 + 210, Y0 + 200); {ОЗУ}

  Rectangle(X0 + 130, Y0 +  30, X0 + 210, Y0 + 70);  {АЛУ}

  Rectangle(X0 + 130, Y0 + 250, X0 + 210, Y0 + 290); {ВЗУ}

  Rectangle(X0 + 260, Y0 + 120, X0 + 360, Y0 + 150); {У.Ввода}

  Rectangle(X0 + 260, Y0 + 170, X0 + 360, Y0 + 200); {У.Вывода}


   {Подписи к прямоугольникам}

  SetColor(TxtCol);















КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



6



















КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп

Дата







  SetTextJustify(2, 0);

  OutTextXY(X0 +  80, Y0 + 200, 'УУ(ЦУУ)');

  OutTextXY(X0 +  80, Y0 + 130, 'PC');

  OutTextXY(X0 + 210, Y0 + 200, 'ОЗУ');

  OutTextXY(X0 + 210, Y0 +  70, 'АЛУ');

  OutTextXY(X0 + 210, Y0 + 290, 'ВЗУ');

  OutTextXY(X0 + 360, Y0 + 150, 'У.Ввода');

  OutTextXY(X0 + 360, Y0 + 200, 'У.Вывода');

  SetTextJustify(0, 0);

   {Стрелки Big}

  SetColor(ARBCol);

  SetFillStyle(1, FILCol);

   {Вид стрелки}

  CArrow := BArrow;

  Arrow(X0 +  85, Y0 + 140, 40, 1); {ОЗУ - УУ(ЦУУ)}

  FloodFill(X0 +  90, Y0 + 140, ARBCol);

  Arrow(X0 + 150, Y0 +  75, 40, 3); {ОЗУ - АЛУ}

  FloodFill(X0 + 150, Y0 +  80, ARBCol);

  Arrow(X0 + 190, Y0 + 115, 40, 4); {АЛУ - ОЗУ}

  FloodFill(X0 + 190, Y0 + 110, ARBCol);

  Arrow(X0 + 150, Y0 + 205, 40, 3); {ВЗУ - ОЗУ}

  FloodFill(X0 + 150, Y0 + 210, ARBCol);

  Arrow(X0 + 190, Y0 + 245, 40, 4); {ОЗУ - ВЗУ}

  FloodFill(X0 + 190, Y0 + 240, ARBCol);

  Arrow(X0 + 215, Y0 + 135, 40, 1); {У.Ввода - ОЗУ}

  FloodFill(X0 + 220, Y0 + 135, ARBCol);

  Arrow(X0 + 255, Y0 + 185, 40, 2); {У.Вывода - ОЗУ}

  FloodFill(X0 + 250, Y0 + 185, ARBCol);

   {Стрелки Small}

  SetColor(ARSCol);

   {Вид стрелки}

  CArrow := SArrow;

  Arrow(X0 + 125, Y0 + 180, 40, 2); {УУ(ЦУУ) - ОЗУ}

  Arrow(X0 + 125, Y0 + 270, 80, 2); {УУ(ЦУУ) - ВЗУ}

  Arrow(X0 + 125, Y0 +  50, 80, 2); {УУ(ЦУУ) - АЛУ = КОП}

  Line(X0 + 45, Y0 + 115, X0 + 45, Y0 + 50);   {1}

  OutTextXY(X0 + 70, Y0 +  60, 'КОП');	       {2}

   {УУ(ЦУУ) - У.Вводы, У.Вывода}

  Line(X0 +  45, Y0 + 205, X0 + 45,  Y0 + 295); {1}

  Line(X0 +  45, Y0 + 295, X0 + 380, Y0 + 295); {2}

  Line(X0 + 380, Y0 + 295, X0 + 380, Y0 + 135); {3}

  Arrow(X0 + 365, Y0 + 135, 15, 1); {in}        {4}

  Arrow(X0 + 365, Y0 + 185, 15, 1); {out}       {5}

   {Носики стрелок Small}

  SetColor(LightGreen);

  Arrow(X0 + 125, Y0 + 180, 0, 2); {1}

  Arrow(X0 + 125, Y0 + 270, 0, 2); {2}

  Arrow(X0 + 125, Y0 +  50, 0, 2); {3}

  Arrow(X0 + 365, Y0 + 135, 0, 1); {4}

  Arrow(X0 + 365, Y0 + 185, 0, 1); {5}

  SetColor(BRDCol);

  Rectangle(0, 0, GetMaxX, GetMaxY);

end; {BildWin}

{-------------------}



procedure BildContext;

const

  TxtCol: Word = LightBlue;

begin

  SetColor(BRDCol); {Устанавливаем цвет границы и рисуем ее}

  Rectangle(XC, YC, GetMaxX - X0, YC + 300);

  SetTextJustify(1, 1);

  SetColor(TxtCol + 1);  {Заголовок}

  OutTextXY(GetMaxX - (GetMaxX - X0 - XC) div 2 - X0, YC + 20, 'Обозначения ' +

                'на схеме:');













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



7







  CArrow := BArrow;  {Стрелки}

  SetColor(ARBCol);

  SetFillStyle(1, Blue);

  Arrow(XC + 50, YC + 50, 40, 2);

  FloodFill(XC + 40, YC + 50, ARBCol);

  CArrow := SArrow;

  SetColor(ARSCol);

  Arrow(XC + 50, YC + 80, 40, 2);

  SetColor(LightGreen);

  Arrow(XC + 50, YC + 80, 0, 2);

  SetColor(MemCol);

  SetLineStyle(1, 0, 0);

  Line(XC + 10, YC + 110, XC + 34, YC + 110);

  Line(XC + 10, YC + 126, XC + 34, YC + 126);

  Line(XC + 14, YC + 106, XC + 14, YC + 128);

  Line(XC + 30, YC + 106, XC + 30, YC + 128);

  SetColor(CPUCol);

  Line(XC + 12, YC + 150, XC + 30, YC + 150);

  SetLineStyle(0, 0, 0);

  SetColor(TxtCol);

  SetTextJustify(0, 1); {Значения}

  OutTextXY(XC + 60, YC +  50, ' - Передача данных');

  OutTextXY(XC + 60, YC +  80, ' - Сигнал управления');

  OutTextXY(XC + 60, YC + 120, ' - Ячейка памяти');

  OutTextXY(XC + 60, YC + 150, ' - Данной линией');

  OutTextXY(XC + 60, YC + 160, '   обведены части');

  OutTextXY(XC + 60, YC + 170, '   входящие в состав');

  OutTextXY(XC + 60, YC + 180, '   процессора (ЦПУ)');

  OutTextXY(XC + 20, YC + 200, '█ - содержимое файла');

  OutTextXY(XC + 20, YC + 210, '1 - адрес первого операнда');

  OutTextXY(XC + 20, YC + 220, '2 - адрес второго операнда');

  OutTextXY(XC + 20, YC + 230, '3 - адрес результата');

  SetTextJustify(0, 0)

end; {Context}

{-------------------}



procedure BildFuncKey;

const

  StrFK: array [1..4] of string[11] =

           ('Помощь F1', 'Назад <-', 'Вперед ->', 'Выход Esc');

  FkbCol: Word = Green;

  TxtCol: Word = LightCyan;

begin

  SetColor(BRDCol);

  Rectangle(XS, YS, GetMaxX - XS, GetMaxY - XS);

  SetTextJustify(1, 1);

  SetFillStyle(1, DarkGray);

  for I := 1 to 4 do

    begin

      SetColor(FkbCol); {Установка цвета границы клавиш}

      Bar((GetMaxX - XS * 2) div 5 * I - Length(StrFK[I]) * 4, YS + 7,

          (GetMaxX - XS * 2) div 5 * I + Length(StrFK[I]) * 4, YS + 23);

      Rectangle((GetMaxX - XS * 2) div 5 * I - Length(StrFK[I]) * 4, YS + 7,

                (GetMaxX - XS * 2) div 5 * I + Length(StrFK[I]) * 4, YS + 23);

      SetColor(Black);  {Установка цвета текста клавиш}

      OutTextXY((GetMaxX - XS * 2) div 5 * I + 2, YS + 15 - 2, StrFK[I]);

      SetColor(TxtCol);

      OutTextXY((GetMaxX - XS * 2) div 5 * I, YS + 15, StrFK[I])

    end;

  SetTextJustify(0, 0);

   {Сахраняем картинки}

  FuncKeyWindow[1].Get(XS, YS, GetMaxX - XS, GetMaxY - XS);

  SetFillStyle(1, GetBkColor);

  Bar((GetMaxX - XS * 2) div 5 * 3 - Length(StrFK[I]) * 4, YS + 7,

      (GetMaxX - XS * 2) div 5 * 3 + Length(StrFK[I]) * 4, YS + 23);













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



8







  FuncKeyWindow[3].Get(XS, YS, GetMaxX - XS, GetMaxY - XS);

  FuncKeyWindow[1].Put(XS, YS);

  Bar((GetMaxX - XS * 2) div 5 * 2 - Length(StrFK[I]) * 4, YS + 7,

      (GetMaxX - XS * 2) div 5 * 2 + Length(StrFK[I]) * 4, YS + 23);

  FuncKeyWindow[2].Get(XS, YS, GetMaxX - XS, GetMaxY - XS)

end; {FuncKey}

{-------------------}



{+----------------------------------------------+}

{                                                }

{ Процедуры вывода текстовой информации на экран }

{                                                }

{+----------------------------------------------+}



procedure Page_1;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  ClearViewPort;

  SetColor(Blue);

  OutTextXY(GetMaxX - X - 25, 100, '1');

  SetColor(TxtCol);

  MyText(0,  8, 'До начала работы программы, она находится на ВЗУ, ' +

                'в виде файла программы');

  MyText(0, 16, '(*.exe или *.com).');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_1}

{-------------------}



procedure Page_2;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  ClearViewPort;

  SetColor(Blue);

  OutTextXY(GetMaxX - X - 25, 100, '2');

  SetColor(TxtCol);

  MyText(0,  8, 'После того как ЭВМ получила команду на запуск ' +

                'программы, содержимое');

  MyText(0, 16, 'этого файла помещается в ячейку ОЗУ, начиная с ' +

                'ячейки с некоторым');

  MyText(0, 24, 'стартовым адресом.');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_2}

{-------------------}



procedure Page_3;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  ClearViewPort;

  SetColor(Blue);

  OutTextXY(GetMaxX - X - 25, 100, '3');

  SetColor(TxtCol);

  MyText(0,  8, 'Содержимое ячейки со стартовым адресом программы ' +

                ' (первая машинная команда)');

  MyText(0, 16, 'пересылается в УУ. УУ расшифровывает первую машинную ' +

                'команду и выробатывает');

  MyText(0, 24, 'соответствующие ей сигналы управления для всех систем управления.');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_3}

{-------------------}



procedure Page_4_1;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  ClearViewPort;











КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



9









  SetColor(Blue);

  OutTextXY(GetMaxX - X - 25, 100, '4');

  SetColor(TxtCol);

  MyText(0,  8, 'Например: если первой машинной командой оказалась ' +

                'трех адресной командой');

  MyText(0, 16, 'сложения двух чисел, произойдут следующие действия:');

  MyText(0, 24, '- УУ посылает первый и второй адреса в ОЗУ');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_1}

{-------------------}



procedure Page_4_2;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);


  SetColor(TxtCol);

  MyText(0, 32, '- ОЗУ пересылает содержимое ячеек с этими адресами в АЛУ,');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_2}

{-------------------}



procedure Page_4_3;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  SetColor(TxtCol);

  MyText(0, 40, '- УУ отправляет сигнал управления (КОП) в АЛУ,');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_3}

{-------------------}



procedure Page_4_4;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  SetColor(TxtCol);

  MyText(0, 48, '- АЛУ выполняет эту операцию (сложение) над двумя ' +

                'операндами и возвращает');

  MyText(0, 56, '  результат в ОЗУ.');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_4}

{-------------------}



procedure Page_4_5;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  SetColor(TxtCol);

  MyText(0, 64, '- УУ собщает ОЗУ третий адрес (адрес результата),');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_5}

{-------------------}



procedure Page_4_6;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  SetColor(TxtCol);

  MyText(0, 72, '- ОЗУ помещает полученный результат в ячейку памяти.');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_6}

{-------------------}



procedure Page_4_7;

begin

  SetViewPort(X, Y, GetMaxX - X, YS - 10, ClipOn);

  SetColor(TxtCol);

  MyText(0, 80, 'На этом выполнение первой машинной команды ' +

                'заканчивается, происходит');











КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



10









  MyText(0, 88, 'переход к следующей по порядку машинной команде. ' +

                'Содержимое ячейки ОЗУ с');

  MyText(0, 96, 'адресом, следующим за стартовым, пересылается в УУ ' +

                'и все повторяется.');

  SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

end; {Page_4_6}

{-------------------}



{+------------------+}

{                    }

{ Процедуры анимации }

{                    }

{+------------------+}



procedure Move_1;

begin

  BLink(150, 285, 'kurs.exe');

end; {Move_1}

{-------------------}



procedure Move_2;

begin

  SetColor(Green);

  Animation(150, 285, -125, 2, ' █ █', True)

end; {Move_2}

{-------------------}



procedure Move_3;

begin

  SetColor(GetBkColor);

  SetColor(Green);

  Animation(100, 168, -70, 1, ' 1 2 +', True)

end; {Move_3}

{-------------------}



procedure Move_4_1;

begin

  SetColor(GetBkColor);

  OutTextXY(30, 176, ' 1 2');

  SetColor(Green);

  Animation(47, 198, 63, 1, ' 1 2', False);

  SetColor(GetBkColor);

  OutTextXY(150, 168, ' █ █');

  SetColor(Green);

  OutTextXY(150, 168, ' a b')

end; {Move_4_1}

{-------------------}



procedure Move_4_2;

begin

  SetColor(Green);

  Animation(150, 160, -95, 2, ' a b', True)

end; {Move_4_2}

{-------------------}



procedure Move_4_3;

begin

  setcolor(getbkcolor);

  OutTextXY(30, 176, '     +');

  SetColor(Green);

  Animation(52, 160, -94, 2, '+', False)

end; {Move_4_3}

{-------------------}



procedure Move_4_4;















КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



11





begin

  SetColor(Green);

  Animation(52, 66, 115, 1, '+', True);

  OutTextXY(183, 73, '=c')

end; {Move_4_4}

{-------------------}



procedure Move_4_5;

begin

  SetColor(GetBkColor);

  SetColor(Green);

  Animation(47, 198, 63, 1, '3', False);

end; {Move_4_1}

{-------------------}



procedure Move_4_6;

begin

  SetColor(Green);

  Animation(191, 66, 94, 2, 'c', True)

end; {Move_4_5}

{-------------------}




procedure Help;  {Помощь}

const

  XH: Integer = 70;

  YH: Integer = 70;

begin

  ClearDevice;

  SetColor(BRDCol);

  Rectangle(0, 0, GetMaxX, GetMaxY);

  SetColor(LightCyan);

  SetTextJustify(1, 0);

  OutTextXY(GetMaxX div 2, YH + 10,'Помощь:');

  SetTextJustify(0, 0);

  OutTextXY(XH + 10, YH + 20,'Адрес  :');

  OutTextXY(XH + 10, YH + 30,'УУ     :');

  OutTextXY(XH + 10, YH + 40,'АЛУ    :');

  OutTextXY(XH + 10, YH + 50,'АЛУ+УУ :');

  OutTextXY(XH + 10, YH + 60,'ВЗУ    :');

  OutTextXY(XH + 10, YH + 70,'ОЗУ    :');

  OutTextXY(XH + 10, YH + 80,'УВвода :');

  OutTextXY(XH + 10, YH + 90,'УВывода:');

  SetColor(Cyan);

  OutTextXY(XH + 90, YH + 20,'номер ячейки памяти');

  OutTextXY(XH + 90, YH + 30,'устройство управления');

  OutTextXY(XH + 90, YH + 40,'арифметико-логическое устройство');

  OutTextXY(XH + 90, YH + 50,'процессор');

  OutTextXY(XH + 90, YH + 60,'внешнее запоминающее устройство (hdd, fdd и др.)');

  OutTextXY(XH + 90, YH + 70,'оперативное запоминающее устройство');

  OutTextXY(XH + 90, YH + 80,'устройство ввода');

  OutTextXY(XH + 90, YH + 90,'устройство вывода');

  _Pause

end; {Help}

{-------------------}



procedure MainWin;

begin

  ClearDevice;

  BildWin;

  BildContext;

  BildFuncKey

end; {MainWin}

{-------------------}













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



12









procedure Play;

 {-------------}

procedure SelectPage(N: Byte);

begin

  case N of

 1: begin

      FuncKeyWindow[2].Put(XS, YS);

      Page_1;

      Move_1

    end;

 2: begin

      FuncKeyWindow[1].Put(XS, YS);

      Page_2;

      Move_2

    end;

 3: begin

      FuncKeyWindow[1].Put(XS, YS);

      Page_3;

      Move_3

    end;

 4: begin

      FuncKeyWindow[3].Put(XS, YS);

      Page_4_1;

      Move_4_1;

      Delay(Time_3 * 20);

      Page_4_2;

      Delay(Time_3 * 20);

      Move_4_2;

      Delay(Time_3 * 20);

      Page_4_3;

      Delay(Time_3 * 20);

      Move_4_3;

      Move_4_4;

      Page_4_4;

      Delay(Time_3 * 20);

      Page_4_5;

      Delay(Time_3 * 20);

      Move_4_5;

      Delay(Time_3 * 20);

      Page_4_6;

      Delay(Time_3 * 20);

      Move_4_6;

      Delay(Time_3 * 20);

      Page_4_7

    end

  end

end; {SelectPage}

 {-------------}



const

  Back = #75;

  Next = #77;

  F1   = #59;

  Esc  = #27;

var

  ArrowsAndEsc: set of Char;

  ExtentedKey: Boolean;

  Flag: Boolean;

  CH: Char;

  N: Byte;

begin

  ClearDevice;

  MainWin;

  N := 0;











КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



13









  ArrowsAndEsc := [Back, Next, F1, Esc];

  repeat

    ExtentedKey := False;

    Flag := False;

    CH := ReadKey;

    if CH = Esc then

      Flag := True;

    if CH = #0 then

      begin

        CH := ReadKey;

        ExtentedKey := True

      end;

    if ExtentedKey then

    case CH of

 Back: begin

         Dec(N);

         SelectPage(N);

         if N < 1 then N := 1

       end;

 Next: begin

         Inc(N);

         SelectPage(N);

         if N > 4 then N := 4

       end;

 F1:   begin

         Temp[1].Get(X0, Y0, X0 + 380, Y0 + 300);

         Temp[2].Get(X0, Y0 + 305, GetMaxX - X0, YS - 5);

         Help;

         MainWin;

         Temp[1].Put(X0, Y0);

         Temp[2].Put(X0, Y0 + 305);

         if N <= 1 then

          FuncKeyWindow[2].Put(XS, YS);

         if N = 4 then

          FuncKeyWindow[3].Put(XS, YS)

       end

    end  {Case}

  until Flag;

  ClearDevice

end; {Play}

{-------------------}



procedure TextT(Col: TColor; S: TText);

begin

  SetTextJustify(1, 1);

  for I := 1 to 4 do

    begin

      SetColor(Col[I]);

      OutTextXY(GetMaxX div 2, GetMaxY div 2 + I * 10 - 40, S[I])

    end;

  SetTextJustify(0, 0)

end; {TextT}

{-------------------}



procedure TestMode;

{-----------------}

function Quastion(N: Byte;  var CH: Char): Byte;

var

  I: Byte;

  C: Char;

  CHEAt: string[1];

  Code: Integer;

  StrN: string[3];

  Res: Byte;

Begin











КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



14









  CH := #0;

  SetColor(BRDCol);

  Rectangle(0, 0, GetMaxX, GetMaxY);

  SetColor(White);

  MyText(XT, YT, 'Вопрос #' + QuastionS[N]);

  SetColor(Yellow);

  for I := 1 to 3 do

    begin

      if I = Ok[N] then

        Cheat := V

      else

        Cheat := '';

      MyText(XT, YT + 10 * I, Answer[N, I] + Cheat)

    end;

  repeat

    C := ReadKey;

    if C = #27 then

      begin

        SetTextJustify(1, 0);

        SetViewPort(1, GetMaxY - 100, GetMaxX - 1, GetMaxY - 1, ClipOn);

        SetColor(Red);

        OutTextXY(GetMaxX div 2, 10, 'Вы действительно хотите выйти?');

        SetColor(Green);

        OutTextXY(GetMaxX div 2, 30, 'Да(Y), Нет(N)');

        SetTextJustify(0, 0);

        C := ReadKey;

        if C = 'y' then

          C := #27

        else

          begin

            C := #0;

            ClearViewPort

          end;

        SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn)

      end

  until C in ['1', '2', '3', #27];

  if C <> #27 then

    begin


      Val(C, Res, Code);

      if Res = Ok[N] then

        begin

          Quastion := 1;

          SetColor(Green);

          MyText(GetMaxX div 2 - 20, GetMaxY - 200, 'ВЕРНО')

        end

      else

        begin

          Quastion := 0;

          SetColor(Red);

          MyText(GetMaxX div 2 - 28, GetMaxY - 200, 'НЕВЕРНО')

        end;

      Delay(Time_2)

    end

  else

    CH := C;

  ClearDevice

end; {Quastion}

{-----------------}



function Mark(Res: Byte): Char;

begin

  case Res of

    1: Mark := '1';

    2: Mark := '2';











КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



15









    3: Mark := '3';

    4: Mark := '4';

    5: Mark := '5';

  else

    Mark := '0'

  end

end; {Mark}

{-----------------}



var

  I: Byte;

  Result: Byte;

  StrRes: string[2];

  TempS: TText;

  C: Char;

begin

  C := #0;

  ClearDevice;

  Result := 0;

  TempS := EndofTest;

  for I := 1 to 5 do

    begin

      if Quastion(I, C) = 1 then

        Inc(Result);

      if C = #27 then Exit

    end;

  ClearDevice;

  SetColor(BRDCol);

  Rectangle(0, 0, GetMaxX, GetMaxY);

  Str(Result, StrRes);

  TempS[3] := EndofTest[3] + StrRes;

  TempS[4] := EndofTest[4] + Mark(Result);

  SetColor(BRDCol);

  Rectangle(GetMaxX div 2 - 150, GetMaxY div 2 - 60,

            GetMaxX div 2 + 150, GetMaxY div 2 + 40);

  TextT(TestCol, TempS);

  _Pause;

  ClearDevice

end; {TestMode}

{-------------------}



procedure MainMenu;

var

  C: Char;

  ExtentedKey: Boolean;

  TempCol: TColor;

  K: ShortInt;

begin

  ClearDevice;

  TempCol[1] := MenuCol[1];

  TempCol[2] := MenuCol[3];

  TempCol[3] := MenuCol[4];

  TempCol[4] := MenuCol[4];

  K := 1;

  repeat

    SetColor(BRDCol);

    Rectangle(GetMaxX div 2 - 150, GetMaxY div 2 - 60,

              GetMaxX div 2 + 150, GetMaxY div 2 + 40);

    Rectangle(0, 0, GetMaxX, GetMaxY);

    ExtentedKey := False; {флаг поступления расширенного кода}

    TextT(TempCol, Menu);

    while KeyPressed do ReadKey;  {очистка буфера клавиатуры}

    C := ReadKey;         {считывание кода новой нажатой клавиши}

    if C = #0 then        {если "да" - код расширенный}

      begin













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



16









        C := ReadKey;     {считывается второй символ расширенного кода}

        ExtentedKey := True

      end;

    if ExtentedKey then   {если код был расширенный}

      case C of

        #72: K := K - 1;

        #80: K := K + 1

      end;

    if C = #13 then

      case K of

        1: Play;         {Обучение}

        2: TestMode;     {Проверка знаний}

        3: Exit          {Выход}

      end;

    if K < 1 then K := 3;

    if K > 3 then K := 1;

    for I := 2 to 4 do

      TempCol[I] := MenuCol[4];

    TempCol[K + 1] := MenuCol[3];  {Смена цвета выделленого пункта}

  until C = #27    {т.е. нажата клавиша "Esc"}

end; {MainMenu}

{-------------------}



begin

  MyInitGraph;           {Инициализация графического режима}

  Title;                 {Титульный лист}

  MainMenu;              {Главное меню}

  CloseGraph;            {Закрытие графического режима}

end. {LEAN_Ecm;}

{-------------------}

Текст модуля Sm_Const

unit Sm_Const;

interface

uses Graph, Sm_Graph;

type

TText = array [1..4] of string;

TColor = array [1..4] of Word;

------------------- type

const

X0:	Integer	=	10;	{Начальная координата X}

Y0:	Integer	=	20;	{Начальная координата Y}

XS:	Integer	=	10;	{FuncKey}

YS:	Integer	=	440;	{FuncKey}

XC:	Integer	=	400;	{Context}

YC:	Integer	=	20;	{Context}

XT:	Integer	=	80;	{Test}

YT:	Integer	=	150;	{Test}

X: Integer =	15;    {Координата вывод текста X}

Y: Integer =	330;   {Координата вывод текста Y}

ARBCol: Word	= LightCyan;  {Цвет внешней границы стрелки Big}

ARSCol: Word	= Red; 	     {Цвет внешней границы стрелки Small}

FILCol: Word	= Blue;	     {Цвет стрелки Big}

MemCol: Word	= LightGreen; {Цвет ячеек памяти}

CPUCol: Word	= DarkGray;   {Цвет CPU}

BRDCol: Word	= Brown;      {Цвет рамки}

TxtCol: Word	= White;      {Цвет текста}

BArrow: TArrow = (X1 : 15; Y1 : 2; Y2 : 5); {Форма стрелки Big}

SArrow: TArrow = (X1 :  5; Y1 : 0; Y2 : 1); {Форма стрелки Small}

TestCol: TColor = (Green, White, Blue, Red); {Цвет окна теста}

MenuCol: TColor = (Cyan, 0, LightGreen, Blue);

V: string[1] = '';

Q: string[9] = 'Вопрос #';

{Вопросы]













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



17

Quastions: array [1..5] of string =









('1. Что такое ВЗУ?',

'2. Что в ходит в процесор?',

'3. Через какое устройство в ЭВМ происходит обмен данными?',

'4. Где в начальный момент находится программа? ',

'5. Какое из устройств расшифровывает первую машинную команду?');

{Варианты ответов}

Answer: array [1..5, 1..3] of string =

(('1. Внешнее записывающее устройство', '2. Внешнее запоминающее устройство', '3. Внутреннее запоминающее устройство'), ('1. ЦУУ + АЛУ + ВЗУ', '2. УВвода + ОЗУ', '3. ЦУУ + АЛУ + КОП'),

('1. АЛУ  ','2. ОЗУ', '3. ВЗУ'),

('1. В ВЗУ','2. В АЛУ','3. В УУ'),

('1. ВЗУ', '2. ЦУУ', '3. АЛУ'));

{Номера правильных ответов}

OK: array [1..5] of Byte = (2, 3, 2, 1, 2);

{Текст Меню}

Menu: TText =('Ваш выбор:',

'Обучение',

'Проверка знаний',

'Esc - Выход');

{Текст итога тестовой части программы}

EndofTest: TText =  ('Ваш результат:',

'Всего вопросов:	5',

'Количество правильных ответов: ',

'Оценка:	');

------------------- const

implementation 

end.

Текст модуля Sm_graph

unit Sm_Graph;

                                interface

uses

  Graph, Crt;

{-------------------} {Uses}



type



TArrow = record X1, Y1, Y2: Integer; end;



TImage =

  object

      private

    Image: Pointer;

    Size : Word;

      public

    procedure Destroy;

    procedure Get(X1, Y1, X2, Y2: Integer);

    procedure Put(X, Y: Integer);

  end;

{-------------------} {Type}



const

  CArrow: TArrow = (X1 : 15; Y1 : 2; Y2 : 5);

  Time_1: Word = 5000;  {Время мерцания}

  Time_2: Word = 15000; {Время задержки экрана после ответа на вопрос}

  Time_3: Word = 300;   {Время анимации}

  Time_4: Word = 400;   {Время задержки вывода текста по буквам}

procedure _Pause;

procedure Animation(X, Y: Integer; D: Integer; XY: Byte; S: string; Vis: Boolean);

procedure Arrow(X, Y, L: Integer; DIRectIOn: Byte);

procedure BLink(X, Y: Integer; S: string);

procedure MyInitGraph;













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



18

procedure MyText(X, Y: Integer; S: string);









procedure Title;



var

  TempImage: TImage;

                                implementation



{---------Object TImage----------}

procedure TImage.Destroy;

begin

  if Image <> nil then

    begin

      FreeMem(Image, Size);

      Image := nil;

      Size := 0;

    end

end; {Timage.Destroy}

{-------------------}



procedure TImage.Get(X1, Y1, X2, Y2: Integer);

begin

  Destroy;

  Size := ImageSize(X1, Y1, X2, Y2);

  GetMem(Image, Size);

  GetImage(X1, Y1, X2, Y2, Image^);

end; {TImage.Get}

{-------------------}



procedure TImage.Put(X, Y: Integer);

begin

  if Image <> nil then

    PutImage(X, Y, Image^, 0);

end; {TImage.Put}

{---------Object TImage----------}



procedure MyInitGraph;

var

    GD, GM : Integer;


begin

 GD := Detect;

 InitGraph(GD, GM,'');

 if GraphResult <> grOK then

  Halt(1);

end; {MyInitGraph}

{-------------------}



procedure MyText(X, Y: Integer; S: string);

var

  I: Word;

  C: Char;

begin

 MoveTo(X, Y);

 I := 0;

 repeat

  Inc(I);

  OutText(S[I]);

  Delay(Time_4);

 until (I = Length(S));

end; {NyText}

{-------------------}



procedure _Pause;

begin

 ReadKey;

end; {_Pause}













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



19









{-------------------}



procedure Animation(X, Y: Integer; D: Integer;

                    XY: Byte; S: string; Vis: Boolean);

                       {Animation}

var

  DX, DY: Integer;

  I: Integer;

begin

 DX := 1;

 DY := 1;

 SetColor(Green);

 if D < 0 then

   begin

     DX := -1;

     DY := -1;

   end;

 case XY of

   1: DY := 0;

   2: DX := 0;

 end;

 D := Abs(D);

 for I := 1 to D do

  begin

   TempImage.Get(I * DX + X,

            I * DY + Y,

            TextWidth(S) + I * DX + X,

            TextHeight(S) + I * DY + Y);

   OutTextXY(X + I * DX, Y + TextHeight(S) + I * DY, S);

   Delay(Time_3);

   if I <> D then

    TempImage.Put(X + I * DX, Y + I * DY);

   if (I = D) and not VIs then

    TEMPImage.Put(X + I * DX, Y + I * DY);

  end;

end; {Animation}

{-------------------}



procedure Arrow(X, Y, L: Integer; Direction: Byte);

type

 COOrAR = array [1..6] of Integer;

var

  X1: Integer;

  Y1: Byte;

  Y2: Byte;

  XX: COOrAR;

  YY: COOrAR;



procedure Change1;

begin

 X1 := -X1;

 L  := -L

end;



procedure Change2;

var

  I: Byte;

  Temp: Integer;

begin

 for I := 1 to 6 do

  begin

   TEMP  := XX[I];

   XX[I] := YY[I];

   YY[I] := TEMP;

  end;













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



20









end;



procedure ArrowCCOOr;

begin

 XX[1] := X1; YY[1] :=  Y2;

 XX[2] := X1; YY[2] :=  Y1;

 XX[3] :=  L; YY[3] :=  Y1;

 XX[4] :=  L; YY[4] := -Y1;

 XX[5] := X1; YY[5] := -Y1;

 XX[6] := X1; YY[6] := -Y2;

end;



var

   I: Byte;

begin

 X1 := CArrow.X1;

 Y1 := CArrow.Y1;

 Y2 := CArrow.Y2;

 if L < X1 then L := X1;

 case Direction of

  2, 4: Change1;

 end;

 ArrowCCOOr;

 case Direction of

  3, 4: Change2;

 end;

 MoveTo(X, Y);

 for I := 1 to 6 do

  LineTo(X+XX[I], Y+YY[I]);

 LineTo(X, Y);

end; {Arrow}

{-------------------}



procedure Title;

const

  Word_1: string = 'Курсовая работа по информатике.';

  Word_2: string = 'Тема: взаимодействие основных частей ЭВМ при выполнении программы';

  Word_3: string = 'Выполнили студенты группы МРС-91:';

  Word_4: string = 'Егоров   О.В.';

  Word_5: string = 'Шетманюк М.В.';

begin

 ClearDevice;

 SetColor(LightGreen);

 Rectangle(0, 0, GetMaxX, GetMaxY);

 SetFillStyle(1, Blue);

 FloodFill(1,1, LightGreen);

 SetColor(LightGray);

 Rectangle(25, 25,GetMaxX-25, GetMaxY-25);

 SetFillStyle(1, DarkGray);

 FloodFill(101,101, LightGray);

 SetTextJustify(1, 0);

 SetTextStyle(0,0,2);

 SetColor(Black);

 OutTextXY(GetMaxX div 2+1, GetMaxY div 2-1, Word_1);

 SetColor(Brown);

 OutTextXY(GetMaxX div 2, GetMaxY div 2, Word_1);

 SetTextStyle(0,0,0);

 SetColor(Red);

 OutTextXY(GetMaxX div 2, GetMaxY-35, 'Хабаровск 2000');

 SetColor(Black);

 OutTextXY(GetMaxX div 2+1, GetMaxY div 2-1+18, Word_2);

 SetColor(Brown);

 OutTextXY(GetMaxX div 2, GetMaxY div 2+18, Word_2);

 SetTextJustify(0, 0);













КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



21









SetColor(Black);

 OutTextXY(GetMaxX-Length(Word_3)*8+1-180, GetMaxY-100-1, Word_3);

 SetColor(White);

 OutTextXY(GetMaxX-Length(Word_3)*8-180, GetMaxY-100, Word_3);

 SetColor(Black);

 OutTextXY(GetMaxX+1-180, GetMaxY-90-1, Word_4);

 SetColor(LightGreen);

 OutTextXY(GetMaxX-180, GetMaxY-90, Word_4);

 SetColor(Black);

 OutTextXY(GetMaxX+1-180, GetMaxY-80-1, Word_5);

 SetColor(LightGreen);

 OutTextXY(GetMaxX-180, GetMaxY-80, Word_5);

 _Pause;

 ClearDevice;

end; {Title}

{-------------------}



procedure BLink(X, Y: Integer; S: string);

var I: Byte;

begin

  for I := 1 to 3 do

    begin

      SetColor(Black);

      Delay(Time_1);

      OutTextXY(X, Y + TextHeight(S), S);

      SetColor(Green);

      Delay(Time_1);

      OutTextXY(X, Y + TextHeight(S), S)

    end

end; {Blink}

{-------------------}



end.

























































КР. 991096.00.00.00 ПЗ

Лист













——–

Изм.

Лист

№ докум.

Подп.

Дата



22