Удаление элемента из конца списка 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Удаление элемента из конца списка



Удаление элемента из конца списка производится, когда указатель dx показывает на предпоследний элемент списка, а х – на последний.

Изобразим удаление графически:

{Найдем предпоследний элемент}

x:= Head;

dx:=Head;

while x^.Next<>Nil do

Begin

dx:= x;

x:= x^.Next;

End;

{Удаляем элемент x^ из списка и освобождаем занимаемую им память}

dx^.Next:= Nil;

Dispose(x);

Теперь опишем процедуру удаления элементов из списка в общем случае:

Procedure Del(Gigit: integer; Var u: Ukazatel);

Var

x, dx: UKAZATEL;

Begin

x:= Head;

while x<>Nil do

if x^.Data=Digit

then

Begin

if x=y

then

Begin

Head:= Head^.Next;

Dispose(x);

x:= Head;

End;

else

Begin

dx^.Next:= x^.Next;

Dispose(x);

x:= dx^.Next;

End;

End;

else

Begin

dx:= x;

x:= x^.Next;

End;

End;

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

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

1. Написать программу, содержащую процедуру, которая удаляет из списка М второй элемент, если такой есть.

2. Написать программу, содержащую процедуру, которая удаляет из списка М N-ый элемент, если такой есть. N задает пользователь.

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

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

5. Написать программу, содержащую процедуру, которая удаляет из списка М первый отрицательный элемент, если такой есть.

6. Написать программу, содержащую процедуру, которая удаляет из списка М все отрицательные элементы.

7. Написать программу, содержащую процедуру, которая формирует список М, включив в него по одному разу элементы, которые входят хотя бы в один из списков М1 и М2.

8. Написать программу, содержащую процедуру, которая формирует список М, включив в него по одному разу элементы, которые входят одновременно в оба списка М1 и М2.

9. Написать программу, содержащую процедуру, которая формирует список М, включив в него по одному разу элементы, которые входят в список М1, но не входят в список М2.

10. Познакомившись с текстами предыдущих задач, придумайте свою задачу и решите ее.

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

 

Проверьте свои знания, ответив на вопросы:

1. Дайте определение динамической структуре список.

2. Сколько элементов может содержать список? Как заканчивается список?

3. Сколько полей может содержать элемент списка? От чего зависит количество полей? Приведите примеры.

4. Какого типа могут быть поля элементов списка? Приведите примеры.

5. Обязательно ли применять процедуру освобождения памяти, занятой элементом, когда мы избавляемся от этого элемента в списке? Каким образом это влияет на работу программы?

6. Можно ли ссылку одного элемента направить сразу на два или больше других элемента? Как необходимо поменять тип указателя, чтобы решить эту проблему?

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

8. Можно ли последовательно "связать" два списка разного типа и почему?

9. Можно ли одновременно работать с несколькими списками сразу?

10. Как Вы считаете, на что нужно обращать особое внимание при работе со списками?


 

Множества

 

Занятие I

Тема. Множественный тип данных. Множество. Элемент множества. Способы задания множества. Объединение множеств. Разность множеств. Пересечение множеств.

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

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

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

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

Множество имеет зарезервированное слово set of и вводится следующим описанием

Type

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

Var

< идентификатор,... >:< имя типа >;

Рассмотрите примеры описания множеств:

Type

SetByte = set of byte; {множество 1, определённое над типом byte}

