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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2008, 11:46   #1
Hunto
Пользователь
 
Регистрация: 06.04.2008
Сообщений: 10
По умолчанию Строки. Алфавит

Здравствуйте. Подскажите, пожалуйста: дана строка слов, нужно чтобы программа вывела на экран те слова, в которых гласные (a, e, i, o, u) чередуются с согласными.

Сообствено немогу придумать как релизовать проверку на чередование . На ум приходит только полностью прописывать алфавит :

If (s[i]==(’a’)|| (’e’)|| (’i’)|| (’o’)|| (’u’) && s[i+1]== (’b’)|| (’c’)|| (’d’) ну и так далее…

Может ктото знает вариант попроще?

p.s. и вообще если нужно работать с алфавитом то нужно задавать все буквы?!
p.s.s. язык обычный С
Hunto вне форума Ответить с цитированием
Старый 06.04.2008, 17:44   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Ну с согласными можно поступить проще. Тут нужно отталкиваться от противоположного. Я думаю вот так будет чуток проще:
Код:
If (s[i]==(’a’)|| (’e’)|| (’i’)|| (’o’)|| (’u’) && s[i+1]!= (’a’) && (’e’) && (’i’) && (’o’) && (’u’))
А насчет другого метода, то я думаю, если таковой и найдется то будет он сложнее. Это мое ИМХО.
MaTBeu вне форума Ответить с цитированием
Старый 06.04.2008, 18:03   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

можно создать две строки:
char гласные[] = "aeiou";
и
char согласные[] = "bcdf и так далее перечисляем все согласные"

далее проверка:
if (strchr(гласные,слово[i]) && strchr(согласные,слово[i+1]))
// значит чередуются
pu4koff вне форума Ответить с цитированием
Старый 06.04.2008, 18:39   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Раз речь идёт про char, то создаём массив char flags[256] и инициализируем его, скажем, по принципу 1 - гласная (flags['a'] = flags['O'] = .... = 1), 2 - согласная, 3 - разделитель слов, 0 - всё остальное, заводим такую же "четырёхзначную" переменную и проходим по строке, сравнивая каждый символ (flags[string[i]]) с этой переменной. Думаю, так проще и быстрее получится, чем такие жуткие условия конструировать.
B_N вне форума Ответить с цитированием
Старый 06.04.2008, 20:34   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Hunto Посмотреть сообщение
If (s[i]==(’a’)|| (’e’)|| (’i’)|| (’o’)|| (’u’) && s[i+1]== (’b’)|| (’c’)|| (’d’))
А зачем столько скобок???

ЗЫ А, вот ещё. Может так:
Код:
If ((s[i]==’a’|| s[i]==’e’|| s[i]==’i’||s[i]==’o’|| s[i]==’u’) && (s[i+1]== ’b’|| s[i+1]==’c’|| s[i+1]==’d’))

Последний раз редактировалось Carbon; 06.04.2008 в 20:38.
Carbon вне форума Ответить с цитированием
Старый 06.04.2008, 20:50   #6
Hunto
Пользователь
 
Регистрация: 06.04.2008
Сообщений: 10
По умолчанию

Всем спасибо за советы но..
MaTBeu - отрицание почемуто не работает. оно вообще перестает выводить слова...
pu4koff - тоже почему то неработает оно выводит все подряд
B_N - честно говоря я несильно понял =) сложно для меня ето еще.

все равно спасибо большое за помощь.

Carbon да ты прав =) можна и без скобок. так как ты предложил все работает, накладка просто в длине кода. там приходитса пиречислять все согласные буквы..

Последний раз редактировалось Hunto; 06.04.2008 в 21:04.
Hunto вне форума Ответить с цитированием
Старый 06.04.2008, 21:18   #7
Hunto
Пользователь
 
Регистрация: 06.04.2008
Сообщений: 10
По умолчанию

Вообщем зделал по молдовански
Вот условие задачи и полный код, может кому пригодитса

Задача. Дана последовательность, которая содержит от 2 до 50 слов, в каждом из который от 1 до 8 строчных латинских букв; между соседними словами - не меньше одного пробела, за последним словом - точка. Напечатать те слова последовательности, что отличающиеся от последнего слова и удовлетворяют такое условие - в слове гласные буквы (а, e, и, о, u) чередуются с согласными.

