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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2013, 14:18   #1
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию неправильная работа программы...

Дан список из n целых чисел a1,a2,...,an.Определить,является ли он симметричным.
Программа всегда выдает,что список не симметричен...
Uses Crt;

type
Plist = ^TList;
TList = record
info: integer;
pred,next : PList;
end;

Var
Head : PList;
n : integer;

{создание двусвязного списка со сторожем}
Procedure MakeList(Var head: PList; n:integer);
var
p,q:PList;
i,k:integer;

Begin {MakeList}

new(head);
head^.next:=nil;
head^.pred:=nil;
p:=head;
writeln('введите элементы списка до 0');
read(k);
while k<>0 do
begin
new(q);
q^.info:=k;
q^.pred:=p;
q^.next:=nil;
p^.next:=q;
p:=q;
inc(n);
read(k);
end;
head^.pred:=p;
writeln('количество элементов списка*: ',n);
writeln;
end;{MakeList}

{вывод списка на экран**}
Procedure PrintList(head : PList);
Var
p: PList;

Begin {PrintList}
writeln('данный список: ');
p:=head^.next;
while p<>nil do
begin
write(p^.info:4);
p:=p^.next;
end;
writeln;
end;{PrintList}

{проверка симметрии списка*}
Procedure SimList(head: PList; n:integer);
Var
p,q:PList;
c:integer;

Begin {SimList}
writeln;
writeln('проверяем симметрию:');
p:=head^.pred;
q:=head^.next;
while (p<>q) and (p^.next <>q) do
begin
write(p^.info:4);
write(q^.info:4);

{ if p^.info=q^.info then inc(c); }

p:=p^.pred;
q:=q^.next;
if p=q then inc(c);
end;
writeln;

if c=(n div 2) then
writeln('список симметричен')
else
writeln('список не симметричен*');
end;{SimList}


Begin {program}
ClrScr;
MakeList(head,n);
PrintList(head);
SimList(head,n);
readkey;
end.{program}
fkty вне форума Ответить с цитированием
Старый 05.06.2013, 15:18   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
 {создание двусвязного списка со сторожем}
 Procedure MakeList(Var head: PList; var n:integer);//передавать по ссылке
Иначе локальная n перекроет глобальную. А глобальную n вообще лучше убрать и сделать локальной.

Код:
 writeln('проверяем симметрию:');
 p:=head^.pred;
 q:=head^.next;
 c:=0;//инициализируем переменную нулём
...
 if p^.info=q^.info then inc(c);//сравниваем не указатели, а информационную часть
eoln вне форума Ответить с цитированием
Старый 05.06.2013, 15:41   #3
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

Так?

Uses Crt;

type
Plist = ^TList;
TList = record
info: integer;
pred,next : PList;
end;

Var
Head : PList;
n : integer;

Procedure MakeList(Var head: PList; Var n:integer);
var
p,q:PList;
i,k:integer;

Begin {MakeList}

new(head);
head^.next:=nil;
head^.pred:=nil;
p:=head;
writeln('введите элементы списка до 0');
read(k);
while k<>0 do
begin
new(q);
q^.info:=k;
q^.pred:=p;
q^.next:=nil;
p^.next:=q;
p:=q;
read(k);
end;
head^.pred:=p;
writeln('количество элементов*: ',n);
writeln;
end;{MakeList}

Procedure PrintList(head : PList);
Var
p: PList;

Begin {PrintList}
writeln('данный список: ');
p:=head^.next;
while p<>nil do
begin
write(p^.info:4);
p:=p^.next;
end;
writeln;
end;{PrintList}

Procedure SimList(head: PList; n:integer);
Var
p,q:PList;
c:integer;

Begin {SimList}
writeln;
writeln('проверяем симметрию:');
p:=head^.pred;
q:=head^.next;
c:=0;
while (p<>q) and (p^.next <>q) do
begin
write(p^.info:4);
write(q^.info:4);

p:=p^.pred;
q:=q^.next;
if p^.info=q^.info then inc(c);
end;
writeln;

if c=(n div 2) then
writeln('симметричен')
else
writeln('не симметричен*');
end;


Begin
ClrScr;
writeln('введите количество элементов');
readln(n);
MakeList(head,n);
PrintList(head);
SimList(head,n);
readkey;
end.
fkty вне форума Ответить с цитированием
Старый 05.06.2013, 16:04   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от fkty Посмотреть сообщение
Так?
Нет, не так. Я привёл список изменений для первого поста (там, кстати, один элемент в списке не используется и не содержит информационной части).
А тут уже неизвестно зачем спрашивается кол-во элементов.
И код надо форматировать (кнопка со значком решётки #)
eoln вне форума Ответить с цитированием
Старый 05.06.2013, 16:20   #5
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

убрала переменную i и строчку writeln('количество элементов:',n)...
fkty вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неправильная работа keybd_event chertovich Win Api 3 07.01.2012 14:52
неправильная работа программы на delphi руслан1993 Помощь студентам 0 28.05.2011 12:13
ADOTable неправильная работа. Spaun Помощь студентам 1 23.06.2010 10:12
неправильная работа программки. Rafff Общие вопросы C/C++ 6 05.04.2010 15:16
Неправильная работа switch в while konstantinopol Общие вопросы C/C++ 3 24.01.2009 03:51