Задать вопрос
valent_in_habrahabr
@valent_in_habrahabr

[С++ ]Поставил begin — поставь и end. Как распознать вложения и правильно поставить в коде end?

Добрый день. У меня задание по КП написать прогру на плюсах: "Поставил begin — поставь и end.". Дан массив строк, представляющий собой фрагмент программы на языке Pascal. Напишите программу, проверяющую правильность вложения операторных скобок begin ... end — каждому begin должен соответствовать end."

Мне всё предельно ясно, нет проблем.
Вот только не ясно как распознать вложения. Точнее как узнать место куда вставить end, в комментариях я выделил end, который "забыли" поставить а мне его нужно дописать. Код должен работать правильно, после проверки а не испортиться.
Например:
var a,n,c,d:word;
begin 
    readln( a );
    n:=1;
    while ( n <= sqrt(a) ) do begin
       c:=a mod n;
       d:=a div n;
       if c = 0 then begin
          writeln( n );
          if n <> d then writeln( d );
       {end; }
       inc( n ); { вот как понять, что end;должен стоять до а не после? }
    end;
end.

Я бы без проблем решил эту проблему за счет отступов. Но я уверен, что мой преподаватель будет копировать не отформатированный код в textBox. Подскажите пожалуйста, как же решить такую проблему? Уверен, что есть хороший способ. Не хочу костылировать.
  • Вопрос задан
  • 846 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 5
@res2001
Developer, ex-admin
Никак.
Если бы можно было легко предугадывать куда вставить end, то все компиляторы давно бы этим занимались, а они почему то этого не делают, а только выдают сообщение об ошибке при этом, как правило указывается строка даже близко не указывающая на то место где не хватает endа.
И прочитайте внимательно задание - вам не надо вставлять end. Делайте как компилятор - считаете количество begin и end, если не равно - ошибка.
Ответ написан
Простой способ проверить корректность расстановки "скобок":
  • Завести счётчик, приравнять его к нулю.
  • Пройтись по тексту. При встрече "begin" счётчик увеличивать, при встрече "end" - уменьшать. После каждой итерации проверять состояние счётчика, если стало -1, значит ошибка.
  • В конце значение счётчика должно равняться нулю (или опять же ошибка).
Ответ написан
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Завели переменную.
Встретили begin - инкрементировали
end - декрементировали
Если на каком-нибудь шаге ушли в минус - количество end-ов превышает
Если в конце - положительное число не равное нулю - количество begin-ов превышает
Если равно нулю - баланс сошелся

Ставить end-ы по условию вам не нужно. Это ближе к задачам ИИ.
Ответ написан
@abcd0x00
Напишите программу, проверяющую правильность вложения операторных скобок begin ... end — каждому begin должен соответствовать end.

Думаю, тут нужен конечный автомат со стеком. Конечный автомат сможет отличить значимые строки с begin от комментариев с begin. А стек поможет отличить правильную конструкцию begin begin end end от неправильной end begin end begin.
Ответ написан
Комментировать
valent_in_habrahabr
@valent_in_habrahabr Автор вопроса
Для решения задачи использовал стек.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы