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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2013, 19:01   #11
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

См. выше мой вопрос о входных данных, на которых она не считает 'a'. Потому что у меня все работает.
Насчет кириллицы - в который раз повторяю - отдельный разговор. Я бы вообще отказался от кириллицы в такой программе.

По поводу частоты я уже отвечал выше.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 14.04.2013, 19:03   #12
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

у "а" код 97
у "А" код 65
почему же у меня тогда не считает эту букву?( я не могу понять
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 19:19   #13
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Вот программа
Код:
uses
	CRT;

	var
	t: text;
    s: string;
    a: array [0..255] of integer;
    i:integer;

BEGIN
	clrscr;
	
	assign (t, '1.txt');
	reset  (t);

	while not (eof (t)) do begin
		readln (t, s);

		for i := 1 to length (s) do begin
			s[i] := lowercase(s[i]);
			inc (a[ord (s[i])]);
		end;
	end;


	for i := 32 to 255 do
		if  (a[i] <> 0)   then
			writeln (chr(i), ' - ', a[i]);

	close (t);
	readln;
END.
Она считает количество символов в тексте. Я протестировал ее на стихотворении "If" Киплинга. Результат получился верным.
Чтобы подсчитать относительную частоту появления какого-то символа, нужно посчитать кол-во символов (видимо, исключая пробелы, если Вы и их не считаете) и разделить кол-во появлений данного символа на общее число символов.
Чтобы добавить возможность подсчета кириллических символов, например, для FPC, нужно сохранять текст в OEM-866 и делать аналог lowercase для этих самых кириллических символов, потому что стандартный lowercase с ними не работает, кажется. Или считать их как-то по-другому.
На этом я умолкаю. Все, что хотел, я сказал.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 14.04.2013, 19:47   #14
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

Спасибо большое! lowercase -это очень круто)) просто я даже не знала о существовании такого, отмажусь скажу что не проходили. но запомню, это штука хорошая)
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 19:52   #15
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

но вдруг если вам станет интересно... у меня случилось вот такое чудо. этот фрагмент
Код:
case  ord(s[i]) of 97..122,224..255:inc(a[ord(s[i])]);
                                          65..90,128..159:begin
                                                                  s[i]:=chr(ord(s[i])+32);
                                                                  inc(a[ord(s[i])]);
                                                                 end;
                  end;
я заменила на
Код:
 if s[i] in ['a'..'z'] then 
    inc(a[ord(s[i])]);
и ВСЁ РАБОТАЕТ, я не понимаю почему... даже "а" читает, и причем считает и большие и маленькие и выводит в виде маленьких... как так
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 20:16   #16
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Мне кажется, у Вас нерационально организован вычислительный процесс.
Неправильно выполнена декомпозиция.
Текст может быть большой - хоть десятки и сотни Мбайт, поэтому не нужно ничего разбирать сразу.
На первом этапе лучше всего тупо подсчитывать символы и больше ничего.
А весь анализ, отсечение служебных символов, преобразование регистра и т.п. делать уже на втором этапе, благо вся работа будет осуществляться только с 256 числами.
s-andriano вне форума Ответить с цитированием
Старый 14.04.2013, 22:03   #17
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

Вот исправлено, проверте пожалуйста
Код:
uses
	CRT;

	var
	t: text;
    s: string;
    a: array [0..255] of integer;
  h, k, i:integer;

BEGIN
	clrscr;

	assign (t, 'int.pas');
	reset  (t);

	while not (eof (t)) do begin
		readln (t, s);
                inc(k); {строки}
		for i := 1 to length (s) do begin
		inc(k);{сколько в строке}
                       s[i] := lowercase(s[i]);
			inc (a[ord (s[i])]);
                if s[i] in ['a'..'z'] then inc(h);{общее кол-во букв}
		end;
	end;


	for i := 65 to 255 do
		if  (a[i] <> 0)   then
                        writeln (chr(i), ' - ','частота*-',( a[i]/h):3:3,', встречается раз -',a[i],'   ','всего символов(букв)',h);

	close (t);
	readln;
END.
student___ вне форума Ответить с цитированием
Старый 15.04.2013, 11:50   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

на мой взгляд - неверно.
во-первых, для чего Вы наращиваете переменную k, которую потом нигде не используете?!

во-вторых. Почему Вы считаете в массиве ВСЕ символы (хоть пробелы, хоть знаки препинания), но при этом счётчик букв наращиваете только для маленьких латинских букв?!
введите строчку вида:
---+++a----@#@
или даже так:
---+++----#
посмотрите, что выдаст программа.
если выданная частота Вас устроит, тогда Вы написали всё верно.

а я бы написал так (если нужна частота только среди заданных букв - остальные игнорируем):
Код:
    for i := 1 to length (s) do begin
             if lowercase(s[i]) in ['a'..'z'] then begin
                 inc (a[ord (lowercase(s[i]))]);
                 inc(h);{общее кол-во букв}
             end;
    end;
или так (если нужна частота среди ВСЕХ символов):
Код:
    for i := 1 to length (s) do begin
             inc(h); {общее кол-во все символов}
             if lowercase(s[i]) in ['a'..'z'] then
                 inc (a[ord (lowercase(s[i]))]);
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.04.2013, 19:15   #19
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Мне кажется, рационального подхода к задаче так ни один исходник не иллюстрирует.
Сначала определим, что мы считаем символами и что мы считаем буквами:
Код:
const 
  symbols : set of ....
  letters : set of ...
Ключевые переменные:
Код:
var
  f : file;
  buf : array[0..32767]of byte;
  nrep : array[0..255]of longint;
подсчет:
Код:
  repeat
    blockread(f, buf, sizeof(buf), w);
    for i := 0 to w-1 do
      inc(nrep[buf[i]]);
  until eof(f);
подсчет общего количества символов
Код:
  NumSymbols := 0;
  for i := 0 to 255 do
    if char(i) in symbols then inc(NumSymbols, nrep[i]);
Далее при необходимости переводим к нужному регистру, попросту складывая содержимое соответствующих ячеек nrep.
В условии этого нет, поэтому опустим.
И в конце - вывод на экран - для простоты в виде "повернутой" диаграммы.
Код:
  for i := 0 to 255 do 
    if(char(i) in letters then
      writeln(char(i),' ',nrep[i]:9);
s-andriano вне форума Ответить с цитированием
Старый 15.04.2013, 19:18   #20
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Поработаю переводчиком :
Цитата:
NumSymbols := 0;
for i := 0 to 255 do // dlheu rjve-nj pf[jxbncz drk.xbnm d j,ott rjkbxtcndj cbvdjkjd cke;t,yst
if char(i) in symbols then inc(NumSymbols, nrep[i]);
вдруг кому-то захочется включить в общее количество символов служебные
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать программу определяющую частоту появления каждого байта в файле. BadGuy Помощь студентам 1 02.04.2012 23:31
Из текста удалить все вхождения некоторого наперед заданного символа и символ, стоящий в тексте перед ним LittleStudent Помощь студентам 1 15.04.2011 00:46
Для каждого из слов указать, сколько раз оно встречается в тексте.(paskal) INZA Помощь студентам 1 14.12.2010 10:25
Найти (в процентах) частоту появления каждого из m наиболее часто встречающихся элементов sk1p Паскаль, Turbo Pascal, PascalABC.NET 2 26.09.2008 23:57
В чем проблема появления символа & в начале каждого заголовка итема созданного в рунтайте раздела меню? SkAndrew Общие вопросы Delphi 17 10.08.2008 21:44