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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2009, 09:22   #1
Grisha248
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 15
По умолчанию Как подсчитать количество записей в списке

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

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

type
 TPStudent = ^TStudent;  //указатель на переменную типа TStudent

 //описание типа элемента списка

 TStudent = record
   f_name: string[20];
   o_name: string[20];
   s_name: string[20];


   next: TPStudent;  //указатель на следующий элемент списка
 end;
var
  head: TPStudent; //указатель на первый элемент списка
procedure TForm1.Button1Click(Sender: TObject);
 var
  curr:TPStudent; //новый элемент списка
begin
 new(curr); //выделить память для элемента списка
 curr^.f_name:=Edit1.Text;
 curr^.o_name:=Edit2.Text;
 curr^.s_name:=Edit3.Text;
 //добавление в начало списка
 curr^.next:=head;
 head:=curr;
 edit1.Text:='';
 Edit2.Text:='';
 Edit3.Text:='';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  curr:TPStudent; // текущий элемент списка
  n: integer;   // длина (кол-во элементов) списка
begin
 n:=0;
 curr:=head;
 Memo1.Lines.Clear;
   while curr<>NIL do
  begin
    n:=n+1;
    Memo1.Lines.Add(curr^.f_name+' '+curr^.o_name+' '+curr^.s_name);
    curr:=curr^.next;
  label1.Caption:='vsego '+inttostr(n);
  end;
  if n=0
    then Memo1.Lines.Add('В списке нет элементов ');
end;




 procedure TForm1.Button3Click(Sender: TObject);
var
  curr:TPStudent;
  pre:TPStudent;
  found:boolean;

begin
   if head = NIL then
     begin
      MessageDlg('Список пустой', mtError,[mbok],0);
      exit;
     end;

     curr:=head;
     pre:=NIL;
     found:=false;

     while (curr<>NIL) and (not found) do
       begin
         if (curr^.f_name=Edit1.Text) and (curr^.o_name = Edit2.Text)
                                      and (curr^.s_name = Edit3.Text)
         then found:=True
         else
           begin
             pre:=curr;
             curr:=curr^.next;
           end;
       end;
    if found then
       begin
         if pre = NIL
           then head:=curr^.next
           else pre^.next:=curr.next;
         Dispose(curr);
         MessageDlg('Узел '+#13+
         'Фамилия   '+edit1.Text+
         'пол   '+Edit2.Text+
         'количество детей   '+Edit3.Text+#13+' удален из списка',
         mtinformation,[mbOk],0);
       end
  else
       MessageDlg('Узел '+#13+
         'Фамилия   '+edit1.Text+
         'пол   '+Edit2.Text+
         'количество детей   '+Edit3.Text+#13+' в списке не найдена',
         mtError,[mbOk],0);
 Edit1.Text:='';
 Edit2.Text:='';
 Edit3.Text:='';
 Edit1.SetFocus;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Form2.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

Последний раз редактировалось Stilet; 23.06.2009 в 10:27.
Grisha248 вне форума Ответить с цитированием
Старый 23.06.2009, 10:25   #2
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Цитата:
реализовать двусвязный динамический список
Это значит, что в списке должны быть укзатели не только на последующий элемент, но и на предыдущий. Т.е. ваш тип должен иметь вид:
Код:
Student = record
f_name: string[20];
o_name: string[20];
s_name: string[20];

prew : TPStudent; // Указатель на предыдущий элемент списка, для парвого - nil
next: TPStudent; //указатель на следующий элемент списка
end;
Дополните свой код с учётом сказаного. А насчёт количества элемнтов списка, то вот так
Код:
Function GetCount:integer;
begin
  Result := 0;
  curr:=head;
  while curr <> nil do 
    begin
    inc(Result);
    curr := curr.next; 
    end;
end;
только проследмте, чтобы у последнего элемента списка поле next было nil
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 23.06.2009, 10:43   #3
Grisha248
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 15
По умолчанию

спасибо. уже сделал
Grisha248 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчитать количество шагов MAKEDON Помощь студентам 3 02.06.2009 15:04
Помогите подсчитать количество дней komar73 Microsoft Office Excel 2 09.02.2009 09:54
Как подсчитать количество уникальных мест? Iskin Microsoft Office Excel 2 05.12.2008 11:44
количество фамилий в списке Гуля Паскаль, Turbo Pascal, PascalABC.NET 8 29.04.2008 13:01
подсчитать количество символов слов и предложений nev Помощь студентам 4 09.06.2007 21:22