Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Pascal. Работа с текстом.

Автор: InviZible 9.10.2006 1:04

Решить задачу на обработку текста, использую функции работы со строками.
Предполагается, что исходным является текстовый файл. В текст могут входить слова из латинских букв, цифры, знаки арифметической операции, точка, запятая, пробел.

Задача: Вывести на экран те слова, которые отличны от последнего слова текста и первая буква этого слова входит в него ещё раз.

больше интересует: как найти последнее слово в строке и из каких символов оно состоит.

Заранее спасибо.

Автор: volvo 9.10.2006 1:05

Я ж тебе на Винограде ответил blink.gif

Ну ладно, смотри:

const
delimit = [#0..#32,'.',',',':',';','!','?','"','+','-'];
type
TWords = array[1..40] of string;

var
words : TWords;

function GetWords(before: byte; s : string; var w : TWords) : byte;
var
i, back, n, count: byte;
st: string;
begin
i := 1;
n := before;
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in delimit) do inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in delimit) do inc(i);
st := copy(s, back, i-back);

inc(n);
w[n] := st;
end;
end;
GetWords := n;
end;

var
f: text;
s: string;
n, i: integer;

begin
n := 0;
assign(f, 't.txt'); reset(f);
while not eof(f) do begin
readln(f, s);
n := GetWords(n, s, words);
end;
close(f);

for i := 1 to n - 1 do begin

s := words[i];
if (s <> words[n]) and (pos(s[1], copy(s, 2, length(s))) > 0)
then writeln(s);

end;

end.


Может, кто-то сделает проще ...

Цитата
как найти последнее слово в строке
На другом форуме было "в тексте". Извини, это ОЧЕНЬ разные вещи!!!

Автор: InviZible 9.10.2006 1:14

я за тобой не успеваю. я только тут, а ты уже там. спасибо.

> На другом форуме было "в тексте". Извини, это ОЧЕНЬ разные вещи!!!
так, я сначала вывожу на экран весь текст через
...
while not eof(f)
readkn(f,s)
....
и в переменной s отсается последнея строка из текста. И мне нужно вытащить из s это слово.

Автор: volvo 9.10.2006 1:17

Цитата
И мне нужно вытащить из s это слово.

А зачем? Ты что, потом, чтоб найти все НЕсовпадающие слова будешь второй раз по файлу проходить?

Ты сначала посмотри, как это сделано в программе, которую тебе предложили, разберись, а потом будешь критиковать.

Автор: InviZible 9.10.2006 1:23

я не криткую.
да, буду второй раз по файлу проходить, т.к. может встретиться такое слово и во всём тексте.

Автор: InviZible 9.11.2006 23:12

Всем спасибо, вот мой вариант

Код

program textproga;
uses crt;
var
bukvi:set of char;
f:text;
slovo,c,s,possl:string;
pslovo,i,k,j:integer;
massl:array[1..100] of string;
begin
clrscr;
assign(f,'E:/tp7/bin/test/text.txt');
reset(f);
bukvi:=['A'..'Z','a'..'z'];
j:=1;
writeln('====Text=====================');
while not eof(f) do
  begin
   readln(f,s);
   writeln(s);
   i:=1;
   while (i <=length(s)) do
    begin
     pslovo:=0;
     if not (s[i] in bukvi) then inc(i);
     slovo:='';
     while (i <=length(s)) and (s[i] in bukvi ) do
      begin
       pslovo:=1;
       slovo:=slovo+s[i];
       inc(i);
      end;
     if pslovo=1 then
      begin
       massl[j]:=slovo;
       inc(j);
      end;
    end;
  end;
writeln('=============================');
for i:=1 to j-1 do
  write(massl[i],' ');
  writeln;

writeln('****last word****************');
possl:=massl[j-1];
writeln(possl);
writeln('*****************************');

for i:=1 to j do
  begin
   slovo:=massl[i];
   c:=slovo[1];
   delete(slovo,1,1);
   if pos(c,slovo) > 0 then
   begin
    slovo:=c+slovo;
    massl[i]:=slovo;
    if (slovo<>possl) then writeln(slovo);
   end;
  end;
{ writeln(possl); esli nujno pechatat' possl }

close(f);
readln;
end.