Файлы.Гистограма длины слов

  • Автор темы eva7
  • Дата начала
E

eva7

#1
Приветики )
мне нужно написать прогу, которая подсчитывает количество слов и их длину. а в результат записать сколько слов этой длины есть в тексте.

напремер
ну вот и настало лето. сессия . жуть...
должно показать

букв слов
1 1
2 1
3 1
4 2
6 1
7 1

я начала писать ,но что-то не знаю как дальше
Код:
program Untitled;
uses crt;
var f:Text;
slov,i:integer;
ST,s:string;

function Words(s:string):boolean;
const
st = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
var i,j,sum:integer;
begin
sum:=0;
for i:=1 to Length(s)do
for j:=1 to Length(st) do
if s[i] = st[j]then sum:=sum+1;

IF sum = Length(s) THEN Words:=true ELSE Words:=false;
end;

BEGIN
ClrScr;
S:='';
st:='';
slov:=0;

Assign(f, 'C:\FPC\2.4.0\bin\i386-win32\histogram.txt');
Reset(f);

while not EOF(f)do
Begin
readln(f,st);


for i:=1 to Length(st)do
if (st[i]<>#32)and(i <> length(st))
then s:=s+st[i]
else
begin
if words(s)=true then slov:=slov+1;
s:='';
end;

End;
Close(f);


writeln('Ilosc slow : ',Slov);
readln;

END.


вот еще - догадалася что длинну слова можна определить так
Код:
n:= length(s);
writeln( n );
но как сделать чтобы оно запоминало длинну каждого слова отдельно, а потом в зависимости от n выводило количество слов ?
и что делать с пробелом?

помогите,пожалуйста..

у меня здесь ошибка в том, что если есть виражение,например "програма Паскаль"
то считает как одно слово =(
тоисть считает как строки - и не знаю что делать...
:lovecodeby:
 
09.11.2009
665
1
#2
Ну вот, токо у меня чёт последнее слово не посчитало
Код:
var f:text;
need_word_count,need_length,word_length,i:integer;
s:string;

function symbol_in_word(s:string):boolean;
var i:integer;
st:string;
res:boolean;
begin
st:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
res:=false;
for i:=1 to length(st) do
if s[1]=st[i] then
begin
res:=true;
break;
end;
symbol_in_word:=res;
end;

begin
assign(f,'1.txt');
reset(f);
need_word_count:=0;
word_length:=0;
writeln('write length to find');
readln(need_length);
while not eof(f) do
begin
readln(f,s);
for i:=1 to length(s)-1 do
begin
if symbol_in_word(s[i]) then word_length:=word_length+1;
if not symbol_in_word(s[i]) then
begin
if word_length=need_length then
need_word_count:=need_word_count+1;
word_length:=0;
end;
end;
end;

writeln('kol slov nujnoj dlini = ', need_word_count);
readln;
end.
ЗЫ Да, английский я не знаю
 

hosm

* so what *
18.05.2009
2 442
6
#5
да народ множества не любит, а строка не понимает in :gifts:
 

hosm

* so what *
18.05.2009
2 442
6
#7
во-во, постарайся для девушки, пока док1100 убежал)
 
09.11.2009
665
1
#8
Dock1100 - это немного не та задача, имхо)
мне нужно написать прогу, которая подсчитывает количество слов и их длину. а в результат записать сколько слов этой длины есть в тексте.
ну я развечто не вывожу кол-во слов и их длину

Добавлено: Вот,работает
Код:
var f:text;
need_word_count,need_length,word_length,i,j:integer;
s:string;

function symbol_in_word(s:string):boolean;
var i:integer;
st:string;
res:boolean;
begin
st:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
res:=false;
for i:=1 to length(st) do
if s[1]=st[i] then
begin
res:=true;
break;
end;
symbol_in_word:=res;
end;

begin
assign(f,'1.txt');
reset(f);
need_word_count:=0;
word_length:=0;
writeln('write length to find');
readln(need_length);
while not eof(f) do
begin
readln(f,s);
s:=s+' ';
for i:=1 to length(s) do
begin
if symbol_in_word(s[i]) then word_length:=word_length+1;
if not symbol_in_word(s[i]) then
begin
if word_length=need_length then
need_word_count:=need_word_count+1;
word_length:=0;
end;
end;
end;

writeln('kol slov nujnoj dlini = ', need_word_count);
readln;
end.
Добавлено:
И еще - так не надо:
это да, просто сначало через in делал, а потом какой-то глюк и ниче не работало.
 

hosm

* so what *
18.05.2009
2 442
6
#9
но как сделать чтобы оно запоминало длинну каждого слова отдельно, а потом в зависимости от n выводило количество слов ?
и что делать с пробелом?
запоминать длину каждого слова не надо по задаче, насколько я вижу.
завести место, куда будет запоминаться кол-во слов данной длины (ну, попробовать какой-нить массив).
а что с пробелом? пробел - это не слово, это разделитель слов. нашли пробел, когда до него было слово - значит слово уже закончилось, смотрим его длину и увеличиваем число слов данной длины.
не нашли пробел - смотрим, если строка закончилась символом слова, увеличиваем число слов данной длины.
 
