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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2014, 18:15   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Слогоделение текстов

Нужно написать программу,которая делит слова в тексте на слоги: мо-ло-ко, та-рел-ка
Как реализовать это программно?
Посимвольно считывать слова с файла от пробела до слова-до пробела после слова, проверять каждую букву,если первая согласная фиксировать ее в массиве,переходить на следующую букву,если она гласная,снова заносить ее в массив (и так далее по правилам слогоделения),добавлять в конце "дефис" и выводить в другом файле.Потом очищать массив и идти дальше по слову.
Или у кого-то есть более удачные идеи? Заранее спасибо)
Вероника99 вне форума Ответить с цитированием
Старый 07.01.2014, 18:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему твоя идея вполне подходящая.
Можно жаде делать деление на слоги сразу при получении очередного слова. Т.е. пока не пробел считывать до очередного гласного, и так далее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2014, 21:33   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Набросала черновик, столкнулась со следующей проблемой: как остановить дейтствия цикла,когда слог выделен и второе,как двигаться дальше по слову?вот такие дурацкие вопросы
Код:
#include "stdafx.h"
#include<stdio.h>
#include "locale" 
#define MAX 100
int ReadFile(char *, char *);  

char sogl[21]={'б','в','г','д','ж','з','к','л','м','н','п','р','с','т','ф','х','ц','ч','ш','щ'};
char glas[10]={'а','е','и','о','у','э','ю','я'};
int main()
{

	char arr[MAX];   //символьная строка данных файла
	char s[100]=" ";
	setlocale(LC_ALL,"Russian"); 
	char name1[20];//="E:\\roz.txt";  //имя файла с которого считаваем
	
	printf("Enter way(path) to file: \n");   //вводим путь 
	gets(name1);
	while(ReadFile(name1,arr)==NULL){  
		printf("Repeat:\n");         
		gets(name1);
	}
	puts(arr); 
	strlwr (arr); 
	printf(arr);
	//strcpy(arr,s);
	printf(arr);
	printf("\n");
	int i=0,j=0,k=0;
	char mas[8]; // массив для слога
	while(arr[i]!='-')
	
	{

	for(j=0;j<=21;j++)
	{
		if(arr[i]==sogl[j]) //если i-тый элемент явл. согласной
		{
			 mas[i]=arr[i];
	
		        printf("%c",mas[i]);
 			break;
		 }

	}
	for(j=0;j<=10;j++)
	{
		if(arr[i]==glas[j]) //если i-тый элемент явл. гласной
	{
		     mas[i]=arr[i];
		     printf("%c",mas[i]);
		     break;
		}
	}
	i++;
	
	}
	return 0;
}

int ReadFile(char *name, char *p)    //функция чтения с файла
{
	FILE *f;
	char num;
	int i=0;
	f=fopen(name,"rt");
	if(f==NULL)             
		return NULL;	 

	while((num=getc(f))!='  ')
	{    //посимвольно копируем
	
		*p++=num;
		*p=0;
		
	}
	fclose(f);    
	return 1;   
}
Вероника99 вне форума Ответить с цитированием
Старый 07.01.2014, 21:42   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

http://helena2012.nichost.ru/fonetika/28-slogodelenie
Вон там этих правил целых 5 штук (это если делать по всем правилам русского языка, то алгоритм должен быть сложнее).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.01.2014, 21:49   #5
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

BDA,да,я знаю эти правила, мне для начала хотя бы чтоб оно основное выделяло,а потом уже буду эти делали делать)
Вероника99 вне форума Ответить с цитированием
Старый 08.01.2014, 19:40   #6
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Ребята, тут такая ситуация: я решила использовать оператор goto для проверки в том случаи,если подряд идут несколько согласных,оно заново переходит на проверку следующего элемента. Но оно не работает,что без goto,что с ним-прога пробускает гласные,если в слове идут подряд несколько согласных,как например в слове: СТавка, что не так? (arr-массив слов,считанных с файла)
Код:
int sklad(void)
{
	
	static int i=0;
	int j=0,k=0;
	char mas[20]; // масив для слога

	while(arr[i]!=NULL)
	
	{
	for(j=0;j<=21;j++)
			
	{
		if(arr[i]==sogl[j]) //если нашли согласную
		{
			mas[i]=arr[i]; //присваиваем ее в массив mas
		    printf("%c",mas[i]);
			i++;
			inv: if(arr[i]) //проверяем следующий элемент
			{
				for(;k<=10;k++)
				{
					if(arr[i]==glas[k]) //если это гласная
					{
						mas[i]=arr[i]; //присваиваем в mas
		
						printf("%c-",mas[i]);
						return 1;
					}
					
				}
				for(j=0;j<=21;j++)
					if(arr[i]==sogl[j]) //если нашли согласную
					{
						mas[i]=arr[i];
						printf("%c-",mas[i]);
						i++;
						goto inv;

					}
			}
			
		}
	}
	i++;

	
      }
		
		

}
Вероника99 вне форума Ответить с цитированием
Старый 09.01.2014, 02:14   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Никто не знает?(((
Вероника99 вне форума Ответить с цитированием
Старый 09.01.2014, 02:41   #8
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Код:
                                for(;k<=10;k++)
				{
					if(arr[i]==glas[k]) //если это гласная
					{
						mas[i]=arr[i]; //присваиваем в mas
		
						printf("%c-",mas[i]);
						return 1;
					}
					
				}
Вы не обнуляете переменную k при повторной попытке исполнения цикла.
Вы после первого выхода из этого цикла, туда больше никогда не попадете.
P.S. Не буду вмешиваться в код, но сделаю одно небольшое замечание, на фоне остальных оно более приоритетное - у вас совпадет имя параметра вложенного цикла с внешним (по отношению к этому) циклом.
В этом нет особой необходимости. Избегайте подобных ситуаций и отладка в дальнейшем будет проще.

Последний раз редактировалось Базиля; 09.01.2014 в 02:50.
Базиля вне форума Ответить с цитированием
Старый 15.01.2014, 15:13   #9
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Написала более менее работающую программу,может у кого-то какие-то замечания будут?Спасибо
Код:
#include "stdafx.h"
#include<stdio.h>
#include "locale" 
#define MAX 200
int ReadFile(char *, char *);  
int sklad(FILE *);
char prygolosni[22]={'б','в','г','д','ж','з','к','л','м','н','п','р','с','т','ф','х','ц','ч','ш','щ','й'};
char golosni[11]={'а','е','и','i','о','у','є','ю','я'};
char arr[MAX];   //символьний рядок даних файлу
int main()
{
	FILE *ff;
	setlocale(LC_ALL,"Ukrainian"); 
	char name1[20];//="E:\\roz.txt";  //ім'я файлу з якого читаємо
	char name2[]="E:\\res.txt";
	printf("Enter way(path) to file: \n");   //вводимо шлях
	gets(name1);
	while(ReadFile(name1,arr)==NULL){  //якщо допущено помилку
		printf("Repeat:\n");          //повторюємо введення
		gets(name1);
	}
	puts(arr); //виводимо дані,які були зчитані з файлу (для перевірки)
	strlwr (arr); //замінює великі букви на малі
	
	printf("\n");
	int r=1,i,d;
	d=strlen(arr);
	ff=fopen(name2,"w"); 
	while(r==1)
		r=sklad(ff);
	printf("\n");
	return 0;
}

char symbol[]={'!','.',',','?','-','\"','(',')',' '};

int sklad(FILE *ff)
{
	
	static int i=0;
	int j=0,k=0,u,h,t,n;
	char mas[200]; // масив для слога
	
	char sym=' ';
	while(arr[i]!=NULL)
	{
	for(h=0;h<10;h++)
	{
		if(arr[i]==symbol[h])
		{
			mas[i]=arr[i];
			    fprintf(ff,"%c",mas[i]);
		    fprintf(ff," ");
		}
	}
	
	for(j=0;j<=22;j++)
			
	{
		if(arr[i]==prygolosni[j]) //якщо знайшли приголосну
		{
			mas[i]=arr[i]; //присвоюємо її в масив mas
		    fprintf(ff,"%c",mas[i]);
			i++;
			inv: if(arr[i]) //перевіряємо наступний елемент
			{
				for(k=0;k<=10;k++)
				{
					if(arr[i]==golosni[k]) //якщо це голосна
					{
						mas[i]=arr[i]; //присвоюємо в mas
						for(n=0;n<10;n++)
						{	//if(arr[i+1]==' '||arr[i+1]=='.'||arr[i+1]==','||arr[i+1]==')'||arr[i+1]=='(') //щоб після кінця слова не було дефісу
						if(arr[i+1]==symbol[n])
						inv2: fprintf(ff,"%c",mas[i]);
						else
							fprintf(ff,"%c-",mas[i]);
						return 1;
						}
					}
					
				}
				if(arr[i]=='ь')
			{ 
				if(arr[i+1]==' ')
				{
					mas[i]=arr[i];
					goto inv2;
				}
				
				
			}

		    	for(j=0;j<=22;j++)
					if(arr[i]==prygolosni[j]) //якщо знайшли приголосну
					{
						mas[i]=arr[i];
						fprintf(ff,"%c",mas[i]);
						i++;
						goto inv;

					}
			}

		}
		}
			if(arr[i]=' ')
			{
				for(t=0;t<=10;t++)
			{
				
				if(arr[i+1]==golosni[t]) //якщо перша голосна
			
				{
					mas[i]=arr[i+1]; //присвоюємо її в масив mas
				    fprintf(ff,"%c",mas[i]);
					i++;
					for(u=0;u<=21;u++)
				{	
					if(arr[i+1]==prygolosni[u]) //якщо знайшли приголосну
					{
						mas[i]=arr[i+1];
						fprintf(ff,"%c-",mas[i]);
					}

			    }
				}
			}
			
			}			
	i++;

      }

}

int ReadFile(char *name, char *p)    //функція читання з файлу
{
	FILE *f;
	char num;
	int i=0;
	f=fopen(name,"rt");
	if(f==NULL)             //функція повертає NULL якщо 
		return NULL;	    //допущено помилку при введенні шляху

	while((num=getc(f))!=EOF)
	
	{    //посимвольно копіюємо дані з файлу

	
		*p++=num;
		*p=0;
		
		
	}
	fclose(f);    //закриваємо потік
	return 1;     //якщо все правильно функція повертає "1"
}
Вероника99 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(С++) Обработка текстов. Юра5 Помощь студентам 1 09.12.2012 17:01
Мастер текстов alexsampler Microsoft Office Excel 5 06.12.2011 14:44
КОДИРОВКА ТЕКСТОВ maikuduk Фриланс 9 04.04.2010 17:18
Сцепление текстов Igor001 Microsoft Office Excel 3 13.02.2010 16:27
Цифры текстов Maruff Microsoft Office Excel 1 10.12.2009 18:16