SetChisla = set of 10... 20; {множество 2, определённое в диапазоне от 10 до 20

Symbol = set of char; {множество, определённое на множестве символов}

Month = (January, February, March, April, May, June, July, August, September, October, November, December);

Season: set of Month; {тип множества, определённый на базе перечислимого типа Month}

Var

Letter, Digits, Sign: Symbol {множествa, определённые над символьным типом}

Winter, Spring, Summer, Autumn, Vacation, WarmSeason: Season;

Index: SetChisla=[12, 15, 17];

Operation: set of (Plus, Minus, Mult, Divid);

Param: set of 0..9=[0, 2, 4, 6, 8];

Для переменных типа множества в памяти отводится по 1 биту под каждое возможное значение базового типа. Так, под переменные Letter, Digits, Sign будет отведено по 256/8=32 байта. Для переменной Winter, базовый тип которой (Month) имеет 12 элементов, необходимо 2 байта, причем второй используется только наполовину. Если множество содержит какой-то элемент, то связанный с ним бит имеет значение 1, если нет – 0.

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

Sign:=['+', '–'];

Spring:=[March, April, May];

b:=[ 'k', 'l', 'd' ]

либо определение через диапазон. Тогда в множество включены все элементы диапазона

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

WarmSeason:= [May.. September];

Обратите внимание, что в определении множества Digits использованы символы в таблице ASCII-кодов, а не целые числа.

Обе формы конструирования могут сочетаться:

Vacation:=[January, February, June.. August];

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

{постоянное множество допустимых символов

Const

YesOrNo = ['Y', 'y', 'N', 'n'];

{множества – типизированные константы}

Const

Digits: set of char=['0'..'9'];

DigitsAndLetter: set of char=['0'..'9', 'a'..'z', 'A'..'Z'];

{применение операции "+" для объявления множества-константы}

Const

Yes = ['Y', 'y'];

No = ['N', 'n'];

YesOrNo = Yes+No;

Объединение множеств (+)

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

Объединение множеств записывается как операция сложения.

Type

Symbol = set of char;

Var

SmallLatinLetter, CapitalLatinLetter, LatinLetter: Symbol;

Begin

......

SmallLatinLetter:=['a'..'z'];

CapitalLatinLetter:= ['A'..'Z'];

LatinLetter:= SmallLatinLetter+CapitalLatinLetter;

......

End.

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

Например, допустима следующая запись, где два элемента и множество объединяются в новое множество:

WarmSeason:= May+Summer+September;

или другая запись

B: = B+['c'],

которую можно применить для организации множества в цикле, если заменить множество ['c'] переменной Sim того же типа, что и множество B, и считывать с клавиатуры данные в переменную Sim, а затем объединяя с множеством В.

B: = B+Sim,

Разность множеств (-)

Определение. Разностью 2-х множеств является третье множество, которое содержит элементы 1-го множества, не входящие во 2-е множество.

a: = a–[ 'd' ]

Если в вычитаемом множестве есть элементы, отсутствующие в уменьшаемом, они не влияют на результат.

Summer:= WarmSeason–Spring–Autumn;

Summer:= WarmSeason–May–September;

Модуль System содержит процедуры для включения элемента в множество

Include (Var S: set of T; Element: T);

и исключения из множества

Exclude (Var S: set of T; Element: T);

где S – множество элементов типа Т, а Element – включаемый элемент.

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

Пересечение множеств

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

Summer:= WarmSeason*Vacation;

Задание. В своей тетради опишите множества М1 и М2 произвольным образом. Получите результирующие множества (запишите какие элементы будут содержать эти множества).

а) М3=М1+М2;

б) М3=М1*М2;

в) М3=М1-М2.


 

Занятие II

Тема. Логические операции над множествами: проверка принадлежности элемента множеству, проверка включения элемента в множество, сравнение множеств.

Сравнение множеств

Определение. Множества считаются равными, если все элементы, содержащиеся в одном множестве присутствуют в другом, и наоборот.

В соответствии с этим правилом определяется результат логических операций "=" и "<>".

Например,

If WarmSeason*Vacation=Summer

Then

Writeln ('Правильно');

Задание. Сравните множества М1 и М2, пользуясь рисунками. Результаты сравнения запишите в тетрадь.

 

а)  

 

б)  

 

в)  

Проверка включения

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

Логические операции проверки вхождения одного множества в другое записываются через операции больше или равно:

if S1<=S2

then

writeln ('S1 входит в S2');

if S1>=S2

then

writeln ('S2 входит в S1');

Задание. Что напечатает оператор Write в каждом из случаев:

1. if Vacation>=Summer

then

writeln ('Правильно')

else

