Бабалова Алгоритмизация задач и структурирование программ 2013
.pdf
Рис. 31. Алгоритм удаления элемента из списка
unit Unit_game_n; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls; type
TForm1 = class(TForm) ListBox1: TListBox; MainMenu1: TMainMenu; N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
81
N7: TMenuItem; Edit1: TEdit; Label1: TLabel; ListBox2: TListBox; Label2: TLabel; Label3: TLabel;
procedure N1Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure N6Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure N7Click(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
Plist=^list;
List=record
igr:integer;
next:Plist;
end;
var
Form1: TForm1; Head, pl:Plist; n, k:integer;
implementation {$R *.dfm}
Function create_l(k:integer):Plist;
//Создание списка игроков var lp,ls:plist;
i:integer;
begin i:=1;
while i<=k do begin
if pl=nil then
82
begin new(lp); lp^.igr:=i; lp^.next:=nil;
pl:=Lp;//начало списка end else
begin new(ls); lp^.next:=ls; ls^.igr:= i;
ls^.next:=nil;
lp:=ls;
end;
i:=i+1;
end;
Result:=pl;
end;
Procedure Vivod_spisok(var p:plist;b:boolean);
//Выводится список всех игроков
//или тех, кто остался в игре
var lp:plist; begin lp:=pp;
while lp<>nil do begin
if b then
Form1. ListBox1.Items.Add(inttostr(lp^.igr)) else
Form1. ListBox2.Items.Add(inttostr(lp^.igr)); lp:=lp^.next;
end;
end;
Procedure Del_gamer(var pp:plist;kk:integer); // Удаляется игрок с номером kk
var dp,dl,lx:plist; begin
lx:=pp;
if lx=nil then
83
Form1.label3.Caption:='Список пуст' else
if (lx=pp)and (lx^.igr=kk)then begin
pp:=pp^.next;
dispose(lx);
end;
lx:=pp;
while (lx<> nil) do
if (lx^.igr <>kk) then begin
dl:=lx;
lx:=lx^.next; end else
begin
dl^.next:= lx^.next; dispose(lx); lx:=dl;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin
pl:=nil;
end;
procedure TForm1.N1Click(Sender: TObject); begin
randomize;
n:=random(12)+3;
pl:=nil;
ListBox1.Clear; Head:=create_l(n);
end;
procedure TForm1.N2Click(Sender: TObject); var t:boolean;
begin t:=true;
Listbox1.Clear; Vivod_spisok(head,t);
end;
84
procedure TForm1.N4Click(Sender: TObject); var i:integer;
begin i:=Strtoint(Edit1.Text); k:=i;
end;
procedure TForm1.N5Click(Sender: TObject); begin
ListBox2.Clear; Del_gamer(head,k);
end;
procedure TForm1.N6Click(Sender: TObject); var pp:plist;
t:boolean; begin ListBox2.Clear; t:=false;
vivod_spisok(head,t); end;
procedure TForm1.N7Click(Sender: TObject); begin
close; end; end.
Форма с результатом решения задачи приведена на рис. 32
Рис. 32. Результат удаления одного игрока
Для вывода списков игроков использованы компоненты типа
TListBox.
85
Задачи для самостоятельной работы
Общие требования к разработке программ в этом разделе:
•обязательное графическое представление структуры программы;
•все методы обработки данных оформляются процедурами или функциями;
•Все методы по обработке данных изображаются алгоритмами
•все исходные данные сохраняются в файле;
•обеспечивается вывод всех результатов решения задачи;
•последовательность выполнения всех этапов решения задачи обеспечивается через меню.
5.1.Вводится произвольная последовательность целых чисел. Сохранить последовательность в файле. Создать односвязный список из введенных значений. Поменять в списке порядок записи чисел на противоположный.
5.2.Вводится последовательность натуральных чисел xi. Исходная последовательность сохраняется в файле и создается из нее односвязный список. Длина последовательности n. Обеспечить с помощью списка вычисление сумм и произведений вида.
1) x1 *xn+ x2*xn-1..... .........xn*x1;
2) (x1 + xn) * (x2 + xn-1)..... ...... |
*(xn + x1). |
5.3.Данные о фондах библиотеки занести в файл в формате: автор книги, название книги, шифр издания (тоже строка), год издания, количество книг данного названия. Из всех сведений создать список книг одного автора. Вывести полученный список на экран. Обеспечить внесение в полученный список новых сведений и исправление старых сведений. Фамилию автора вводить в диалоге.
5.4.Вводится произвольный текст из неизвестного количества строк. Сохранить текст в файле. Представить текст в виде односвязного списка строк, длина которых не превышает только 30 символов. Определить число строк такой длины в тексте, обеспечить перестановку i-й и j-й строк. Номера строк вводятся в диалоге.
5.5.Есть последовательность сведений следующего формата:
номер операции, стоимость операции. Все сведения должны быть сохранены в файле. Создать стек из введенных данных. Определить с помощью стека стоимость выполнения набора операций, опреде-
86
ляемого последовательностью случайных чисел на отрезке [1,n], где n – число возможных операций при каждой их выборке. Количество всех сведений m >= n.
5.6.Вводится последовательность целых чисел и записывается
вфайл. Для обработки последовательности создаем очередь. Определить среднее арифметическое для этой последовательности. В диалоге вводится некоторое число K. Заменить все значения элементов, равные введенному числу K, на m = –1. Определить число этих замен для каждого варианта списка.
5.7.Вводится последовательность слов и записывается в файле. Создать односвязный список из слов. Определить количество одинаковых слов в списке. Удалить все одинаковые слова. Вывести на экран список и его получившуюся длину.
5.8.Задается некоторая последовательность чисел. Сохраняется последовательность в файле. Создать односвязный список. Найти в списке наибольший и наименьший элементы и поменять их местами. Результаты обработки списка и исходный список вывести на экран.
5.9.Задается некоторая последовательность чисел. Сохранить последовательность в файле. Создать стек. Упорядочить стек по убыванию чисел. Удалить из стека наименьший элемент. Результаты обработки стека и исходные данные вывести на экран.
5.10.Ввести последовательность целых положительных чисел из n значений. Сохранить последовательность в файле. Создать списки из чисел, имеющих одинаковые старшие разряды. Например, введена последовательность 234, 456.23, 47, 31, 56, 2078. Один список будет содержать 234, 23, 2078. Другой список 456, 47 и т.д. Создать процедуру слияния этих списков в исходную последовательность.
5.11.Исходные данные задаются в виде значения и номера этого значения в последовательности размерности n. Например: (45, 3), (12, 5),(48, 1),(89, 2), (33, 4),(55, 7),(19, 6). Обеспечить проверку наличия всех индексов в последовательности от 1 до n. Создать двусвязный список из значений элементов последовательности, упорядоченных по их номерам.
5.12.Вводится некоторая последовательность букв русского алфавита и записывается в памяти в виде линейного списка. Опреде-
87
лить упорядочена ли последовательность по алфавиту. Упорядочить буквы. Заменить выбранную K-ю букву на Q-ю, поменять местами первую и последнюю буквы.
5.13.В файл заносятся сведения о веществах: название, удельный вес, проводимость. Прочитать из файла эти сведения и разместить в памяти в виде линейного списка. Создать списки из проводников, изоляторов, полупроводников.
5.14.В файл записать некоторую последовательность из слов S
неизвестной длины. Создать список из слов, считанных из файла. Удалить из списка все одинаковые слова. Вывести исходный список и результат обработки. Новый список также сохранить в файле.
5.15.В файл занести сведения об автомобилях: фамилия владельца, марка автомобиля, номер автомобиля. Прочитать из файла
изаписать в виде списка все имеющиеся сведения. Создать списки всех владельцев заданной марки автомобиля. Результаты поисков вывести на экран.
5.16.В файл заносится последовательность слов и записывается в памяти в виде списка при чтении из файла. Обеспечить перестановку слов в списке в обратном порядке. Вывести исходный список и преобразованный. В файле сохраняется исходный вид последовательности.
5.17.В файл занести сведения об абонентах телефонной сети: фамилия, адрес, номер телефона. Прочитать все сведения в список. Удалить из списка убывшего абонента, внести в список данные о новом абоненте, изменить данные об абоненте. Вывести на экран преобразованный и исходный списки.
5.18.Создать кольцевой список из букв латинского алфавита. В файле имеется последовательность английских слов. Прочитать из файла эти слова. Создать список из этих слов, поменяв каждую букву слова на букву, стоящую на расстоянии тринадцати букв в алфавите. Например; a – n, d – q, z – m.
5.19.Последовательность чисел хранится в файле. Прочитать последовательность и записать в виде стека. Удалить элементы стека, не превышающие заданного числа. Вывести исходный список элементов и результат обработки стека.
5.20.В файле создать последовательность сведений о сотрудниках некоторой организации. Формат сведений: фамилия, имя, отче-
88
ство, должность, оклад. Создать в памяти упорядоченный список сотрудников по величине заработной платы в виде стека. На вершине должен находиться сотрудник с самой высокой заработной платой.
5.21.В текстовый файл записана последовательность слов. Создать из слов списки по длине слова: две буквы в слове, три буквы в слове и т.д. Считаем, что слов, содержащих более 10 букв, в последовательности нет. Вывести по запросу пользователя любой из списков. Удалить из каждого списка одинаковые слова по запросу пользователя.
5.22.В память в виде линейного списка заносятся сведения о студентах и их оценках по двум предметам. Формат сведений: фамилия, оценка 1, оценка 2. Все сведения сохраняются в файле. Создать списки из отличников, неуспевающих и остальных студентов. Добавить
всведения нового студента. Вывести исходный и результирующие списки на экран.
5.23.В файл заносится неупорядоченный список абонентов телефонной сети в формате: фамилия, имя, отчество, адрес, номер телефона. Создать кольцевой список из этих сведений. Обеспечить вывод сведений обо всех однофамильцах с их номерами телефонов,
атакже удаление и вставку нового абонента.
5.24.Задается некоторая последовательность чисел. В памяти последовательность хранится в виде списка. Найти в списке элементов наибольший элемент и поместить его в конец списка. Заменяемый элемент вставить на его место. Последовательность сохраняется в файле. Результаты обработки и исходный список вывести на экран.
5.25.Из файла читается последовательность вещественных чисел и записывается в виде списка. Определить длину списка. В диалоге вводится некоторый номер n. Удалить из списка элементы с n-го по n+4. Вывести исходный и результирующий списки
5.26.В файл записывается последовательность целых чисел. Прочитать последовательность из файла и записать ее в виде стека в памяти. Определить длину стека. Удалить из стека все отрицательные элементы. Вывести содержимое исходного и результирующего стеков на экран.
5.27.В файл записывается последовательность целых чисел. Создается линейный список из считанной последовательности. Из ис-
89
ходного списка создать список всех совпадающих элементов. Вывести исходный список и список выбранных элементов на экран.
5.28.В файл заносятся сведения о жителях некоторой улицы: фамилия, адрес, год рождения. Все сведения записываются в памяти
ввиде линейного списка. Вводится некоторая текущая дата (год). В списке сведений найти всех жителей, имеющих право участвовать в выборах (возраст >=18). Список полученных сведений вывести на экран.
5.29.В файл записывается некоторая последовательность целых чисел. Прочитать последовательность и записать в память в виде линейного списка. Преобразовать список таким образом, чтобы в начале списка были только отрицательные числа, а затем только положительные. Порядок следования чисел по сравнению с исходной последовательностью не должен быть изменен. Вывести исходную последовательность и результат преобразования.
5.30.В файл надо записать некоторый текст. Каждое предложение текста заканчивается точкой. Составить список из предложений текста, удалив в каждом предложении лишние пробелы (более одного). Записать список в файл. Вывести на экран исходный и преобразованный тексты.
5.31.Создается текстовый файл из слов разной длины. Прочитать из файла слова в список типа очереди. Упорядочить список по длине слов. Обеспечить просмотр списка слов, удаление любого выбранного слова, вставки слова на правильное место по признаку упорядоченности.
5.32.В файл внести сведения о владельцах автомобилей в формате: фамилия, имя, отчество владельца автомобиля, марка автомобиля, год выпуска, номер автомобиля. Разработать список типа очереди, где в начале очереди стоят владельцы самых старых автомобилей. Сформировать списки по владельцам разных марок автомобилей. Обеспечить исправление сведений в списках.
5.33.В файл занести сведения о заработной плате сотрудников некоторой организации в формате: номер отдела, должность, ставка, фамилия, имя, отчество. Создать в памяти кольцевой список из сотрудников организации. Список упорядочить по фамилиям. Обеспечить исправление сведений о сотрудниках, в том числе и изменение числа сотрудников.
90
