Есть ответ 👍

Ввести выражение, полученное после раскрытия скобок (сумма или разность произведений однобуквенных переменных без коэффициентов). подобные. пример: abc + a + bca-acb+abc+abc+a ответ: 2a+3abc.

202
231
Посмотреть ответы 2

Ответы на вопрос:


Опишем формальную грамматику для разбора входной строки. < символ> : : = < буква> | < знак> < буква> : : = 'a' | 'b' | 'c' | | 'y' | 'z' < знак> : : = '+' | '-' < терм> : : = < буква> [ < терм> ] < операнд> : : = [ < знак> ] < терм> < строка> : : = < операнд> [ < операнд> ] ниже программа на языке pascal.abc, реализующая разбор входной строки и её по правилам подобных членов. const   n = 30; {максимальное количество операндов, я так захотел! }   pm = ['+', '-']; {символы < знак> }   letter = ['a'..'z']; {символы < буква> } type   toper = record       sgn: integer;       vars: string   end;   tm = array[1..n] of toper;   tasort = array[1..n] of string; {для сортировки} var   s: string;   l, p: integer;   symb: set of char; procedure getsymbol(var c: string); { сканирует строку s с позиции p и возвращает элемент < символ> продвигает курсор p к первому необработанному символу строки s } var   found: boolean; begin   found : = false;   c : = '';   while (p < = l) and (not found) do   begin       if s[p] in symb then begin           found : = true;           c : = s[p]       end;       p : = p + 1   end end; procedure sort(var a: tasort; kol: integer); {сортировка вставкой} var   i, j: integer;   x: string;   flag: boolean; begin   for i : = 2 to kol do   begin       x : = a[i];       j : = i - 1;       flag : = false;       while (j > 0) and (not flag) do           if x < a[j] then           begin               a[j + 1] : = a[j];               j : = j - 1           end           else flag : = true;       a[j + 1] : = x   end end; function getsign(c: char): integer; begin   case c of       '+': result : = 1;       '-': result : = -1;   else result : = 0   end end; procedure getoper(var oper: toper); { строит элемент < операнд> максимально возможной длины и упорядочивает составляющие его символы в лексикографическом порядке. если операнд построить невозможно, в oper.vars помещается пустая строка. процедура обращается к процедурам getsymbol и sort. } var   i, n: integer;   c, c1: string;   exitflag: boolean;   a: tasort; begin   c : = '';   exitflag : = false;   getsymbol(c1); {попытаемся получить знак}   if c1[1] in pm then oper.sgn : = getsign(c1[1])   else begin       oper.sgn : = 1;       c : = c1   end;   repeat       getsymbol(c1);       if c1 = '' then exitflag : = true       else if c1[1] in pm then begin           p : = p - 1;           exitflag : = true       end       else           c : = c + c1   until exitflag;   if c < > '' then   begin       n : = length(c);       for i : = 1 to n do a[i] : = c[i];       sort(a, n);       c : = '';       for i : = 1 to n do c : = c + a[i];       oper.vars : = c   end   else oper.vars : = '' end; procedure add2m(var a: tm; c: toper; var pn: integer); { ищет среди элементов массива a.vars элемент, с с.vars. при нахождении добавляет c.sgn к a[i].sgn, в противном случае добавляет в массив новый элемент a[i], увеличивая pn на 1. при вызове pn - количество элементов в массиве. } var   i: integer;   c1: string;   found: boolean; begin   c1 : = c.vars;   i : = 1;   while (i < = pn) and (not found) do   begin       found : = (c1 = a[i].vars);       if found then a[i].sgn : = a[i].sgn + c.sgn       else i : = i + 1   end;   if not found then begin       a[i].sgn : = c.sgn;       a[i].vars : = c1;       pn : = pn + 1   end end; function convert(k: integer): string; begin   case k of       -1: result : = '-';       0: result : = '';       1: result : = '+';   else begin           str( k, result);           if k > 0 then result : = '+' + result       end   end end; var   c, cz: string;   n1, i: integer;   opr: toper;   a: tm; begin   symb : = pm + letter;   p : = 1;   n1 : = 0;   writeln('введите исходное выражение');   readln(s);   s : = lowercase(s); {перевод символов в нижний регистр}   l : = length(s);   repeat       getoper(opr);       add2m(a, opr, n1)   until p > l;   if n1 > 0 then   begin       cz : = convert(a[1].sgn);       if cz = '+' then cz : = '';       if cz = '' then c : = ''       else c : = cz + a[1].vars;       for i : = 2 to n1 do       begin           cz : = convert(a[i].sgn);           if cz < > '' then c : = c + cz + a[i].vars       end   end   else c : = '';   if c='' then c: ='0';   if c[1]='+' then c: =copy(c,2,length(c)-1);   writeln('результат: ', c) end. тестовое решение: введите исходное выражение abc +      a+bca  -acb+abc+abc  +a  результат: 3abc+2a введите исходное выражение ab-bca+bc+cba+abc-ba+cba+da+adb+bad-db результат: 2abc+bc+ad+2abd-bd
jasmina14
4,5(6 оценок)

1. Миникомпьютеры на интегральных схемах - 3 поколение.

2. Полупроводниковые машины на транзисторах - 2 поколение.

3. Вычислительные машин на большой интегральной схеме - 4 поколение.

4. Ламповые машины - 1 поколение.

Реши свою проблему, спроси otvet5GPT

  • Быстро
    Мгновенный ответ на твой вопрос
  • Точно
    Бот обладает знаниями во всех сферах
  • Бесплатно
    Задай вопрос и получи ответ бесплатно

Популярно: Информатика

Caktus Image

Есть вопросы?

  • Как otvet5GPT работает?

    otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса.
  • Сколько это стоит?

    Проект находиться на стадии тестирования и все услуги бесплатны.
  • Могу ли я использовать otvet5GPT в школе?

    Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое!
  • В чем отличия от ChatGPT?

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

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

GTP TOP NEWS