E
#11
Так я не понял, где последний вариант, исправленный?
 
09.11.2009
665
1
#12
Так я не понял, где последний вариант, исправленный?
но как сделать чтобы оно запоминало длинну каждого слова отдельно, а потом в зависимости от n выводило количество слов ?
и что делать с пробелом?
Это?
Вопрос СЛОВО выводить или токо длину?
 
09.11.2009
665
1
#14
Как я понял (судя по примеру) то выводится сумарное кол-во букв и кол-во слов?
 

hosm

* so what *
18.05.2009
2 442
6
#15
Dock1100 Как я поняла задачу :rolleyes:
в файле дана строка:
а вот как я поняла
результат:
букв слов
1 2
3 2
6 1
т.е. с 1 буквой - 2 слова (а, я), с 3 буквами - 2 слова (вот, как), с 6 - одно)
только это всё с английским тексом, насколько видно из примера автора
кстати, а как там в инглише апостроф считается?)
 
09.11.2009
665
1
#17
Ну, тогда вот:
Что б не парится с динамическим масивом возьмём максимальную длину слова за 255
Код:
var f:text;
need_word_count,need_length,word_length,i,j:integer;
s:string;
sym_word_count:array[1..255] of integer;

function symbol_in_word(s:string):boolean;
var i:integer;
st:string;
res:boolean;
begin
st:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
res:=false;
for i:=1 to length(st) do
if s[1]=st[i] then
begin
res:=true;
break;
end;
symbol_in_word:=res;
end;


begin
assign(f,'1.txt');
reset(f);
for i:=1 to 255 do
sym_word_count[i]:=0;
need_word_count:=0;
word_length:=0;
writeln('write length to find');
readln(need_length);
while not eof(f) do
begin
readln(f,s);
s:=s+' ';
for i:=1 to length(s) do
begin
if symbol_in_word(s[i]) then word_length:=word_length+1;
if not symbol_in_word(s[i]) then
begin
if word_length=need_length then
need_word_count:=need_word_count+1;
sym_word_count[word_length]:= sym_word_count[word_length]+1;
word_length:=0;
end;
end;
end;

writeln('| symbol | word_count |');

for i:=1 to 255 do
if sym_word_count[i]<>0 then
writeln('| ',i:6,' | ',sym_word_count[i]:10,' |');

writeln('kol slov nujnoj dlini = ', need_word_count);
readln;
end.
 

hosm

* so what *
18.05.2009
2 442
6
#18
а учитывать замечания кто будет? :rolleyes:
док, не обижайтесь, но тут етс распинался насчет ин и пос:

и какие-то "атавизмы" от прошлого варианта остались

Добавлено: лучше проверить на
Код:
if word_length > 0 then
if word_length <= 255 then 
sym_word_count[word_length]:= sym_word_count[word_length]+1
else
writeln("слишком длинное слово");
word_length:=0;
 
09.11.2009
665
1
#19
а учитывать замечания кто будет? :rolleyes:
док, не обижайтесь, но тут етс распинался насчет ин и пос
Это я щас исправлю

и какие-то "атавизмы" от прошлого варианта остались
Всмысле?

Добавлено: лучше проверить на
Код:
if word_length > 0 then
if word_length <= 255 then 
sym_word_count[word_length]:= sym_word_count[word_length]+1
else
writeln("слишком длинное слово");
word_length:=0;
Добавлю

Добавил :
Код:
const st= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

var f:text;
word_length,i,j:integer;
s:string;
sym_word_count:array[1..256] of integer;

begin
assign(f,'1.txt');
reset(f);
for i:=1 to 256 do
sym_word_count[i]:=0;
word_length:=0;
while not eof(f) do
begin
readln(f,s);
s:=s+' ';
for i:=1 to length(s) do
begin
if pos(s[i],st)>0 then word_length:=word_length+1;
if pos(s[i],st)=0 then
begin
if (word_length>0)and(word_length<=255) then
sym_word_count[word_length]:= sym_word_count[word_length]+1
else sym_word_count[256]:=sym_word_count[256]+1;
word_length:=0;
end;
end;
end;

writeln('| symbol | word_count |');

for i:=1 to 255 do
if sym_word_count[i]<>0 then
writeln('| ',i:6,' | ',sym_word_count[i]:10,' |');

if sym_word_count[256]>0 then writeln('slishkom dlinnihn slow(dlina > 255 symvolov) : ',sym_word_count[256]);
readln;
end.
Как окозалось со строками >255 паскаль глючит
 

hosm

* so what *
18.05.2009
2 442
6
#20
атавизмы - ну, "хвосты" от той задачи, которую вы решали - вывести число слов заданной пользователем длины.
типа этого:
writeln('write length to find'); readln(need_length);
и чуть ниже там тоже есть...

Исходная задача автора - определение кол-ва одно-, двух-, трехбуквенных и т.д. слов в заданном тексте.
Я по-другому уже не могу сформулировать))))
Правда, в примере автора слова русские, а в программе - только инглиш в качестве слов рассматривается...



Добавлено: кстати, с множествами может работать быстрее=)