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

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

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

Автор: dog 30.09.2010 13:06

Дан текстовой файл, знаки препинания отсутствуют, слова разделены пробелами.

Необходимо вычислить количество слов одинаковой длины.

Например слов диной в один символ - столько-то, в два символа столько то, в три символа - столько то.


PROGRAM PRP7;

VAR
f:text;
s:string;
i:INTEGER;
n:INTEGER;

BEGIN
ASSIGN(f,'in.txt');
RESET(f);
n:=0;
WHILE NOT EOF(f) DO
BEGIN
READLN(f,s);
FOR i:=1 TO LENGTH(s) DO
IF (s[i-1]=' ') OR (i=1) THEN
BEGIN
n:=n+1;
END;
END;
CLOSE(f);
WRITELN;
WRITELN(n);
END.



Количество слов в файле всего определить получилось, а вот как посчитать количества слов с одинаковыми количествами букв не знаю.

Автор: volvo 30.09.2010 14:33

Цитата
Количество слов в файле всего определить получилось
Кстати, не совсем корректно. Не каждый компилятор это "проглотит". Например, FPC со стандартными настройками вылетит с ошибкой при выполнении этой программы, потому что s[i - 1] при i = 1 - это выход за границу массива. Поменяй условия местами:
IF (i=1) OR (s[i-1]=' ') THEN
, и это будет работать везде и всегда. Кстати, еще одно: в следующий раз, когда обращаешься к нулевому символу строки, и сравниваешь его с пробелом, подумай, а что будет, если длина строки будет равна 32? В этом конкретном случае ничего страшного не произойдет, но вообще таких "сюрпризов" надо избегать.

А по поводу вопроса - ну что ж, надо ввести Count - счетчик количества символов между пробелами (который будет сбрасываться при s[ i ] = ' '), и массив:
var
WordLen: array[1 .. 15] of integer;

(слова длиной больше 15 символов ты вряд ли найдешь), и после нахождения длины очередного слова (как раз перед тем, как сбросить счетчик) - делать
Inc(WordLen[Count]);

, тогда у тебя в WordLen[ i ] будет храниться количество слов с длиной i

Автор: dog 1.10.2010 9:10

Честно не совсем понятно

Допустим ввели новые переменные


PROGRAM PRP7;

VAR
f:text;
s:string;
i:INTEGER;
n:INTEGER;


WordLen: array[1 .. 15] of integer;
count:INTEGER;


BEGIN
ASSIGN(f,'in.txt');
RESET(f);
n:=0;
WHILE NOT EOF(f) DO
BEGIN
READLN(f,s);
FOR i:=1 TO LENGTH(s) DO
IF (i=1) OR (s[i-1]=' ') THEN
BEGIN
n:=n+1;

Inc(WordLen[Count]);
WRITELN('Количество слов длины','i',' - ', WordLen[ i ]);



END;
END;
CLOSE(f);
WRITELN;
WRITELN(n);
END.




И в общем программа какую-то ахинею выдает.

Автор: Lapp 1.10.2010 10:04

Цитата(dog @ 1.10.2010 6:10) *
Честно не совсем понятно

...

И в общем программа какую-то ахинею выдает.
Программа всегда выдает то, что ты ей сказала выдавать )).

Да, логика в твоей проге явно хромает..
Используешь то n, то Count.. Подсчет тоже неверный.
volvo, извини, но мне кажется, что тут простыми советами не обойтись.. Ладно, приводить всю прогу не буду. Но основной кусок - придется.
  RESET(f);
for i:=1 to nLen do WordLen[i]:=0;
WHILE NOT EOF(f) DO BEGIN
READLN(f,s);
n:=0;
FOR i:=1 TO LENGTH(s) DO IF s[i]=' ' THEN begin // по пробелу..
if n>0 then Inc(WordLen[n]); // .. увеличиваем счетчик слов длины n
n:=0 // .. и обнуляем n
end
else Inc(n); // по НЕпробелу просто увеличиваем длину текущего слова
if n>0 then Inc(WordLen[n]) // в конце строки тоже увеличиваем счетчик
END;
CLOSE(f);
// теперь выводим результаты
for i:=1 to nLen do if WordLen[i]<>0 then WriteLn(i,'-char words: ',WordLen[i]);


понятно так? если нет - спрашивай )).