Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите, найти ошибку в программе паскаль 
V
    Опции темы
mobilephone
Дата 18.5.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Помогите, найти ошибку в программе. 

Условие: 
"Задан текст, содержащий не более 255 символов. Определить частоту, с которой встречаются в тексте различные буквы русского алфавита (в долях от общего количества букв)" 

Программа запускается. Но она не всегда выводит правильный ответ 

Код
program lab6; 
const rus:string[33]='АБСДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; 
var s:string; 
freq:array[1..33] of byte; 
i,j:integer; 
begin 
write('s='); 
readln(s); 
for i:=1 to length(s) do 
begin 
for j:=1 to 33 do 
begin 
if UpCase(s)=rus[j] then 
begin 
inc(freq[j],1); 
break; 
end; 
end; 
end; 
for i:=1 to 33 do 
begin 
if freq<>0 then 
write(rus,'-',freq*100/length(s):2:2,'%'); 
end; 
end.



Это сообщение отредактировал(а) volvo877 - 19.5.2009, 09:38
PM MAIL   Вверх
ФедосеевПавел
Дата 18.5.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Так, навскидку
1. Русский алфавит несколько другой

Цитата(mobilephone @  18.5.2009,  18:21 Найти цитируемый пост)
const rus:string[33]='АБСДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ; 

2. Нет инициализации freq

Добавлено через 4 минуты и 56 секунд
А это вообще не компилируется

Добавлено через 8 минут и 35 секунд
Цитата(mobilephone @  18.5.2009,  18:21 Найти цитируемый пост)
if UpCase(s)=rus[j] then 


PM   Вверх
ФедосеевПавел
Дата 18.5.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



И самое главное - то, что UpCase работает только с английскими буквами.
Для русских возьми и переделай для символа
Код

FUNCTION UpperCase  (     S : String ) : String;
assembler;
asm    push  ds
       push  es
       cld
       lds   si,S
       les   di,@Result
       lodsb
       stosb
       mov   cl,al
       xor   ch,ch
       jcxz  @3
  @1:  lodsb
       cmp   al,'a'
       jb    @2
       cmp   al,'z'
       ja    @@2
       sub   al,20h
       jmp   @2
  @@2: cmp   al,'а'  {преобразование для PC866}
       jb    @2
       cmp   al,'п'
       ja    @@21
       sub   al,20h
  @@21:cmp   al,'р'
       jb    @2
       cmp   al,'я'
       ja    @@22
       sub   al,50h
       jmp   @2
  @@22:cmp   al,'ё'
       jne   @2
       mov   al,'Ё'
  @2:  stosb
       loop  @1
  @3:  pop   es
       pop   ds
END;


Но, более удобным будет создание двух массивов - прописных и строчных букв
Код

const
  rus_p : String[33] = 'АБВГД........';
  rus_s : String[33] = 'абвгд........';

а сравнение выполнить так
Код

if (s[i]=rus_p[j]) or (s[i]=rus_s[j]) then 


Это сообщение отредактировал(а) ФедосеевПавел - 18.5.2009, 19:31
PM   Вверх
mobilephone
Дата 19.5.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



А как сделать, чтобы при подсчете количества символов в тексте, пробелы между словами не считались? 
PM MAIL   Вверх
ФедосеевПавел
Дата 19.5.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Наверное, посчитать количество пробелов, а потом вычесть его из длины строки.
Код

write(rus,'-',freq*100/(length(s)-SpaceCount):2:2,'%');


Добавлено @ 18:11
Или, лучше, объявить константу типа множество, в которой будут только учитываемые символы
Код

CONST
  AllowedChars : Set of Char = ['a'..'z','A'..'Z','а','б','в','г'........,'А','Б',........];{русские буквы придётся перечислить все}
VAR
  CharsCount  : Integer;

А потом при рассмотрении строки вести подсчет учитываемых символов
Код

  if s[i] in AllowedChars then Inc(CharsCount);

Переменная CharsCount заменит в дальнейших подсчётах частот функцию lenght(s) (а также нужно добавить проверку на 0).

Это сообщение отредактировал(а) ФедосеевПавел - 19.5.2009, 18:15
PM   Вверх
mobilephone
Дата 19.5.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Большое спасибо, за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.