writeln ('Неправильно')

2. if Vacation<=Summer

then

writeln ('Правильно')

else

writeln ('Неправильно')

Проверка принадлежности

Логическая операция проверки принадлежности элемента множеству записывается через оператор in.

Например, выражение

May in WarmSeason

имеет значение True.

Использование множеств и операции in позволяет, в частности, сделать эффективнее проверку правильности вводимых символов.

Например, для проверки допустимости введенного символа можно использовать следующее условие:

(Reply='y') or (Reply='Y') or (Reply='n') or (Reply='N')

Но если ввести множество

Const

AllowSymbol: set of char = ['Y', 'y', 'N', 'n'];

проверяемое условие можно записать в более компактной форме:

Reply in AllowSymbol

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

Рассмотрите пример.

Задача. Описать множество М(1..50). Сделать его пустым. Вводя целые числа с клавиатуры, заполнить множество 10 элементами.

В разделе описания переменных опишем множество целых чисел от 1 до 50, переменную Х целого типа будем использовать для считывания числа-кандидата в множество, целую переменную i используем для подсчета количества введенных чисел.

В начале программы применим операцию инициализации множества М:=[ ], так как оно не имеет элементов и является пустым.

Заполнение множества элементами произведем с использованием оператора цикла Repeat, параметр которого i будет указывать порядковый номер вводимого элемента. Операцию заполнения множества запишем оператором присваивания М:=M+[X]. Контроль заполнения множества запишем с использованием операции проверки принадлежности in. Если условие X in M выполняется, выведем сообщение о том, что число Х помещено в множество.

Текст программы описания и заполнения множества будет таким:

Program InputMno;

Var

M: set of 1..50;

X, i: integer;

Begin

M:= [ ];

i:=1;

repeat

write('Введите ',i,'-й элемент множества');

readln(X);

if (X in M)

then

begin

write(Х, ' уже содержится в множестве');

i:= i-1;

end

else

begin

write(Х, ' помещен в множество');

M:= M+[X];

end;

i:= i+1;

until i>10;

End.

Задание. Наберите рассмотренную программу, откомпилируйте ее. Проверьте работу программы, исполняя ее по шагам и наблюдая текущие значения переменных i, X, M в окне просмотра. Попробуйте задать значения числа большие 50, повторно задавать одинаковые значения Х и анализируйте значения множества М. Дополните программу выводом на экран содержимого полученного множества, сопровождая соответствующим сообщением. Откомпилируйте программу. Покажите учителю рабочую программу и ее листинг для оценки.

Задание. В своей тетради выполните упражнения, выбрав их с учителем из предложенных ниже:

1. Опишите множества М1(1, 2) и М2(2, 1). Сравните эти множества на равенство.

2. Опишите множества М1('a', 'b') и М2('b', 'a', 'c'). Сравните эти множества на неравенство.

3. Опишите множества М1('a', 'b', 'c') и М2('a', 'c'). Сравните эти множества по операции >=.

4. Опишите множества М1(1, 2, 3) и М2(1, 2, 3, 4). Сравните эти множества по операции <=.

5. Опишите множества М1(1, 2) и М2(5, 6). Получите результирующее множество М3=М1+М2. Определите, имеется ли в М3 элемент 7.

6. Опишите множества М1(1, 2, 3, 4) и М2(3, 4, 1). Получите результирующее множество М3=М1–М2. Определите, имеется ли в М3 элемент 2.

5. Опишите множества М1(1, 2, 3) и М2(1, 4, 2, 5). Получите результирующее множество М3=М1*М2. Определите, имеется ли в М3 элементы 1 и 2.


 

Занятие III

Тема. Примеры решений задач на применение множества.

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

