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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2013, 18:23   #1
anikev
 
Регистрация: 14.11.2011
Сообщений: 3
По умолчанию Списки

Здравствуйте, уважаемые форумчане! Подскажите пожалуйста, как мне можно организовать список? У меня есть список, но он только добавляет только одно значение, то есть по одной строке. А можно ли мне добавлять несколько значений? Допустим, ФИО и ПОЛ. Понял, что делается это помощью Массива, но как его реализовать в этом листинге. Подскажите пожалуйста.
Код:
Program spisok_1;
Uses Crt;
Type  
   t_name=string[20];{значением элемента списка является строка}
   ref_elem=^t_elem;
   t_elem=record name:t_name;
                 next:ref_elem  
          end;
Var
   list:ref_elem; 
   st:t_name; 
   c:char;
{       Операция "создать список"       }
Procedure CreateList(var head:ref_elem);
var 
 c:t_name; 
 p,r:ref_elem;
begin
 writeln('Строится список строк ');
 writeln('Вводите строки длиной <=20, признак конца – пустая строка');
 write('Введите строку=');   readln(c);
 if c='' then begin head:=nil else
 begin
  new(p);
  p^.name:=c;    {   список строится "с начала"   }
  head:=p;
  write('Введите строку=');  readln(c);
  while c<>'' do begin
                  r:=p;
                  new(p);
                  p^.name:=c; 
                  r^.next:= p;
                  write('Введите строку=');  readln(c);
                 end;
  p^.next:=nil
 end;
end;{end of CreateList}
{    Операция "найти элемент с заданным значением" }
Function FindElem(head : ref_elem; str:t_name):ref_elem;
var 
 p:ref_elem;
begin 
 p:=head;
 while (p<>nil) and (str<>p^.name) do p:=p^.next;
 FindElem:=p
end;{end of FindElem}
{    Операция "напечатать значения элементов списка"  }
Procedure PrintList(head:ref_elem);
var 
  p:ref_elem;
begin
 p:=head;
 while p<>nil do 
 begin
  writeln(p^.name);
  p:=p^.next 
 end;
end;{end of PrintList}
 
{   Операция "сортировка списка"       }
{    элементы списка не переставляются, меняются их значения    }
Procedure SortList(head:ref_elem);
var 
 a,b,d : ref_elem;
 c:t_name;
begin 
 a:=head;
 while a<>nil do
 begin 
  c:=a^.name; d:=a; b:=a;
  while b<>nil do
  begin
   if b^.name<c then 
   begin c:=b^.name; d:=b; end;
   b:=b^.next 
  end;
  d^.name:=a^.name;
  a^.name:=c;
  a:=a^.next;
 end
end;{end of procedure SortList}
{     Главная программа.  Меню операций   }
Begin
 list:=nil;
 while true do begin
  clrscr;
  writeln('    Операции с  однонаправленным  списком строк  ');
  writeln(' ____________ЗАДАЙТЕ НОМЕР ОПЕРАЦИИ_____________');
  writeln('|    1 : Создать список                         |');
  writeln('|    2 : Сортировать список                     |');
  writeln('|    3 : Найти элемент с заданным значением     |');
  writeln('|    4 : Напечатать значения элементов списка   |');
  writeln('|    5 : Завершить работу программы             |');
  writeln('|_______________________________________________|');
  c:=readkey;
  case c of
   '1': CreateList(list);
   '2': begin writeln('      Исходный список: '); PrintList(list);
              SortList(list);
              writeln('      Отсортированный список: ');
              PrintList(list)
        end;
   '3': begin write('Введите искомую строку='); readln(st);
           if FindElem(list,st)<>nil then writeln('Такая строка есть')
                     else writeln('Такой строки нет')
        end;
   '4': begin writeln(' Элементы списка :'); PrintList(list) end;
   '5': begin Exit; readln end;
   else  writeln('*** неверный номер операции');
  end;
  writeln('Для продолжения работы нажмите любую клавишу');
  c:=readkey;
 end;{while}
end.{ конец программы }

Последний раз редактировалось Stilet; 07.04.2013 в 18:53.
anikev вне форума Ответить с цитированием
Старый 07.04.2013, 20:52   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от anikev Посмотреть сообщение
делается это помощью Массива, но как его реализовать в этом листинге
Массивы тут не нужны ни коим образом.
Достаточно изменить структуру
Код:
t_elem=record 
  name:t_name;
  sex: string[10];//можно t_name, char, boolean, byte... смотря как хранить пол
  next:ref_elem  
