Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Билет 22. Напомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (procedure , function




Напомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (procedure…, function…, program…) и блока.

Если блок какой-либо процедуры p1 содержит внутри процедуру p2, то говорят, что p2 вложена в p1.

Пример.

procedure p1(x: real; var y: real);

var c: integer;

procedure p2(var z: real);

…………………….

end;

begin

…………………….

end;

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

Пример.

procedure t1;

var y1, y2: real;

procedure sq1;

var a, b, c, d: real;

begin

{ Переменные a, b, c, d являются локальными для sq1,

область их действия – процедура sq1 }

……………………………………

end;

begin

{ Переменные y1, y2 - нелокальные для sq1,

область их действия – t1 и sq1 }

end;

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

При написании программ, имеющих вложенные модули, необходимо придерживаться следующих правил:

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

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

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

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

Пример.

var k: integer;

procedure a;

var x, z: real;

begin

{ через x, z обозначены две величины –

локальные переменные для a;

k – глобальная переменная для a }

…………………………………

end;

procedure b;

var x, y: integer;

begin

{ через x, y обозначены две другие величины –

локальные переменные для b;

k – глобальная переменная для b }

…………………………………

end;

begin

{ k – единственная переменная, которую

можно использовать в основной ветке программы }

…………………………………

end.

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

Var

i: integer;

a: real;

 

procedure p(var d: real);

var i: integer;

Begin

i := 3;

d := i + 10 * d;

end;

 

Begin

a := 2.0;

i := 15;

p(a);

writeln(' i = ', i, ' a = ', a);

readln

end.

Глобальным переменным i и a отводятся две ячейки памяти. Первыми выполняются операторы a := 2.0 и i := 15. Затем вызывается процедураp(a). В процессе работы p отводится ячейка для локальной переменной iи туда засылается число 3. После окончания работы процедуры p эта ячейка i программой «забывается». После возврата на оператор writelnпрограмма знает только одну ячейку i – глобальную, т.е. ту, которая содержит число 15. Поэтому программа выдаст на печать i = 15, a = 23.0, т.к. a = 3 + 10 * 2.

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

Пример.

type ab = array[1..3] of real;

var a: ab;

procedure q;

var b: ab;

…………………………..

end;

В этом примере переменные a и b описаны через общий тип ab. Если же локальная и глобальная переменные описаны одинаково, но не через общий тип, то программа может «не понять», что эти переменные принадлежат одному типу.

Пример.

var a: array[1..3] of real;

procedure q;

var b: array[1..3] of real;

……………………….

end;

В этом примере переменные a и b – одинаковые массивы, т.е. типы этих переменных одинаковы, но программа, тем не менее, «не считает», что a и b принадлежат одному типу. Это происходит из-за того, что описание массивов дано в разных блоках.

Тип-множество. В отличие от математического понятия множества множество в Turbo Pascal представляет собой совокупность элементов базового типа. Максимальный размер множества - 256 элементов, которые имеют порядковые номера от 0 до 255. Следовательно, в качестве базовых могут выступать стандартные типы данных byte и char, перечисляемые типы и их диапазоны. Множество включает в себя все возможные наборы элементов базового типа, т.е. все подмножества данного множества, включая пустое. Если базовый тип состоит из n элементов, то число всех подмножеств равно .

Описание типа-множества имеет вид:

type <имя типа> = set of <базовый тип>;

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

type bukva = ‘a’..’z’; {Тип ‘строчная буква латинского алфавита’}

mn_bukv = set of bukva;

mn_byte = set of byte;

godi_ucheniya = set of 2002..2007; {Неверное описание}

mn_nat_chisel = set of 1..256; {Неверное описание}

Элементы в множестве располагаются произвольно и не повторяются. Задается множество с помощью конструктора множеств - [ ]. В нем через запятую перечисляются допустимые элементы, в том числе и диапазоны, например:

type vremena_goda = set of (vesna, leto, osen, zima);

var q, s : vremena_goda; {Множество времен года}

mn : set of 1..100; {Множество целых чисел от 1 до 100}

begin s := [ ]; {Пустое множество}

q := [vesna, leto];

mn := [1, 5..13, 27..33] …

Операции над множествами:

1) объединение множеств A и B - A + B ®

например s := [vesna] + [leto..zima]; (результат - [vesna..zima])

2) пересечение множеств A и B - A * B ®

например q := [leto] * [vesna..osen]; ([leto])

3) разность множеств A и B - A - B ®

например q := [leto..zima] - [osen]; ([leto, zima])

4) операции отношения:

- тождественность множеств A = B;

- нетождественность множеств A <> B;

- A является подмножеством B A <= B;

- B является подмножеством B A >= B.

Установить принадлежность некоторого элемента e множеству mn можно с помощью операции in, e in mn,которая возвращает значение true, если элемент e присутствует в множестве mn, и false - в противном случае. Для включения элемента в множество можно использовать процедуру include(mn, e), а для исключения элемента из множества - процедуру exclude(mn, e).

Пример 2. Из строки символов s1 удалить повторно встречающиеся символы. Структурограмма алгоритма и программа приведены ниже.

program Symbol_Odin_Raz;

var i byte;

s1, s2 : string;

mn : set of char;

begin writeln(‘Введите строку символов’);

readln(s1); s2 := ‘’; mn := [ ];

for i := 1 to length(s1) do begin

if not s1[i] in mn then s2 := s2 + s1[i];

mn := mn + [s1[i]]

end;

writeln(‘Исходная строка: ‘, s1);

writeln(‘Результирующая строка: ‘, s2)

end.

 

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 62; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты