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

Тема в разделе "Pascal and Delphi", создана пользователем zaaz, 9 апр 2011.

Статус темы:
Закрыта.
  1. zaaz

    zaaz Гость

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

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

    XTen Active Member

    Регистрация:
    18 сен 2010
    Сообщения:
    26
    Симпатии:
    0
    готов помочь с реализацией, пиши ICQ#: 410-691-984
     
  3. zaaz

    zaaz Гость

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

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    Товарищ предлагает платную помощь. А цену обсудить лично..

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

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

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

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

    zaaz Гость

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

    nayke Well-Known Member

    Регистрация:
    4 авг 2010
    Сообщения:
    310
    Симпатии:
    0
    Если честно смысл не понял.. но если есть конкретные вопросы здесь всегда помогут
     
  7. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Вот, но сделано немного по другому :
    1. считает максимальное количество уровней путем если ( то текущий уровень+1 если ) то текущий уровень -1 потом если максимальный уровень меньше текущего уровеня то записываем в максимальный уровень текущий.
    2. проходим строку:
    наткнулись на ( увеличиваем уровень на 1 и заменяем символ на символ уровня под номером равным количество уровней-текущий уровень-1
    наткнулись на ), аналогично, но с начала заменяем а потом уменьшаем текущий уровень на 1​


    Код (Delphi):
    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.
     
  8. zaaz

    zaaz Гость

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

    Добавлено:
    Код (Delphi):
    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.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей