readln(NewName);
assign(f1, Name);
assign(f2, NewName);
reset(f1);
rewrite(f2);
while not Eof(f1) do
begin
readln(f1, Stroka);
ModifStr(Stroka, NewStroka);
writeln(f2, NewStroka);
end;
close(f1);
close(f2);
End.
Занятие 4. Самостоятельное решение задач
Задачи для самостоятельного решения:
1. Дан текстовый файл. Проанализировав в программе содержимое файла, выберите из него числа и занесите в очередь. Выведите содержимое очереди на экран и посчитайте сумму этих чисел. Решение в программе оформляйте через подпрограммы.
2. Дан текстовый файл. Проанализировав в программе содержимое файла, выберите из него имена и занесите в очередь. Выведите содержимое очереди на экран и посчитайте количество элементов образованной очереди. Решение в программе оформляйте через подпрограммы.
3. Проверьте на равенство две очереди. Решение в программе оформляйте через подпрограммы.
4. Найдите среди трех (4, 5) очередей две одинаковые. Решение в программе оформляйте через подпрограммы.
5. Организовать три очереди с одинаковым количеством элементов, содержащие соответствено имена, отчества и фамилии людей. Составьте очередь из элементов, содержащих наиболее полную информацию о людях, воспользовавшись уже созданными очередями и запросив какую-то дополнительную информацию. Решение в программе оформляйте через подпрограммы.
6. Создайте файл символьного типа. Организовывая очереди по N элементов, cоздайте файл слов по N символов в каждом. Решение в программе оформляйте через подпрограммы.
7. Создайте файл целого типа. Проанализировав в программе содержимое файла, создайте одну очередь однозначных чисел, а вторую очередь двузначных чисел. Перемножьте соответственные элементы двух очередей и организуйте третью очередь. Результат выведите в текстовый файл. Решение в программе оформляйте через подпрограммы.
8. Используя очередь, проверьте, какие строки текстового файла являются симметричными. Решение в программе оформляйте через подпрограммы.
9. Используя очередь, проверьте на равенство два текстовых файла. Решение в программе оформляйте через подпрограммы.
10. Создайте две очереди. Проверьте, является ли одна из очередей частью другой. Решение в программе оформляйте через подпрограммы.
Занятие 5. Кольцо. Формирование кольца. Основные операции над кольцом.
Koльцо - это вид связанного списка, в котором указатель последнего элемента ссылается на первый элемент.
Рассмотрите его графическое представление.

