IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на текст, Найти количество одинаковых слов в файле
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Женский

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


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

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

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


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.



Количество слов в файле всего определить получилось, а вот как посчитать количества слов с одинаковыми количествами букв не знаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Женский

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


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

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


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.




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

Сообщение отредактировано: dog -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


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


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 20:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name