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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2012, 18:55   #1
elea87
Новичок
Джуниор
 
Регистрация: 17.11.2012
Сообщений: 2
По умолчанию Паскаль.Динамические структуры данных

"В заданном списке поменять местами К-й и М-й по счету элементы"

Написала код, программа работает. но! есть одна "некрасивость"
не могу никак исправить.

вот кусочек:
Код:
 repeat
    {Создание списока}
    Writeln('Создание списка.');
    Writeln('Прекратить ввод - ' ' + Enter.');
    N := 0;
    repeat
      Write('Элемент ', N + 1, ': ');
      Readln(S);
      if S <> ' ' then
      begin
        Val(S, Data, Code);
        if Code = 0 then
        begin
          Inc(N);
          Add(L, Data);
        end
        else
          Writeln('Неверный ввод. Повторите.');
     end;
    until S = ' ';
не срабатывает "Writeln('Прекратить ввод - ' ' + Enter.');"
при "until S = ' ';"
(мигает что-то и дальше программа не выполняется)

заменила ' ' на '*' программа пошла дальше, но список получается, например, таким:
1,2,3,*
(элемент 1й = 1, 2-ой = 2, 3-ий = 3 и 4-ый = *.

меня эта звездочка не устраивает совсем. как исправить?


думала как-то что-то с указателями натворить, но 4 часа мороки и результата ноль.

P.S.
начало программы. пояснения
Код:
program Project1;
type
    {Основные данные}
    TData = Integer;
    {Указатель на основные данные}
    TPData = ^TData;
    {Указатель на элемент списка}
    TPElem = ^TElem;
    {Элемент списка}
    TElem = record
    PData : TPData; {Указатель на основные данные}
    PNext : TPElem; {Указатель на следующий элемент списка}
  end;
  {Тип, описывающий однонаправленный список}
  TList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка}
  end;
 
{Начальная инициализация списка. !!! Эту процедуру можно выполнять
только в отношении пустого списка!}
procedure Init(var aList : TList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
{Добавление элемента в конец однонаправленного списка}
procedure Add(var aList : TList; const aData : TData);
var
  PData : TPData;
  PElem : TPElem;
begin
  {Выделяем память для основных данных}
  New(PData);
  {Записываем основные данные в выделенную память}
  PData^ := aData;
  {Выделяем память для нового элемента списка}
  New(PElem);
  {Записываем указатель на основные данные}
  PElem^.PData := PData;
  {Предварительно обнуляем указатель на следующий элемент}
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    {Если список пуст, то новый элемент становится первым элементом списка}
    aList.PFirst := PElem
  else
    {Если список непустой, то новый элемент прикрепляем к последнему элементу списка}
    aList.PLast^.PNext := PElem;
  {Новый элемент становится последним в списке}
  aList.PLast := PElem;
end;
 
{Удаление однонаправленного списка из памяти и инициализация}
procedure Free(var aList : TList);
var
  PData : TPData;
  PNext, PDel : TPElem;
begin
  PNext := aList.PFirst;
  while PNext <> nil do begin
    {Указатель на удаляемый элемент}
    PDel := PNext;
    {Указатель на следующий элемент списка}
    PNext := PNext^.PNext;
    {Указатель на основные данные в удаляемом элементе}
    PData := PDel^.PData;
    {Освобождение памяти, занятой под основные данные}
    if PData <> nil then Dispose(PData);
    {Освобождение памяти, занятой под элемент}
    Dispose(PDel);
  end;
  Init(aList);
end;
 
{Получить указатель на элемент под номером aN}
function GetByNum(const aList : TList; const aN : Integer) : TPElem;
var
  PNext : TPElem;
  N : Integer;
begin
  GetByNum := nil;
  if (aList.PFirst = nil) or (aN < 1) then Exit;
 
  PNext := aList.PFirst;
  N := 1;
  while (PNext <> nil) and (N < aN) do begin
    PNext := PNext^.PNext;
    Inc(N);
  end;
  GetByNum := PNext;
end;
 
{Распечатка однонаправленного списка}
procedure Print(const aList : TList);
var
  PData : TPData;
  PElem : TPElem;
begin
  if aList.PFirst = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
 
  PElem := aList.PFirst;
  while PElem <> nil do begin
    if PElem <> aList.PFirst then Write(', ');
    PData := PElem^.PData;
    if PData <> nil then
      Write(PData^)
    else
      Write('nil');
    PElem := PElem^.PNext;
  end;
end;
 
var
  L : TList;
  PElem1, PElem2 : TPElem;
  Plast:TPelem;
  PData : TPData;
  Data : TData;
  N, K, M, Code : Integer;
  S : String;
begin
  {Начальная инициализация списка}
  Init(L);
...

Последний раз редактировалось Stilet; 17.11.2012 в 19:38.
elea87 вне форума Ответить с цитированием
Старый 17.11.2012, 23:13   #2
elea87
Новичок
Джуниор
 
Регистрация: 17.11.2012
Сообщений: 2
По умолчанию

а еще как-то надо убрать надпись "Неверный ввод. Повторите.", которая появляется когда уже список создан и нужно нажать комбинацию клавиш для прекращения ввода списка.
elea87 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль Динамические структуры данных Айс Беби Помощь студентам 0 29.05.2012 12:28
Динамические структуры данных (ПАСКАЛЬ). Liv James Помощь студентам 0 25.05.2011 14:31