2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Паскаль
Сообщение07.12.2008, 21:03 
Помогите найти ошибку. Программа написана,но идет не во всех случаях...
Program ex1;
Type stack=^el;
el=record
data:integer;
next:stack;
end;

var a:String;
f:Boolean;
i:Integer;

Procedure POP(Var s:stack);
Var t:stack;
Begin
t:=s^.next;

s:=t;
end;

Procedure PUSH(Var s:stack; c:integer);
Var t:stack;
Begin
New(t);
t^.data:=c;
if s<>nil then t^.next:=s;

s:=t;
end;

Procedure MAIN(a:string);
Var l:stack;
Begin
new(l);
i:=1;
While (i<=length(a)) and f Do
Begin
If a[i] in ['(','{','['] Then Push(l,i);
if a[i] in [')','}',']'] then
If Ord(l^.data)-Ord(a[i])<2 Then Pop(l)
else f:=false;

inc(i);
end;

end;

Begin
writeln(введите строку); f:=true;
readln(a);
IF LENGTH(a) mod 2=0 then
Begin

If a<>'' Then
Begin
Main(a);
If f Then Writeln (правильно)
Else Writeln (не правильно);
end
Else Writeln(не правильно);
end
else Writeln (не правильно);
Readln;
end.

 
 
 
 
Сообщение08.12.2008, 23:47 
И все должны фантазировать, что должна делать эта задача? Если не известна постановка задачи, какой смысл рассматривать ее решение?

 
 
 
 
Сообщение09.12.2008, 13:09 
Аватара пользователя
Насколько я понимаю, программа должна определять правильность расстановки скобок?
Меня здесь смущает строчка
Код:
new(l);
(по-моему, вместо этого должно быть l := nil;)
и строчка
Код:
if s<>nil then t^.next:=s;
(в случае, когда s = nil, поле t^.next оказывается неинициализированным). Лучше просто
Код:
  t^.next := s;
(т.е. убрать if).
И, таки да, напишите, в каких случаях не идёт Ваша программа.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group