Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2008, 19:14   #1
amigo90
 
Регистрация: 16.04.2008
Сообщений: 7
Вопрос Помогите написть простую прогу подсчета статистики слов, символов в тексте..

Доброго времяни суток. В книгах нигде не написанно как конкретно выполнить эту задачу.. Помогите пожалуйста!! Задача такая: Подсчет статистики. Сделать что бы пользаватель мог задать обрабатываемого файла ( имя.txt например).Далее сделать статистику: количество: слов, символов, строк, абзацев и страниц в тексте. При высоте/ширене страницы 60/80 символов.Загрузку из файла в переменную я сделал, а вот со всем остальным что то не получается. Я не совсем понимаю, если мы задаем например переменной "f" тип "string" то получается что ли что она только одну строку считает? Может быть нужно делать цикл для счета всех строк, но тогда не понятно как это поймет переменная... Короче вот мои наброски, но всю статистику онделает неправельно:

Код:
program textstat;
var
n1,l,h:integer;
f:text;
s,namein,nameout:string;
begin

writeln('ўўҐ¤ЁвҐ Ё¬п ўе®¤*®Ј® д ©« ');
readln(namein);
assign(f,namein);
{$I-}
reset(f);
if IOresult <> 0 then
begin
writeln('*ҐўҐа*®Ґ Ё¬п д ©« ',namein , '; Nagmite ENTER dlya vihoda');
readln;
close(f);
end;
begin
l:=1;
readln(f,s);
repeat if pos(' ',s)<>0 then l:=l+1; n1:=pos(' ',s);
delete(s,n1,1) until pos(' ',s)=0;
end;
{ begin
h:=1;
repeat h:=h+1; delete(s,1,1); until length(s)=0;
end;}
h:=length(s);
Writeln('Kolichestvo slov v texte = ', l);
Writeln('Kolichestvo simvolov v texte = ', h);

end.
amigo90 вне форума Ответить с цитированием
Старый 29.09.2008, 20:18   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Код:
function kolslov(st: string): byte;
const
  razdel = ['.', ','];
var
  k, d: integer;
begin
  d := 0;
  repeat
    inc(d);
    if st[d] in razdel then
    begin
      delete(st, d, 1);
      insert(' ', st, d);
    end;
  until d > length(st);
  while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
  d := pos(' ', st);
  k := 1;
  while d > 0 do
  begin
    delete(st, 1, d+1);
    d := pos(' ', st);
    inc(k)
  end;
  kolslov := k
end;

var
  t: text;
  abzac, strok, simvol, slov, stranic: longint;
  filname, s: string;
begin
  write('File = '); readln(filname);
  assign(t, filname);
  reset(t);
  while not eof(t) do
  begin
    readln(t, s);//читаем строку
    inc(strok, 1 + length(s) div 80);//кол-во строк по 80 символов
    inc(simvol, length(s));//длина всех строк
    if s[1] = #9 then inc(abzac);//#9 - это клавиша Tab
    inc(slov, kolslov(s));
  end;
  close(t);
  stranic := 1 + strok div 60;
  writeln('tranic = ', stranic);
  writeln('abzac = ', abzac);
  writeln('strok = ', strok);
  writeln('slov = ', slov);
  writeln('simvolov = ', simvol);
  readln
