Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр1.doc
Скачиваний:
9
Добавлен:
19.09.2019
Размер:
1.03 Mб
Скачать

9.2 Проект программы:

  • Точная формулировка задачи

  • Типы данных

  • Структуры данных

  • Процедуры и функции

  • Алгоритм

9.3 Простейший сканер.

Формулировка задачи: Программа читает текстовый файл, выделяет слова и распознает идентификаторы. Имя текстового файла запрашивается. На экран выдается список слов по одному слову в строку, идентификаторы помечаются символом *. Разделителем не является признак конца строки.

Спецификации (типы данных и структуры данных):

Определяются три состояния чтения текста:

  • ident – подозрение на идентификатор,

  • news – начало чтения нового слова,

  • ordin – читаемое слово не идентификатор.

Состояния объединены в перечислимый тип status.

chars – множество всех символов, letter, digit и separ - подмножества букв, цифр и разделителей слов, соответственно.

Процедуры и функции - нет.

Алгоритм: Чтение (из файла) посимвольно. Определяется изменение состояния в зависимости от состояния s и вновь прочитанного символа c. Начальное состояние - news.

Входной алфавит V – буква, цифра, разделитель, символ.

Алфавит состояний Q – News, Ident, Ordin.

Функция переходов f:QVQ:

буква

цифра

разделитель

символ

News

Ident

Ordin

News

Ordin

Ident

Ident

Ident

News

Ordin

Ordin

Ordin

Ordin

News

Ordin

Начальное состояние – News

Множество заключительных состояний – {}

{Symplest scaner}

program Symplest_Scanner;

{Программа читает текстовый файл,

выделяет слова и распознает идентификаторы}

type

status=(ordin,ident,news);

chars=set of char;

var

letter,digit,separ:chars;

anytxt:string;

s:status;

i:integer;

c:char;

F:text;

begin

letter:=['A'..'Z','a'..'z'];

digit :=['0'..'9'];

separ :=[' '];

repeat

writeln(' Введите имя обрабатываемого файла');

readln(anytxt);

assign(F,anytxt);

{$I-} reset(F); {$I+}

i:=IOResult;

if i<>0 then

writeln(' Ошибочка ',i:3,' , попробуйте еще раз');

until i=0;

s:=news;

while not eof(F) do

begin

while not eoln(F) do

begin

read(F,c);

write( c);

case s of

news : if c in letter then s:=ident

else if not(c in separ) then s:=ordin;

ident: if c in separ then

begin s:=news; writeln('*') end

else

if not((c in letter) or (c in digit))

then s:=ordin;

ordin: if c in separ

then begin s:=news; writeln end;

end;

end;

if s=ordin then begin s:=news; writeln end;

if s=ident then begin s:=news; writeln(' *') end;

readln(F);

end;

end.

9.4 Копия любого файла

program Copy;

var c:byte;

f,g:file of byte;

begin

assign(f,'file.abc');

assign(g,’file_copy.abc’);

reset(f); rewrite(g);

while not(eof(f)) do

begin

read(f,c);

write(g,c);

end;

close(f);

end.

Лекция 10

10.1 Процедуры и функции

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

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

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

procedure <имя>(<формальные параметры>);{заголовок процедуры}

<секция описаний процедуры>

begin

<секция действий процедуры>

end;

function <имя>(<формальные параметры>):<тип>;{заголовок функции}

<секция описаний функции>

begin

<секция действий функции>

end;

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

Формальные параметры представляют собой список через «точку с запятой» предложений вида:

[var/const]<список переменных>:<имя типа>

Необязательные параметры var и const указывают способ передачи данных. Ключевое слово var означает, что данные передаются по адресу. Такие данные называются параметрами-переменными. Ключевое слово const означает, что данные передаются по адресу, но с защитой от изменения их значений. Такие данные называются параметрами-константами. Если перед списком переменных ключевое слово отсутствует, то данные передаются по значению. Такие параметры называются параметрами-значениями.

Обращение к подпрограммам осуществляется по следующей схеме:

Вызов процедуры (как самостоятельного оператора):

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

Вызов функции (в выражении, где допустим тип функции):

…<имя>(<список фактических параметров>)…

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

Тип передачи

Ключевое слово

Фактический параметр

По значению

-

Любые выражения соответствующего типа

По адресу

var

Имена переменных

По адресу

const

Любые выражения соответствующего типа

Между формальными (в описании подпрограммы) и фактическими (при обращении к подпрограмме) параметрами должно быть согласование по количеству, типам и порядку следования. (!)

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

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

Вот примеры использования подпрограмм (процедур и функций) в Паскале:

1. Программа вычисляет величину y=max(min(x1,x2,x3),max(min(x3,x5,x4),x4))

program minmax;

var y,x1,x2,x3,x4,x5:real;

function max(a,b:real):real;

begin if a>b then max:=a else max:=b end;

function min(a,b:real):real;

begin if a<b then min:=a else min:=b end;

begin

readln(x1,x2,x3,x4,x5);

y:=max(min(x1,min(x2,x3)),max(min(x3,min(x5,x4)),x4));

writeln(y)

end.

Обратите внимание на порядок обращений к подпрограммам!

2. Программа подсчитывает количество символов ‘A’,’B’ и ‘C’ в введенной пользователем строке:

program ABC;

var s:string; i:integer;

procedure kolABC(s:string; var kolA,kolB,kolC:integer);

begin

kolA:=0; kolB:=0; kolC:=0;

for i:=1 to length(s) do

case s[i] do

‘A’: kolA:=kola+1;

‘B’: kolB:=kolB+1;

‘C’: kolC:=kolC+1;

end;

end;

begin

readln(s);

kolABC(s,kolA,kolB,kolC);

writeln(kolA,kolB,kolC);

end.

Функция ввода данного типа integer с защитой:

function enter_integer(s:string):integer;

var i,n:integer;

begin

repeat

readln(s);

val(s,n,i);

if i=0 then enter_integer:=n

until i=0;

end;