Главная страница
Навигация по странице:

  • "ОСНОВЫ ПРОГРАММИРОВАНИЯ"

  • Практическая работа № 1 Модули Цель работы: закрепить знания о модулях; разработка модуля и программы с его использованием. 1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

  • 2 ВЫПОЛНЕНИЕ РАБОТЫ

  • 3 ФОРМА ОТЧЕТА В работе отчет должен содержать краткое изложение теории модулей, ответы на вопросы. 4 КОНТРОЛЬНЫЕ ВОПРОСЫ

  • Практическая работа № 2 Создание библиотек подпрограмм в Turbo Pascal. Связь модулей друг с другом

  • 1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

  • му паскаль и делфи. Методические рекомендации для студентов по выполнению практических работ для специальности 09. 02. 03 Программирование в компьютерных системах


    Скачать 2.13 Mb.
    НазваниеМетодические рекомендации для студентов по выполнению практических работ для специальности 09. 02. 03 Программирование в компьютерных системах
    Дата01.09.2022
    Размер2.13 Mb.
    Формат файлаdoc
    Имя файламу паскаль и делфи.doc
    ТипМетодические рекомендации
    #658926
    страница1 из 7
      1   2   3   4   5   6   7

    Ливенский филиал ПГУ

    МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

    ДЛЯ СТУДЕНТОВ ПО ВЫПОЛНЕНИЮ

    ПРАКТИЧЕСКИХ РАБОТ
    для специальности 09.02.03 «Программирование в компьютерных системах»

    "ОСНОВЫ ПРОГРАММИРОВАНИЯ"

    2015

    АННОТАЦИЯ
    Методические указания соответствуют рабочей программе по специальности 09.02.03 Программирование в компьютерных системах.

    В работах приведены задачи и упражнения по основным разделам курса изучения объектно-ориентированного языка программирования Delphi. Каждое задание содержит теоретический материал, разбор характерных примеров и задач, методические рекомендации по их выполнению. В конце задания дается перечень задач для самостоятельного решения и список вопросов для самоподготовки.
    Составитель: ___________________ Е. Н. Шатохина, преподаватель кафедры естественнонаучных дисциплин

    Ливенского филиала ПГУ

    Рецензент: ____________________ Д. Н. Шолохов, преподаватель кафедры естественнонаучных дисциплин

    Ливенского филиала ПГУ


    Методические рекомендации рассмотрены и одобрены на заседании кафедры естественнонаучных дисциплин.
    Протокол № ____ от «___»__________20__ г.
    Зав. кафедрой канд.техн. наук, доцент _____________ В.И.Брусова

    Методические рекомендации рассмотрены и одобрены на заседании научно-методического совета
    Протокол № ____ от «___»__________ 20__ г.

    Председатель НМС канд. соц. наук _____________ Е.А. Колякина
    СОДЕРЖАНИЕ

    МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ 1

    Модули 4

    Работа с файлами 14

    Создание файла и запись данных в него 15

    Чтение данных из файла 15

    Функция IOResult 16

    Редактирование файла 17

    Текстовые файлы 17

    Типизированные файлы 18

    Нетипизированные файлы 19

    Операции для работы с файловой системой 22

    Цель работы: ознакомиться с операциями, предназначенными для работы с файловой системой. 22

    1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ 22

    Практическая работа №11. 49

    Panel1,2,3Caption 54

    With RxGIFAnimator1 do Begin 65

    Практическая работа № 1

    Модули


    Цель работы: закрепить знания о модулях; разработка модуля и программы с его использованием.

    1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

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

    Модуль не представляет собой исполняемой программы, а только содержит набор средств для использования в исполняемой программе: типы данных, переменные, процедуры и функции. Исходный текст модуля имеет расширение .pas. Модуль компилируется отдельно от основной программы, откомпилированный модуль имеет расширение .tpu (Turbo Pascal Unit). Готовый откомпилированный модуль может быть использован в основной программе с помощью предложения uses, которое записывается сразу же после имени программы.

    В Турбо Паскале имеются стандартные модули: DOS, CRT (Cathode Ray Tube, электронно-лучевая трубка), Printer, Graph, System и другие. Их не надо описывать, а можно сразу включать в программу предложением uses. Модуль System используется во всех программах, поэтому для него сделано исключение, его можно не включать в предложение uses, он будет подключен автоматически. Остальные модули требуют включения в предложение uses, если в программе используются ресурсы модуля, например, процедуры и функции.

    Назначение стандартных модулей следующее. Модуль DOS использует системные ресурсы операционной системы MS-DOS . Возможно использование регистров, обслуживание прерываний, вызов других программ из программы на Паскале. Модуль CRT используется для обслуживания видеомонитора, клавиатуры, встроенного динамика. Процедуры очистки экрана clrscr и ожидание нажатия клавиши readkey содержатся именно в модуле CRT.

    Модуль Graph содержит богатейший набор графических процедур и функций: проведение линий, работа с цветом, вызов графических примитивов, работа с текстом в графическом режиме, закраска замкнутых областей и т.п. Экран в графическом режиме рассматривается как набор пикселей. Модуль Printer служит для вывода информации на принтер.

    Кроме стандартных модулей, в Турбо Паскале возможны модули пользователя, Они требуют описания, которое начинается ключевым словом языка unit и содержат 3 раздела: раздел интерфейса (interface), раздел реализации (implementation), раздел инициализации (необязательный).

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

    За счет параллельной работы многих программистов срок разработки сокращается во много раз. Руководитель проекта распределяет работу и обеспечивает стыковку отдельных модулей в единое целое. При этом каждый программист может пользоваться своими идентификаторами, независимо от остальных. Совпадение идентификаторов в различных модулях не оказывает влияния на программу, т.к. каждый идентификатор используется в своем модуле.

    Рассмотрим пример модуля для работы с комплексными числами. Комплексное число состоит из двух вещественных чисел, действительной и мнимой частей соответственно. Пусть имеются два комплексных числа x и y: x=a+bi; y=c+di. Здесь i квадратный корень из минус единицы (мнимая единица), причем i2= - 1. Если комплексное число z=e+fi, и z есть результат операции над x и y, то

    z=x+y; e=a+c: f=b+d; (сложение)

    z=x-y; e=a-c: f=b-d; (вычитание)

    z=x*y; e=a*c-b*d: f=a*d+b*c; (умножение)

    z=x/y; e=(a*c+b*d)/(c2+d2): f=(c*b-a*d)/(c2+d2): (деление)

    Легко видеть, что при сложении и вычитании складываются и вычитаются соответственно действительные и мнимые части комплексных чисел, умножение и деление более сложны.

    Для организации операций над комплексными числами представим каждое комплексное число в виде записи из двух полей вещественного типа: Re -действительная часть, Im - мнимая часть. Создадим модуль complex, в котором опишем комплексный тип com с двумя полями. В этом же модуле в разделе интерфейса опишем процедуры ad (сложение), su (вычитание), mu (умножение), di (деление) комплексных чисел (только заголовки). Тела процедур поместим в раздел реализации модуля. Раздел инициализации имеет вид:

    begin

    операторы

    end.

    Если раздел инициализации не содержит операторов, как в нашем примере, достаточно написать только end. Пример модуля complex.pas.

    unit complex;{модуль арифметики комплексных чисел}

    {$N+}

    interface

    uses dos,crt;

    type com=record

    re,im:real;

    end;

    var a,b,c:com;

    procedure ad(var a,b,c:com);{сложение, c=a+b}

    procedure su(var a,b,c:com);{вычитание, c=a-b}

    procedure mu(var a,b,c:com);{умножение, c=a*b}

    procedure di(var a,b,c:com);{деление, c=a/b, случай b =0 не предусмотрен }

    procedure wr_com(var p:com); {печать комплексного числа}

    implementation

    procedure ad(var a,b,c:com);

    begin c.re:=a.re+b.re;

    c.im:=a.im+b.im;

    end;{ad}

    procedure su(var a,b,c:com);

    begin c.re:=a.re-b.re;

    c.im:=a.im-b.im;

    end;{su}

    procedure mu(var a,b,c:com);

    begin c.re:=a.re*b.re-a.im*b.im;

    c.im:=a.re*b.im+a.im*b.re;

    end;{mu}

    procedure di(var a,b,c:com);

    var d:real;

    begin d:=b.re*b.re+b.im*b.im;

    c.re:=(a.re*b.re+a.im*b.im)/d;

    c.im:=(b.re*a.im-a.re*b.im)/d;

    end;{di}

    procedure wr_com(var p:com);

    begin

    if p.im<0 then writeln(p.re:9:5,'-',-p.im:9:5,'i') else

    writeln(p.re:9:5,'+',p.im:9:5,'i');

    end;{wr_com}

    begin

    end.{unit}

    Как уже было указано, модуль не может непосредственно выполняться. Нужно разработать основную программу, которая использует ресурсы модуля. В данном случае это программа com_arif.pas (комплексная арифметика). В программе вводятся 2 комплексных числа, затем с ними выполняются действия сложения, вычитания, умножения и деления, результаты выводятся на экран.

    program com_arif;

    uses complex;

    var x,y,z:com; {тип com определен в модуле complex}

    begin

    writeln('Введите дейст. и мн. части первого числа');

    read(x.re,x.im);

    writeln('Введите дейст. и мн. части второго числа');

    read(y.re,y.im);

    write('x='); wr_com(x);

    write('y='); wr_com(y);

    ad(x,y,z); {z=x+y}

    write('x+y=');wr_com(z);

    su(x,y,z); {z=x-y}

    write('x-y=');wr_com(z);

    mu(x,y,z); {z=x*y}

    write('x*y=');wr_com(z);

    di(x,y,z); {z=x/y}

    write('x/y=');wr_com(z);

    end.
    2 ВЫПОЛНЕНИЕ РАБОТЫ

    В работе требуется внимательно рассмотреть и разобрать построчно, приведенные примеры.

    3 ФОРМА ОТЧЕТА

    В работе отчет должен содержать краткое изложение теории модулей, ответы на вопросы.

    4 КОНТРОЛЬНЫЕ ВОПРОСЫ

    1. Какое расширение имеет исходный файл модуля? Откомпилированный файл?

    2. Какие разделы имеются в модуле? Какой раздел модуля доступен для программ и других модулей? Какой недоступен?

    3. Какие ресурсы модуля могут использоваться в программах?

    4. Каковы преимущества использования модулей?

    5. Имеется ли в разработанном вами модуле раздел инициализации?

    6. Назначение раздела инициализации модуля.

    7. В каком разделе модуля помещаются тела процедур и функций?

    Практическая работа № 2

    Создание библиотек подпрограмм в Turbo Pascal. Связь модулей друг с другом
    Цель работы: ознакомиться с созданием библиотек подпрограмм, получить начальные сведения о связи модулей в Turbo Pascal.
    1 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

    Стандартный язык Pascal не располагает средствами разработки и поддержки библиотек программиста (в отличие, скажем, от языка Fortran и других языков программирования высокого уровня), которые компилируются отдельно и в дальнейшем могут быть использованы как самим разработчиком, так и другими. Если программист имеет достаточно большие наработки, и те или иные подпрограммы могут быть использованы при написании новых приложений, то приходится эти подпрограммы целиком включать в новый текст.

    В Turbo Pascal это ограничение преодолевается за счет, во-первых, введения внешних процедур, во-вторых, разработки и использования модулей. В настоящей работе на примерах рассмотрим работу с теми и другими программными единицами.

    Начнем с внешних подпрограмм.

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

    Покажем это на примере задач целочисленной арифметики, где аргументы, результаты и промежуточные величины являются целыми (Integer, Word, LongInt и т.д.). Вот несколько таких задач.

    1. Дано натуральное число n. Найти сумму первой и последней цифры этого числа.

    2. Дано натуральное число n. Переставить местами первую и последнюю цифры этого числа.

    3. Дано натуральное число n. Дописать к нему цифру kв конец и в начало (если это возможно, т.е. результат не выйдет за диапазон допустимых значений), или сообщить о невозможности выполнения операции.

    4. Найти наибольшую цифру в записи данного натурального числа.

    5. Дано натуральное число 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 (это расширение внешних подпрограмм в Turbo Pascal), например, digits.inc.

    Еще необходима функция возведения натурального числа в натуральную степень.

    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: LongInt;

    {$I digits.inc} {подключаем внешнюю функцию digits.inc, возвращающую количество цифр в записи числа}

    {$I power.inc} {внешняя функция, выполняющая возведение числа A в степень N}

    Begin

    Write('Введите натуральное число: ');

    ReadLn(N);

    {для определения последней цифры числа N берем остаток от деления этого числа на 10, а для определения первой делим N на 10 в степени на единицу меньшую, чем количество цифр в записи числа (нумерация разрядов начинается с 0)}

    S := N Mod 10 + N Div Power(10, Digits(N) — 1);

    WriteLn('Искомая сумма: ', S)

    End.

    Внешние процедуры создаются и внедряются в использующие их программы аналогично функциям, и мы не будем подробно на этом останавливаться.

    Далее речь пойдет о модулях: их структуре, разработке, компиляции и использовании.

    Модуль — это набор ресурсов (функций, процедур, констант, переменных, типов и т.д.), разрабатываемых и хранимых независимо от использующих их программ. В отличие от внешних подпрограмм модуль может содержать достаточно большой набор процедур и функций, а также других ресурсов для разработки программ. Обычно каждый модуль содержит логически связанные между собой программные ресурсы.

    В основе идеи модульности лежат принципы структурного программирования. Существуют стандартные модули Turbo Pascal, которые обычно описываются в литературе по данному языку.

    Модуль имеет следующую структуру:

    Unit <имя модуля>; {заголовок модуля}

    Interface

    {интерфейсная часть}

    Implementation

    {разделреализации}

    Begin

    {раздел инициализации модуля}

    End.

    После служебного слова Unit записывается имя модуля, которое (для удобства дальнейших действий) должно совпадать с именем файла, содержащего данный модуль. Поэтому (как принято в MS DOS) имя не должно содержать более 8 символов.

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

    В разделе Implementation реализуются все подпрограммы, которые были ранее объявлены. Кроме того, здесь могут содержаться свои константы, переменные, типы, подпрограммы и т.д., которые носят вспомогательный характер и используются для написания основных подпрограмм. В отличие от ресурсов, объявленных в разделе Interface, все, что дополнительно объявляется в Implementation, уже не будет доступно при подключении модуля. При написании основных подпрограмм достаточно указать их имя (т.е. не нужно полностью переписывать весь заголовок), а затем записать тело подпрограммы.

    Наконец, раздел инициализации (который часто отсутствует) содержит операторы, которые должны быть выполнены сразу же после запуска программы, использующей модуль.

    Приведем пример разработки и использования модуля. Поскольку рассмотренная ниже задача достаточно элементарна, ограничимся листингом программы с подробными комментариями.

    Задача. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P/Q (P— целое, Q— натуральное):

    1) сложение; 2) вычитание; 3) умножение; 4) деление; 5) сокращение дроби; 6) возведение дроби в степень N (N— натуральное); 7) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

    Дробь представить следующим типом:

    Type Frac = Record

    P: Integer;

    Q: 1… High(LongInt)

    End;


    Unit Droby;

    Interface

    Type

    Natur = 1..High(LongInt);

    Frac = Record

    P: LongInt; {Числитель дроби}

    Q: Natur {Знаменатель дроби}

    End;

    Procedure Sokr(Var A: Frac);

    Procedure Summa(A, B: Frac; Var C: Frac);

    Procedure Raznost(A, B: Frac; Var C: Frac);

    Procedure Proizvedenie(A, B: Frac; Var C: Frac);

    Procedure Chastnoe(A, B: Frac; Var C: Frac);

    Procedure Stepen(A: Frac; N: Natur; Var C: Frac);

    Function Menshe(A, B: Frac): Boolean;

    Function Bolshe(A, B: Frac): Boolean;

    Function Ravno(A, B: Frac): Boolean;

    Function MensheRavno(A, B: Frac): Boolean;

    Function BolsheRavno(A, B: Frac): Boolean;

    Function NeRavno(A, B: Frac): Boolean;

    {Раздел реализации модуля}

    Implementation

    {Наибольший общий делитель двух чисел — вспомогательная функция, ранее не объявленная}

    Function NodEvklid(A, B: Natur): Natur;

    Begin

    While A <> B Do

    If A > B Then

    If A Mod B <> 0 Then A := A Mod B Else A := B

    Else

    If B Mod A <> 0 Then B := B Mod A Else B := A;

    NodEvklid := A

    End;

    Procedure Sokr; {Сокращение дроби}

    Var M, N: Natur;

    Begin

    If A.P <> 0 Then

    Begin

    If A.P < 0 Then M := Abs(A.P)

    Else M := A.P; {Совмещение типов, т.к. A.P — LongInt}

    N := NodEvklid(M, A.Q); A.P := A.P Div N; A.Q := A.Q Div N

    End

    End;

    Procedure Summa; {Сумма дробей}

    Begin

    {Знаменатель дроби} C.Q := (A.Q * B.Q) Div NodEvklid(A.Q, B.Q);

    {Числитель дроби} C.P := A.P * C.Q Div A.Q + B.P * C.Q Div B.Q;

    Sokr(C)

    End;

    Procedure Raznost; {Разность дробей}

    Begin

    {Знаменатель дроби} C.Q := (A.Q * B.Q) Div NodEvklid(A.Q, B.Q);

    {Числитель дроби} C.P := A.P * C.Q Div A.Q — B.P * C.Q Div B.Q;

    Sokr(C)

    End;

    Procedure Proizvedenie;

    Begin

    {Знаменатель дроби} C.Q := A.Q * B.Q;

    {Числитель дроби} C.P := A.P * B.P;

    Sokr(C)

    End;

    Procedure Chastnoe;

    Begin

    {Знаменатель дроби} C.Q := A.Q * B.P;

    {Числитель дроби} C.P := A.P * B.Q;

    Sokr(C)

    End;

    Procedure Stepen; {Степень}

    Var I: Natur;

    Begin

    C.Q := 1; C.P := 1; Sokr(A);

    For I := 1 To N Do Proizvedenie(A, C, C)

    End;

    Function Menshe;

    Begin Menshe := A.P * B.Q < A.Q * B.P End;

    Function Bolshe;

    Begin Bolshe := A.P * B.Q > A.Q * B.P End;

    Function Ravno;

    Begin Ravno := A.P * B.Q = A.Q * B.P End;

    Function BolsheRavno;

    Begin BolsheRavno := Bolshe(A, B) Or Ravno(A, B) End;

    Function MensheRavno;

    Begin MensheRavno := Menshe(A, B) Or Ravno(A, B) End;

    Function NeRavno;

    Begin NeRavno := Not Ravno(A, B) End;

    {Раздел инициализации модуля}

    Begin

    End.

    Дадим некоторые рекомендации по разработке модулей:

    1) спроектировать модуль, т.е. выделить основные и вспомогательные подпрограммы, другие ресурсы;

    2) каждую подпрограмму целесообразно отладить отдельно, после чего «вклеить» в текст модуля.

    Сохраним текст разработанной программы в файле DROBY.PAS и откомпилируем наш модуль. Для этого можно воспользоваться внешним компилятором, поставляемым вместе с Turbo Pascal. Команда будет выглядеть так: TPC DROBY.PAS. Если в тексте нет синтаксических ошибок, получим файл DROBY.TPU, иначе будет соответствующее сообщение с указанием строки, содержащей ошибку. Другой способ компиляции модуля — в среде программирования Turbo Pascal выбрать в пункте меню Run подпункты Make или Build (при этом должна быть включена компиляция на диск).

    Теперь можно подключить модуль к программе, где планируется его использование.

    Для примера решим задачу суммирования массива дробей.

    Program Sum;

    Uses Droby;

    Var A: Array[1..100] Of Frac;

    I, N: Integer;

    S: Frac;

    Begin

    Write('Введите количество элементов массива: ');

    ReadLn(N);

    S.P := 0; S.Q := 1; {Первоначально сумма равна нулю}

    For I := 1 To N Do {Вводим и суммируем дроби}

    Begin

    Write('Введите числитель', I, '-йдроби: '); ReadLn(A[I].P);

    Write('Введите знаменатель', I, '-йдроби: '); ReadLn(A[I].Q);

    Summa(A[I], S, S);

    End;

    WriteLn('Ответ: ', S.P, '/', S.Q)

    End.

    Как видно из примера, для подключения модуля используется служебное слово USES, после чего указывается имя модуля и происходит это сразу же после заголовка программы. Если необходимо подключить несколько модулей, они перечисляются через запятую.

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

    Ещё несколько слов о видимости объектов модуля. Если в программе, использующей модуль, имеются идентификаторы, совпадающие с точностью до символа с идентификаторами модуля, то они «перекрывают» соответствующие ресурсы модуля. Тем не менее, даже в такой ситуации доступ к этим ресурсам модуля может быть получен таким образом: <имя модуля>.<имя ресурса>.
      1   2   3   4   5   6   7


    написать администратору сайта