Вопрос № 178808: Здравствуйте. Помогите пожалуйста написать программу на языке Pascal в среде turbo. просьба такая: использовать в программе модули и динамические переменные. Задание: Задано m пар не повторяющихся символов, воспринимаемых как скобочные пары, т...
Вопрос № 178812: Дан текстовый файл. Указать в процентах,сколько раз встречается та или иная буква. Среда ТР7....
Вопрос № 178815: Даны два текстовых файла а1 и а2. Файл а1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками припинания. Файл а2 содержит не более 30 слов,которые разделены запятыми. Эти слова образуют пары,каждое второе является синонимом пер...
Вопрос № 178820: Решите задачу в Turbo Pascal: Заданы n пар точек на плоскости, являющихся концами отрезков. Определить количество треугольников, получающихся при пересечении этих отрезков. Хранение данных организовать в виде списка, результат проиллюстрировать графи...
Вопрос № 178808:
Здравствуйте. Помогите пожалуйста написать программу на языке Pascal в среде turbo. просьба такая: использовать в программе модули и динамические переменные. Задание: Задано m пар не повторяющихся символов, воспринимаемых как скобочные пары, т.е. если (a,b)- одна из пар, то a- левая скобка, b- соответствующая правая скобка. Вводится текст, состоящий из любой последовательности символов и пробела. Текст считается корректным, если соблюдаются скобочные правила: за левой скобкой рано или поздно следует
соответствующая правая скобка. Предусмотреть произвольную вложенность скобок. Надо определить корректность любого введенного текста. И текст и пары скобок считать из входных файлов. В программе использовать стек. Проиллюстрировать решение анимацией.
Отвечает amnick, Студент :
Здравствуйте, Евгений Усков.
Вот основной модуль программы:
Код:
{ Задано m пар не повторяющихся символов, воспринимаемых как скобочные пары, т.е. если (a,b) - одна из пар, то a- левая скобка, b- соответствующая правая скобка. Вводится текст, состоящий из любой последовательности
символов и пробела. Текст считается корректным, если соблюдаются скобочные правила: за левой скобкой рано или поздно следует соответствующая правая скобка. Предусмотреть произвольную вложенность скобок. Надо определить корректность любого введенного текста. И текст и пары скобок считать из входных файлов. В программе использовать стек. } program q178808;
uses stack;
type p_bracket_pair = ^t_bracket_pair; t_bracket_p
air = record next: p_bracket_pair; left, right: char; { левая и правая скобки } end;
var pBrackets: p_bracket_pair; { указатель на список пар скобок }
{ добавление скобок в список с контролем } procedure addBrackets( left, right: char ); var p: p_bracket_pair; begin if (left <> ' ') and (right <> ' ') and (left <> right) then begin { проверяем, есть ли уже такие символы в списке } p := pBrackets; while p <>
nil do begin if (left = p^.left) or (left = p^.right) or (right = p^.left) or (right = p^.right) then exit; { один из символов уже встречался }
p := p^.next; end;
{ вставляем новую пару скобок в список } new( p ); p^.next := pBrackets; p^.left := left; p^.right := right; pBrackets := p; end; end;
{ уничтожение списка скобок } procedure freeBrackets; var next: p_bracket_pair; begin while pBrackets <> nil do begin next := pBrackets^.next; dispose( pBrackets ); pBrackets := next; end; end;
{ ищем символ в списке скобок возвращает указатель на пару, к которой относится скобка или nil, если символ не является скобкой } function findBracketPair( ch: char ): p_bracket_pair; var p: p_bracket_pair; begin p := pBrackets; while p <> nil do begin with p^ do if (ch = left) or (ch = right) then begin findBracketPair
:= p; exit; end;
p := p^.next; end; findBracketPair := nil; end;
{ читаем скобки из файла в каждой строке файла должно быть не меньше двух символов первые 2 символа - правая и левая скобки например: () [] } procedure readBrackets; var f: text; s: string; begin assign( f, 'brackets' ); reset( f ); while not eof(f) do begin readln( f, s ); if length(s) >
;= 2 then addBrackets( s[1], s[2] ); end; close(f); end;
{ функция читает первую строку из файла и возвращает ее } function readExpression : string; var f: text; s: string; begin assign( f, 'expr' ); reset( f ); readln( f, s ); readExpression := s; close(f); end;
{ сообщения } msg : array[0..maxError] of string[30] = ( 'Correct expression', 'Illegal character', 'Not a pair', 'Unexpected end of expression' ); { ------------------------------------------------------------- }
var level : integer; { уровень вложенности }
{ показывает очередную скобку со сдвигом по уровню вложенности dir = 1 - левая скобка (PUSH) dir =
-1 - правая скобка (POP) } procedure show( dir: integer; ch: char ); var i : integer; begin if dir > 0 then inc(
level ); for i := level downto 1 do write( ' ' ); writeln( ch ); if dir < 0 then dec( level ); end;
{ разбор строки как скобочного выражения возвращает код ошибки, 0 - корректное выражение } function parse( s: string ): integer; var i : integer; { индексация символов в строке } ch : char; { текуций символ } stack: TStack; { стек скобок } p : p_bracket_pair; begin stack.init; { инициализируем стек } level := 0; { начальный
уровень } for i := 1 to length(s) do begin ch := s[i]; if ch <> ' ' then begin p := findBracketPair( ch ); { ищем символ в списке скобок } if p = nil then begin { неверный символ } show( 0, ch ); { показываем символ для информации } parse := errIllegalChar; exit; end; if ch = p^.left then begin { левая скобка } show( 1, ch ); { показываем } stack.push( p ); { помещаем в стек } end else begin { правая скобка } show( -1, ch ); { показываем } if p <> stack.pop then begin { непарная скобка, напр. (] } parse := errNotPair; exit; end; end; end; end; if stack.pop <> nil then { непустой стек - ошибка } parse := errUnexpectedEnd else parse := 0; end;
var expr: string; { скобочное выражение }
BEGIN pBrackets := nil; readBrackets; { читаем скобки } if pBrackets <>
nil then begin expr := readExpression; { читаем выражение } writeln( 'Parsing expression:' ); writeln( expr ); writeln( msg[parse( expr )] ); { анализ и сообщение } end; END.
В приложении — модуль стека.
Для простоты, имена файлов со скобками и скобочным выражением предопределены — соответственно, brackets и expr.
Если нужен какой-то другой вывод (для наглядности), то поясните, пожалуйста, в мини-форуме. Программа проверена в Borland Pascal 7.0.
Успехов!
Приложение:
Ответ отправил: amnick, Студент
Ответ отправлен: 03.06.2010, 00:33
Номер ответа: 261833
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261833
на номер 1151 (Россия) |
Еще номера »
Отвечает Andrew Kovalchuk, Студент :
Здравствуйте, Евгений Усков. В прикрепленном архиве содержатся: 178808.pas - исходный текст программы stack.pas - исходный текст модуля с реализацией стека stack.tpu - скомпилированный из предыдущего файла модуль pairs.txt - тестовый файл с парами символов для обозначения скобок checkme.txt - текст для проверки. Прикрепленный файл:загрузить »
----- Временная неудача лучше временной удачи
Ответ отправил: Andrew Kovalchuk, Студент
Ответ отправлен: 03.06.2010, 13:46
Номер ответа: 261841
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261841
на номер 1151 (Россия) |
Еще номера »
Вопрос № 178812:
Дан текстовый файл. Указать в процентах,сколько раз встречается та или иная буква.
Отвечает Пупорев Юрий Борисович, Специалист :
Здравствуйте, Вознисеннский Сергей Андреевич! Написал так, как Вы уточнили. Код в приложении.
Приложение:
Ответ отправил: Пупорев Юрий Борисович, Специалист
Ответ отправлен: 02.06.2010, 12:07
Номер ответа: 261820
Оценка ответа: 5 Комментарий к оценке: Спасибо большое.выручили меня!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261820
на номер 1151 (Россия) |
Еще номера »
Вопрос № 178815:
Даны два текстовых файла а1 и а2. Файл а1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками припинания. Файл а2 содержит не более 30 слов,которые разделены запятыми. Эти слова образуют пары,каждое второе является синонимом первого. Заменить в файле а2 те слова,которые можно,их синонимами. Результат поместить в новый файл.
Отвечает Andrew Kovalchuk, Студент :
Здравствуйте, Борис Андреевич Прохоров. Текст программы в приложении. В приаттаченом архиве исходник и тестовые файлы.
Ответ отправил: Andrew Kovalchuk, Студент
Ответ отправлен: 03.06.2010, 16:15
Номер ответа: 261850
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261850
на номер 1151 (Россия) |
Еще номера »
Вопрос № 178820:
Решите задачу в Turbo Pascal: Заданы n пар точек на плоскости, являющихся концами отрезков. Определить количество треугольников, получающихся при пересечении этих отрезков. Хранение данных организовать в виде списка, результат проиллюстрировать графически. программа должна состоять как минимум из двух программных модулей и содержать динамические структуры данных
Отвечает Boriss, Академик :
Здравствуйте, Игорь Викторович. Вот в приложении архив с исходными файлами и файлом даннных. Программа (главный модуль) 178820.pas, модуль анализа uLines.pas, модуль рисования uDrawL.pas. Еще есть файл данных 178820.dat, который я использовал при тестировании
Строчку вызова подпрограммы ручного ввода я закоментировал. Снимите скобки фигурные - тогда после считывания данных из файла получите возможность ввести дополнительные точки вручную
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.