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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2012, 01:55   #1
Tim Grey
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 4
По умолчанию Удалить из строки повторные вхождения слов

Написать программу на Си:
Задана строка, слова в которой разделены запятыми, после последнего слова - точка. Удалить из нее повторные вхождения слов.
Tim Grey вне форума Ответить с цитированием
Старый 15.12.2012, 01:57   #2
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Ну и как есть идеи? или более этого тебе показать нечего?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 15.12.2012, 02:05   #3
Tim Grey
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 4
По умолчанию

"Средства у нас есть... У нас ума не хватает." (с)
Вообще, есть идея по очереди сравнивать слова друг с другом и бросить те самые повторные вхождения в другой массив. Но как это сделать?..
Tim Grey вне форума Ответить с цитированием
Старый 15.12.2012, 02:13   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

друг, можно разбить приложение на слова, запросто.. мне всё равно... что их делит... у меня лишь возникнет одна проблемка..... как мне узнать позицию в строке....

дробим

Код:

char deliminate[] = " ,.";
char* word = strtok("Здесь какая то строка", deliminate); 
do //мы попадём в цикл, столько сколько слов
{
word <-- тут слово будет
}
while(word = strtok(NULL, deliminate))
нет я знаю... но я хотел бы услышать и твои предложения.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Stilet; 15.12.2012 в 15:12.
Perchik71 вне форума Ответить с цитированием
Старый 15.12.2012, 02:23   #5
Tim Grey
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 4
По умолчанию

У меня есть набросок решения на эту прогу, но я не могу понять, почему он мне после ввода строки выводит все ее элементы "елочкой" и только потом выводит строку без повторений?

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

void main()
{
 char s[60], slovo[10], slovo1[10];
 char Mas_sl[20][10];
 int prov[20], razm[20];
 gets(s);

 int i, j, p=0, strok=0;
 for(i=0; i<strlen(s); i++)
	{
	 if (((s[i]==' ')||(s[i]==',')||(s[i]=='.'))&&(s[i-1]!=','))
		{
		 for (j=0; j<strlen(slovo); j++)
			{
			 Mas_sl[strok][j]=slovo[j];
			 Mas_sl[strok][j+1]='\0';
			 }
		 razm[strok]=strlen(slovo)+1;
		 strok++;
		 strcpy(slovo, "");
		 p=0;
		 }
	 else if ((s[i]!=' ')&&(s[i]!='.')&&(s[i]!=','))
		{
		 slovo[p]=s[i];
		 slovo[p+1]='\0';
		 p++;

	 }
	}
 for (i=0; i<20; i++)
	prov[i]=1;
 strok=strok-1;

 for (i=0; i<strok; i++)
	{
	 p=0;
	 while (Mas_sl[i][p]!='\0')
		{
		 slovo[p]=Mas_sl[i][p];
		 slovo[p+1]='\0';
                 puts(slovo);
		 p++;
		 }
	 for (j=i+1; j<=strok; j++)
		{
		 p=0;
		 while (Mas_sl[j][p]!='\0')
			{
			 slovo1[p]=Mas_sl[j][p];
			 slovo1[p+1]='\0';
                         puts(slovo1);
			 p++;
			 }
		 if(!(strcmp(slovo, slovo1))) prov[j]=0;
                 printf("%i\n", prov[j]);
		 }
	 }

for (i=0; i<=strok; i++)
	if (prov[i]==1)
		{
		 printf("%s ", Mas_sl[i]);
		 }
 }
Tim Grey вне форума Ответить с цитированием
Старый 15.12.2012, 02:41   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Простой код, путь к совершенству.

перейдём к цели.

Код:
struct s_povtor
{
char* word; //слово
int count;    //кол-во раз
};

....

char deliminate[] = " ,.";
bool flag = false;
int count_word = 0, i; // всего слов, вспомогательная переменая
s_povtor povtor[100]; // сделаем массив в 100, памяти жопой ешь.
char* word = strtok("Здесь какая то строка", deliminate); 
do //мы попадём в цикл, столько сколько слов
{
  flag = false;
  for(i = 0; i < count_word; i++) // сравнение слов в базе
  {
     if(!strcmp(povtor[i].word, word))
     {
        povtor[i].count++;
        flag = true;
        break;
     }
  }
  if(flag)
  {
     povtor[count_word].word = new char[strlen(word) + 1];
     strcpy(povtor[count_word].word, word);
     povtor[count_word].count = 1;
  }
  count_word++;
}
while(word = strtok(NULL, deliminate));
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 15.12.2012, 02:42   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Вопросы, что не понятно, что разъяснить?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 15.12.2012, 03:38   #8
Tim Grey
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 4
По умолчанию

Непонятно само описание программы в начале.
В первом цикле for стоит count_word, которому присвоено значение 0. Оно вообще так что-то считать будет? (i=0; i<0; i++) Может лучше заменить его на strlen()?
И булевая... Она не на всех компиляторах проходит. Мой ошибку выдает.
Tim Grey вне форума Ответить с цитированием
Старый 15.12.2012, 14:56   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

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

Код:
for (j=i+1; j<=strok; j++)
		{
		 p=0;
		 while (Mas_sl[j][p]!='\0')
			{
			 slovo1[p]=Mas_sl[j][p];
			 slovo1[p+1]='\0';
                         puts(slovo1);
			 p++;
			 }
		 if(!(strcmp(slovo, slovo1))) prov[j]=0;
                 printf("%i\n", prov[j]); // <-- елочкой делает вот что
		 }
	 }

for (i=0; i<=strok; i++)
	if (prov[i]==1)
		{
		 printf("%s ", Mas_sl[i]); 
		 }
ну или исправь у себя... задроби принтф
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Stilet; 15.12.2012 в 15:14.
Perchik71 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC.Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложения. powersej Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2012 21:07
Pascal ABC.Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложения powersej Помощь студентам 0 13.12.2012 20:41
Дана последовательность слов разделенных пробелами, удалить из нее повторные вхождения слов.С++ Bullrock Помощь студентам 4 01.03.2012 13:16
Дан файл, компоненты которого являются целыми числами. Преобразовать его, исключив повторные вхождения одного и того же Vikulyaa Помощь студентам 2 05.10.2011 19:15
С++. Файлы. Исключить из первого повторные вхождения Анастасия18 Помощь студентам 0 21.05.2011 18:16