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

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

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

    zaaz Гость

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

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

    XTen Active Member

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

    zaaz Гость

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

    nayke Well-Known Member

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

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

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

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

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

    zaaz Гость

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

    nayke Well-Known Member

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

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    Вот, но сделано немного по другому :
    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 Гость

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

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

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