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 килобайт ) Кол-во скачиваний: 186
 К началу страницы 
+ Ответить 
777
сообщение 1.02.2010 12:23
Сообщение #3


Новичок
*

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

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


Цитата(volvo @ 1.02.2010 12:25) *

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

Даааааа!!! shok.gif
Я вечером попытаюсь это как-то переварить blink.gif
Ничего, если у меня будет очень много тупых вопросов, откровенно тупых, но без ответов на которые мне будет ещё сложнее???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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

 

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