Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Исключить из файла все слова


Автор: KoSMoS 7.12.2006, 20:30
Помогите,пожалуйста!!!

Пусть в некоторый файл ‘words txt’ построчно записаны слова.
Исключить из файла все слова, написанные на русском языке.

Автор: mr.Anderson 7.12.2006, 20:55
Могу прописать примерный алгоритм. Если не разберешься сам, то напишу код.

1. В разделе Var объявляем переменные f: Text; control: Boolean; str: Array[ 0..1000 ] of String;, из расчета, что в файле не более 1000 слов.
2. Открываем файл на чтение.
3. Считываем построчно через цикл FOR. В цикле:
 3.1. Всю строчку обрабатываем посимвольно через вложенный цикл FOR.
 3.2. В этом цикле проверяем каждую букву на соответствие одной из букв русского алфавита (эти буквы тоже можно в отдельный массив запихать, как хочешь). Если есть совпадение, то присваиваем CONTROL := TRUE; .
 3.3. На выходе из этого цикла ставим условие: если CONTROL = FALSE, то записываем текущую строку как текущий элемент в массив STR.
4. Закрываем файл.
5. Открываем файл на перезапись.
6. Через цикл FOR запихиваем в файл все элементы массива STR.
7. Закрываем файл.

Вот тебе алг. Не справишься - скажи, я код дам.

Автор: KoSMoS 7.12.2006, 21:58
Slim7.спасибо большое,но я реально сам не справлюсь!!!

Автор: volvo877 8.12.2006, 02:39
Цитата(sim7 @  7.12.2006,  19:55 Найти цитируемый пост)
1. В разделе Var объявляем переменные f: Text; control: Boolean; str: Array[ 0..1000 ] of String;, из расчета, что в файле не более 1000 слов.

В Паскале? Ну-ну... Попробуй, посмотри, что получится smile Размер DS ограничен, ты в курсе? 1000 строк - это 255К, тебе доступно только 64К


KoSMoS, все проще...

Код

var
  s, name: string;
  f_in, f_out: text;
  i: integer;

begin
  name := 'my_file.txt'; { <--- Имя твоего файла }
  assign(f_in, name); reset(f_in);
  assign(f_out, 'my_file.out'); rewrite(f_out);

  while not eof(f_in) do begin
    readln(f_in, s);
    i := 1;
    while (i <= length(s)) and not (s[i] in ['А' .. 'Я', 'а' ..'п', 'р' ..'я']) do inc(i);
    if i > length(s) then writeln(f_out, s);
  end;
  close(f_in);
  close(f_out);
  erase(f_in);
  rename(f_out, name);
end.

Автор: mr.Anderson 8.12.2006, 16:21
volvo877, здорово. smile Я бы не догадался, хотя бы потому, что не знал, что можно задать проверку на принадлежность множеству. Хороший метод, я запомню.

Автор: Mercator 8.12.2006, 17:05
sim7, я тоже не знала! ))) Только по-моему с русскими буквами проще можно, если мне память не изменяет (а в Паскале я лет 6 назад писала). По символу спец. функцией узнаешь ее код ASCII и смотришь, попадает ли он в диапазон русских символов таблицы ASCII. Они там вроде подряд идут. По-моему, гораздо быстрее получится.

Автор: volvo877 8.12.2006, 18:01
Цитата(Mercator @  8.12.2006,  16:05 Найти цитируемый пост)
Они там вроде подряд идут.

Упс... Здесь ты ошибаешься... Если бы все было так просто... Не идут они подряд в ДОС-кодировке... Да и быстрее чем со множествами (тем более, гораздо быстрее) вряд-ли получится, это ОЧЕНЬ быстрый тип...

Опять же вызов Ord (это имелось в виду под спец. функцией?) тоже занимает время... А зачем, если можно напрямую проверить вхождение во множество самого символа, а не его кода?  smile 

Автор: KoSMoS 10.12.2006, 14:56
спасибо огромное!!!

Автор: Mercator 11.12.2006, 09:40
volvo877, а как работает проверка вхождения во множество? (Правда, это тему наверно отдельную надо...)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)