Зададим тип Letters – множество букв русского языка, затем опишем переменные этого типа: Glasn – множество гласных букв, Sogl – множество согласных букв. Вводимое с клавиатуры предложение опишем переменной Text типа String. Для указания символа в строке Text применим переменную i типа byte. Для подсчета количества гласных и согласных букв опишем переменные G и S. Проверку принадлежности символов, составляющих предложение множествам гласных или согласных букв русского языка запишем с использованием оператора повтора For, параметр i которого, изменяясь от 1 до значения длины предложения, будет указывать порядковый номер символа в предложении. Принадлежностьб очередного символа предложения множеству гласных или согласных букв запишем операцией in. Если выполняется условие Text[i] in Sogl, тогда увеличивается на 1 счетчик S. Если выполняется условие Text[i] in Glasn, тогда увеличивается на 1 счетчик G. Если не выполняется ни первое, ни второе условие, значит, очередной символ в предложении не является гласной или согласной буквой русского языка.

Теперь рассмотрите текст программы:

Program GlasnSogl;

Type

Letters = set of 'A'..'я';

Var

Glasn, Sogl: Letters;

Text: String;

i, G, S: byte;

Begin

Glasn:= ['A', 'я', 'Е', 'е', 'И', 'и', 'О', 'о', 'У', 'у', 'Э', 'э', 'Ю', 'ю', 'Я', 'я'];

Sogl:= ['Б'..'Д', 'б'..'д', 'Ж', 'ж', 'З', 'з', 'К'..'Н', 'к'..'н', 'П'..'Т', 'п'..'т', 'Ф'..'Щ', 'ф'..'щ', 'ь'];

Write('Введите предложение ');

Readln(Text);

G:= 0;

S:= 0;

For i:= 1 to Length(Text) do

Begin

If Text[i] in Glasn

Then

G:= G+1;

If Text[i] in Sogl

Then

S:= S+1;

End;

Write('В предложении " ', Text, ' " ', G, ' гласных и ', S, ' согласных букв');

End.

Задание. Усовершенствуйте текст решения задачи, дополните комментарием. Если у Вас возникла идея решения этой задачи с помощью другого алгоритма, – дерзайте. Протестированную программу и листинг покажите учителю для оценки.

Пример 2. Поиск простых чисел с помощью решета Эратосфена в числовом промежутке [1..N].

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

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

Идея метода "решета Эратосфена" заключается в следующем: сформируем множество М, в которое поместим все числа заданного промежутка. Затем последовательно будем удалять из него элементы, кратные 2, 3, 4, и так далее до целой части числа [N/2], кроме самих этих чисел. После такого "просеивания" в множестве М останутся только простые числа.

Рассмотрите вариант решения этой задачи.

Program Resheto;

Var

M: set of byte;

i, k, N: Integer;

Begin

Writeln('Введите размер промежутка (до 255) ');

Readln(N);

M:= [2..N];

For k:= 2 to N div 2 do

For i:= 2 to N do

If (i mod k=0) and (i<>k)

Then

M:= M-[i]

For i:= 1 to N do

If i in M

Then

Write(i:3);

Readln;

End.

Ответьте на вопросы:

1. Как сформировано множество М?

2. Как организован просмотр элементов этого множества?

3. Как организован просмотр делителей?

4. Как удаляется элемент множества?

5. Как организован вывод "просеянного" множества?

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

Задание. Улучшите алгоритм решения предложенной задачи. Протестируйте программу, дополните комментариями и покажите файл и листинг учителю для оценки.

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

1. Например, вы знаете, что если из множества М удалить все элементы, делящиеся на 2, то нет смысла проверять, делятся ли оставшиеся числа на 4, 6, 8, 10, и т.д.

2. Когда программа проверяет делимость, например, на 50, то она проверяет и числа до 50, что не имеет смысла.

Пример 3. Разгадывание ребусов.

+ МУХА

МУХА

СЛОН

Каждая буква – это цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получилось верное равенство. Найти все решения. Для решения этой задачи используется метод перебора с возвратом. Используем множество S1 для хранения цифр слова МУХА, причем будем вносить в него цифры последовательно, учитывая уже внесенные цифры. Начальное значение S1 – пустое множество. после выбора всех цифр первого слова создаем его числовой эквивалент и числовой образ слова СЛОН. Выделяем цифры СЛОНа (множество S2)и если слова состоят из разных цифр (то есть пересечение S1 и S2 пустое) и все цифры СЛОНа разные (то есть пересечение множеств цифр тоже пустое), то выводим решение на экран. Если же нет, то идет возврат – удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно значение. Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.

