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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2009, 23:09   #1
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
Сообщение слова(Си)

В символьной строке сосчитать число слов, начинающихся на гласную букву и заканчивающихся на согласную букву.

Код:
#include<stdio.h>
#include<windows.h>

const char s='б','в','г','д','ж','з','й','к','л','м','н','п','р','с','т','ф','х','ц','ц','ш','щ';
const char g='а','я','о','ё','ы','и','э','е','у','ю';

void main()
{
	char begin,end;
	char a[80];
	int k,i;

	printf("введите строку:");
	gets(a);

	for(i=0;a[i]!='\0';i++)
	{
		if(a[i-1]==' '||i=0)
			begin=a[i];
		if(a[i+1]==' ')
			end=a[i];
		if(begin==g&&s==end)
			k++;
	}
	printf("число совпадений:%d\n",k);

}
вопросик собственно такой как констанку символьную здесь задать? через массив? подскажите пожалуйста!
Bl@st вне форума Ответить с цитированием
Старый 24.12.2009, 23:17   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да, массивом можно
Код:
const char s[] = { 'б','в','г','д','ж','з','й','к','л','м','н','п','р','с','т','ф','х','ц','ц','ш','щ' };
const char g[] = { 'а','я','о','ё','ы','и','э','е','у','ю' };
только сравнение придётся заменить, сравнивать вот так
Код:
'a' == s
нельзя, нужно цикл писать. проще всего это ф-цией оформить:
Код:
int isVowel(char c)
{
    char vowels[] = { 'а','я','о','ё','ы','и','э','е','у','ю' };
    int i;

    for(i = 0; i < sizeof(vowels); i++)
        if( c == vowels[i] )
            return TRUE;
    return FALSE;
}
и что-то подобное для согласных
Соответственно использовать:
Код:
if(isVowel('o'))
   ...
netrino вне форума Ответить с цитированием
Старый 25.12.2009, 00:52   #3
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

Код:
#include<stdio.h>
#include<windows.h>

int isvowel(char m)
{
	char vowels[]={'а','я','о','ё','ы','и','э','е','у','ю'};
	int i;

	for(i=0;i<sizeof(vowels);i++)
		if(m==vowels[i])
			return true;
		return false;
}

int isconsonant(char n)
{
	char consonant[]={'б','в','г','д','ж','з','й','к','л','м','н','п','р','с','т','ф','х','ц','ц','ш','щ'};
	int i;

	for(i=0;i<sizeof(consonant);i++)
		if(n==consonant[i])
			return true;
		return false;
}

void main()
{
	SetConsoleCP (1251);
	SetConsoleOutputCP (1251);

	char begin,end;
	char a[80];
	int k=0,i;

	printf("введите строку:");
	gets(a);

	for(i=0;a[i]!='\0';i++)
	{
		if(a[i-1]==' '||i=0)
			begin=a[i];
		if(a[i+1]==' ')
			end=a[i];
		if(isvowel('begin')&&isconsonant('end'))
			k++;
	}
	printf("число совпадений:%d\n",k);

}
выдает такие ошибки:
error C2106: '=' : left operand must be l-value
error C2015: too many characters in constant
warning C4305: 'argument' : truncation from 'const int' to 'char'
warning C4309: 'argument' : truncation of constant value
Bl@st вне форума Ответить с цитированием
Старый 25.12.2009, 00:59   #4
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

слишком много параметров в константе..на этой вот строчке
Код:
if(isvowel('begin')&&isconsonant('end'))
вторая ошибка показывает тут:
Код:
if(a[i-1]==' '||i=0)

Последний раз редактировалось Bl@st; 25.12.2009 в 01:07.
Bl@st вне форума Ответить с цитированием
Старый 25.12.2009, 09:49   #5
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
if(isvowel('begin')&&isconsonant('end'))
в выделенном красным д.б. begin и end без ' ' т.е то что передаете функции.
Код:
if(a[i-1]==' '||i=0)
д.б ==, знак = в Си и С++ это присваивание.
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 25.12.2009 в 15:28.
Sweta вне форума Ответить с цитированием
Старый 25.12.2009, 16:21   #6
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

Sweta
спасибо ошибок 0 теперь, только результат неверный выдает, где то у меня ляп, пытаюсь найти
Bl@st вне форума Ответить с цитированием
Старый 25.12.2009, 17:21   #7
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Если еще не нашли, то ляпа 2, вот здесь
Код:
		if(a[i+1]==' ')
			end=a[i];
		if(isvowel('begin')&&isconsonant('end'))
			k++;
д.б.
Код:
		if(a[i+1]==' '||a[i+1]=='\0')
			end=a[i];
          	if(a[i+1]==' '||a[i+1]=='\0')
		{if(isvowel(begin)&&isconsonant(end))
			k++; }
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 25.12.2009, 17:37   #8
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

Sweta
спасибо большое!!
netrino
спасибо большое!!
Bl@st вне форума Ответить с цитированием
Старый 25.12.2009, 21:50   #9
Bl@st
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 47
По умолчанию

а можно еще вопросик? если мне нужно сосчитать число слов в которых содержатся гласные буквы, если я сделаю так:
Код:
for(i=0;a[i]!='\0';i++)
	{
		if(a[i-1]==' '||i==0)
			begin=a[i];
		if(a[i+1]==' '||a[i+1]=='\0')
			end=a[i];
		if(a[i+1]==' '||a[i+1]=='\0')
		{
			for(begin;end;begin++)
			{
				if(isvowel(begin))
				k++;
			}
		}
	}
то будет ошибка т.к. в begin и end забиты символы буквы, значит нужно запомнить значение i т.е. сделать так:
Код:
for(i=0;a[i]!='\0';i++)
	{
		if(a[i-1]==' '||i==0)
			begin=i;
		if(a[i+1]==' '||a[i+1]=='\0')
			end=i;
		if(a[i+1]==' '||a[i+1]=='\0')
		{
			for(begin;begin<end;begin++)
			{
				if(isvowel(a[begin]))
				k++;
			}
		}
	}
так он считает гласные, но если она не последняя буква! но считает буквы, а не слова..., в принципе я же могу букву последнюю и не запоминать, а останавливать по пробелу или конец строки?
Bl@st вне форума Ответить с цитированием
Старый 25.12.2009, 22:30   #10
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
for(begin;begin<end;begin++)
			{
				if(isvowel(a[begin]))
				k++;
			}
У Вас begin и end обьявлены как символьные, поэтому их лучше заменить на другие, допустим int n и k. Для того чтобы считало последнюю букву можно считать до begin<end+1 (пишу в привязке к имеющемуся)
Если Вам не нужно количество гласных букв можете ввести переменную bool, и присваивать ей значение true, если в слове есть хоть одна гласная и применить break для прекращения дальшего анализа гласных, и далее в зависимости от флага считать или не считать кол-во строк.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ. Удалить слова, которые содержат все повторяющиеся буквы первого слова nick23 Помощь студентам 7 01.11.2009 14:47
Как удалить текст до слова, потом от слова ? littlecoder Общие вопросы Delphi 7 29.12.2008 00:57
Длина слова IGoDoVaN Общие вопросы Delphi 14 12.06.2008 08:04
Составление слова Cawboy Общие вопросы Delphi 2 03.06.2008 13:21
Поиск 'Слова' JakSon Работа с сетью в Delphi 1 20.04.2008 00:13