end.
Функция kolslov - много раз описанный на форуме способ подсчёта слов в строке с запятыми, точками и другими разделителями. Enter (#13 #10)- за символ не считаем. Максимальная длина строки в проверяемом файле естественно не более 255 символов.
eoln вне форума Ответить с цитированием
Старый 06.10.2008, 12:33   #3
amigo90
 
Регистрация: 16.04.2008
Сообщений: 7
По умолчанию

eoln Вы мне помогли просто невероятно!!! Код разобрал, все оказалось очень просто! Но я бы сам до такого еще долго доходил. Странно что нам такого не показывали ( хотя не странно ). Не написал, сразу, т.к инет отключали... СПАСИБО ВАМ ОГРОМНОЕ!!! Может быть я могу вам как то помочь? Я даже не знаю как отблагодарить... Я немного изучал FLASH если будет надо, могу какую нить минюшку или баннер нарисовать Моя аська 305858855
amigo90 вне форума Ответить с цитированием
Старый 24.10.2008, 16:35   #4
amigo90
 
Регистрация: 16.04.2008
Сообщений: 7
По умолчанию

eoln Программу к сожалнию не приняли. Заброкавали то что абзацы могут быть заданны пробелами. Посмотрел по госту, это могут быть либо 3 либо 5 пробелов. Буду пытаться исправить. И еще я не смог объяснить, а в последствии и понять для чего мы в цикле
Код:
while d > 0 do
  begin
    delete(st, 1, d+1);
    d := pos(' ', st);
    inc(k)
  end;
делаем d+1 , а точнее зачем +1 ? Она и без этого вроде работает коректно, но зачем это не понял...
amigo90 вне форума Ответить с цитированием
Старый 24.10.2008, 23:24   #5
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
абзацы могут быть либо 3 либо 5 пробелов
Код:
i:=1;
while s[i]=' ' do ink(i);
if (i=3) or (i=5) then writeln('табуляция из 3 или 5 пробелов')

Последний раз редактировалось Arkuz; 25.10.2008 в 00:27.
Arkuz вне форума Ответить с цитированием
Старый 25.10.2008, 00:14   #6
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Чтобы работало корректно нужно изменить следующее(выделил):

Код:
k:=0  //а было k:=1 - получалось, что заведомо слов в строке на 1 больше
while d > 0 do
  begin
    delete(st, 1, d); //было d+1 получается, что съедает везде по 1 букве у каждого слова
    d := pos(' ', st);
    inc(k)  //если слово одно в строке ,а k=1, то при инкрименте k=2, а это неверно
  end;
Arkuz вне форума Ответить с цитированием
Старый 25.10.2008, 00:26   #7
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от amigo90 Посмотреть сообщение
eoln
Код:
while d > 0 do
  begin
    delete(st, 1, d+1);
    d := pos(' ', st);
    inc(k)
  end;
Это счётчик слов.

1.
После того когда очередная строчка приводится от вида:

______привет______как_дела_________ ура___________________________ухо ("_"-здесь пробел)
к виду:

привет как дела ура ухо

2.
Считают каким по счёту будет пробел. Соответственно индекс_пробела+1 это и есть первая буква следующего слова.

3.
Удаляется последовательность символов до индекс_пробела+1 символа и счётчик прибавляет 1.

4. Всё... Как я и говорил, собственно счётчик слов...

А до этого стоит защита от дурака. На обрезание любого кол-ва пробелов.

Последний раз редактировалось Arkuz; 25.10.2008 в 00:29.
Arkuz вне форума Ответить с цитированием
Старый 25.10.2008, 13:36   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Чтобы работало корректно нужно изменить следующее(выделил):

Код:
delete(st, 1, d); //было d+1 получается, что съедает везде по 1 букве у каждого слова
Согласен с замечанием, хотя и так работает корректно при любой длине слова

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Код:
k:=0  //а было k:=1 - получалось, что заведомо слов в строке на 1 больше
...
inc(k)  //если слово одно в строке ,а k=1, то при инкрименте k=2, а это неверно
Не согласен. Предполагается что в конце строки нет лишних пробелов. Тогда в предложении "Hello world" будет найден 1 пробел, но слова 2. Но чтобы не было неопределённости, надо положить k := 0; и изменить немного программу
Код:
  st := st + ' ';//добавим пробел в конец строки
  while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
  d := pos(' ', st);
  k := 1;
  while d > 0 do
eoln вне форума Ответить с цитированием
Старый 26.10.2008, 10:33   #9
amigo90
 
Регистрация: 16.04.2008
Сообщений: 7
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Но чтобы не было неопределённости, надо положить k := 0; и изменить немного программу
Код:
  st := st + ' ';//добавим пробел в конец строки
  while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
  d := pos(' ', st);
  k := 1;
  while d > 0 do

Не понял, так нужно изменить на k:=0 ? Еще была ошибка, когда в конце строки уже был пробел. Тоесть вы хотите предложить добавить намеренно в конец пробел,а k:=0, тогда если пробел в конце уже был до обработки, то там станет 2 пробела и следующей строкой
Код:
while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
один пробел назад сотрется... не понял.
amigo90 вне форума Ответить с цитированием
Старый 26.10.2008, 10:49   #10
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Совершенно верно. Каюсь что написал об этом, а в коде забыл изменить. Значит меняем это
Код:
  while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
  d := pos(' ', st);
  k := 1;
на это
Код:
  st := st + ' ';//добавим пробел в конец строки
  while pos('  ', st) > 0 do delete(st, pos('  ', st), 1);
  d := pos(' ', st);
  k := 0;
В этом случае число пробелов (точек, запятых) = числу слов в строке
"Hello world " - 2 пробела и 2 слова.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите (написть пару элементарных программ на С++) ВаньОК Общие вопросы C/C++ 6 10.02.2008 18:50
Число перемен знака в массиве. Количество слов в тексте. Pascal. Cartman18 Помощь студентам 1 10.12.2007 12:58
Поиск слов в тексте pleer Общие вопросы Delphi 5 23.09.2007 08:19
подсчитать количество символов слов и предложений nev Помощь студентам 4 09.06.2007 21:22