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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2010, 21:43   #1
RZMTZM
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 22
Восклицание (Си) Замена слов наименьшей длины в массиве строк

Задание у меня таково, что нужно ввести текст с заданным количеством строк, массив символов-разделителей, и слово. Сформировать новый текст, состоящий только из строк с нечетным количеством слов. Потом в этом тексте нужно заменить все слова минимальной длины на это заданное слово, а потом вывести новый массив. Я доделал до замены слов. Напишите, пожалуйста, как заменять слова. Что-то мне не допереть) А сдавать завтра, или отчислят=(

сформированный массив - new_text, заменяющее слово - new_word

Код:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <iostream.h>
#include <string.h>
void main (void)
{
	int a, i, j, k, l, min, kol_strok, kol_razd, kol_slov;
	char *new_word, **text, **new_text, b, *razd;
	clrscr();
	printf("BBeguTe KoJIu4ecTBo cTpoK");
	scanf("%d", &kol_strok);
	text=(char**)malloc(kol_strok*sizeof(char));
	for(i=0; i<kol_strok; i++)
		text[i]=(char*)malloc(sizeof(char));
	printf("nocTpo4Ho BBeguTe TeKcT");
	for(i=0, b=' '; b!='\n' || i<kol_strok; i++)
	{
		b=getchar();
		text[i]=(char*)realloc(text[i], (j+1)*sizeof(char));
		if(b!='\n')
		{
			text[i][j]=b;
			j++;
		}
		else
			text[i][j]='\0';
	}
	razd=(char*)malloc(sizeof(char));
	new_text=(char**)malloc(kol_strok*sizeof(char));
	printf("BBeguTe cuMBoJIbI-pa3geJIuTeJIu");
	i=0;
	b=' ';
	while(b!='\n')
	{
		b=getchar();
		razd=(char*)realloc(razd, (i+1)*sizeof(char));
		if(b!='\n')
		{
			razd[i]=b;
			i++;
		}
		else
			razd[i]='\0';
	}
	kol_razd=strlen(razd);
	do
	{
		do
		{
			j=0;
			while(j<kol_razd)
			{
				if(text[i][j]!=razd[k])
					k++;
				else
					break;
			}
			if(j==kol_razd)
			{
				l++;
				if(text[i][j+1]=='\0')
					kol_slov++;
			}
			else
			{
				if(l!=0)
					kol_slov++;
				if(min>l)
					min=l;
				l=0;
			}
			j++;
		}
		while(text[i][j]!='\0');
		a=kol_slov%2;
		if(a!=0)
		{
			a=strlen(text[i]);
			new_text[l]=(char*)malloc(a*sizeof(char));
			strcpy(new_text[l], text[i]);
		}
		i++;
	}
	while(i<kol_strok);
	printf("BBeguTe cJIoBo");
	new_word=(char*)malloc(sizeof(char));
	i=0;
	b=' ';
	while(b!='\n')
	{
		b=getchar();
		new_word=(char*)realloc(new_word, (i+1)*sizeof(char));
		if(b!='\n')
		{
			new_word[i]=b;
			i++;
		}
		else
			new_word[i]='\0';
	}

Последний раз редактировалось RZMTZM; 24.01.2010 в 21:51.
RZMTZM вне форума Ответить с цитированием
Старый 24.01.2010, 22:34   #2
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

У тебя представленный код рабочий?
(у меня дает ошибку на realloc)

P.S. Почему используешь такой блок
Код:
for(i=0, b=' '; b!='\n' || i<kol_strok; i++)
	{
		b=getchar();
		text[i]=(char*)realloc(text[i], (j+1)*sizeof(char));
		if(b!='\n')
		{
			text[i][j]=b;
			j++;
		}
		else
			text[i][j]='\0';
	}
а не:
Код:
for(i=0; i<kol_strok; i++)
gets(text[i]);
BleStaR вне форума Ответить с цитированием
Старый 24.01.2010, 23:04   #3
RZMTZM
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 22
По умолчанию

Потому что память выделяю... Сказали так сделать..
RZMTZM вне форума Ответить с цитированием
Старый 24.01.2010, 23:32   #4
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Ладно, дело твое... видимо у тебя все работает нормально, кроме замены слов... Тогда просто расскажу теорию как заменять слова в char'овских массивах.

P.S.
как у тебя работают do-while'ы???
ведь в:
Код:
while(j<kol_razd)
{
if(text[i][j]!=razd[k])
	k++;
else
	break;
}
либо ошибка (выход за пределы массива):
    1)условие заведомо верное (т.к. хотя бы один разделитель будет)
    2)он выйдет из цикла тока в том случае если ОДИН КОНКТРЕТНЫЙ символ text[i][j] равен какому нибудь разделителю (а это мало вероятно, т.к. i [равное количесту разделителей] не обнулялась при входе в do-while и не изменяется в теле while'a. Аналогично j равное 0 не изменяется. Т.е. если text[kol_razd][0] не равен ни одному из разделителей, то k в итоге примет значение больше чем длина массива razd
либо счастливая случайность:
      символ text[kol_razd][0] все же равен одному из разделителей
либо логика которая работает и которую я так и не понял!!!))))))
BleStaR вне форума Ответить с цитированием
Старый 24.01.2010, 23:32   #5
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Ладно, дело твое... видимо у тебя все работает нормально, кроме замены слов... Тогда просто расскажу теорию как заменять слова в char'овских массивах.

