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

Тема в разделе "Pascal and Delphi", создана пользователем eva7, 14 июн 2010.

  1. eva7

    eva7 Гость

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

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

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

    я начала писать ,но что-то не знаю как дальше
    Код (Text):
    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.


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

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

    у меня здесь ошибка в том, что если есть виражение,например "програма Паскаль"
    то считает как одно слово =(
    тоисть считает как строки - и не знаю что делать...
    :lovecodeby:
     
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Ну вот, токо у меня чёт последнее слово не посчитало
    Код (Delphi):
    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.
    ЗЫ Да, английский я не знаю
     
  3. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Dock1100 - это немного не та задача, имхо)
    И еще - так не надо:


    Код (Delphi):
     if symbol_in_word(s[i]) then word_length:=word_length+1
    else
    begin
    И цикл у тебя до length(s)-1 - так и надо?
     
  4. etc

    etc Гость

    Просто IN не помогает?
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    да народ множества не любит, а строка не понимает in :gifts:
     
  6. etc

    etc Гость

    А если постараться?
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    во-во, постарайся для девушки, пока док1100 убежал)
     
  8. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    ну я развечто не вывожу кол-во слов и их длину

    Добавлено: Вот,работает
    Код (Text):
    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 делал, а потом какой-то глюк и ниче не работало.
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    запоминать длину каждого слова не надо по задаче, насколько я вижу.
    завести место, куда будет запоминаться кол-во слов данной длины (ну, попробовать какой-нить массив).
    а что с пробелом? пробел - это не слово, это разделитель слов. нашли пробел, когда до него было слово - значит слово уже закончилось, смотрим его длину и увеличиваем число слов данной длины.
    не нашли пробел - смотрим, если строка закончилась символом слова, увеличиваем число слов данной длины.
     
  10. etc

    etc Гость

    Еще пос есть.
     
  11. etc

    etc Гость

    Так я не понял, где последний вариант, исправленный?
     
  12. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Это?
    Вопрос СЛОВО выводить или токо длину?
     
  13. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    дарагой, а зачем слово?)
    вот тут всё сказано:
    а вот что подразумевать под "словом", это уже вопрос )))
     
  14. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Как я понял (судя по примеру) то выводится сумарное кол-во букв и кол-во слов?
     
  15. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Dock1100 Как я поняла задачу :rolleyes:
    в файле дана строка:
    т.е. с 1 буквой - 2 слова (а, я), с 3 буквами - 2 слова (вот, как), с 6 - одно)
    только это всё с английским тексом, насколько видно из примера автора
    кстати, а как там в инглише апостроф считается?)
     
  16. etc

    etc Гость

    Все ерунда, надо стринглист юзать.
     
  17. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Ну, тогда вот:
    Что б не парится с динамическим масивом возьмём максимальную длину слова за 255
    Код (Delphi):
    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.
     
  18. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    а учитывать замечания кто будет? :rolleyes:
    док, не обижайтесь, но тут етс распинался насчет ин и пос:

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

    Добавлено: лучше проверить на
    Код (Delphi):
    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;
     
  19. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Это я щас исправлю

    Всмысле?

    Добавлю

    Добавил :
    Код (Delphi):
    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 паскаль глючит
     
  20. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    атавизмы - ну, "хвосты" от той задачи, которую вы решали - вывести число слов заданной пользователем длины.
    типа этого:
    и чуть ниже там тоже есть...

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



    Добавлено: кстати, с множествами может работать быстрее=)
     
Загрузка...
Похожие Темы - Файлы Гистограма длины
  1. lmike
    Ответов:
    27
    Просмотров:
    237
  2. garrick
    Ответов:
    25
    Просмотров:
    653
  3. sgfsdg
    Ответов:
    1
    Просмотров:
    422
  4. vovanabali
    Ответов:
    0
    Просмотров:
    530
  5. anatoliygorbunov
    Ответов:
    1
    Просмотров:
    740

Поделиться этой страницей