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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2010, 11:41   #1
Matr1x
Студент
Пользователь
 
Аватар для Matr1x
 
Регистрация: 10.11.2009
Сообщений: 49
По умолчанию Преобразовать строку таким образом, чтобы буквы каждого слова в ней были отсортированы по возрастанию.

Помогите пожалуйста советом или подкинутым кодом) вот задание. Преобразовать строку таким образом, чтобы буквы каждого слова в ней были отсортированы по возрастанию.
тут рабочий код программы под упорядочивание всей строки, если ввести слова через пробелы, то ответ выдает смазанный пример : dsa dsa ответ будет aaddss
Код:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
const int max_razmer=255;
using namespace std;
int sortirovka(char *us,int len);


int main()
{
	char us[max_razmer];
	gets(us); // ввод строки
	int len = strlen(us); // узнаем длину введенной строки
	sortirovka(us,len);	
	puts(us); // вывод строки
	return 0;
}
int sortirovka(char *us,int len) // функция для упорядочивания букв
{
	int vixod=0;
	do
	{
		vixod=1;
		for(int i=0;i<(len-1);i++)
		{
			if(us[i]>us[i+1])
			{
				char tmp=us[i];
				us[i]=us[i+1];
				us[i+1]=tmp;
				vixod=0;
			}
		}		
	}
	while(vixod!=1);
	return 1;
}
была идея вначале запихивать в массив слова между пробелами, отправлять их в функцию по упорядочиванию, а по возвращению присваивать отдельному массиву с пробелом, и так циклично всю строчку...
заранее спасибо!

Последний раз редактировалось Matr1x; 06.01.2010 в 11:47.
Matr1x вне форума Ответить с цитированием
Старый 06.01.2010, 12:58   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

У тебя все готово. Просто читай строку по словно и передавай в их в метод sortirovka. По словам читать легко. Идешь по каждому символу, если встретился разделитель(пробел, зпт, тчк и т.д.), то от предыдущего разделителя до текущего по индексам берешь слово. Для первого слова позиция предыдущего разделителя = 0.
Hollander вне форума Ответить с цитированием
Старый 06.01.2010, 14:09   #3
Matr1x
Студент
Пользователь
 
Аватар для Matr1x
 
Регистрация: 10.11.2009
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Hollander Посмотреть сообщение
У тебя все готово. Просто читай строку по словно и передавай в их в метод sortirovka. По словам читать легко. Идешь по каждому символу, если встретился разделитель(пробел, зпт, тчк и т.д.), то от предыдущего разделителя до текущего по индексам берешь слово. Для первого слова позиция предыдущего разделителя = 0.
спасибо!, так и начал делать еще до прочтения поста, очень объемно получается, как закончу выложу
Matr1x вне форума Ответить с цитированием
Старый 06.01.2010, 16:19   #4
Matr1x
Студент
Пользователь
 
Аватар для Matr1x
 
Регистрация: 10.11.2009
Сообщений: 49
По умолчанию

ппц запарился, во че получилось)) главно чтобы к объему препод не придрался.
Код:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
const int max_razmer=255;
using namespace std;
char *sortirovka(char *buff,int len_kyska);
int *probeli(int *space,char *us,int len);
int kolvo_probelov(char *us,int len);
char *razbienie(char *us,int len,int probel);