Заметим, что значение буквы М в слове МУХА может иметь значения от 1 до 4, а буква А в этом же слове не может быть равна 0.

Рассмотрите решение задачи.

Program Rebus;

Type

MN = set of 0..9;

Var

m, u, h, a: 0..9;

n1, n2: Integer;

s, l, o, n: 0..9;

S1, S2: MN;

Procedure Print(x, y: Integer);

Begin

writeln(x:5);

writeln('+');

writeln(x:5);

writeln(' ');

writeln(y:5);

End;

Begin

S1:= [ ];

S2:= [ ];

for m:= 1 to 4 do

begin

S1:= S1+[m];

for u:= 0 to 9 do

if Not(u in S1)

then

begin

S1:= S1+[u];

for h:= 0 to 9 do

if Not (h in S1)

then

begin

S1:= S1+[h];

for a:= 1 to 9 do

if Not (a in S1)

then

begin

S1:= S1+[a];

n1:= 1000*m+100*u+10*h+a;

n2:= 2*n1;

s:= n2 div 1000;

l:=n2 div 100 mod 10;

o:= n2 div 10 mod 10;

n:= n2 mod 10;

S2:= [s, l, o, n];

if (S1*S2=[ ]) and ([s]*[l]*[o]*[n]=[ ])

then

Print (n1, n2);

S1:= S1–[a];

end;

S1:= S1–[h];

end;

S1:= S1–[u];

end;

S1:= S1–[m];

end;

Readln;

End.

Задание. Решите один из ребусов:

1) П Ч Ё Л К А

x 7

ЖЖЖЖЖЖ

2) ТОРГ x Г = ГРОТ

3) ЛАДЬЯ+ЛАДЬЯ = ФЕРЗЬ

4) М3= КУБ

5) СМ3 = КУБИК

6) МАТЕ * М = АТИКА

7) ПРОП * О = РЦИЯ

8) ПРОП: О = РЦИЯ

9) (М + О + С +К + В + А)4 = МОСКВА

10) ВЕТКА + ВЕТКА = ДЕРЕВО

11) САР = АТОВ

12) ПЛОМБА * 5 = АПЛОМБ

13) НИКЕЛЬ * 6 = ЕЛЬНИК

14) КВАНТ * 30 = ЖУРНАЛ

15) КАПЛЯ + КАПЛЯ + КАПЛЯ + = ОЗЕРКО

16) СОРОК * 5 = ДВЕСТИ

17) SIX * TWO = TWELVE

18) ДВЕСТИ * 5 = ТЫСЯЧА

19) НАТАША + ТОНЯ = СЁСТРЫ

20) БРА2 = БОМДОР

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

Procedure ReadWord(Var Result: Word; x, y, MaxLength: byte);

Const

