лабораторные работы паскаль. Практикум по программированию на языке Паскаль Учебное пособие
Скачать 0.89 Mb.
|
Тема: "Введение в построение человеко-машинного интерфейса" Цель работы Научиться корректно вводить исходную информацию и отображать выходную. Краткие сведения из теории В практическом программировании сложились определенные принципы организации ввода и вывода данных. Эти принципы позволяют разработать систему ввода и вывода в виде дружественного диалога пользователя с компьютером. Для создания дружественного человеко-машинного интерфейса удобно использовать стандартный модуль CRT интегрированной Среды Турбо-Паскаля. Данный модуль предоставляет готовые к использованию процедуры и функции для работы с клавиатурой, экраном в текстовом режиме и динамиком. 15.1. Функции CRT для клавиатуры В модуле CRT существуют две функции ReadKey и KeyPressed, предназначенные для работы с клавиатурой. Функция ReadKey возвращает символ, введенный с клавиатуры. Синтаксис: ReadKey : Char; Пример Uses Crt; Var Ch : Char; begin WriteLn('Нажмите клавишу'); Ch := ReadKey; {считали код клавиши} if Ch = #0 then {нажата функциональная клавиша?} begin {да} Ch := ReadKey; {чтобы получить код функциональной клавиши, необходимо повторить чтение} WriteLn('Вы нажали функциональную клавишу с кодом = ', Оrd(Ch)); end else {нет} WriteLn('Вы нажали клавишу с ASCII кодом = ', Ord(Ch)); end. Примечание. Все модули подключаются к программе с помощью предложения USES. Функция KeyPressed отвечает на вопрос: "Была ли нажата какая-либо клавиша?". Синтаксис: KeyPressed: Boolean. Функция возвращает значение TRUE, если клавиша была нажата, FALSE - если нет. Пример Uses Crt; Begin repeat {Экран заполняется до тех пор, пока не нажата клавиша} Write('Xx'); until KeyPressed; End. 15.2. Процедуры CRT для текстового экрана 111 (1,25) (1,1) (80,1) (80,25) (1,1) Модуль Crt позволяет создавать окна на экране монитора. При записи в такое окно оно ведет себя точно также, как целый экран. При этом остальная часть экрана остается нетронутой. Внутри окна можно удалять и добавлять строки, при этом курсор возвращается к правому краю и при достижении курсором нижней строки текст продвигается вверх. По умолчанию окном считается весь экран. С каждым окном связаны координаты: Полный экран имеет координаты: 1 <= X <= 80; 1 <= Y <= 25. Определить окно можно с помощью процедуры Window. Синтаксис: Window(X1,Y1, X2,Y2 : word). Параметры X1, Y1 - координаты верхнего левого угла окна; X2, Y2 - координаты нижнего правого угла окна. Если параметры заданы некорректно, то вызов Window игнорируется. Когда определено окно, то все координаты экрана, используемые в процедурах, становятся относительными координатами этого окна. С каждым окном связаны две переменные, объявленные в CRT: WindMin, WindMax : Word. Переменная WindMin определяет левый верхний угол экрана, а переменная WindMax - правый нижний. В младшем байте хранится координата X, а в старшем - координата Y. Чтобы извлечь значения этих координат, нужно использовать функции Lo и Hi. Например, Lo(WindMin) - дает координату X левого края, а Hi(WindMax) - дает координату Y нижнего края. С координатами связаны процедуры GotoXY, WhereX, WhereY. Процедура GotoXY - установка курсора в указанные координаты. Синтаксис: GotoXY(X, Y : byte); Верхний левый угол задается координатами (1, 1). Если X, Y заданы неверно, то переход не выполняется. Например : Window(1,10, 60,20); GotoXY(1, 1); В результате выполнения этих предложений произойдет перемещение курсора в верхний левый угол созданного окна. WhereX, WhereY - возвращают соответственно координату X или Y текущей позиции курсора относительно текущего окна. Например : Uses Crt; begin Writeln('Курсор находится в позиции ', '(' ,WhereX,' , ',WhereY,' )' ); end. Пример для Window. Uses Crt; Var x, y: Byte; Begin TextBackground(Black); { Установка черного фона } 112 ClrScr; { очистка экрана цветом фона } repeat { Рисуются случайные окна } x := Succ( Random(80)); { выбор случайной координаты Х } y := Succ( Random(25)); { выбор случайной координаты Y } Window(x, y, x + Random(10), y + Random(8)); TextBackground( Random(16)); { установка случайного цвета окна} ClrScr; { очистка окна текущим цветом фона } until KeyPressed; End. 15.3. Основные принципы ввода информации Во-первых, при вводе информации рекомендуется выполнять ее контроль (диагностику). Это необходимо для обнаружения ошибок, допущенных при вводе. Если не разработана ПП обработки таких ошибок, то произойдет программное прерывание по вводу-выводу, и выполнение программы будет прервано. Во-вторых, ввод любого данного должен сопровождаться комментарием. Комментарий должен быть кратким, однозначным и недвусмысленным. В-третьих, рекомендуется на экране дисплея создавать "окна ввода" (например, в виде таблицы при вводе массива). Рассмотрим один из видов контроля данных. Самый простой способ проверки ввода заключается в использовании оператора IF ... THEN. Если при вводе обнаружены ошибки, выводится диагностическое сообщение, и пользователю предлагается повторить ввод. Пример Рrogram IOTest; Uses Crt; Var A : array[1..10] of integer; i : byte; Key : char; begin {$I-} WriteLn('По окончанию ввода нажмите клавишу WriteLn('Для ввода нового значения - клавишу { цикл по вводу значений массива A } Repeat Write('Введите значение переменной А: '); Readln(A[i]); { контроль ошибки ввода-вывода } if IOResult <> 0 then WriteLn('Введена не цифра. Повторите ввод значения.') else begin WriteLn('A[',i:2,'] = ', A[i]); i:= i + 1; if i > 10 then WriteLn('Массив заполнен. Нажмите Key := Readkey Until Key = #27; { #27 - код клавиши {$I+} End. 113 Примечание. {$I-} и {$I+} - директивы компилятора для отключения и включения стандартной проверки завершения операций ввода-вывода. При создании удобного интерфейса используются "окна" CRT. Табулирование внутри "окна" осуществляется процедурой GOTOXY. Пример применения этих процедур при вводе данных. Словесная постановка задачи. Ввести данные о студенте: фамилию, имя, отчество, год рождения и номер группы. Выполнить контроль правильности ввода значения данного "год рождения" на не цифру. Ввод данных организовать с помощью окон. Текстуальная запись алгоритма. 1. Рассчитать ширину "окна". Ширина "окна" (рис.1) состоит из: − количества символов в "подсказке" - наименовании данного; − количества символов значения данного; − количества символов для пробелов (информация в окне должна располагаться свободно, поэтому необходимо вставлять пробелы). 2. Рассчитать высоту "окна". Высота "окна" состоит из: − количества вводимых данных (одно данное записывается в одной строке); − строки для заголовка "окна"; − строки для диагностических сообщений (сообщение удобнее помещать внизу "окна" или в отдельном выпадающем "окне"); − количества пустых строк для повышения визуальности восприятия "окна", например, необходима пустая строка между верхней границей окна и заголовком окна, между заголовком и первой строкой данных и т.д. 3. Для лучшего визуального восприятия создать три вложенных друг в друга "окна" с помощью процедуры WINDOW. Для каждого "окна" установить цвет фона и цвет изображаемых в нем символов. 4. Написать в первом "окне" вспомогательную информацию о работе с программой (HELP- помощь); во втором "окне" название третьего "окна"; и в третьем - тексты "подсказок " по каждому вводимому данному. 5. Процедурой GOTOXY установить курсор на позицию экрана, с которой нужно вводить значение первого данного. 6. Оператором ReadLn ввести значение данного. 7. Организовать диагностику числовых данных. 8. Если при вводе числового значения выявлена ошибка, то a) войти в первое "окно"; b) установить курсор процедурой GOTOXY на строку "окна" для диагностических сообщений; c) предложением WRITE напечатать сообщение "Введена не цифра"; d) предложением DELAY выполнить задержку сообщения на экране; e) удалить с экрана диагностическое сообщение, используя при этом процедуру GOTOXY и пустые пробелы в предложении WRITE; f) процедурой GOTOXY снова установить курсор на позицию экрана, с которой нужно вновь ввести значение данного; g) удалить с экрана неправильно введенное значение. Для этого предложением WRITE вывести пробелы, количество которых равно максимальной длине вводимого данного; h) вернуться в третье "окно" с помощью процедуры WINDOW; i) процедурой GOTOXY снова установить курсор на позицию экрана , с которой нужно вводить значение первого данного; j) предложением READLN ввести уточненное значение данного; k) передать управление на пункт 7. 9. Процедурой GOTOXY установить курсор на позицию экрана, с которой нужно вводить значение следующего данного. 114 10. Пункты с 6 по 9 повторяются для всех остальных данных. Операторная запись алгоритма. { ************************************************************** } { * Программа ввода и контроля данных * } { ************************************************************** } Program Interf; Uses Crt; Const MaxNumberStud = 30; { массив имен вводимых данных } NameDat : array[1..5] of string = ('Фамилия','Имя','Отчество','Год рождения', 'N группы'); Type RecStud = record { запись данных по студенту } Fam, Name, Otch : string[15]; GodR : word; NGrup : string[10]; end; Var i : integer; Key : char; Flag : boolean; { флаг корректности ввода } Stud : array[1..MaxNumberStud] of RecStud; { ************************************************************* } { * Процедура проверки значений на не цифру * } { ************************************************************* } Procedure TestData(name: string; var Flag: boolean); begin if IOResult <> 0 then begin Window(10,3, 70,22); { возврат в первое окно } GotoXY(14,19); Write('Не цифра при вводе ', name, ' !') ; Delay(3000); { задержка } GotoXY(14,19); { удаление диагностического сообщения с экрана } Write(' ') ; Window(22,8, 58,18); { переход в окно ввода } GotoXY(23,8); Write(' '); { удаление с экрана старого значения} end else Flag := True; end; { ************************************************************** } { * т е л о п р о г р а м м ы * } { ************************************************************** } Begin { установка цвета фона и цвета символов, очистка экрана } TextBackGround(White); { процедура установки цвета фона } TextColor(White); { процедура установки цвета символов } 115 ClrScr; { процедура очистки экрана цветом фона} { ............................................................................................................ } { организация внутреннего окна и вывод в нем вспомогательной информации } Window(10,3, 70,22); { координаты левого угла окна - (10,3) координаты правого угла окна - (70,22)} TextBackGround(Cyan); { установка цвета фона окна - бирюзового} ClrScr; GotoXY(10,2); Write('По окончанию ввода нажмите клавишу GotoXY(10,3); Write('Для ввода нового значения - клавишу { .............................................................................................................} { организация вложенного окна, используемого для образования рамки и вывода названия окна } Window(20,7, 60,19); TextBackGround(15); { установка белого цвета рамки } ClrScr; TextColor(Red); { установка красного цвета символов } GotoXY(15,1); Write('Окно ввода'); { ............................................................................................................. } { организация второго вложенного окна, предназначенного для ввода информации } Window(22,8, 58,18); TextBackGround(Cyan); ClrScr; TextColor(White); { вывод в окне наименований вводимых данных } For i:= 1 to 5 do begin GotoXY(5,2*i); Write(i:1,'.',NameDat[i]); GotoXY(21,2*i); Write(': '); end; { непосредственный ввод данных } i:= 1; Repeat GotoXY(23, 2); Readln(Stud[i].Fam); GotoXY(23, 4); Readln(Stud[i].Name); GotoXY(23, 6); Readln(Stud[i].Otch); { ввод значения года рождения и проверка его на не цифру } {$I-} Flag:= False; repeat GotoXY(23, 8); Readln(Stud[i].GodR); TestData(NameDat[i], Flag); { вызов процедуры диагностики } until Flag; {$I-} GotoXY(23, 10); Readln(Stud[i].NGrup); i:= i + 1; { Диагностика: исчерпано ли место в ОП, отведенное под массив Stud } 116 if i > MaxNumberStud then begin Window(10,3, 70,22); { возврат в первое окно } GotoXY(12,19); Write('Массив заполнен. Нажмите клавишу Delay(3000); { задержка } GotoXY(12,19); { удаление с экрана диагностического сообщения } Write(' '); end; Key := Readkey Until Key = #27; { ........................................................................................................... } { очистка всего экрана } Window(1,1, 80,25); ClrScr; End. 15.4. Рекомендации по отображению результатов работы программы При выводе данных рекомендуется: − отображать их в "окнах" в виде таблицы и по возможности сопровождать графикой; − использовать цветовые и звуковые эффекты; Таблица состоит из следующих частей: заголовка, подзаголовка и собственно таблицы. Заголовок содержит наименование таблицы, определяющее ее смысловое содержание. Совокупность содержаний графа (столбцов) образует подзаголовок. Слова, входящие в наименование графы, могут сокращаться. Если количество строк в таблице превышает длину стандартного листа (60 строк), то необходимо организовать постраничный вывод таблицы. При этом на любой странице кроме данных необходимо также печатать номер страницы и подзаголовок. Возможный порядок отображения таблицы: 1. Рассчитать ширину таблицы (см. пример таблицы 1). Ширина таблицы состоит из: − суммы максимальных длин вводимых данных; − разделителей граф (их количество на единицу больше числа граф. В качестве вертикального разделителя удобно использовать символ "¦" или символ псевдографики "|" (Alt-179) ); − пустых пробелов между графами для повышения визуального восприятия таблицы. Рис. 2. Вид экрана с изображением таблицы. Список студентов Таблица 1 № п/г Фамилия И.О. Год рождения 519-1а Бадмаев Баир Александрович 1975 519-1б Иванова Людмила Алексеевна 1975 218-2а Павлова Раиса Адамовна 1974 218-2б Доржиева Энгельсина Баировна 1974 239-1а Борисов Вадим Сергеевич 1974 239-3а Ринчинова Дарима Доржиевна 1975 239-2б Савельев Николай Петрович 1975 117 2. Создать окно с помощью процедуры WINDOW и установить цвета для фона "окна" и символов в нем. 3. Вывести заголовок таблицы. 4. Вывести горизонтальную линию. 5. Вывести подзаголовок таблицы, например: № п/г Фамилия И.О. Год рождения 8. Организовать цикл по выводу строки значений данных, используя форматированный вывод оператора WRITE. 9. Вывести горизонтальную линию. Контрольные вопросы 1. Чем характеризуется текстовый экран? Укажите средства позиционирования курсора на экране. 2. Что представляет собой "окно" и какими средствами оно создается? 3. Какими следует пользоваться координатами при выводе информации в "окне": локальными - "окна" или глобальными - экрана? 4. Как осуществляется переход между вложенными или параллельными "окнами"? 5. Перечислите процедуры и функции модуля CRT и укажите их назначение. 6. В чем заключается контроль данных? Обоснуйте необходимость организации корректного ввода. 7. Что такое диагностическое сообщение? Перечислите диагностические сообщения программы Interf. 8. Что понимается под человеко-машинным интерфейсом, и в чем заключается понятие "дружественности"? Задание к работе Разработайте программу, имеющую удобный интерфейс для ввода и вывода информации. Методические указания 1. Структуру данных возьмите из лабораторной работы N 10. Структура - это запись, то есть любая совокупность взаимосвязанных данных. Например, характеристики компьютера, состав компьютера или структура института являются структурами. 2. Создайте программу аналогичную программе Interf.pas дополнив ее: − процедурой контроля на смысловое значение данных; − удалением в "окне ввода" значений, введенных на предыдущем шаге. 3. Отладьте программу. 4. Согласно "возможному порядку отображения таблицы", приведенному в разделе 2.4, разработайте процедуру отображения Вашей структуры данных. 5. Вставьте эту процедуру в отлаженную программу. 6. Отладьте модифицированную программу. 7. Напишите отчет по работе и представьте его к защите. Содержание отчета 1. Титульный лист. 2. Словесная постановка задачи. 3. Текстуальное описание алгоритма решения задачи. 4. Графическая схема алгоритма решения задачи. 5. Листинг программы. 6. Результаты тестирования программы (твердая копия структуры данных). 7. Инструкция к использованию программы. 8. Ответы на контрольные вопросы по согласованию с преподавателем. 118 ЛАБОРАТОРНАЯ РАБОТА N 16 Тема: "Модульное программирование" Цель работы 1. Научиться выделять из общей задачи подзадачи с целью описания их в виде отдельных модулей. 2. Получить навыки компиляции модулей и основной программы средствами ТР. 3. Понять связь объектов основной программы и модулей. Краткие сведения из теории При проектировании программ, предназначенных для решения сложных задач, обычно прибегают к методу пошаговой детализации, или, иначе, методу программирования сверху- вниз. Процесс пошаговой детализации начинается с составления схемы алгоритма, представляющей решение задачи в самых общих чертах. Те этапы решения, которые на схеме выражены недостаточно точно и определенно, подвергаются дальнейшему разбиению с целью уточнения первоначальной схемы на последующих шагах. Процесс детализации повторяется по отношению к новому варианту схемы алгоритма до тех пор, пока не будет достигнут такой уровень ясности решения, при котором написание программы на Паскале уже не составит труда. Таким образом, метод программирования сверху-вниз состоит в том, что на каждом этапе частные детали решения задачи (например, касающиеся конкретного способа определения делимости одного числа на другое) откладываются до того момента, пока не выявится общая структура алгоритма. С чего начинается проектирование программы? Прежде всего с предварительного анализа задачи. Затем с определения и описания цели программы в самых общих чертах. Первоначальное описание цели подвергается последовательному уточнению, выявляя таким образом несколько четко сформулированных задач, для которых вновь строится описание цели и выявляются новые подзадачи. Продолжая процесс детализации, можно расчленить всю проблему на все более и более простые подзадачи. Таким образом, выстраивается иерархическое дерево решения проблемы (рис. 1), ствол которой реализует главная программа, а подзадачи - подпрограммы. При этом тело главной программы будет представлять собой совокупность предложений, в котором производятся поочередно обращения к отдельным ПП. В терминах модульного программирования ПП подразделяются на внешние и внутренние. С внутренними ПП мы познакомились в лабораторной работе N 9. Ими являются процедуры и функции. Внешние ПП называются модулями. Модуль - это некоторая последовательность предложений, в совокупности выполняющих вполне определенную подзадачу или несколько взаимосвязанных подзадач. Такая узко специализированная группа предложений, в принципе, может быть частью текста главной программы, что не всегда удобно, так как загромождает программу. Таким образом, модуль - это некая изолированная программная единица, обладающая следующими характеристиками: набором предложений, описывающим ход решения задачи, при этом в набор могут входит и внутренние ПП; параметрическими значениями, обеспечивающими настройку модуля на выполнение конкретного вычисления. Располагая обобщенной группой предложений, т.е. модулем, программа может осуществить их выполнение, задав соответствующий набор параметров; необходимостью автономной трансляции. Основным преимуществом использования подпрограмм является возможность тестировать и отлаживать их независимо от других ПП. Отлаженная ПП может рассматриваться как не требующий проверки элементарный шаг программы. Например, если 119 Задача Главная программа Подзадача 1 ПП 1 Подзадача i ПП i Подзадача n ПП n Подзадача i1 ПП i1 Подзадача ij ПП ij Подзадача im ПП im главная программа вызывает ПП, то мы можем каждую из них тестировать и отлаживать отдельно до тех пор, пока не убедимся в том, что она правильно работает, а затем объединить их в одно целое. Рис. 1. Иерархическое дерево программы После разработки общего проекта программы в схемах или псевдокодах наступает момент реализации проекта. При реализации проекта программы в мировой практике наработано множество методов или правил проектирования программ, но наибольшее распространение получил метод структурного программирования. |