Код:
#include <stdio.h>
#include <string.h>
void main ()
{ char s[50],ps[50],sl[50]; int i,r,j,n,m;
  printf ("\nBBEDITE CTPOKY: \n\n"); gets(s);
  for (i=strlen(s),r=(strlen(s)+1);r>0;r--,i--)
  { s[r]=s[i]; } s[0]=' '; puts(s);
  for(i=0;i<=strlen(s);i++)
  if(s[i]==' '&&s[i+1]!=' ')
{ j=0; ps[j]=' ';
  while (s[i+1]!=' ' && s[i+1]!='.')
{ ps[j]=s[i+1]; j++; i++; } ps[j]='\0';
} printf("\n Poslednee Slovo: "); puts(ps);

for (i=0;i<=strlen(s);i++)
if (s[i]==' '&&s[i+1]!=' ')
{j=0; while (s[i+1]!=' ' && s[i+1]!='.')
{sl[j]=s[i+1]; j++; i++; } sl[j]='\0';

if (strcmp(sl,ps)!=0)

for(j=0;j<=strlen(sl);j++){

if((sl[j]=='a'||sl[j]=='e'  ||sl[j]=='i'  ||sl[j]=='o'||sl[j]=='u') &&
 (sl[j+1]=='b'||sl[j+1]=='c'||sl[j+1]=='d'||sl[j+1]=='f'
||sl[j+1]=='g'||sl[j+1]=='h'||sl[j+1]=='j'||sl[j+1]=='k'
||sl[j+1]=='l'||sl[j+1]=='m'||sl[j+1]=='n'||sl[j+1]=='p'
||sl[j+1]=='q'||sl[j+1]=='r'||sl[j+1]=='s'||sl[j+1]=='t'
||sl[j+1]=='v'||sl[j+1]=='w'||sl[j+1]=='x'||sl[j+1]=='z'))

{printf("\n- iskomoe slovo: "); puts(sl); break; }}}}
Hunto вне форума Ответить с цитированием
Старый 06.04.2008, 22:18   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

особо не вдаваясь в подробности поправил Ваш код. оформление конечно еще то... но мой вариант работает вроде:
Код:
#include <stdio.h>   
#include <string.h>   
void main ()   
{
	char s[50],ps[50],sl[50];
	int i,r,j,n,m;  

	char glas[] = "aeiou";
	char soglas[] = "bcdfghjklmnpqrstvwxz";
	printf ("\nBBEDITE CTPOKY: \n\n"); gets(s);  
	for (i = strlen(s), r = (strlen(s)+1); r > 0; r-- ,i--)  
	{
		s[r]=s[i];
	}
	s[0]=' ';
	puts(s);   
	for(i=0;i<=strlen(s);i++)   
		if(s[i]==' '&&s[i+1]!=' ')   
		{
			j=0; ps[j]=' ';  
			while (s[i+1]!=' ' && s[i+1]!='.')  
			{ ps[j]=s[i+1]; j++; i++; } ps[j]='\0';   
		} printf("\n Poslednee Slovo: "); puts(ps);   

	for (i=0;i<=strlen(s);i++)   
		if (s[i]==' '&&s[i+1]!=' ')   
		{
			j=0;
			while (s[i+1]!=' ' && s[i+1]!='.')  
			{
				sl[j]=s[i+1];
				j++;
				i++;
			}
			sl[j]='\0';   

		if (strcmp(sl,ps)!=0)   

		for(j=0;j<=strlen(sl);j++){  
			if (strchr(glas,sl[j]) && strchr(soglas,sl[j+1]))
			{
				printf("\n- iskomoe slovo: ");
				puts(sl);
				break;
			}
		}
	}
}
ЗЫ. там чет с ошибкой только вылетает и в Вашем варианте, но лень разбираться
pu4koff вне форума Ответить с цитированием
Старый 06.04.2008, 22:52   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Если мне не изменяет память, алгоритмы для решения таких задачек назывались сканирующими конечными автоматами.

Код:
#include <stdio.h>

