Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на текст
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dog
Дан текстовой файл, знаки препинания отсутствуют, слова разделены пробелами.

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

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


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
Цитата
Количество слов в файле всего определить получилось
Кстати, не совсем корректно. Не каждый компилятор это "проглотит". Например, 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
Честно не совсем понятно

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


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
Цитата(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]);


понятно так? если нет - спрашивай )).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.