IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите с программкой, Отсортировать Интернет ссылки
777
сообщение 27.01.2010 0:19
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Нужно составить программу во FREE Паскале, которая из текстового файла забирает все имеющиеся в нём Интернет ссылки, и выводит их на экран + сохраняет их в другой текстовый файл! Чесно скажу, я учусь на заочном, второй семестр на занятиях полностью отсутствовал из за работы, и сейчас на работе такой завал, сто вникать в Паскаль просто нет возможности! Пожалуйста, помогите! Что такое программа Паскаль я узнал четыре дня назад, на лабораторной работе по информатике...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 1.02.2010 11:25
Сообщение #2


Гость






Цитата
мне очень хочется повторить свою просьбочку, написать что каждая строка в программе обозначает. Я готов рассмотреть, как предложил Lapp, сначала разбить программу на части, если так проще понять...
Смотри, я прокомментировал каждую строку своего кода, подробно прокомментировал... Попробуй разобраться, если что не понятно - то тогда уже можно разбить программу на подзадачи...

Итак: вот прокомментированный код (в аттаче - тот же код, но без комментариев, можно сохранить файл к себе на диск, откомпилировать и проверить). У меня в программе ссылки вида www.google.com дополняются префиксом http://, а не https и не ftp.
Program DZ;
{$mode objfpc}
uses
classes,
regexpr, sysutils, strutils;

// Ну, описания переменных, используемых в программе - это понятно...
var
re: TRegExprEngine;
s, subs, sLink, f_n: AnsiString;
ok: boolean;
index, len: longint;

sL_In, sL_Out: TStringList;

begin
// Итак, начинаем:

// Первым делом создаем два StringList-а (есть в ObjectPascal-е
// такой удобны для хранения строк класс) - первый для исходного
// текста, во второй "будем бросать кости", в смысле, выдернутые
// из текста ссылки
sL_In := TStringList.Create;
sL_Out := TStringList.Create;

// Теперь в защищенном блоке (даже если произойдет какая-нибудь ошибка,
// удалить-то созданные StringList-ы все равно надо), поэтому код, который
// может вызвать ошибку, пишем в секции try (попробуем выполнить, в смысле),
// а то, что ГАРАНТИРОВАННО должно произойти, даже если программа завершится
// с ошибкой - в секции finally
try
// Что же мы тут делаем?
// Для начала просим пользователя ввести название файла, который
// будем обрабатывать:
write('Enter file name: '); readln(f_n);
// Теперь заталкиваем содержимое этого файла в первый StringList...
sL_In.LoadFromFile(f_n);

// А вот теперь - внимательно. Это важный момент: берем то, что прочитали
// (sL_In.Text), заменяем в этом тексте "www." на "http://www." (будем
// надеяться, что ссылок на ww2.что_то в файле нет, только www.). Флажок
// rfReplaceAll заставляет функцию StringReplace изменить все вхождения,
// а не завершить выполнение после первой замены.

// Но стоп. Что же у нас получилось? Если адрес был записан в виде
// www.site.com, то все в порядке, будет добавлен протокол и получится
// httр://www.site.com, если сайт был записан как httр://site.com - тоже
// будет все в порядке, www не присутствует, ничего вообще меняться
// не будет. А что, если httр://www.site.com? Ведь после изменения у нас
// выйдет вот такой бред: httр://httр://www.site.com !!!

// Для этого добавлена в следующей строке еще одна замена: если есть
// дублирование протокола "http://http://", то исправим его, чтоб осталось
// "http://" один раз.
s := StringReplace(
StringReplace(sL_In.Text, 'www.', 'http://www.', [rfReplaceAll]),
'http://http://', 'http://', [rfReplaceAll]
);

// Дальше - генерируем новое регулярное выражение, которое в заданном тексте
// будет искать определенную последовательность символов. Я здесь задал такое
// выражение, которое будет искать правильно оформленную http:// -ссылку
ok := GenerateRegExprEngine('http://([\w+?\.\w+])+([a-zA-z0-9\~\!\@\#\$\%\^\&\*\(\)\_\-\=\+\\\/\?\.\:\;\"\,]*)?',[],re);

// В переменной Ok вернулся признак удачного создания регулярки.
// Если там false - то сообщаем о неудаче и заканчиваем работу
if not ok then writeln('error: init regexp')
else
begin
// Если пришли сюда - значит, регулярное выражение было создано. Идем дальше.

// Ну, вот тут я просто перестраховался, работал с копией текста
// из файла (subs), а не с самим текстом (s).
subs := s;

// До тех пор, пока есть что проверять (пока текст не обработан полностью)
while Length (subs) > 0 do
begin
// Натравливаем на этот текст регулярку. Если последовательность символов,
// которая является ссылкой, обнаружена - то в index вернется индекс
// её первого символа, а в len - длинна.
if RegExprPos(re, PChar(subs), index, len) then
begin
// Угу, ссылка найдена. Копируем ее из текста в отдельную переменную
sLink := Copy(subs, index + 1, len);
// Проверяем, есть ли она уже в списке ссылок?
// Если нету - то вернется (-1)
if sL_Out.IndexOf(sLink) = -1 then
begin
// Ссылка встетилась впервые, добавляем ее к списку ссылок
// и, заодно, выводим на экран.
sL_Out.Add(sLink);
writeln(sLink);
end;