int main()
{
	unsigned char 	String[] 	= "dfha bAabbb-Abababab   Hjhj6767 Bubibo  an,Aaa656 up."
								  " OpopopopA ring=Dat thx    ppp wao vid xz.";

	unsigned char 	current;
	unsigned char 	previous 	= 3;
	unsigned char 	*ptr 		= String;
	unsigned char	*pCurWord 	= String;
	long			bPrintWord 	= 0;
	int				goodword 	= 1;
	int				stop 		= 0;

	unsigned char 	flags[256];
	
	// инициализируем массив флагов, для начала - только латинские буквы
	flags['a'] = flags['e'] = flags['i'] = flags['o'] = flags['u'] = 1;
	flags['A'] = flags['E'] = flags['I'] = flags['O'] = flags['U'] = 1;
	
	flags['b'] = flags['c'] = flags['d'] = flags['f'] = flags['g'] = 2;
	flags['h'] = flags['j'] = flags['k'] = flags['l'] = flags['m'] = 2;
	flags['n'] = flags['p'] = flags['q'] = flags['r'] = flags['s'] = 2;
	flags['t'] = flags['v'] = flags['w'] = flags['x'] = flags['y'] = flags['z'] = 2;

	flags['B'] = flags['C'] = flags['D'] = flags['F'] = flags['G'] = 2;
	flags['H'] = flags['J'] = flags['K'] = flags['L'] = flags['M'] = 2;
	flags['N'] = flags['P'] = flags['Q'] = flags['R'] = flags['S'] = 2;
	flags['T'] = flags['V'] = flags['W'] = flags['X'] = flags['Y'] = flags['Z'] = 2;
	
	flags[' '] = flags['.'] = flags[','] = flags['-'] = flags['='] = flags['\t'] = 3;

	// начинаем проверять
	while(!stop){
		if(*ptr){
			bPrintWord = 0;
			current = flags[*ptr];
			switch(current)	{
				case 1	:
					// текущая буква - гласная
					if(previous == 3) {
						pCurWord = ptr;
						goodword = 1;
					}
					else goodword &= (previous == 2);
					break;
				case 2	:
					// текущая буква - согласная
					if(previous == 3) {
						pCurWord = ptr;
						goodword = 1;
					}
					else goodword &= (previous == 1);
					break;
				case 3	:
					// разделитель
					if(previous != 3) bPrintWord = 1;
					break;
				default	:
					// не согласная и не гласная - плохое слово
					goodword = 0;
			}
		}
		else {
			// исходная строка закончилась
			bPrintWord = 1;
			stop = 1;
		}

		if(bPrintWord && goodword){
			// Печатаем слово.
			// Здесь маленькая "хитрость" для того, чтобы упростить вывод
			// в строку временно вставляется '\0'
			unsigned char tmp = *ptr;
			*ptr = '\0';
			printf("%s\n", pCurWord);
			*ptr = tmp;
		}
		previous = current;
		ptr ++;
	}
	getchar();
}

Последний раз редактировалось B_N; 07.04.2008 в 00:56. Причина: Чуть исправил. Нашёл-таки одну ошибочку.
B_N вне форума Ответить с цитированием
Старый 06.04.2008, 22:55   #10
Hunto
Пользователь
 
Регистрация: 06.04.2008
Сообщений: 10
По умолчанию

Спасибо что помагаете. Я пробывал этот код, теоретически он правельны, но у меня он неправильно работает.
Пример: задано предложенее - "Dat thx ppp wao vid xz."
У меня Ваш код выводит:
Dat
thx
ppp
wao
vid
Хотя это не подходит условию. А мой выводит:
dar
vid

p.s. возможно ето проблема у меня. я незнаю, уже почти все перепробывал. пусть наверное остаетса длиный вариант


B_N работает =) спасибо будет еще вариант, но я только недавно начал изучать С так что такие коды мне еще не под силу )

Последний раз редактировалось Hunto; 06.04.2008 в 23:00.
Hunto вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Национальный алфавит Bagirli Общие вопросы Delphi 5 30.03.2008 01:44
Строки. Mr.User Помощь студентам 11 08.12.2007 07:00
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45