Ввести выражение, полученное после раскрытия скобок (сумма или разность произведений однобуквенных переменных без коэффициентов). подобные. пример: abc + a + bca-acb+abc+abc+a ответ: 2a+3abc.
202
231
Ответы на вопрос:
Опишем формальную грамматику для разбора входной строки. < символ> : : = < буква> | < знак> < буква> : : = '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
1. Миникомпьютеры на интегральных схемах - 3 поколение.
2. Полупроводниковые машины на транзисторах - 2 поколение.
3. Вычислительные машин на большой интегральной схеме - 4 поколение.
4. Ламповые машины - 1 поколение.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Vureshivatel18.08.2022 06:39
-
прп3021.04.2022 00:47
-
МериКрисс12.01.2020 22:44
-
12abgh27.10.2020 13:22
-
puremoorning01.05.2023 22:52
-
vita14208.10.2021 16:57
-
тупойуголь01.03.2020 10:31
-
Pwp79004.04.2023 21:07
-
Soldat09805.06.2020 09:22
-
toshamilgis24.02.2022 12:27
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.