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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2009, 17:29   #1
kuzzz
 
Регистрация: 18.05.2009
Сообщений: 9
По умолчанию помогите пожалуйста проверкой и правкой!

в субботу экзамен а прога не до конца работает((( не работает когда вводишь (()()) или подобное
вот условие - Дана последовательность, состоящая из символов англ букв и знаков "+" ";" "*" и парных круглых скобок. На основе стека или/и очереди, элементы в которых - натуральные числа, написать номера позиций пар открывающихся и закрывающихся скобок в порядке возрастания номеров открывающихся скобок. Последовательность завершать символом "=".
пример - последовательность A+(B*+P(x)*(A+M))=
ответ - 3 17; 8 10; 12 16;
Код:
program skobki;
uses crt;
      type mas= array [0..100] of integer;
      type List=^node;       
           node=record       
             info:char;      
             next:List;
           end;
 
var
L: list;      
sk1,sk2,dlina,j,i,n:integer;
e:real;
c:char;
A:mas;
 
procedure Form(elem:char;var L:List);
   begin
     if L<>nil then Form(elem,L^.next)
     else begin
        New(L); L^.info:=elem; L^.next:=nil;
     end;
   end;
 
procedure Print(L:List);
   begin
     while L<>nil do begin
       write(L^.info);
       L:=L^.next;
     end;
     writeln('<---');
     writeln;
   end;
 
procedure Skobk(L:List);
 
var  mesto:byte;
   begin
   mesto:=0;
     while L<>nil do
           begin
           mesto:=mesto+1;
           if L^.info='(' then
                          begin
                          A[mesto]:=1;
                          writeln('(',mesto,' ');
                          end;
 
           if L^.info=')' then
                          begin
                          A[mesto]:=2;
                          writeln(')',mesto,' ');
                          end;
           L:=L^.next;
           end;
     writeln('<---');
     writeln;
   end;
 
begin
clrscr;
writeln('vvedite posledovat:');
dlina:=0;
while (c<>'=') do
     begin
     c:=readkey;
     Form(c,L);
     write(c);
     dlina:=dlina+1;
     end;
writeln;
Print(L);
Skobk(L);
writeln(dlina);
writeln('*****');
for i:=0 to dlina do
    begin
    if (A[i]=1) then
       begin
       write(i,' ');
       A[i]:=0;
       for j:=dlina downto 0 do
           begin
           if (A[j]=2) then
              begin
              write(j,' ');
              A[j]:=0;
              break;
              end;
           end;
       writeln;
       end;
    end;
writeln;
writeln('******');
readln;
end.
kuzzz вне форума Ответить с цитированием
Старый 26.06.2009, 07:18   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Код:
program skobki;
var
	c : char;
	s : string;
	op : array [1 .. 127] of byte;
	i : byte;
	p : byte;
procedure push(v : byte);
begin
	inc(p);
	op[p] := v;
end;
function pop : byte;
begin
	pop := op[p];
	dec(p);
end;
begin
	readln(s);
	for i := 1 to length(s) do begin
		if s[i] = '(' then push(i);
		if s[i] = ')' then writeln(pop, ' ', i);
	end;
end.
Надеюсь, переписать программу с использованием динамических структур данных ты сможешь. Главное, чтобы алгоритм был понятен. И ещё: ответ выводится не в сортированном виде. Так что напиши ещё сортировку. Ну и читаю я до конца строки, а не до '='.

Твоя ошибка заключалась в том, что ты не различал для какой открывающей скобки является закрывающей каждая конкретная закрывающая скобка. Закрывающая скобка всегда закрывает самую ближайшую слева открывающую скобку. Так что в принципе можно было написать вообще без стека или чего-либо ещё, но это потребовало бы уйму писанины, т.к. пришлось бы искать позиции с самым глубоким уровнем вложенности, хранить, какие скобки мы уже простматривали... Даа... не получилось "без чего-либо ещё"...

Последний раз редактировалось megachuhancer; 26.06.2009 в 07:22.
megachuhancer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать поле с проверкой! ice_777 Microsoft Office Access 0 23.04.2009 14:05
сумма и произведение чисел с проверкой на кратность.. Locust Microsoft Office Excel 4 01.04.2009 12:41
Помогите с проверкой в паскале neomaximus Помощь студентам 2 10.07.2008 09:41
Помогите с проверкой ввода в паскале neomaximus Помощь студентам 4 01.07.2008 23:10
Не могу разобраться с проверкой значений CAMyM Microsoft Office Excel 5 23.10.2007 12:18