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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2014, 23:49   #1
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
Сообщение Некорректно работает, ошибка в алгоритме

Задание: Сформируйте двунаправленный список, содержащий действительные
числа a1, a2, ..., a2n (n>= 2, величина n и данные числового ряда
заранее неизвестны и вводятся с клавиатуры). Вычислите: max(min(a1,
a2n), min(a2, a2n-1),..., min(an, an+1))


Код:
Код:
type pElement = ^Element;
     Element = record
     Data : integer;
     Next : pElement;                      {поле указателя на следующий элемент}
     Prev : pElement;                      {поле указателя на предыдущий элемент}
               end;
               
var pHead : pElement;                      {указатель на первый элемент списка}
    pCurrent : pElement;                   {указатель на текущий элемент}
    pAddt, Addt: pElement;                 {В.П.}
    n, i : integer;
    
PROCEDURE Insert_NotFirst_DoubleList(var pHead, pCurrent : pElement);
BEGIN
  New (pAddt);
  readln (pAddt^.Data);
    if pHead = NIL then begin              {список пуст}
      pAddt^.Next := NIL;
      pAddt^.Prev := NIL;
      pHead := pAddt;
                        end
        else begin                         {список не пуст}
          if pCurrent^.Next <> NIL then begin   {вставляем не последний}
            pCurrent^.Next := pAddt;
            pCurrent^.Prev := pAddt;
                                        end;
          pAddt^.Next := pCurrent^.Next;
          pCurrent^.Next := Paddt;
          pAddt^.Prev := pCurrent;
             end;
      pCurrent := pAddt;
END;

PROCEDURE Insert_First_DoubleList (var pHead, pCurrent : pElement);
BEGIN
  New (pAddt);
  readln (pAddt^.Data);
  pAddt^.Prev := NIL;
    if pHead = NIL then               {список пуст}
      pAddt^.Next := NIL
        else begin
          pAddt^.Next := pHead;
          pHead^.Prev := pAddt;
             end;
    pHead := pAddt;
    pCurrent := pHead;
END;

PROCEDURE Print_List (pHead : pElement);
BEGIN
  pAddt := pHead;
  i := 1;
  while pAddt <> NIL do begin
    write (i, '----- ');  
    writeln (pAddt^.data);
    pAddt:=pAddt^.Next;
    i := i+1;
                      end;
END;

PROCEDURE Poisk_Chisla (pHead : pElement; n : integer);
var minPara, i, maxRyad : integer;
BEGIN
  pAddt := pHead;
  Addt := pHead;
    while Addt^.Next <> NIL do
      Addt := Addt^.Next;
    
  if pAddt^.Data < Addt^.Data then
      maxRyad := pAddt^.Data 
        else
          maxRyad := Addt^.Data;
  pAddt:=pAddt^.Next;
  Addt:=pAddt^.Prev;
   
  for i := 2 to n do begin
    if pAddt^.Data < Addt^.Data then
      minPara := pAddt^.Data
        else
          minPara := Addt^.Data;
      if minPara > maxRyad then
        maxRyad := minPara;
                     end;   
  write ('Максимальное число из минимальных пар: ', maxRyad);
END;


BEGIN
  write ('Введите n>=2 : ');  readln (n);
  writeln ('Введите данные числового ряда: ');
  write ('1----- ');
    Insert_First_DoubleList (pHead, pCurrent);
    for i:=2 to (2*n) do begin
      write (i, '----- ');
      Insert_NotFirst_DoubleList(pHead, pCurrent);
                         end;
  writeln ();
  Print_List (pHead);
  writeln ();
  Poisk_Chisla (pHead, n);
  pAddt := pHead;                   {удаление списка}
    while pAddt <> NIL do begin
      pHead := pAddt^.Next;
      dispose (pAddt);
                      end;
END.
Выдаёт некорректный результат функция Poisk_Chisla, она просто не то число выдаёт, которое ручным вычислением находится. Помогите, пожалуйста, понимаю, что где-то есть очень глупая ошибка, но не могу её найти
orandzheviyman вне форума Ответить с цитированием
Старый 24.10.2014, 05:26   #2
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

вникал, вникал я в суть вашей функции "Poisk_Chisla", скажу одно - сложный стиль у вас... несколько раз пытался понять, ничего... потом забил, глянул дальше, вижу:
Код:
    while pAddt <> NIL do begin
      pHead := pAddt^.Next;
      dispose (pAddt);
                      end;
это точно не дело... вы же удаляете объект, а потом сравниваете указатель удалённого объекта с nil, попробуйте:
Код:
 while pAddt <> NIL do begin
                     pHead := pAddt^.Next;
                     dispose (pAddt);
                     pAddt:=pHead;
             end;
для начала, это же логичнее... ошибку в "Poisk_Chisla" пока не найду (((
как вариант - могу эту задачу написать вам с нуля нормально, на free pascal...

Последний раз редактировалось abit; 24.10.2014 в 05:41.
abit вне форума Ответить с цитированием
Старый 24.10.2014, 08:49   #3
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от abit Посмотреть сообщение
для начала, это же логичнее... ошибку в "Poisk_Chisla" пока не найду (((
как вариант - могу эту задачу написать вам с нуля нормально, на free pascal...
Спасибо, можете, если вам не сложно написать задание полностью, может я сравню коды и пойму что не так.
orandzheviyman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
некорректно работает скрипт Klerik97 Microsoft Office Excel 2 07.06.2013 12:59
Некорректно работает программа. JIOBEJIAC Помощь студентам 0 19.12.2011 20:47
Ошибка в алгоритме parkito Общие вопросы C/C++ 1 07.12.2011 04:25
Ошибка в алгоритме поиска murzilka6002 Общие вопросы C/C++ 15 24.11.2011 04:57
IdHTTP1 некорректно работает nike-p Работа с сетью в Delphi 9 23.07.2008 23:13