текстовый файл(турбо паскал)

  • Автор темы zaaz
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Z

zaaz

#1
Скобки. Текст (например, арифметическое выражение) содержит многократно вложенные круглые скобки. Исправить его, оставив скобки первого уровня круглыми, второго - заменить на квадратные, третьего и последующих - на фигурные. Убедиться в корректности использования скобок. Пример: In (sin ((a+B)c-d)) заменить выражением In {sin [(a+B)c-d]}.

помогите пожалуйста составить программку паскаль!
 
Z

zaaz

#3
А ты мне чем поможешь в аське? что здесь тебе не устраивает?
 

nayke

Well-known member
04.08.2010
310
0
#4
А ты мне чем поможешь в аське? что здесь тебе не устраивает?
Товарищ предлагает платную помощь. А цену обсудить лично..

Что касается задачи, возможно решение в лоб:

проверяете корректность скобок(считаете количество открытых/закрытых)

Далее проходим в цикле по строке|например ((q+w) +((q+w)/23)) |
Находим первую скобку |s[1]|
Находим количество скобок до ее закрытия,
т.е. находим открытую +1, находим закрытую -1, изначально 1 открыта, закроется при 0.
отрезаем от строки открывающую и закрывающую скобки.
проходим по строке еще раз пока есть скобки.

Подозреваю, что за один проход решается но цикл не сложный при наличие желания думаю решите..
 
Z

zaaz

#5
Ну наверное для кого то это очень легко,но для меня как для начинающего программиста это не кажется легким))я в сути немножко смог разобраться, а это изложить не могу..
 

nayke

Well-known member
04.08.2010
310
0
#6
Ну наверное для кого то это очень легко,но для меня как для начинающего программиста это не кажется легким))я в сути немножко смог разобраться, а это изложить не могу..
Если честно смысл не понял.. но если есть конкретные вопросы здесь всегда помогут
 
09.11.2009
665
1
#7
Далее проходим в цикле по строке|например ((q+w) +((q+w)/23)) |
Находим первую скобку |s[1]|
Находим количество скобок до ее закрытия,
т.е. находим открытую +1, находим закрытую -1, изначально 1 открыта, закроется при 0.
отрезаем от строки открывающую и закрывающую скобки.
проходим по строке еще раз пока есть скобки.
Вот, но сделано немного по другому :
1. считает максимальное количество уровней путем если ( то текущий уровень+1 если ) то текущий уровень -1 потом если максимальный уровень меньше текущего уровеня то записываем в максимальный уровень текущий.
2. проходим строку:
наткнулись на ( увеличиваем уровень на 1 и заменяем символ на символ уровня под номером равным количество уровней-текущий уровень-1
наткнулись на ), аналогично, но с начала заменяем а потом уменьшаем текущий уровень на 1​


Код:
var i,level,maxlevel,l,r:integer;
s,s2:string;
begin
writeln('vvedite stroku');
readln(s);
s2:=s;
maxlevel:=0;
level:=0;
l:=0;
r:=0;

for i:=1 to length(s) do
begin
if s[i]='(' then l:=l+1;
if s[i]=')' then r:=r+1;
end;

if l<>r then
begin
writeln('ERROR');
readln;
exit;
end;

for i:=1 to length(s) do
begin
if s[i]='(' then level:=level+1;
if s[i]=')' then level:=level-1;
if level>maxlevel then maxlevel:=level;
end;

for i:=1 to length(s) do
begin
if s[i]='(' then
begin
level:=level+1;
if level=maxlevel then s[i]:='(' else
if level=maxlevel-1 then s[i]:='[' else
s[i]:='{';
end;

if s[i]=')' then
begin
if level=maxlevel then s[i]:=')' else
if level=maxlevel-1 then s[i]:=']' else
s[i]:='}';
level:=level-1;
end;
end;

writeln('before : ','',s2);
writeln('after : ','',s);
writeln('max level = ',maxlevel);
readln;
end.
 
Z

zaaz

#8
спасибо) но вот мне недавно помогли решить задачу, но оно по другому выглядит..

Добавлено:
Код:
program Fanis;
uses crt;
var s,st:string;
x1,x2:integer;
x11,x22:integer;
i:integer;
level:integer;
begin
readln(s);
x1:=0;
x2:=0;
for i:=1 to length(s) do
begin
if s[i] = '(' then inc(x1);
if s[i] = ')' then inc(x2);
end;
if x1<>x2 then writeln('не верное количество скобок');

if x1=x2 then
begin
writeln('Изночально : '+s);
level:=x1;
for i:=1 to length(s) do
begin
if s[i] = '(' then
begin
dec(level);
if (level = 0) then s[i]:='(';
if (level = 1) then s[i]:='[';
if (level > 1) then s[i]:='{';
end;
if s[i] = ')' then
begin
if (level = 0) then s[i]:=')';
if (level = 1) then s[i]:=']';
if (level > 1) then s[i]:='}';
inc(level);
end;
end;
writeln('Получилось : '+s);
end;
end.
 
Статус
Закрыто для дальнейших ответов.