Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

lamed
Статус: Профессионал
Рейтинг: 2754
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2489
∙ повысить рейтинг »
star9491
Статус: Профессионал
Рейтинг: 2222
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Pascal (Паскаль)

Номер выпуска:1102
Дата выхода:07.06.2010, 22:30
Администратор рассылки:Boriss, Академик
Подписчиков / экспертов:206 / 180
Вопросов / ответов:4 / 5

Вопрос № 178808: Здравствуйте. Помогите пожалуйста написать программу на языке Pascal в среде turbo. просьба такая: использовать в программе модули и динамические переменные. Задание: Задано m пар не повторяющихся символов, воспринимаемых как скобочные пары, т...


Вопрос № 178812: Дан текстовый файл. Указать в процентах,сколько раз встречается та или иная буква. Среда ТР7....
Вопрос № 178815: Даны два текстовых файла а1 и а2. Файл а1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками припинания. Файл а2 содержит не более 30 слов,которые разделены запятыми. Эти слова образуют пары,каждое второе является синонимом пер...
Вопрос № 178820: Решите задачу в Turbo Pascal: Заданы n пар точек на плоскости, являющихся концами отрезков. Определить количество треугольников, получающихся при пересечении этих отрезков. Хранение данных организовать в виде списка, результат проиллюстрировать графи...

Вопрос № 178808:

Здравствуйте. Помогите пожалуйста написать программу на языке Pascal в среде turbo.
просьба такая: использовать в программе модули и динамические переменные.
Задание: Задано m пар не повторяющихся символов, воспринимаемых как скобочные пары, т.е. если (a,b)- одна из пар, то a- левая скобка, b- соответствующая правая скобка. Вводится текст, состоящий из любой последовательности символов и пробела. Текст считается корректным, если соблюдаются скобочные правила: за левой скобкой рано или поздно следует соответствующая правая скобка. Предусмотреть произвольную вложенность скобок. Надо определить корректность любого введенного текста. И текст и пары скобок считать из входных файлов. В программе использовать стек. Проиллюстрировать решение анимацией.

Отправлен: 01.06.2010, 23:13
Вопрос задал: Евгений Усков, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает 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;

{ ------------------------------------------------------------- }
const
errIllegalChar = 1; { коды ошибок }
errNotPair = 2;
errUnexpectedEnd = 3;
maxError = 3;

{ сообщения }
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.

Пример файла brackets:
Код:
()
[]
{}
<>

Пример файла expr:
Код:
( <> {([] <>) ()} ( [] <[() []]() > ) )


Вывод программы на данном примере:
Код:
Parsing expression:
( <> {([] <>) ()} ( [] <[() []]() > ) )
(
<
>
{
(
[
]
<
>
)
(
)
}
(
[
]
<
[
(
)
[
]
]
(
)
>
)
)
Correct expression


Если нужен какой-то другой вывод (для наглядности), то поясните, пожалуйста, в мини-форуме.
Программа проверена в Borland Pascal 7.0.

Успехов!

Приложение:

Ответ отправил: amnick, Студент
Ответ отправлен: 03.06.2010, 00:33
Номер ответа: 261833

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261833 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает 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 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 178812:

    Дан текстовый файл. Указать в процентах,сколько раз встречается та или иная буква.

    Среда ТР7.

    Отправлен: 02.06.2010, 11:01
    Вопрос задал: Вознисеннский Сергей Андреевич, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Пупорев Юрий Борисович, Специалист :
    Здравствуйте, Вознисеннский Сергей Андреевич!
    Написал так, как Вы уточнили. Код в приложении.

    Приложение:

    Ответ отправил: Пупорев Юрий Борисович, Специалист
    Ответ отправлен: 02.06.2010, 12:07
    Номер ответа: 261820

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо большое.выручили меня!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261820 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 178815:

    Даны два текстовых файла а1 и а2. Файл а1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками припинания. Файл а2 содержит не более 30 слов,которые разделены запятыми. Эти слова образуют пары,каждое второе является синонимом первого. Заменить в файле а2 те слова,которые можно,их синонимами. Результат поместить в новый файл.

    Среда ТР7

    Отправлен: 02.06.2010, 11:46
    Вопрос задал: Борис Андреевич Прохоров, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Andrew Kovalchuk, Студент :
    Здравствуйте, Борис Андреевич Прохоров.
    Текст программы в приложении.
    В приаттаченом архиве исходник и тестовые файлы.

    Приложение:
    Прикрепленный файл: загрузить »

    -----
    Временная неудача лучше временной удачи

    Ответ отправил: Andrew Kovalchuk, Студент
    Ответ отправлен: 03.06.2010, 16:15
    Номер ответа: 261850

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261850 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 178820:

    Решите задачу в Turbo Pascal: Заданы n пар точек на плоскости, являющихся концами отрезков. Определить количество треугольников, получающихся при пересечении этих отрезков. Хранение данных организовать в виде списка, результат проиллюстрировать графически. программа должна состоять как минимум из двух программных модулей и содержать динамические структуры данных

    Отправлен: 02.06.2010, 20:02
    Вопрос задал: Игорь Викторович, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Boriss, Академик :
    Здравствуйте, Игорь Викторович.
    Вот в приложении архив с исходными файлами и файлом даннных.
    Программа (главный модуль) 178820.pas, модуль анализа uLines.pas, модуль рисования uDrawL.pas.
    Еще есть файл данных 178820.dat, который я использовал при тестировании

    Строчку вызова подпрограммы ручного ввода я закоментировал. Снимите скобки фигурные - тогда после считывания данных из файла получите возможность ввести дополнительные точки вручную

    Приложение:
    Прикрепленный файл: загрузить »

    -----
    Вывод - то место в тексте, где вы устали думать

    Ответ отправил: Boriss, Академик
    Ответ отправлен: 06.06.2010, 14:43
    Номер ответа: 261930

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261930 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное