ПР ПРОГРАММИРОВАНИЕ МОДУЛЯ. Практическая работа тема программирование модуля
Скачать 52.45 Kb.
|
ПРАКТИЧЕСКАЯ РАБОТА ТЕМА: ПРОГРАММИРОВАНИЕ МОДУЛЯ Цель работы: научиться применять в программах стандартные библиотеки подпрограмм, создавать собственные библиотеки подпрограмм. Оборудование: ПК, ИСР Pascal ABC ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Стандартный Паскаль не располагает средствами разработки и поддержки библиотек программиста, которые компилируются отдельно и в дальнейшем могут быть использованы не только самим разработчиком. Если программист имеет достаточно большие наработки и если те или иные подпрограммы могут быть использованы при написании новых приложений, приходится эти подпрограммы целиком включать в новый текст. В Паскале это ограничение преодолевается, во-первых, внедрением внешних подпрограмм, а, во- вторых, созданием и использованием модулей. Внедрение внешних подпрограмм В этом случае исходный текст каждой процедуры или функции хранится в отдельном файле и при необходимости с помощью специальной директивы компилятора включается в текст создаваемой программы. Пример1. Дано число n, требуется найти сумму первой и последней цифр этого числа. Создаем функцию: Function Digits(N: LongInt): Byte; Var Kol: Byte; Begin Kol:=0; While N<>0 Do Begin Kol:=Kol + 1; N:=N Div 10 End; Digits:=Kol End; Сохраним этот текст в файле с расширением .inc (расширение внешних подпрограмм), например digits.inc. Опишем также функцию возведения числа в степень an: Function Power (A,N: LongInt): LongInt; {файл power.inc} Var I, St: LongInt; Begin St:=1; For I:=1 To N Do St:=St*A; Power:=St End; Основная программа, решающая поставленную задачу с использованием описанных подпрограмм: Program Example1; Var N, S: Integer; {$I digits.inc} {Подключение внешней функции из файла digits.inc, вычисляющей количество цифр в записи числа} {$I power.inc} {Подключение внешней функции из файла power.inc, вычисляющей результат возведения числа а в степень n } Begin Write (‘Введите целое число: ’); Readln(n); {Для определения последней цифры числа N берется остаток от деления этого числа на 10, а для определения первой цифры число N делится на число 10, возведенное в степень, на единицу меньшую, чем количество цифр в записи числа N} S:= N Mod 10 + N Div Power(10, Digits(N)-1); Writeln(‘Искомая сумма=’, S) End. Директива компилятора {$I <имя файла>} позволяет в данное место текста программы вставить содержимое файла с указанным именем. Файлы с расширением .inc можно накапливать на жестком диске, формируя таким образом личную библиотеку подпрограмм. Создание и использование модулей Модуль – это набор ресурсов (функций, процедур, констант, переменных, типов и т.д.), разрабатываемых и хранимых независимо от использующих программ. В отличие от внешних подпрограмм, модуль может содержать достаточно большой набор процедур и функций, а также других ресурсов для разработки программ. Стандартные модули: System Crt Graph и др. Например, стандартный модуль CRT в паскале поддерживает 16 цветов, нумерация которых начинается с 0 (от 0 до 15 включительно). Также можно просто прописывать названия цветов не используя цифры. Для того чтобы использовать модуль CRT его нужно подключить с помощью следующей строчки: uses crt; Для того чтобы закрасить фон нужно использовать такую команду: textbackground (2); //Фон залит зелѐным цветом textbackground следует применять вместе с процедурой очистки экрана, которая описана ниже. Для очистки экрана (1) и установки позиции курсора (2) используются соответственно следующие команды: clrscr; {(1) – очистка курсора} gotoxy (9,6); {(2) –Курсор установлен в точку (9;6)} Цвет текста определяет процедура: textcolor (13); Для временной задержки существует процедура delay delay (1500); Запускать программу в Pascal с использованием модуля CRT нужно при помощи клавиш Shift+F9. Пример 2. Программа на Паскаль с использованием модуля CRT: uses crt; {Подключение модуля} begin textbackground (2); {Перекраска фона в зелѐный} clrscr; {Очистка экрана и применение цвета фона} textcolor (13); {Текст будет розовым цветом} gotoxy (9,6); {Курсор будет перемещѐн в точку (9;6)} write ('Программирование'); {Вывод текста} delay (1500); {Задержка} textbackground (3); {Фон будет салатного цвета} clrscr; {Очистка экрана } gotoxy (20,20); {Курсор перемещѐн в точку (20;20)} textcolor (red); {Цвет текста – красный} write ('Алгоритмизация'); {Вывод текста} readln; end. Структура модуля: Unit <имя модуля>; {Заголовок модуля} Interface {Интерфейсная часть} Implementation {Раздел реализации} Begin {Раздел инициализации модуля} End. Примечания: Имя модуля должно совпадать с именем файла и не должно содержать более 8 символов В разделе Interface объявляются все ресурсы, которые будут в дальнейшем доступны программисту при подключении модуля. В разделе Implementation описываются все подпрограммы, которые были ранее объявлены. Раздел инициализации содержит операторы, которые должны быть выполнены сразу же после запуска программы, использующей модуль. Может быть пустым. При разработке модуля рекомендуется следующий порядок: Спроектировать модуль, то есть определить основные и вспомогательные подпрограммы и другие ресурсы; Описать компоненты модуля; Отладить каждую программу отдельно, после чего «вклеить» в текст модуля Откомпилировать модуль. Для этого в меню системы Паскаль выбрать Compile/Destination Disk, а затем – Compile/Build Подключить разработанный модуль к программе, где планируется его использование. Для подключения модулей используется служебное слово Uses. Пример 3. Разработать модуль, содержащий подпрограмму суммирования элементов массива. Разбиваем текст программы на две части: подпрограмму размещаем в модуле, а тестирующую программу оставляем в качестве основной программы. Так как все структурные типы параметров должны быть предварительно объявлены, описываем тип массива в модуле. {Модуль должен размещаться в файле Summa.pas}Unit Summa;Interface {объявление внешних ресурсов} Туре mas=array[1..10] of integer; Function sum(b:mas; n:integer):integer; ImplementationFunction sum; {описание функции} Var s, i: integer; begin s:=0; for i:=1 to n do s:=s+b[i]; sum:=s; end; Begin end. Программа использует из модуля два ресурса: описание типа mas для объявления массива А и функцию Sum. Program Ex; Uses summa; {указание используемого модуля} Var a: mas; {используем ресурс mas} i, n: integer; s:real; Begin Writeln('Введите размерность массива:'); Readln(n); Writeln('Введите элементы массива:'); For I:=1 To n do read(a[i]); s:=sum(a,n); {используем ресурс sum из модуля Summa} Writeln('summa=',s:5:2); end. Программа использует из модуля два ресурса: описание типа mas для объявления массива А и функцию Sum. Задание. Составить модуль по заданным подпрограммам (процедурам) для работы с телефонным справочником. Процедуры выполняют следующие действия: Создание нового файла, который содержит данные: фамилию абонента, и его номер телефона; Просмотр списка справочника; Изменение записи справочника; Поиск абонента по фамилии. Доработать телефонный справочник, добавить в модуль и основную программу процедуру для поиска абонента по номеру телефона. Составить блок-схемы для основной программы и для любой подпрограммы. Procedure Create_Book_Phone – процедура формирования телефонного справочникаProcedure Create_Book_Phone; Var Ind, Count: integer; Begin write('Введите имя файла телефонного справочника'); Readln(Name); Assign(BookFile, Name); Rewrite(BookFile); {Открытьновыйфайлдлязаписи} Writeln('Создание записей файла',Name); Write ('Введите число записей в файле'); Readln(Count); for Ind:=1 to Count do begin writeln('Ввод записи №', FilePos(Bookfile)+1); with work do begin write('Введите фамилию: '); readln(FIO);{Ввод фамилиивфайл} write(' Введите номер телефона: '); readln(Phone); {Ввод номерателефонавфайл} Write(BookFile, Work);{Записатьвфайлфамилию иномер телефона} end ; end; Writeln('Создание файла справочника завершено'); Writeln('Файл данных имеет ', FileSize(BookFile), 'записей'); Close(BookFile); end. Пояснение: Для сокращения записи при обращении к полям FIO и Phone переменной типа запись Work используем предложение with work do. В окончании процедуры организуем вывод сообщения о результатах создания файла. Для измерения размера файла в записях используем функцию FileSize. Procedure OutputAllRec – процедура просмотра списка телефонного справочника Procedure OutputAllRec; begin Writeln('Введите имя файла'); Readln(Name); Assign(BookFile, Name); Reset(BookFile); If IOResult = 0 then begin Seek(BookFile,0); Writeln('***Вывод телефонного справочника из файла ', Name, '***'); While (not Eof(Bookfile)) do begin Read(BookFile, work); With work do begin Write ('Zapis N', FilePos(BookFile), ':'); Writeln('Фамилия Имя Отчество:', FIO, 'Телефон: ', Phone); end; end; end; end; Пояснение: для вывода на экран всех записей файла сначала, используя функцию IOresult, выполним проверку наличия данного файла на диске. Если функция IOresult возвращает значение, отличное от 0, то на экран выводится сообщение о том, что требуемого файла нет на диске. В противном случае разместить указатель так, чтобы он указывал на первую запись: Seek(BookFile, 0), не забывая, что первый компонент имеет номер 0. Затем, используя оператор while, вызвать процедуру вывода на экран одной записи. Условием окончания цикла while будет выражение Eof(BookFile). Как только оно выполнится, цикл завершится. Данные всех записей файла выводятся на экран. Для вывода на экран номера записи применим функцию FilePos(BookFile). Procedure UpDateRec – процедура изменения записи телефонного справочника Procedure UpDateRec; var NumRec:LongInt; begin Writeln('Введите имя файла'); Readln(Name); Assign(Bookfile, Name); Reset(BookFile); If IOResult = 0 then begin Write('Укажите номер изменяемой записи: '); Readln(NumRec); Seek(BookFile, NumRec-1); {Установка файловой позиции по указанному номеру} Writeln('—старое значение записи:'); {Вывод записи на экран и переход на следующую} Read(BookFile, work); With work do begin Write ('Запись №', FilePos(BookFile), ':'); Writeln('Фамилия Имя отчество:', FIO, ' Телефон: ', Phone); end; Seek(BookFile, NumRec-1); {Возврат на прежнюю позицию} Writeln('Задаем новое значение', NumRec, 'записи'); begin writeln('Вводим запись №', FilePos(Bookfile)+1); with work do begin write('Введите фамилию: '); readln(FIO); write('Введите номер телефон: '); readln(Phone); Write(BookFile, Work); end; end; end; Close(BookFile); end; Пояснение:для изменения записи файла сначала, используя функцию IOResult, проверим, есть ли данный файл на диске. Дальше выводится запрос о номере изменяемой записи. После считывания номера записи переместим указатель к данной записи и выведем данные этой записи из файла на экран. Затем задаем новые значения полей этой записи. В разделе описания переменных опишем локальную переменную NumRec типа LongInt (длинное целое), которая будет принимать значение номера изменяемой записи. Procedure FindFIO – процедура поиска абонента по фамилииProcedure FindFIO; var Bookfile: file of RecBook; Work: RecBook; Maska: StFIO; Rez_Find: boolean; CountRec: integer; Begin Writeln('Укажите имя файла'); Readln(name); Assign(BookFile, Name); Reset(BookFile); if IOresult = 0 then begin write('Введите фамилию для поиска:'); Readln(Maska); Rez_Find:=False; CountRec:=0; While (not Eof(BookFile)) do begin Read(BookFile, Work); With work do if Pos(Maska, FIO)<>0 then begin Rez_Find:=True; Inc(CountRec); Writeln('Фамилия:' , FIO, 'Телефон:', Phone); end; end; if Rez_Find then Writeln('Число записей для ', Maska, ' = ', CountRec) else writeln('Нет абонентов с фамилией ', Maska); Close(BookFile); end; Пояснение:в процедуре поиска номера телефона опишем локальные переменные: Maska типа stFio, которая будет хранить фамилию искомого абонента; Rez_Find типа Boolean, которая будет принимать значения True (истина) и False (ложь) в зависимости от результата поиска; CountRec , значение которой будет равно числу записей с такой фамилией. После запроса имени файла данных телефонного справочника и проверки его наличия на диске сделаем запрос фамилии искомого абонента. Перед поиском присвоим переменным Rez_Find и CountRec значения false и 0 соответственно. Просмотр всех записей файла данных при поиске реализуем при помощи оператора цикла while. Условием завершения поиска является Eof(BookFile) – достяжение конца файла. Для сокращения обращения к именам полей записи используем предложение with Work do.При совпадении значения поля FIO очередной записи со значением переменной Maska переменной Rez_Find присваивается значение True (абонент с заданной фамилией найден), значение переменной CountRec увеличивается на 1 и выводится сообщение о фамилии и номере телефона найденного абонента. Описываем глобальные переменные, которые будут нужны в процессе работы процедур(Блок описания модуля) type StFio = string[20]; StPhone = string[10]; RecBook = record {запись сведений об абоненте} FIO: StFio; {поле фамилия} Phone: StPhone {поле номер телефона} end; var BookFile: file of RecBook; {Описание файловой переменной, компонентами, которой явл. запись} Work: RecBook; {Переменная для доступа к записям} Name: string; {переменная, которая содержит имя внешнего файла на диске} Основная программа, использующая ресурсы модуля telephonProgram Tel_spravochnik; uses crt, telephon; var Vid:byte; {переменная, которая позволяет выбрать вид операции работы со справочником} End_Menu: boolean; Begin clrscr; End_Menu:=False; Repeat writeln('***Телефонный справочник***'); Writeln('Выберите вид работ с телефонным справочником:'); Writeln('1 – создание нового файла'); Writeln('2 – просмотр списка справочника); Writeln('3 – изменение справочника'); Writeln('4 – поиск абонента по фамилии'); writeln('0 – завершение работы') ; Writeln('Ваш выбр:'); Readln(Vid); Case vid of 1: Create_Book_Phone; 2: OutputAllRec; 3: UpDateRec; 4: FindFIO; 0: End_Menu:=True; end; Writeln('Для продолжения Enter'); Readln; Clrscr; until End_Menu=true; end. ЗАДАНИЕРеализовать в виде модуля набор подпрограмм для выполнения следующих операций: перевод из кг в граммы перевод из кг в тонны перевод из кг в центнер перевод из кг в миллиграммы Создать программу, в которой необходимо будет обратиться к ресурсам разработанного модуля. КОНТРОЛЬНЫЕ ВОПРОСЫКогда необходимо использовать модуль? Чем модуль отличается от подпрограмм? Из каких разделов состоит модуль? Дайте характеристику разделов модуля? Скачано с www.znanio.ru |