ValidSymbol: set of char=['0'..'9',#8,#13];

Var

Str: string;

Code: integer;

Key: char;

Begin

GoToXY(x, y);{курсор – в заданную позицию}

Str:= ''; {строка пустая}

repeat {начало бесконечного цикла}

{проверка вводимых символов на допустимость}

repeat

Key:= ReadKey

until Key in ValidSymbol;

case Key of {анализ вводимых символов}

'0'..'9': {нажата цифра}

if Length(Str)>=MaxLength {если длина больше заданной}

then

begin

Sound(100); {звуковой сигнал}

Delay(200);

NoSound;

end;

else {если длина меньше заданной}

begin

write(Key);

Str:=Str+Key; {добавление символа в строку}

end;

#8: {нажата клавиша BackSpace}

if Length(Str)>0 {если строка не пустая}

then

begin

Delete(Str, Length(Str),1); {удаление из строки}

GoToXY(WhereX-1, WhereY); {возврат курсора}

write(''); {запись пробела вместо символа}

GoToXY(WhereX-1, WhereY); {возврат курсора}

end

else {если строка пустая}

begin

Sound(100); {звуковой сигнал}

Delay(200);

NoSound;

end;

#13: {нажата клавиша Enter}

begin

Val(Str, Result, Code); {преобразование строки в целое число}

Exit {выход из подпрограммы}

end;

end; {конец оператора Case}

until False; {бесконечный цикл}

End;

В заголовке процедуры Result – возвращаемое число; MaxLength – максимальное число цифр в записи числа; х, у – координаты начальной позиции вывода. Процедура формирует текстовую строку Str, состоящую из цифр. При нажатии клавиши Enter строка преобразуется в целочисленную переменную.

В начале программы курсор направляется в заданную точку, и текстовой строке присваивается пустое значение. Далее начинается бесконечный цикл, заданный оператором Repeat... Until False. Выход из цикла происходит вместе с выходом из процедуры по команде Exit. "Бесконечность" цикла обеспечивает произвольное число повторов и исправлений при вводе числа.

Процедура реагирует только на нажатие цифровых клавиш, клавиш Enter и BackSpace. Назначение клавиш – традиционное: Enter используется для завершения процедуры, BackSpace – для стирания последнего введенного символа.

Цикл

repeat

Key:= ReadKey

until Key in ValidSymbol;

проверяет вводимые символы на допустимость. Множество допустимых символов ValidSymbol определено в процедуре как константа, онон включает цифровые символы и символы, соответствующие клавишам Enter и BackSpace. Первая имеет символьный код #13, вторая – #8.

Далее оператор Case производит выбор одного из трех направлений – обработка нажатой цифры, обработка клавиши BackSpace или обработка клавиши Enter. При нажатой цифре сначала проверяют, не достигло ли число цифр максимального значения. Число цифр определяется функцией Length, аргумент которой – редактируемая строка. Если длина уже достигла максимального значения, выдается звуковой сигнал. Если длина вводимой строки меньше максимальной, то в строку дописывается символ, и он же выводится на экран процедурой Write.

При нажатии клавиши BackSpace должен быть стерт последний введенный символ. Вначале производится проверка, есть ли в строке символы. Если строка пуста, подается звуковой сигнал, если нет – начинается удаление символа. Для этого строка уменьшается на один элемент процедурой Delete, курсор возвращается назад на одну позицию, на место стираемой цифры записывается символ пробела, затем курсор снова возвращается на позицию назад. курсор возвращается назад на одну позицию оператором GoToXY(WhereX-1, WhereY), который использует функции WhereX и WhereY для определения текущего положения и уменьшает координату х на 1.

После нажатия Enter строка преобразуется в целочисленную переменную процедурой Val и происходит выход из процедуры ReadWord по команде Exit.

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

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

Задание *. Составьте программу для проверки входных данных другого типа.

Примечание. Задание не является обязательным для всех учащихся.


 

Занятие IV

Тема. Самостоятельное решение задач.

Итак, коротко обо всем выше сказанном.

В языке Паскаль типом-множеством называется множество всевозможных сочетаний объектов исходного множества. Число элементов исходного множества не может быть больше 256, а порядковые номера элементов (т.е. значение функции Ord) должны находиться в пределах от 0 до 255. Для задания типа-множества следует использовать зарезервированные слова set of, а затем указать элементы этого множества, как правило, в виде перечисления или диапазона.

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

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

Например, следующие конструкции являются конструкторами множеств:

[Plus,Minus]

[1..K mod 12, 15]

[Chr(0).. Chr(31), 'A', 'B']

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

Конструктор множества можно использовать и непосредственно в операциях над множествами.

Для множеств определены следующие операции:

+ – объединение множеств;

– – разность множеств;

* – пересечение множеств;

= – проверка эквивалентности двух множеств;

<> – проверка неэквивалентности двух множеств;

<= – проверка, является ли левое множество подмножеством правого множества;

>= – проверка, является ли правое множество подмножеством левого множества;

in – проверка, входит ли элемент, указанный слева, в множество, указанное справа.

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

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

1. Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются встречающиеся в последовательности цифры от 1 до 3 и от 17 до 100.

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

3. Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются встречающиеся в последовательности буквы от D до I.

4. TYPE natur=1..maxint;

Описать функцию digist(n), подсчитывающую количество различных (значащих) цифр в десятичной записи натурального числа n.

5. TYPE natur=1..maxint;

Описать процедуру print(n), печатающую в возрастающем порядке все цифры не входящие в десятичную запись натурального числа n.

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

(Примечание: гласные буквы - а, е, и, о, у, ы, э, ю, я;

согласные - все остальные буквы, кроме й, ъ, ь)

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

(Примечание: гласные буквы - а, е, и, о, у, ы, э, ю, я; согласные - все остальные буквы, кроме й, ъ, ь)

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

(Примечание: гласные буквы - а, е, и, о, у, ы, э, ю, я; согласные - все остальные буквы, кроме й, ъ, ь)

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

10. Опишите множество М(1..50). Сделайте его пустым. Вводя целые числа с клавиатуры, заполните множество 10 элементами.

11. Опишите множество Pr(1..20) и поместите в него все простые числа в диапазоне от а до b.

12. Составьте программу вычисления суммы мест, на которых в слове Х стоят гласные буквы.

13. Подсчитайте число разных букв в слове.

14. Опишите множества Rus и Lat, содержашие русские и латинские буквы. В цикле вводите русские и латинские буквы и выводите соответствующее сообщение. Выход из цикла – какая-либо клавиша, не являющаяся алфавитно-цифровой.

15. Дан двумерный массив. Найти и напечатать число, которое встречается в каждой строке. Если такого числа нет - напечатайте сообщение.

16. Задан целочисленный массив. Подсчитать число различных значений в массиве.

17. Даны две таблицы по 10 элементов в каждой. Найдите наименьшее среди тех чисел первой таблицы, которые не входят во вторую таблицу (считая, что хотя бы одно такое число есть).

Задание. Приготовьте файлы и листинги решенных задач по этой теме.

Будьте готовы ответить на следующие вопросы:

1. Что такое множество? Каким элементам должны удовлетворять все элементы множества? Преимущества использования типа множество?

2. Что такое базовый тип множества? Как он задается?

3. Какое множество называется пустым, как оно обозначается?

4. Как задается описание множественного типа?

5. Какие операции допустимы над множествами? Каков тип результатов выражений с применением операций над множествами?

6. Какие множества считаются равными, неравными? Имеет ли значение для сравниваемых множеств порядок следования элементов?

7. Для чего применяются операции ">=", "<="? В чем их отличие?

8. Для чего применяется операция in? Особенности ее применения.

9. Что называется объединением множеств?

10. Что называется разностью множеств?


 

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

 

Занятие I

Тема: Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы. Примеры употребления подпрограмм в решении задач.

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

Подпрограммы решают три важные задачи:

• избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;

• улучшают структуру программы, облегчая ее понимание;

• повышают устойчивость к ошибкам программирования и непредвидимым последствиям при модификациях программы.

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

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

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

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

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

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

Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.

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

Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).

Help содержит подробные описания предусмотренных средой программирования процедур и функций. Для вызова помощи при работе со стандартнымипроцедурами и функциями нужно поставить на имя подпрограммы курсор и нажать клавиши <Ctrl+F1>. Описание процедур и функций в Help строится по стандартному принципу.

Задание. Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.

Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая особенно часто необходима для определения типа переменных при обращении к ним. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются курсорной рамкой), то выбрав одно из них (нажать клавишу <Enter>), можно получить справку по следующей функции. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка программы. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций облегчает работу.

Существует другой способ получения помощи по процедурам и функциям. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).

Задание. Рассмотрите список процедур и функций, выберите какие-либо и просмотрите предлагаемую информацию.

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

Существует два способа объединения программ и подпрограмм:

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



Поделиться:


Последнее изменение этой страницы: 2016-12-30; просмотров: 495; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.227.69 (0.298 с.)