Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
основы программирования и алгоритмизация.docx
Скачиваний:
19
Добавлен:
27.09.2019
Размер:
281.75 Кб
Скачать

Подпрограммы – процедуры

Подпрограммами называются вспомогательные алгоритмы

В Паскале различают две разновидности подпрограмм:

- Процедуры

- Функции

Задача: даны два натуральных числа А и В. Необходимо найти наиболее общий делитель трех величин: А+В, |А-В|, А*В

НОД(А+В, |А-В, А*В) = (НОД (А+В, |А-В|), А*В)

Т.е необходимо найти НОД первых двух величин, а затем НОД полученного значения и третьей величины

Запишем процедуру НОД на алгоритмическом языке

Процедура Евклид (M, N,K)

Нач

Пока M<>N

Нач

Если M>N

То M:=M-N

Иначе N:=N-M

Кон;

K:=M

Кон;

Здесь M и N являются формальными параметрами процедуры

M и N это параметры аргументы, K – это параметр результат. Основной алгоритм, решающий исходную задачу будет следующий:

Алгоритм задача

Целое а, в, с,

Начало

Ввод (а,в)

Евклид (а+в, |а-в|, с)

Евклид (с, а*в, с)

Вывод (с)

Конец

Основное отличие процедуры в Паскале от процедуры в алгоритмическом языке является то, что процедура в паскале описывается в разделе описания подпрограмм, а в алгоритмическом языке является внешний, по отношению к вызывающей программе.

Program NOD;

Var A,B,C: integer;

Procedure Evklid (M,N:integer; Var K:integer);

Begin

While M<>N do

If M>N then M:=M-N

Else N:=N-M;

K:=M;

End;

Begin

Write (‘a=’);

Read (A);

Write (‘b=’);

Read (b);

Evklid (C,A*B,C);

Evklid (‘НОД=’,C);

End

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

Существует и другой способ обмена - через глобальные переменные.

Синтаксис описания процедуры:

<Заголовок процедуры><имя процедуры><блок>

<Заголовок процедуры><имя процедуры>кнопка (<список формальных параметров> кнопка )

Из диаграмм видно, что процедура может иметь параметры, а может указываться без них. Чаще всего аргументы представляются как параметры – значения (хотя могут быть и параметрами - переменными). А для передачи результата используются параметры – переменные, причем в качестве результата вызывающую программу может передаваться множество значений (в частном случае одно), а может и неодного.

20.01.12

Рассмотрим правила обращения к процедурам.

Обращение к процедуре производится в форме оператора процедуры.

<имя процедуры>(список фактических параметров)

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

Правила соответствия между формальными и фактическими параметрами:

  1. Соответствие по кол-ву

  2. Соответствие по последовательности

  3. Соответствие по типам

Правила взаимодействия формально-фактических параметров:

  1. Передача по значению – вычисляется значение фактического параметра (выражения) и это значение присваивается соответствующему формальному параметру.

  2. Передача по имени – при выполнении процедуры имя формальной переменной заменяется на имя фактического параметра.

Теперь рассмотрим вариант подпрограммы нахождения НОД трех выражений, где используется процедура без параметров.

Program NOD2;

Var A, B, K, M, N: integer

Procedure Evklid;

Begin

While M<>N do

If M>N then M: =M-N

N: =N-M

K: = M;

End;

Begin

Write (‘a=’);

Readln (A);

Write (‘b=’);

Readln (B);

M: = A+B;

N:= Abs(A-B)

Evklid;

M: = K;

N:= A*B;

Evklid;

Writeln (‘НОД(A+B, |A-B|, A*B)=’,K);

End.

Областью действия описания любого программного объекта (переменной, типа, константы, и т.д.) является тот блок в котором расположена это описание. Если данный блок вложен в другой (подпрограмма) то присутствиующие в нем описания являются локальными. Описания, стоящие во внешнем блоке называются глобальными по отношению к внутреннему блоку. Если глобально описанный объект используется во внутреннем блоке, то на него распространяется внешнее (глобальное описание).

Подпрограммы – функции

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

Синтаксис описания функции:

Function <имя функции> (<Список формальных параметров>): <тип функции>;

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

Program NOD3;

Var A, B, Rez: integer;

Function Evklid (M, N: integer): integer;

Begin

While M<>N do

IF M>N then M:= M-N

Else N:= N-M;

Evklid:=M;

End;

Begin

Write (‘a=’);

Readln (A);

Write (‘b=’);

Readln (B);

Rez:= Evklid(Evklid(A+B, Abs(A-B)), A*B);

Writeln (‘НОД (A+B, |A-B|, A*B)=’,Rez);

End.

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

<имя функции>(список фактических параметров);

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

Function Max (X,Y: real): real;

Begin

Max : = X;

If x>y then exit

Else Max: = y;

end;

Для выхода из подпрограммы используется процедура Exit

Файлы. Файловые переменные.

В Паскале понятие файла употребляется в двух смыслах:

  1. Как именованная информация на внешнем устройстве (внешний файл);

  2. Как переменная файлового типа в Паскаль программе – внутренний файл

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

С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.

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

Структура описания файловой переменной:

Var<имя переменной>:file of<тип элемента>

Где тип элемента может быть любым кроме файлового, например:

Var Fi: File of integer;

Fr: File of real;

Fe: File of Char;

23.01.12

Файл можно представить как последовательную цепочку элементов, пронумерованных от нуля и заканчивающуюся специальным кодом – маркер конца

Элемент 0

Элемент 1

……..

Элемент N

Маркер конца

Количество элементов, хранящихся в данный момент в файле, называется его текущей длинной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (запись или чтение). Этот адрес называется указателем или окном файла. Для того чтобы начать запись в файл его следует открыть для записи : Rewrite (FV), где FV – файловая переменная.

При этом указатель файла устанавливается на начало файла, а если в нем была информация, то она исчезает.

до

Элемент 0

Элемент 1

……..

Элемент N

Маркер конца

Rewrite (FV)

После

Маркер конца

Элемент 1

……..

Элемент N

Запись файла осуществляется процедурой write (FV,V), где V – переменная того же типа, что и файл. Запись происходит в то место на которое установлен указатель. Сначала записывается значение, а затем указатель, смещается в следующую позицию.

Если новый элемент записывается в конец файла, то сдвигается маркер конца

до

Элемент 0

Элемент 1

……..

Элемент N

Маркер конца

write (FV,V)

После

Элемент 0

Элемент 1

……..

<V>

Маркер конца

В файловую переменную FX занести 20 вещественных чисел последовательно вводимых с клавиатуры.

Program file;

Var Fx:real;

F: real;

I; byte;

Begin

Rewrite (Fx);

For i: = 1 to 20 do

Begin

Write (‘вв.число’);

Readln (F);

Write (Fx, F);

End;

End.

Для чтения элементов файла с его начала следует открыть файл для чтения, это делается процедурой Reset (FV). В результате устанавливается на начало файла, при этом вся информация в файле сохраняется

до

Элемент 0

Элемент 1

……..

Элемент N

Маркер конца

Reset (FV)

После

Элемент 0

Элемент 1

……..

Элемент N

Маркер конца

Чтение из файла осуществляется процедурой Read (FV,V), где V – переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную V, указатель смещается к следующему элементу.

до

Элемент 0

Элемент 1

……..

Эл К

Эл К+1

………

Маркер конца

Read (FV,V)

После

Элемент 0

Элемент 1

……..

Эл К

Эл К+1

………

Маркер конца

Доступ к элементам файла может быть последовательный или прямой. В стандартном Паскале только последовательный доступ.

Принцип последовательного доступа. Для того чтобы прочитать N-ую запись файла, сначала нужно прочитать все предыдущие записи с первой по N-1/

Функция Eof (FV) проверяет маркер конца файла. Эта логическая функция, которая получает значение true если указатель установлен на марке конца, в противном случае - false.

ВНЕШНИЕ ФАЙЛЫ

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

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

Con – консоль – логическое устройство, связанное при вводе с клавиатуры, при выводе с экрана.

Prn – принтер – логическое имя файла, связанное с устройством печати.

AUX – логическое имя коммуникационного канала, который используется для связи ПК с другими машинами.

INPUT – стандартные устройства ввода связанное с клавиатурой, при этом вводимая информация отображается на экран.

OUTPUT – стандартное устройство вывода на экран

Магнитный диск – это много файловое устройство, на нем могут храниться как системные файлы, так и файлы пользователя. Они могут использоваться в режиме чтения или записи. Идентификатор файла состоит из имени файла и типа файла. Имя файла содержит от 1 до 8 символов, тип файла от 1 до 3 символов (необязательный элемент). Для организации связи между файловой переменной и внешним файлом в ТП используется процедура назначения.

Assign (<имя файловой переменной>, <имя внешнего файла>);

Имя внешнего файла (идентификатор) – это строковая величина (константа или переменная).

Пример:

Assign (Fi, Number.dat);

После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорию. Если файл открывается для чтения (Assign и Reset), то в текущем каталоге уже должен существовать указанный внешний файл, иначе будет обнаружена ошибка. Работа с файлом в программе завершается его закрытием с помощью процедуры CLOSE (<имя файловой переменной>)

20.03.12

То есть для создания и заполнения файла требуется следующая последовательность действий:

  1. Описать файловую переменную

  2. Описать переменную того же типа что и файл.

  3. Произвести назначение (Assign)

  4. Открыть файл для записи (Rewrite)

  5. Записать файл в данные (write)

  6. Закрыть файл (CLOSE)

Для последовательного чтения данных из файла требуется выполнить следующую последовательность действий:

  1. Описать файловую переменную

  2. Описать переменную того же типа что и файл.

  3. Произвести назначение (Assign)

  4. Открыть файл для чтения (Reset)

  5. В цикле читать из файла (read)

  6. Закрыть файл (CLOSE)

Функция определения размера файла: File size (<имя файловой переменной>).

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

В программе файловая переменная текстового типа описывается

Var <идентификатор>:text;

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

S1

S2

Sk1

М.К.С

S1

S2

Sk2

М.К.С

S1

S2

Sk2

М.К.С

М.К.Ф

В текстовый файл можно записать и из него можно считать информацию любого типа.

В программах на Паскале для работы с текстовыми файлами используется процедуры read, write, readln, writeln.

Пример:

Writeln (FV, <список ввода>); - эта процедура записывает в файл FV значение из списка ввода после чего выставляет маркер конца строки.

Readln (FV, <список ввода>); - процедура читает строку из файла с именем FV, помещая прочитанные переменные из списка вывода.

Для обнаружения конца строки используется функция Eoln (FV);

Решение задач

Цикл ПОКА

Вычислить сумму чисел от m до n путем прямого суммирования, m и n

Program Slogenie;

Var I, M, N, Summa: integer;

Begin

Writeln (`введите значение М`);

Readln (M);

Writeln (`введите значение N`);

Readln (N);

Summa:=0;

Ii=M;

While I <=N do

Begin

Summa:=Summa +I;

I:=I+1;

End;

Writeln (`значение суммы равно; Summa`);

End.

Цикл ДО

Program Slogenie

Var I, M, N, Summa: integer;

Begin

Writeln (`введите значение M`);

Readln (M);

Writeln (`введите значение N`);

Readln (N);

Summa:=0;

I:=M;

Repeat

Summa:=Summa+I;

I:=I+1;

Until I>N;

Writeln (`сумма равна`, Summa);

End.

ЦИКЛ ДЛЯ

Program Slogenie

Var I, M, N, Summa: integer;

Begin

Writeln (`введите значение M`);

Readln (M);

Writeln (`введите значение N`);

Readln (N);

Summa:=0;

For i:=M to N do

Summa:=Summa + I;

Writeln (`сумма равна`, Summa);

End.

Условный оператор

Program Uslovie

Var F, x: integer;

Begin

Writeln (`Введите x`);

Readln (X);

If x<-5 then F:=x+5

Else F:= XxX;

Writeln (`F=`, F);

End.

Задачи по файлам

Пример 1

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

Program task 1;

Var Ft:File of Real;

T:real

Begin

Assign (Ft, ‘Temp.dat’);

Rewrite (Ft);

Writeln (‘вводите данные. Признак завершения-9999’

Readln (T);

While T<>9999do

Begin

Write(FT,T);

Write(‘?’);

Readln(T);

End;

Writeln(‘ввод закончен’)

Close(FT);

End.

Пример2:

Определить среднесуточную температуру для значения хранящийся в файле temp.dat

Program task2;

Var Ft:File of Real;

T,St:real;

N:integer;

Begin

Assign (Ft,’Temp.dat’);

Reset (Ft);

St:=0;

While NOT Eof(Ft) do

Begin

Read (Ft, T);

St:=St+T;

End;

N:=FileSize(Ft);

St:=S+N;

Writeln(‘средняя температура за’,N:3, суток равно’,St:7:2)

Close(Ft);

End.

Пример 3 пусть файл note.txt содержит некоторый текст

Требуется подсчитать количество строк в этом тексте

Program kolstrok;

Var

Note:text

K:integer;

Begin

Assign (note,’note.txt);

Reset (note);

K:=0;

While Not Eof(Note)do=’маркер конца флага’

Begin

Readln (note)l

K:=K+1;

End;

Пример 4

В текстовом файле note.txt определить длину самой большой строки

Program Dlina Stroki;

Var

Note:text;

Max,K:integer;

C:char;

Begin

Assign (Note,’note.txt’);

Reset (note);

Max:=0;

While not Eof(note)do

Begin

K:=0;

While not Eolh (note)do

Begin

Read (note,с);

K:=K+1;

End;

If K>max Then Max:=K;

Readln(note);

End;

Writeln( максимальное число символов в строке равно’,max);

Close (Note);

End.

Внешние подпрограммы и модули

  1. Внешние подпрограммы

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

В ТБ это решается введением внешних подпрограмм и использованием модулей

  1. Организация внешних подпрограмм

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

Текст таких подпрограмм сохраняется в файле с расширением .inс

(расширение внешних подпрограмм), а в тексте основной программы подключается с помощью директивы компилятора

{$I<имя файла>}

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

  1. Модули

Это набор ресурсов (функций, процедур, констант, переменных и т.д.) разрабатываемых и хранимых независимо от используемых их программ

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

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

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

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

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

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

После служебного слова Unit записывается имя модуля, которое для удобства может совпадать с именем файла, содержащими модуль

(имя не должно содержать более 8-ми символов)

В разделе interface описывается все подпрограммы, которые были ранее объявлены

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

То, что указывается в разделе implementation не будет доступно при подключении модуля

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

В ТБ имеется 8 символьных модулей, в которых содержится большое число разнообразных типов констант, процедур и функций

Первый модуль

System

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

Второй модуль

Printer

Делает доступными вывод на матричный принтер. В нем определяется файловая переменная LST типа, текст, которая связывается с логическими устройствами PRN

Третий модуль

CRT

Содержит процедуры и функции, обеспечивающие управление текстовыми режимами экрана

Четвертый модуль

GRAPH

Содержит инструменты для управления графическими режимами работы экрана

Пятый модуль

DOS

Содержит инструменты, открывающие доступ к программам, к средствам дисковой ОС ms-dos

Шестой модуль

OverLay

3.04.12

Необходим для разработки громоздких программ с перекрытиями. Turbo Pascal обеспечивает создание программ, длина которых ограничивается лишь оперативной памятью. ОС MS-DOS оставляет исполняемой программе около 580 Кб. Память такого размера достаточна для большинства прикладных программ, но для использования программ с перекрытиями должно снимать это ограничение.. Библиотечные модули Turbo 3, Graph 3 введены для совместимости версии Turbo Pascal и Pascal 3.0.

Объектно-ориентированное программирование (ООП)

Основополагающий идеей данного подхода к программированию является объединение данных и обрабатывающих их процедур в единое целое – объект. Программа представляется в виде совокупности объектов, каждый из которых является реализацией определенного класса (это тип особого вида). Классы образуют иерархию, которая основывается на принципах наследуемости.

При процедурном подходе требуется описать каждый шаг, каждое действие алгоритма для достижения конечного результата. В отличие от него объектно ориентированный подход оставляет за объектом право решать как отреагировать и что сделать в ответ на поступивший вызов достаточно в стандартной форме поставить перед объектом задачу и получить ответ. Объект состоит из 3 частей:

  1. Имя обекта

  2. Состояние (переменные состояния)

  3. Методы или операции

Объект ООП – это совокупность переменных состояния и связанных с ними методов, которые определяют как объект взаимодействует с окружающим миром.

Методы объекта – это процедуры и функции, объявление, которых включено в описание объекта и которые выполняют действия (совокупность методов часто называют интерфейсом объекта).

Инкапсуляция – это механизм, который объединяет данные и методы, манипулирующие этими данными и защищает и то и другое от внешнего вмешательства или неправильного использования. Инкапсуляция намного упрощает поиск и исправление ошибок. Но снижает эффективность доступа к элементам объекта.

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

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

Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения нескольких технически разных задач. Полиморфизм подразумевает такое определение методов в иерархии типов, при котором метод с одним именем может применятся к различным родственным объектам

08.05.12

Решение задач