end;
Если код рабочий, то далее, там где вносится в список ФИО, нужно ещё вносить и пол, где выводится ФИО - выводить ещё и пол, а в сортировке при обмене ФИО - надо ещё обменять и пол.
Все операции по вводу, выводу и смене пола аналогичны операциям с ФИО
eoln вне форума Ответить с цитированием
Старый 08.04.2013, 17:56   #3
anikev
 
Регистрация: 14.11.2011
Сообщений: 3
По умолчанию

Вот я так сделал, возможно неправильно, но у меня при запуске процедуры "напечатать значения элементов списка", появляются иероглифы какие-то. Я новичек, возможно что-то делаю не так. Подскажите пожалуйстав чем моя ошибка.
Код:
Program spisok_1;
Uses Crt;
Type
   t_name=string[20];{значением элемента списка является строка}
   t_group=string[20];
   ref_elem=^t_elem;
   t_elem=record name:t_name;
                 gruppa:t_group;
                 next:ref_elem
          end;
Var
   list:ref_elem;
   st:t_name;
   c:char;
{       Операция "создать список"       }
Procedure CreateList(var head:ref_elem);
var
 c:t_name;
 g:t_group;
 p,r:ref_elem;
begin
 writeln('Строится список строк ');
 writeln('Вводите строки длиной <=20, признак конца – пустая строка');
 write('Введите строку=');   readln(c);
 write('Введите группу=');   readln(g);
 if c='' then  head:=nil else
 begin
  new(p);
  p^.name:=c;    {   список строится "с начала"   }
  head:=p;
  write('Введите строку=');  readln(c);
   write('Введите группу=');   readln(g);
  while c<>'' do begin
                  r:=p;
                  new(p);
                  p^.name:=c;
                  r^.next:= p;
                  write('Введите строку=');  readln(c);
                   write('Введите группу=');   readln(g);
                 end;
  p^.next:=nil
 end;
end;{end of CreateList}

{    Операция "напечатать значения элементов списка"  }
Procedure PrintList(head:ref_elem);
var
  p:ref_elem;
begin
 p:=head;
 while p<>nil do
 begin
  writeln(p^.name);
  gotoXY(16,whereY); writeln(p^.gruppa);
  p:=p^.next
 end;
end;{end of PrintList}


{     Главная программа.  Меню операций   }
Begin
 list:=nil;
 while true do begin
  clrscr;
  writeln('    Операции с  однонаправленным  списком строк  ');
  writeln(' ____________ЗАДАЙТЕ НОМЕР ОПЕРАЦИИ_____________');
  writeln('|    1 : Создать список                         |');
  writeln('|    2 : Сортировать список                     |');
  writeln('|    3 : Найти элемент с заданным значением     |');
  writeln('|    4 : Напечатать значения элементов списка   |');
  writeln('|    5 : Завершить работу программы             |');
  writeln('|_______________________________________________|');
  c:=readkey;
  case c of
   '1': CreateList(list);
   '2': begin writeln('      Исходный список: '); PrintList(list);
              SortList(list);
              writeln('      Отсортированный список: ');
              PrintList(list)
        end;
   '3': begin write('Введите искомую строку='); readln(st);
           if FindElem(list,st)<>nil then writeln('Такая строка есть')
                     else writeln('Такой строки нет')
        end;
   '4': begin writeln(' Элементы списка :'); PrintList(list) end;
   '5': begin Exit; readln end;
   else  writeln('*** неверный номер операции');
  end;
  writeln('Для продолжения работы нажмите любую клавишу');
  c:=readkey;
 end;{while}
end.{ конец программы }
anikev вне форума Ответить с цитированием
Старый 08.04.2013, 20:28   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

При создании списка в Procedure CreateList после
Код:
p^.name:=c;
надо добавить
Код:
p^.gruppa:=g;
По поводу кракозябр, так это дело в кодировке, с английскими буквами должно быть всё нормально. Видимо, русификатор не установлен или кодовой страницы нет.
Если это Turbo Pascal, то лучше запускать его из под досбокса (кодировку ес-но надо будет менять, либо заново перепечатывать) DOSBox.rar
eoln вне форума Ответить с цитированием
Старый 09.04.2013, 05:12   #5
anikev
 
Регистрация: 14.11.2011
Сообщений: 3
По умолчанию

Спасибо, все круто получилось. Но вот только при последнем вводе, если я хочу закончить список, мне приходится еще и 5 раз нажимать ентер, что бы заполнить пустые значения. Можно ли мне как-то с помощью Esc осуществить выход из редактирования списка?
anikev вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
списки FSAS Помощь студентам 0 25.06.2011 09:56
списки с++ SlowMotion Помощь студентам 1 22.06.2011 21:00
Списки. Pavel_4a-4anax Помощь студентам 0 01.06.2011 15:38
(C++) списки Troi666 Помощь студентам 6 13.05.2009 00:47