int main()
{
	char *us,*buff,vivod[max_razmer];
	for(int i=0;i<max_razmer;i++)vivod[i]=NULL; // антибаггер
	int *space,kol_probelov,probel,len_kyska,t=0;
	us=new char[max_razmer];
	space=new int[max_razmer];
	gets(us); // ввод строки
	int len=strlen(us); // узнаем длину введенной строки
	space=probeli(space,us,len);	
	kol_probelov=kolvo_probelov(us,len);	
	for(int i=0;i<kol_probelov;i++)
	{
		probel=space[i]; // задаем начало слова		
		buff=razbienie(us,len,probel); // получаем кусок строки
		len_kyska=strlen(buff);
		buff=sortirovka(buff,len_kyska); // упорядочиваем буквы в куске строки
		if(probel!=0) vivod[probel-1]=' '; // ставим пробел
		if(t<1) strcpy(vivod,buff); // заполняем массив
		else strcat(vivod,buff); //    на вывод		
		t+=1; // условие захода в иф		
	}
	puts(vivod); // вывод строки
	return 0;
}
int *probeli(int *space,char *us,int len) //функция по нахождению начала строки и пробелов
{
	int num_space=0,k=0;
	space[k]=0; //ассоциация начала строки
	for(int i=0;i<(len-1);i++)
	{		
		num_space+=1; // счетчик для улавливания пробелов
		if(us[i]==' ')
		{
			k+=1; // счетчик для заполнения массива
			space[k]=num_space; //ассоциация пробелов	-1		
		}
	}	
	return space;
}
int kolvo_probelov(char *us,int len) // считает количество пробелов в строке + начало
{
	int kol_probelov,number=0;
	for(int i=0;i<(len-1);i++)
	{
		if(us[i]==' ')
		{
			number+=1;
		}
	}
	kol_probelov=number+1; //еще +1 т.к. учитываем начало строки
	return kol_probelov;
}
char *sortirovka(char *buff,int len_kyska) // функция для упорядочивания букв
{
	int vixod=0;
	do
	{
		vixod=1;
		for(int i=0;i<(len_kyska-1);i++)
		{
			if(buff[i]>buff[i+1])
			{
				char tmp=buff[i];
				buff[i]=buff[i+1];
				buff[i+1]=tmp;
				vixod=0;
			}
		}		
	}
	while(vixod!=1);
	return buff;
}
char *razbienie(char *us,int len,int probel) //функция для разбиения строки на маленькие строки
{
	char *buff;
	buff=new char[max_razmer];
	for(int i=0;i<10;i++)buff[i]=NULL; // антибаггер
	for(int i=probel,s=0;i<max_razmer,s<max_razmer;i++,s++)
	{
		if(us[i]==' ') break;		
		buff[s]=us[i];
	}		
	return buff;
}
Matr1x вне форума Ответить с цитированием
Старый 07.01.2010, 21:38   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

сложно чета получилось у тебя. стл рулит

Код:
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>

using namespace std;

bool IsWordSeparator(char ch)
{
  // если сивмол не буква и не цифра, то это разделитель слов
  return !isalpha(ch) && !isdigit(ch);
}

void SortWords(string& str)
{
  for (string::iterator iter = str.begin(), end = str.end(); iter != end;)
  {
    // ищем первый не разделитель слов
    iter = find_if(iter, end, not1(ptr_fun(IsWordSeparator)));
    if (iter != end)
    {
      // нашли. теперь ищем разделитель слов, начиная со следующего за неразделителем символа
      string::iterator wordEnd = find_if(iter + 1, end, &IsWordSeparator);
      // полученные итераторы (iter и wordEnd) - это итераторы на начало и конец слова.
      // сортируем этот интервал
      sort(iter, wordEnd);

      // подготовка к следующей итерации
      iter = wordEnd;
      if (iter != end)
        ++iter;
    }
  }
}

int main()
{
  string str = "321, dsf, dfd,  gdfs gda;,";
  cout << "Before sorting: " << str << endl;
  SortWords(str);
  cout << "After sorting:  " << str << endl;
  return 0;
}

Последний раз редактировалось _Ч_; 07.01.2010 в 22:25.
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ. Удалить слова, которые содержат все повторяющиеся буквы первого слова nick23 Помощь студентам 7 01.11.2009 14:47
Матрица m*n и числа по возрастанию в ней BotoBot Паскаль, Turbo Pascal, PascalABC.NET 3 01.06.2009 01:49
Дана строка символов.Преобразовать строку,заменив в ней каждую из групп стоящих рядом точек одной точкой V I K T O R I Y A Паскаль, Turbo Pascal, PascalABC.NET 1 03.05.2009 09:56
Дана строка S. Преобразовать строку, заменив в ней каждое многоточие одной точкой.Строки в C++ slog Помощь студентам 9 16.12.2008 20:14
Как сделать чтобы новые строки всегда были в области видимости? neugadal Microsoft Office Excel 9 06.09.2008 12:23