Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчёт слов содержащих буквы рус и англ алфавитов 
:(
    Опции темы
factura
Дата 6.1.2014, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Среда Visual C++2010
По логике должно работать, но почему то кириллица игнорируется, пытался исправить подключением библиотеки locale не помогло. При использовании одной лишь латиницы алгоритм работает...
В чём может быть проблема?

Код
#include <conio.h>
#include <stdio.h>
#include <string>
void main()
{
printf("input\n");
char s[100];
scanf("%[^\n]s",s);
int count=0;
if(s[0]>='A' && s[0]<='Z')
count=1;
else
count=0;
for(int i=0;i<strlen(s)-1;i++)
{
if(s[i]==' ' && ((s[i+1]>='A'&& s[i+1]<='Z' && s[i+1]>='A' && s[i+1]<='я') || (s[i+1]>='a'&& s[i+1]<='z' && s[i+1]>='А' && s[i+1]<='я')) )
count++;
}
printf("result-%d",count);
_getch();
}


Модератор: не забываем пользоваться кнопочкой "Код"
PM MAIL   Вверх
feodorv
Дата 7.1.2014, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(factura @  7.1.2014,  00:24 Найти цитируемый пост)
При использовании одной лишь латиницы алгоритм работает...

Довольно любопытная ситуация. Имеем неправильное условие
Цитата(factura @  7.1.2014,  00:24 Найти цитируемый пост)
s[i+1]>='A'&& s[i+1]<='Z' && s[i+1]>='A' && s[i+1]<='я'

Здесь мало того, что 'я' маленькая (хотя отсев идёт заглавных букв), так ещё и 'A' английская.
Здесь мало того, что && стоит вместо ||, так ещё и s[i+1] знаковая, то есть для русских букв имеет отрицательное значение.


Лучший выход - написать функцию is_letter и пользоваться ей:
Код

int is_letter( int c )
{
  c &= 0xff;
  if( c >= 'A' && c <= 'Z' ) return 1;
  if( c >= 'a' && c <= 'z' ) return 1;
  if( c >= 'А' && c <= 'Я' ) return 1;
  if( c >= 'а' && c <= 'я' ) return 1;
  return 0;
}



Кроме того, Вы указываете разделитель:
Цитата(factura @  7.1.2014,  00:24 Найти цитируемый пост)
s[i]==' '

А если встретилась точка, запятая, тире, ...? И что делать с цифрами?


В начале Вы проверяете первый символ:
Цитата(factura @  7.1.2014,  00:24 Найти цитируемый пост)
if(s[0]>='A' && s[0]<='Z')
count=1;
else
count=0;

но только на принадлежность к английскому алфавиту.


Вообще, я бы разделил все символы на буквы и не буквы (что не буквы, то разделитель). И соответственно считал бы слова...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 7.1.2014, 09:01 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Это потому, что есть два объяснения и два неисключающих варианта решения:
1. Потому что мировую историю последние лет тридцать писали амеры. И писали, разумеется, на латинице. А не на кириллице и не на иероглифах, и не на арабской вязи. Следовательно, всё заточено в первую очередь под латиницу (а тех же самых однобайтовых вариантов кодировок кириллицы - дочерта, и где-то символы расположены так, а где-то по-другому). Как исправить? БЫть круче всех (и амеров, разумеется).
2. Есть либа <locale>, в которую включены разные функции (макросы) для использования. Для определения букв используется 'isletter'. Но и тут есть своя тонкость. Ввиду того, что однобайтовых кириллических кодировок для русских символов многовато, то 'isletter' работает только для UNICODE (под Windows точно). Так что тут не надо писать свой обработчик определения для multibyte кодировки, а надо переводить всё в Unicode-кодировку (посредством функции mbstowcs и более её безопасных аналогов), а там уже применять 'isletter'.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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