При программировании на Паскале считается, что для кольца существует обход элементов. Доступ возможен к любому элементу структуры.
Кольцо является динамической структурой – в зависимости от пользователя программы может изменяется длина и набор составляющих его элементов.
Опишем кольцо на языке программирования:
Type
TypeCircle = ^K;
K = record
Data : integer;
Next : TypeCircle;
End;
Var
Circle1 : TypeCircle;
Формирование кольца
Рассмотрите процедуру формирования кольца. Для работы этой процедуры заводятся две локальные переменные типа TypeCircle для хранения адресов промежуточного и завершающего звена списка, последним оператором преобразуемого в кольцо.
Procedure FofmK(Var u : TypeCircle);
Var
x, y : TypeCircle;
i, N : integer;
Begin
write('Введите количество звеньев кольца: ');
readln(N);
for i := 1 to N do
begin
new(x); {выделяем память для хранения нового элемента кольца}
write('Введите данные в звено: ');
readln(i);
x^.Data := i; {заносим информацию в поле данных}
if u=nil {если кольцо еще не создано}
then
u := x {то указатель первого элемента ставим на новый элемент}
else
y^.Next := x; {присоединяем новый элемент к последнему элементу}
y := x; {переносим указатель у на последний элемент}
end;
x^.Next := u; {преобразуем получившийся список в кольцо}
End;
Над кольцом определены три операции: занесение элемента в кольцо, извлечение элемента из кольца и обход кольца.
Задание. Составьте программу, содержащую две процедуры: процедуру занесения элемента в кольцо и процедуру извлечения элемента из кольца по какому-либо условию. (Можно воспользоваться предыдущим текстом программы.)
Обход кольца
Для того чтобы обойти кольцо и вывести на экран содержащуюся в нем информацию, необходимо в локальной переменной типа TypeCircle запомнить адрес первого выводимого элемента. В этом случае можно избежать повторения и зацикливания программы. Вывод данных можно начинать с любого элемента кольца; это зависит от адреса первого элемента, переданного в процедуру обхода.
Рассмотрите процедуру обхода кольца.
Procedure PrintК(u : TypeCircle);
Var
x : TypeCircle;
Begin
x := u;
repeat
write(x^.Data,' ');
x := x^.Next;
until x=u;
readln;
End;
Задание. Дополните предыдущую программу процедурой обхода кольца.
Занятие 6. Примеры решения задач с применением динамической структуры кольцо. Творческая работа.
Задание. Рассмотрите приведенные примеры задач, решенные с помощью динамической структуры – кольцо. Наберите их на компьютере, проверьте их действие, вставьте комментарий.
Задача 1. N ребят располагаются по кругу. Начав отсчет от первого, удаляют каждого k-го, смыкая при этом круг. Определить порядок удаления ребят из круга.
Для хранения данных об участниках игры используется список.
Наберите предложенный ниже текст программы, проверьте его работу, дополните комментариями.
Program Schitalka;
Type
Children = ^Child;
Child = record
Data : integer;
Next : Children;
end;
Var
Circl, p, Temp : Children;
i, j, NumName : integer;
text : string;
Function NumSlov(Var S : string) : integer;
Var
i, d : integer;
Begin
d := 0;
i := 1;
while i < Length(S) do
begin
while S[i] = ' ' do
Inc(i);
while S[i] <> ' ' do
Inc(i);
d := d+1;
end;
if S[Length(S)] = ''
then
d := d-1;
NumSlov := d;
End;
Procedure AddName(Var Old, Young : Children);
Begin
Young^.Next := Old;
Young^.Prev := Old^.Prev;
Old^.Prev^.Next := Young;
Old^.Prev := Young;
End;
Procedure DeleteName(Var Old : Children);
Begin
Old^.Next^.Prev := Old^.Prev;
Old^.Prev^.Next := Old^.Next;
End;
Begin
new(Circl);
Circl^.Next := Circl;
Circl^.Prev := Circl;
Circl^.Name := '';
writeln('Считалка');
writeln('Введите текст считалки >');
readln(text);
writeln('Сколько человек в кругу? >');
readln(NumName);
if NumName>0
then
begin
write('Введите ',i,'-е имя: ');
new(p);
readln(p^.name);
temp := head^.next;
while temp <> head do
temp := temp^.next;
AddName(temp, p);
end;
for i := 1 to NumName-1 do
begin
temp := head;
for j := 1 to NumSlov(text) do
begin
temp := temp^.next;
if temp^.name = ''
then
temp :=temp^.next;
end;
writeln(temp^.name, '- вышел');
deleteName(temp);
end;
writeln(head^.next^.name, '- остался');
End.
Пример 2. Вывести на экран работающий светофор.
Program GrushinK;
Uses
Crt, Graph;
Type
TypeCircle = ^K;
K = record
Data : char;
Next : TypeCircle;
end;
Const
XX = 80;
R = 50;
Var
Svetofor, x : TypeCircle;
FraphDriver, GraphMode, Y : integer;
Procedure Picture;
Begin
SetViewPort(240, 1, 400, 477, ClipOff);
Line(0, 1, 0, 477);
Line(160, 1, 160, 477);
Line(0, 1, 160, 1);
Line(0, 477, 160, 477);
Line(0, 150, 156, 150);
Line(0, 330, 156, 330);
Line(-240, 480, 0, 100);
Line(400, 480, 160, 100);
Line(380, 460, 160, 460);
Line(160, 440, 368, 440);
Line(368, 440, 380, 460);
Line(-220, 460, -208, 440);
SetFillStyle(1, White);
FloodFill(375, 455, White);
FloodFill(-215, 455, White);
SetFillStyle(7, 6);
FloodFill(-230, 200, White);
SetColor(4);
Line(-240, 150, -120, -1);
Line(400, 150, 240, -1);
SetColor(15);
SetFillStyle(9, 4);
FloodFill(-240, 0, 4);
FloodFill(390, 10, 4);
SetFillStyle(1, 8);
FloodFill(-100, 470, White);
Y := 74;
Circle(XX, Y, R);
Y := 240;
Circle(XX, Y, R);
Y := 405;
Circle(XX, Y, R);
SetFillStyle(9, 6);
FloodFill(5, 5, White);
End;
Procedure Yellow(Y : integer);
Begin
Picture;
Y := 240;
SetFillStyle(1, 14);
FloodFill(XX, Y, 15);
Delay(850);
ClearViewPort;
End;
Procedure Green(Y : integer);
Begin
Picture;
Y := 405;
SetFillStyle(1, 2);
FloodFill(XX, Y, 15);
Delay(1500);
ClearViewPort;
End;
Procedure Red Yellow(Y : integer);
Begin
Picture;
Y := 240;
SetFillStyle(1, 14);
FloodFill(XX, Y, 15);
Delay(1500);
ClearViewPort;
End;
Procedure Red(Y : integer);
Begin
Picture;
Y := 74;
SetFillStyle(1, 4);
FloodFill(XX, Y, 15);
Delay(2000);
ClearViewPort;
End;
Procedure Vibor;
Begin
case x^.Data of
'R' : Red(Y);
'2' : Red Yellow(Y);
'G' : Green(Y);
'Y' : Yellow(Y);
End;
Begin
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, '..\BGI');
new(x);
u := x;
x^.Data := 'R';
new(x^.Next);
x := x^.Next;
x^.Data := '2';
new(x^.Next);
x := x^.Next;
x^.Data := 'G';
new(x^.Next);
x := x^.Next;
x^.Data := 'Y';
x^.Next := u;
x := u;
while not KeyPressed do
begin
Vibor;
x := x^.Next;
end;
End.
Задание. Придумайте интересную задачу из жизни и решите ее с помощью динамической структуры кольцо.
Список
Занятие 1. Список. Создание списка путем добавления элементов в конец списка. Просмотр списка.
Определение. Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим элементом.
Из определения следует, что каждый элемент списка содержит поле данных (Data) (оно может иметь сложную структуру) и поле ссылки на следующий элемент (Next). Поле ссылки последнего элемента должно содержать пустой указатель (Nil).
Схематически это выглядит так:

|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |


