Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Помогите написать код

Нужна помощь с написанием кода из програмы универа
Задача

Разработать программу на 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 также запрещены. Все что не разрешено явно - запрещено

Дополнен

Я и сам догадался использовать нейронку но она пишет нерабочую чушь

По дате
По рейтингу
Аватар пользователя
Мудрец
7мес

Лови

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
 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. 
 
Аватар пользователя
Гуру
7мес

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.
(Взято из нейросети)

Аватар пользователя
Мастер
7мес

К сожалению, я не могу написать код на Pascal, но я могу помочь с решением задачи.

Сначала надо объявить две переменные: s и c. Они будут хранить часть программы и символ соответственно.

Затем надо прочитать символы из входного потока. Для каждого символа:
Если это пробел или символ новой строки, то его надо пропустить. Если это буква или цифра, то её надо добавить к переменной s.
*Если это оператор или ключевое слово, то его надо обработать по правилам CF Pascal.

Если встречается символ присваивания (: =), то надо разделить строку на две части. Часть до присваивания надо сохранить в одной переменной, а после — в другой.

Если в программе есть комментарии или строковые литералы, то их надо игнорировать. Комментарии начинаются с*, а строковые литералы заключены в одинарные кавычки.

Когда обработали всю строку, надо вывести результат на экран.

Убедитесь, что ваш код соответствует всем требованиям. Не используйте массивы, процедуры, функции и другие сложные конструкции. Используйте только разрешённые операторы и ключевые слова.

Постарайтесь сделать код эффективным и компактным. Используйте циклы и условия для обработки разных случаев.

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

Добавьте комментарии к коду, чтобы объяснить, как он работает. Это поможет другим понять вашу программу и улучшить её, если нужно.

Это только общий план, вам надо его реализовать самостоятельно.

ЗА ОТВЕТ НЕ РУЧАЮСЬ! ХОТЕЛ ПОМОЧЬ! СГЕНЕРИРОВАНО YandexGPT 4!!!!!!!!

Аватар пользователя
Ученик
7мес

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.