Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / турбо паскаль / 7 сообщений из 7, страница 1 из 1
29.04.2008, 21:04
    #35287143
klimik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
задача на списки:

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

дан .тхт файл из него читаются данные о сотрудниках. Помогите кто-нибудь, не понятно как выстраивать их списком. Дайте ссылки на тему если у кого есть...
...
Рейтинг: 0 / 0
29.04.2008, 21:40
    #35287194
Anjey aka PM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
тынц

вам вполне достаточно односвязного списка. Организовать примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PListItem = ^TListItem;
TListItem =  record 
   {data fields here:} 
  Name:  string ;
  Age: Integer;
  Education: Boolean;
  .......
   {--------} 
  Next: PListItem;
 end ;

далее заводим 2 списка. Первый для сотрудников с высшим образованием, второй -- без

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 var 
  VO_Head,  {голова списка с в/о} 
  WVO_Head,  {голова списка без в/о} 
  VO_Tail,  {хвост списка с в/о} 
  WVO_Tail,  {хвост списка без в/о} 
  Result,  {голова результата (склеенный список), впринципе можно и без этого но мухи и котлеты лучше разделять} 
  Node: PListItem;  {текущий элемент списка (только-что прочитанный из файла)} 
 begin 
  VO_head :=  nil ;
  WVO_head :=  nil ;
  VO_tail :=  nil ;
  WVO_tail :=  nil ;

Инициализируем и заполняем примерно так:

Код: plaintext
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.
 while  ( {пока есть записи в файле} )  do   begin 
   {тут читаем запись из файла} 

  Node := GetMem(SizeOf(TListItem));
  Node^.Next :=  nil ;
  Node^.Name := NameFromFile;
  Node^.Age := AgeFromFile;

  ......

  Node^.Education := EducationFromFile;

   if  (Node^.Education)  then   begin 
     if  (VO_Head =  nil )  then   begin 
      VO_Head := Node;
      VO_Tail := VO_Head;
     end   else   begin 
      VO_Tail^.Next := Node;
      VO_Tail := Node;
     end ;
   end   else   begin 
     if  (WVO_Head =  nil )  then   begin 
      WVO_Head := Node;
      WVO_Tail := WVO_Head;
     end   else   begin 
      WVO_Tail^.Next := Node;
      WVO_Tail := Node;
     end ;
   end 
 end 

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

Делаем примерно такое

Код: plaintext
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.
 if  (VO_Head =  nil )  then   {нетути первого списочка} 
  Result := WVO_Head
 else 
 begin 
  Result := VO_Head;
  VO_Tail^.Next := WVO_Head;
 end ;

Node := Result;

 while  (Node <>  nil )  do 
 begin 
  Writeln('Name: ', Node^.Name);
   {и прочую хренотень о сотруднике выводим тут} 
  Node := Node^.Next;
 end ;

 {Да и культурно очищаем память} 

 while  (Result <>  nil )  do 
 begin 
  Node := Result;
  Result := Result^.Next;
  FreeMem(Node, Sizeof(TListItem));
 end ;


Ну.... както воттак

ЗЫ: кусочки кода писаные сразу в мемо-поле браузера и поданы лишь для получения общего представления как работать с односвязными списками на паскале, так что если е найдете багов это будет даже странно

ЗЫЫ: на пакакале лет 10 не писал :)
...
Рейтинг: 0 / 0
30.04.2008, 08:02
    #35287498
klimik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
Большое спс!!
...
Рейтинг: 0 / 0
30.04.2008, 10:03
    #35287747
klimik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
а если "образование" в стринге должно быть, то как? надо переменную присваивать?
...
Рейтинг: 0 / 0
30.04.2008, 13:42
    #35288519
Anjey aka PM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
а если это то переделайте условие на проверку наличия образования где оно встречается ЛИБО разово проверяйте при считываии из файла и присваивайте полю Education значения true или false соответственно.
...
Рейтинг: 0 / 0
06.05.2008, 23:17
    #35298277
klimik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
Anjey aka PM
if (Node^.Education) then begin
if (VO_Head = nil) then begin
VO_Head := Node;
VO_Tail := VO_Head;
end else begin
VO_Tail^.Next := Node;
VO_Tail := Node;
end;
end else begin
if (WVO_Head = nil) then begin
WVO_Head := Node;
WVO_Tail := WVO_Head;
end else begin
WVO_Tail^.Next := Node;
WVO_Tail := Node;
end;
end
end

if (VO_Head = nil) then {нетути первого списочка}
Result := WVO_Head
else
begin
Result := VO_Head;
VO_Tail^.Next := WVO_Head;


Node := Result;


тут список строится очередью; как сделать через стек?
...
Рейтинг: 0 / 0
06.05.2008, 23:26
    #35298287
Anjey aka PM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
турбо паскаль
а запихивайте не в хвост а в голову и будет вам счастье....

The greatest programming project of all took six days; on the seventh day the programmer rested. We've been trying to debug the *&^%$#@ thing ever since. Moral: design before you implement.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / турбо паскаль / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]