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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2014, 10:57   #1
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию рекурсивная процедура в Паскаль

есть односвязный список. (весь код кидать не буду) . Нужно было написать рекурсивную процедуру которая "смотрит" сколько раз входит данный элемент в список , тоесть количество одинаковых значений.
Вот небольшой код:
Код:
type
 PNode = ^TNode;
 TNode = record
   Next: PNode;
   Value: Integer;
 end;
var
 Root: PNode;
var
 cnt: Integer;
 SearchValue: Integer;
procedure CheckEqual(Node: PNode);
begin
 if (Node = nil) then Exit;
 if (Node.Value = SearchValue) then inc(cnt);
 CheckEqual(Node.Next);
end;
begin
 cnt := 0;
 ReadLn(SearchValue);
 CheckEqual(Root);
 Writeln(cnt);
end.
при вводе чисел постоянно выдает 0. помогите плиз исправить процедуру
mishammm вне форума Ответить с цитированием
Старый 29.04.2014, 11:14   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Root инициализирован перед обращением к CheckEqual?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2014, 11:19   #3
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Root инициализирован перед обращением к CheckEqual?
с утра немного туплю, извините это имеете в виду
Код:
var
 Root: PNode;
?
mishammm вне форума Ответить с цитированием
Старый 29.04.2014, 11:24   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну да, в него помещен указатель на первый элемент списка?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2014, 11:28   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от mishammm Посмотреть сообщение
с утра немного туплю, извините это имеете в виду
Код:
var
 Root: PNode;
?
именно так.
в вашей программе Вы вызываете:
Цитата:
Код:
CheckEqual(Root);
если Root, как и должно, показывает на голову (начало == первый элемент) списка, то всё должно отработать.
Если же там мусор или nil - как раз ноль в cnt и вернётся.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.04.2014, 11:33   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там если мусор, то прога вообще в ступор может упасть или ошибка по памяти
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2014, 13:10   #7
reflexx
Пользователь
 
Регистрация: 27.04.2014
Сообщений: 21
По умолчанию

del del del

Последний раз редактировалось reflexx; 29.04.2014 в 13:13.
reflexx вне форума Ответить с цитированием
Старый 29.04.2014, 13:11   #8
reflexx
Пользователь
 
Регистрация: 27.04.2014
Сообщений: 21
По умолчанию

Работает ваш код. Вот быстрый пример:
Код:
type
 PNode = ^TNode;
 TNode = record
   Next: PNode;
   Value: Integer;
 end;
 
var
 Root: PNode;
 RootNext: PNode;
var
 cnt: Integer;
 SearchValue: Integer;
 
procedure CheckEqual(Node: PNode);
begin
 if (Node = nil) then Exit;
 if (Node^.Value = SearchValue) then inc(cnt);
 CheckEqual(Node^.Next);
end;

begin
 cnt := 0;
 //
 New(Root);
 Root^.Value:=5;
 New(RootNext);
 RootNext^.Value:=5;
 Root^.Next:=RootNext;
 //
 ReadLn(SearchValue);
 CheckEqual(Root);
 Writeln(cnt);
 //
 Dispose(RootNext);
 Dispose(Root);
end.
Код:
Вывод:
5
2
Выделенные жирным строки - то, что я дописал для проверки.
reflexx вне форума Ответить с цитированием
Старый 30.04.2014, 00:17   #9
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Цитата:
Выделенные жирным строки - то, что я дописал для проверки.
ваш пример то работает, но если вводить другие значения кроме 5 которые вы указали в коде то всеравно будет ноль выводиться. получаеться как бы мусор кидает в переменную
mishammm вне форума Ответить с цитированием
Старый 30.04.2014, 01:49   #10
reflexx
Пользователь
 
Регистрация: 27.04.2014
Сообщений: 21
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная процедура удаления Kehl Помощь студентам 3 13.05.2013 17:16
рекурсивная процедура rinoolik Помощь студентам 1 08.12.2012 18:05
рекурсивная процедура Серый777 Паскаль, Turbo Pascal, PascalABC.NET 1 08.11.2011 18:19
рекурсивная процедура Avvakymova Паскаль, Turbo Pascal, PascalABC.NET 7 10.05.2011 10:01
Рекурсивная процедура Asira Помощь студентам 12 23.12.2009 21:47