Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2014, 22:12   #1
King Kong
Пользователь
 
Регистрация: 06.04.2014
Сообщений: 23
По умолчанию Списки

Имеется работающая программа для добавления и удаления из упорядоченного списка элементов по фамилии и имени. Не получается сделать так чтобы
1)Удалялись из упорядоченного списка все элементы с заданным именем
2)Удалялись из упорядоченного списка все элементы с фамилиями, начинающимися с заданной буквы.
Что в программе поменять?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label3: TLabel;
    Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
TPStudent=^TStudent; // указатель на тип TStudent
TStudent = record
f_name:string[20]; // фамилия
l_name: string[20]; // имя
next: TPStudent; // следующий элемент списка
end;
var
head: TPStudent; // начало (голова) списка

// добавить элемент в список
procedure TForm1.Button1Click(Sender: TObject);
var
node: TPStudent; // новый узел списка
curr: TPStudent; // текущий узел списка
pre: TPStudent; // предыдущий, относительно curr, узел
begin
new(node); // создание нового элемента списка
node^.f_name:=Edit1.Text; // фамилия
node^.l_name:=Edit2.Text; // имя
// добавление узла в список
// сначала найдем в списке подходящее место для узла
curr:=head;
pre:=NIL;
{ Внимание!
Если приведенное ниже условие заменить
на (node. f_name>curr^. f_name) and (curr<>NIL) ,
то при добавлении первого узла возникает ошибка времени
выполнения, т. к. curr = NIL и, следовательно,
переменной curr.^name нет!
В используемом варианте условия ошибка не возникает, т. к.
сначала проверяется условие (curr<> NIL), значение которого
FALSE, и второе условие в этом случае не проверяется. 
}
while (curr<> NIL) and (node.f_name>curr^.f_name) do
begin
// введенное значение больше текущего
pre:= curr;
curr:=curr^.next; // к следующему узлу 
end;
if pre = NIL then
begin
// новый узел в начало списка
node^. next:=head; head:=node; 
end
else
begin
// новый узел после pre, перед curr
node^.next:=pre^.next;
pre^.next:=node;
end;
Edit1.text:='';
Edit2.text:='';
Edit1.SetFocus;

end;

// вывести список
procedure TForm1.Button2Click(Sender: TObject);
var
curr: TPStudent; // текущий элемент списка
n: integer; // длина (кол-во элементов) списка
st: string; // строковое представление списка
begin
n := 0; st := '';
curr := head; // указатель на первый элемент списка 
while curr<> NIL do begin
n := n + 1;
st := st + curr^.f_name + ' ' + curr^.l_name+#13;
curr := curr^.next;  // указатель на следующий элемент
end;
if n <> 0
then ShowMessage('Список:' + #13 + st)
else ShowMessage('В списке нет элементов.');


end;

// начало работы программы
procedure TForm1.FormActivate(Sender: TObject);
begin
head:=NIL; // список пустой
end;

// удалить элемент из списка
procedure TForm1.Button3Click(Sender: TObject);
var
curr: TPStudent; // текущий узел списка
pre: TPStudent; // предыдущий, относительно curr, узел
st: string; // строковое представление списка

begin
curr:=head;
pre:=NIL;

while (curr <> NIL) and (Edit1.Text <> curr^.f_name) do
begin
// поиск значение больше текущего
pre:= curr;
curr:=curr^.next; // к следующему узлу
end;

if curr = NIL then
begin
// искомое значение в списке не обнаружено
ShowMessage('В списке нет такого элемента.');
end
else
begin
st := st + curr^.f_name + ' ' + curr^.l_name+#13;
ShowMessage('Удаляемый элемент:' + #13 + st) ;

if pre = NIL then
begin
// удаляется узел из начала списка
curr:=head; head:=head^.next;
dispose(curr);
end
else
begin
// удаляется найденный узел

pre^.next:=curr^.next;
dispose(curr);

end;
Edit1.text:='';
Edit2.text:='';
Edit1.SetFocus;
end;
end;

end.

Последний раз редактировалось King Kong; 30.04.2014 в 22:13. Причина: Недочёт
King Kong вне форума Ответить с цитированием
Старый 01.05.2014, 17:10   #2
King Kong
Пользователь
 
Регистрация: 06.04.2014
Сообщений: 23
По умолчанию

никаких предложений?
King Kong вне форума Ответить с цитированием
Старый 01.05.2014, 21:49   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
никаких предложений?
Ну почему же никаких?
Есть одно - использовать TObjectList в качестве списка. Это вместо того что пишут в учебниках с классическими реализациями списков.
Однако пока мне не понятно чем эта программа не устраивает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2014, 15:57   #4
King Kong
Пользователь
 
Регистрация: 06.04.2014
Сообщений: 23
По умолчанию

программа устраивает просто нужно выполнить эти два задания )мне сказали нужно поменять в тексте программы что то. не понимаю что ( через TObjectList не нужно мне кажется. я могу весь проект скинуть если нужно
King Kong вне форума Ответить с цитированием
Старый 25.05.2014, 23:28   #5
King Kong
Пользователь
 
Регистрация: 06.04.2014
Сообщений: 23
По умолчанию

спасайте народ!
King Kong вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки ProstoKuzia Паскаль, Turbo Pascal, PascalABC.NET 0 12.05.2012 14:37
списки(с++) besbyblik Помощь студентам 0 27.12.2011 18:30
Списки Fryg HTML и CSS 1 10.12.2011 18:38
Списки Chief Паскаль, Turbo Pascal, PascalABC.NET 4 03.06.2009 18:29