


Помогите написать код
Нужна помощь с написанием кода из програмы универа
Задача
Разработать программу на CF Pascal, которая форматирует строку, поданную на вход как CF Pascal программу. На вход могут быть поданы любые данные, и в любом случае программа должна завершиться корректно
Операторы, необходимые к обработке:
BEGIN END. (все до BEGIN и после END, кроме комментариев, должно быть проигнорировано)
Присваивание (i. e. Variable := Data)
READ & READLN
WRITE & WRITELN
RESET
REWRITE
Также необходимо обрабатывать комментарии и строковые литералы.
Ограничения:
Код не должен первышать 200 строк
Можно использовать только две переменные, обе из которых символьного типа. Никаких других переменных быть не должно
Из конструкций языка разрешено использовать только READ, READLN, WRITE, WRITELN, IF, логические выражения и WHILE. Массивы, процедуры, функции и т.п. использовать ЗАПРЕЩЕНО. Операторы управления циклом, такие как break и continue также запрещены. Все что не разрешено явно - запрещено
Я и сам догадался использовать нейронку но она пишет нерабочую чушь
Лови
PROGRAM CodeFormatter;
VAR
c, prev: CHAR;
BEGIN
prev := ' ';
WHILE NOT EOF DO
BEGIN
READ(c);
IF c = '{' THEN
BEGIN
WRITE(c);
WHILE NOT EOF DO
BEGIN
READ(c);
WRITE(c);
IF c = '}' THEN BREAK
END
END
ELSE IF c = '(' THEN
BEGIN
IF NOT EOF THEN
BEGIN
READ(c);
IF c = '*' THEN
BEGIN
WRITE('(*');
WHILE NOT EOF DO
BEGIN
READ(c);
WRITE(c);
IF (prev = '*') AND (c = ')') THEN BREAK;
prev := c
END
END
ELSE
BEGIN
WRITE('(');
WRITE(c)
END
END
END
ELSE IF c = '''' THEN
BEGIN
WRITE(c);
WHILE NOT EOF DO
BEGIN
READ(c);
WRITE(c);
IF c = '''' THEN BREAK
END
END
ELSE IF c = ';' THEN
BEGIN
WRITELN(c);
WHILE NOT EOF DO
BEGIN
READ(c);
IF (c <> ' ') AND (c <> #13) AND (c <> #10) THEN
BEGIN
WRITE(' ');
WRITE(c);
BREAK
END
END
END
ELSE IF c = 'B' THEN
BEGIN
READ(c);
IF c = 'E' THEN
BEGIN
READ(c);
IF c = 'G' THEN
BEGIN
READ(c);
IF c = 'I' THEN
BEGIN
READ(c);
IF c = 'N' THEN
BEGIN
WRITELN('BEGIN');
WRITE(' ')
END
END
END
END
END
ELSE IF c = 'E' THEN
BEGIN
READ(c);
IF c = 'N' THEN
BEGIN
READ(c);
IF c = 'D' THEN WRITELN('END')
END
END
ELSE IF (c <> #13) AND (c <> #10) AND (c <> ' ') THEN WRITE(c);
prev := c
END;
WRITELN
END.
program FormatPascal;
var
ch: char;
inComment, inString: boolean;
begin
inComment := false;
inString := false;
while not eof(input) do
begin
read(ch);
if (ch = '{') then
inComment := true
else if (ch = '}') then
inComment := false;
if (ch = '"') then
inString := not inString;
if not inComment and not inString then
begin
if (ch <> ' ') and (ch <> chr(10)) and (ch <> chr(13)) then
write(ch);
end;
if (ch = chr(10)) or (ch = chr(13)) then
writeln;
end;
writeln;
end.
(Взято из нейросети)
К сожалению, я не могу написать код на Pascal, но я могу помочь с решением задачи.
Сначала надо объявить две переменные: s и c. Они будут хранить часть программы и символ соответственно.
Затем надо прочитать символы из входного потока. Для каждого символа:
Если это пробел или символ новой строки, то его надо пропустить. Если это буква или цифра, то её надо добавить к переменной s.
*Если это оператор или ключевое слово, то его надо обработать по правилам CF Pascal.
Если встречается символ присваивания (: =), то надо разделить строку на две части. Часть до присваивания надо сохранить в одной переменной, а после — в другой.
Если в программе есть комментарии или строковые литералы, то их надо игнорировать. Комментарии начинаются с*, а строковые литералы заключены в одинарные кавычки.
Когда обработали всю строку, надо вывести результат на экран.
Убедитесь, что ваш код соответствует всем требованиям. Не используйте массивы, процедуры, функции и другие сложные конструкции. Используйте только разрешённые операторы и ключевые слова.
Постарайтесь сделать код эффективным и компактным. Используйте циклы и условия для обработки разных случаев.
Протестируйте программу на разных данных, чтобы убедиться, что она работает правильно.
Добавьте комментарии к коду, чтобы объяснить, как он работает. Это поможет другим понять вашу программу и улучшить её, если нужно.
Это только общий план, вам надо его реализовать самостоятельно.
ЗА ОТВЕТ НЕ РУЧАЮСЬ! ХОТЕЛ ПОМОЧЬ! СГЕНЕРИРОВАНО YandexGPT 4!!!!!!!!
program Formatter;
var
c, prev: char;
inComment, inString: boolean;
begin
c := #0; // Инициализация переменной
prev := #0;
inComment := false;
inString := false;
// Начало обработки до инициализации
while not eof(input) do
begin
read(c);
// Определяем, в комментарии ли мы
if (c = '{') then inComment := true;
if (c = '}') and inComment then inComment := false;
// Определяем, в строковом литерале ли мы
if (c = '"') and (not inComment) then
begin
inString := not inString; // Изменяем состояние строки
write(c); // Печатаем кавычку
end;
// Если мы находимся вне комментариев и строк, выполняем обработку
if not inComment and not inString then
begin
// Пропускаем текст до BEGIN
if (prev = '.') and (c = 'B') then
begin
while (c <> 'E') do
begin
read(c);
write(c);
end;
write(c); // Печатаем 'D'
end;
// Обрабатываем операторы присваивания
if (prev <> ':') and (c = ':') then
begin
write(c);
read(c); // Читаем следующий символ
write('=');
end
else
// Обрабатываем остальные разрешенные операторы
if (c in ['R', 'W']) then
begin
write(c);
if (prev in ['R', 'W']) then read(c); // Пропускаем если два R/W подряд
if c = 'E' or c = 'L' then begin
write(c);
read(c);
if c = 'N' then write(c);
end;
end;
// Вводим предыдущий символ
prev := c;
end;
end;
end.