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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2013, 16:27   #1
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию Pascal Для каждого символа текста указать его относительную частоту появления в тексте

Здравствуйте. Дана задача : Для каждого символа заданного текста указать его относительную частоту появления в тексте. Построить соответствующую диаграмму. Сообщение об одном символе должно печататься не более одного раза. Вот мой черновик. программа читает текст из файла, который может состоять из любого количества символов(английские , русские буквы, всевозможные знаки препинания и все это в несколько строк), выводить нужно только символы-буквы. всё шло прекрасно до того момента как текст состоял из двух-трёх строк, но если читать ,к примеру, полноценное стихотворение, то начинаются ошибки(выводит несколько раз сообщение об одинаковых символах, некоторые буквы не выводит вовсе, неправильно считает) и как мне уже подсказали формула по которой считается относительная частота не верна(.до диаграммы дело не доходит так понимаю, что смысла нет за неё браться пока происходят вот такие косяки.. Прошу посмотреть программу и помочь с выявлением ошибок

Код:
Program chast;
uses crt;
var t: text;
    s: string;
    a: array [0..255] of integer;
    k, b, i, max:integer;
  BEGIN  clrscr;
    k:=0;
    assign(t,'int.pas');
    reset(t);
      while not (eof(t)) do
         begin
     
           readln(t,s);
             for i:=1 to length(s) do
               begin
                inc(k);
                  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;
               end;
 
    writeln('Относительная частота повторений символов в тексте');
    writeln;
    max:=0;
      for i:=32 to 255 do
          if  a[i]<>0   then  
             begin
                writeln(chr(i),'-','частота',(a[i]/100*k):3:2,'',' % ',
                                ' встречается в тексте ',a[i],' раз(а)');
             if a[i]>max then begin
                                    max:=a[i] ;
                                    b:=i
                                   end;
               end;
   end;
writeln;
writeln;
writeln('всего символов - ',k, '  больше всего встречается-',chr(b),'  ',  max,' раз(а)');
close(t);
readln;
end.
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 17:07   #2
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Из-за разрыва в размещении русских букв в таблице ASCII это будет работать неправильно (касательно русских букв, по крайней мере)
Код:
 65..90,128..159:begin
       s[i]:=chr(ord(s[i])+32);
       inc(a[ord(s[i])]);
       end;
С латинскими буквами работает правильно?
Относительная частота появления - это количество появлений данной буквы к общей длине текста.

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

с латинскими все считает кроме буквы " а "
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 17:58   #4
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Можно пример входных данных, где считается неправильно?

Upd.
Если пока оставить вопрос о частоте появлений и заставить программу просто считать символы, то это будет что-то типа
Код:
uses 
	CRT;

	var 
	t: text;
    s: string;
    a: array [0..255] of integer;
    k, b, i, max:integer;
  
BEGIN  
	clrscr;
    k:=0;
    assign(t,'1.txt');
    reset(t);
    
	while not (eof(t)) do begin
		readln(t,s);
		for i:=1 to length(s) do begin
			inc(k);
			case  ord(s[i]) of 
				97..122:inc(a[ord(s[i])]);
				65..90:begin
					s[i]:=chr(ord(s[i])+32);
					inc(a[ord(s[i])]);
				end;
			end;
		end;
	end;
 
 
	for i:=32 to 255 do
		if  a[i]<>0   then 
			writeln(chr(i),' - ',a[i]);

	close(t);
	readln;
END.
Ну, я, конечно, не удалял все лишние строчки, это уж Вы сами.. но в таком виде она считает кол-во символов, и на моих тестовых файлах делает это правильно.
Μολὼν λαβέ

Последний раз редактировалось alexander13; 14.04.2013 в 18:11.
alexander13 вне форума Ответить с цитированием
Старый 14.04.2013, 18:08   #5
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

к сожалению с русскими буквами работаю вслепую, мой паскаль вместо них выдает нечто ужасное.
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 18:14   #6
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Еще раз объясняю насчет русских букв: посмотрите на ЭТУ ТАБЛИЦУ
Видите, как они расположены? Если Вам в тексте встретится буква 'С', то тут уже не прокатит прибавить 32 и получить 'с'.

И я, кажется, говорил, что сначала нужно разобраться с латинскими буквами. А добавить обработку кириллицы - это дело второе.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 14.04.2013, 18:45   #7
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

извините конечно за мою необразованность, но в таблице которую Вы рекомендуете я ничего не понимаю. смотрю вот этутаблицу и по ней все норм
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 18:49   #8
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Собственно, если Вас интересуют русские буквы, то Вам нужна расширенная таблица ASCII (которая справа по моей ссылке).
Программа-то в итоге работает для латинских букв?
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 14.04.2013, 18:54   #9
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

"а" не считает
student___ вне форума Ответить с цитированием
Старый 14.04.2013, 18:58   #10
student___
Пользователь
 
Регистрация: 14.04.2013
Сообщений: 12
По умолчанию

а по поводу относительной частоты все-таки. посчитать сколько раз каждая буква встречается в тексте и разделить на сумму всех символов?
student___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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