P.S.
как у тебя работают do-while'ы???
ведь в:
Код:
while(j<kol_razd)
{
if(text[i][j]!=razd[k])
	k++;
else
	break;
}
либо ошибка (выход за пределы массива):
    1)условие заведомо верное (т.к. хотя бы один разделитель будет)
    2)он выйдет из цикла тока в том случае если ОДИН КОНКТРЕТНЫЙ символ text[i][j] равен какому нибудь разделителю (а это мало вероятно, т.к. i [равное количесту разделителей] не обнулялась при входе в do-while и не изменяется в теле while'a. Аналогично j равное 0 не изменяется. Т.е. если text[kol_razd][0] не равен ни одному из разделителей, то k в итоге примет значение больше чем длина массива razd
либо счастливая случайность:
      символ text[kol_razd][0] все же равен одному из разделителей
либо логика которая работает и которую я так и не понял!!!))))))
BleStaR вне форума Ответить с цитированием
Старый 24.01.2010, 23:51   #6
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

В кратце теория замены слов:
1)Дано:
а)Длина слова, которое надо заменить (L1)
б)Индекс первого символа слова, которое надо заменить (I1)
в)Длина нового слова(L2)
2)Действия:
а)Считается разница длин слов (L2-L1=R)
если R>0 длина массива увеличивается на R элементов и производится смещение элеметов вправо [смещение с послденего элемента до I1+L1 не включая]. Новое слово посимвольно записывается в массив начиная с I1 элемента
если R<0 производится смещение элементов влево на |R| элементов [смещение с I1+L1+1 включая до последнего]. Длина массива уменьшается на |R| элементов. Новое слово посимвольно записывается в массив начиная с I1 элемента
если R==0 Новое слово посимвольно записывается в массив начиная с I1 элемента
BleStaR вне форума Ответить с цитированием
Старый 25.01.2010, 00:06   #7
RZMTZM
Пользователь
 
Регистрация: 10.12.2009
Сообщений: 22
По умолчанию

Ага... Только этих слов может быть несколько в одной строке, а может и не быть... А индексы я их не знаю.. Но все равно спасибо, может получится)
RZMTZM вне форума Ответить с цитированием
Старый 25.01.2010, 00:30   #8
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

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

А по поводу индексов слов более менее рационально можно сделать так:
Создаешь динамический массив типа int (mas_index). когда ты ищешь слово с минимальной длиной, ты пробегаешь по всему массиву и сравниваешь длину текущего слова с ранее найденным (на текущий момент самым коротким). Просто добавь еще один if который будет проверять равны ли длины этих слов, если да то запиши индекс первого символа в mas_index. Если нашел более короткое слово, то mas_index изменяет свои размеры до одного и записывает новый индекс.

Тут главное помнить что при выполнении алгоритма замены слов индексы слов (которые хранятся в mas_index) тоже будут изменяться на -R или +R при каждой замене.
BleStaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена слов в Office noMaster Microsoft Office Word 2 19.12.2009 19:05
excel Определить максимальное и минимальное значение длины слов в таблице Nibbler Помощь студентам 0 05.12.2009 22:42
Поиск и замена слов. ildarn Общие вопросы C/C++ 1 25.11.2009 19:01
замена слов lekom Общие вопросы Delphi 7 27.09.2009 23:46
замена столбцов в массиве DeFace Общие вопросы C/C++ 10 10.01.2009 23:16