// А теперь - просто, берем и удаляем из "рабочего" текста кусок,
// в котором только что была найдена ссылка, чтоб в нём же больше
// не искать... Таким образом "продвигаемся" вперед по тексту -
// удаляем из начала => продвигаемся к концу
subs := RightStr(subs, Length(subs) - index - len);
end

// Стоп. В оставшемся куске текста регулярка не нашла ссылку...
// Выходим из цикла
else
break;
end;

// Всё, цикл поиска ссылок закончился. Что осталось сделать?
// Правильно, удалить регулярку...
DestroyRegExprEngine(re);

// ..., спросить у пользователя куда сохранять файл с результатами,
// и сохранить их, собственно:
write('File name to store results: '); readln(f_n);
sL_Out.SaveToFile(f_n);
end;

finally
// Это будет выполнено, либо когда все ссылки найдены и все
// завершилось благополучно, либо при первой же ошибке при выполнении
// программы.
sL_Out.Free;
sL_In.Free;
end;

// Всё, миссия завершена, выходим...
end.

Цитата
В задании не оговаривалось что делать с двойными ссылками, я думаю можно оставить как проще, хотя было бы интересно узнать альтернативу простому.
Если не обязательно обеспечивать уникальность ссылки - то условие
 if sL_Out.IndexOf(sLink) = -1 then // строка 88
можно просто убрать...


Прикрепленные файлы
Прикрепленный файл  DZ.pas ( 1.35 килобайт ) Кол-во скачиваний: 184
 К началу страницы 
+ Ответить 

Сообщений в этой теме
777   Помогите с программкой   27.01.2010 0:19
volvo   Вот в FPC это делается элементарно, как раз:{...   27.01.2010 11:55
777   Огромное спасибо!!! Мне это поможет ли...   27.01.2010 15:09
777   Записал листинг в программу, всё как Вы написали, ...   27.01.2010 23:39
777   Зачем же Вы так резко, я ведь не в претезии написа...   28.01.2010 0:10
Lapp   Зачем же Вы так резко, я ведь не в претезии написа...   28.01.2010 20:32
777   Я ни в коем случае не хотел никого обвинять, и в м...   29.01.2010 0:22
Lapp   А на данный момент я исправил то что мне было сказ...   29.01.2010 1:12
777   Послушай, [b]777, к сожалению, единственный спосо...   29.01.2010 22:15
volvo   У меня НЕТ такого идентификатора. Есть Copy Такого...   27.01.2010 23:47
volvo   Извини, не получилось ЧТО? Выделить текст программ...   29.01.2010 4:06
777   Извини, не получилось ЧТО? Выделить текст програм...   29.01.2010 22:29
volvo   А ты это условие ПРИВЕЛ раньше? Здесь что, форум т...   29.01.2010 22:28
Lapp   777, пожалуйста, используй тэги при публикации код...   29.01.2010 22:41
777   777, пожалуйста, используй тэги при публикации ко...   29.01.2010 22:52
Lapp   Я сейчас нажал код (#), но честное слово, я не пон...   29.01.2010 23:09
777   777, пожалуйста, используй тэги при публикации ко...   29.01.2010 23:23
Lapp   по поводу <непонимания простых вещей> - поче...   29.01.2010 23:44
777   Поверь мне, иногда нежелание пошевелить лишний ра...   31.01.2010 19:35
Lapp   довести дело до конца, если получится, то попытать...   1.02.2010 1:04
777   Сергей, если нужна помощь в понимании или обучени...   1.02.2010 6:55
volvo   То, что ты говоришь - еще дальше от правды. Чтобы ...   1.02.2010 9:42
777   То, что ты говоришь - еще дальше от правды. Чтобы...   1.02.2010 10:29
volvo   Смотри, я прокомментировал каждую строку своего ко...   1.02.2010 11:25
777   Смотри, я прокомментировал каждую строку своего к...   1.02.2010 12:23
volvo   Если возникают вопросы - уже хорошо... Гораздо хуж...   1.02.2010 13:07
Lapp   Если возникают вопросы - уже хорошо... Гораздо хуж...   1.02.2010 21:12
777   Все вопросы, которые будут - задавай. Начнём с...   1.02.2010 21:43
volvo   "Ну-с, приступим..." (С) Итак, когда я ...   1.02.2010 22:23
777   Ну что, хоть что-то их того, что я тут написал, с...   1.02.2010 22:39
777   Добрый день всем!!! Это опять я... use...   2.02.2010 12:42
Lapp   Правильно ли я понял, что вот эти модули - есть, к...   2.02.2010 20:52
777   Перед использованием модуля ты должен прочитать е...   2.02.2010 21:23
Lapp   Как и где найти описание переменных , модулей и фу...   2.02.2010 23:20
777   У тебя учебник есть? Какой? Да НЕТ конечно...   3.02.2010 8:56
Unconnected   Посмотри здесь: Литература , там по паскалю есть к...   3.02.2010 13:42
Гость   Вот с этого и надо было начинать! (Книжки)   6.02.2010 13:12
Гость - ZetVV   Volvo, Laap! Удивляюсь Вашей выдержке! :g...   6.02.2010 13:27


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 14:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"