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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 16:06   #1
lenincore
Новичок
Джуниор
 
Регистрация: 15.01.2012
Сообщений: 2
По умолчанию работа со строками (С++)

Подскажите, пожалуйста, что делаю не так.
Задание: Из имеющегося набора слов выбрать наиболее длинное, в котором все буквы разные. Например, лейкопластырь, неряшливость.
Со сравнением длины слов, еще не разобралась, но уже ошибка - программа делает противоположное заданию, т.е. выводит слова с повторяющимися буквами.
Код:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>

using namespace std;
// функция удаления лишних пробелов в строке
string trim (string str) 
{
	int i=0; // удаление пробелов из начала
	while (str[i]==' ')
		i++;
	str=str.erase(0,i);
	i=str.length()-1; // удаление концевых пробелов
	while (str[i]==' ') 
		i--;
	str=str.erase(i+1, str.length()-i+1);
	i=0; // удаление лишних пробелов в середине строки
	while (i<str.length())
		if (str[i]==' ' && str[i+1]==' ')
			str=str.erase(i,1);
		else i++;
	return str;
}
void chec(string lang,int n)
{ 
	int i=0;
	while (i<n-1)
	{ 
		int ind1=lang.find(" ")+i;
		int ind2=lang.find(" ", ind1+1);
		string word=lang.substr(ind1+1, ind2-ind1-1);
		int l=word.length();
		char first=word[0];
		char last=word[word.length()-1];
		for (int j=1; j<word.length()-1; j++)
		{
			char now=word[j];
			if (first==now) break;
			else first=now;
			if (now==last) cout<<word<<endl;
		}	
		i=ind2;
	}
	
}

void main()
{
	SetConsoleCP(1215);
	SetConsoleOutputCP(1215);
	string str;
	cout<<"Введите слова: "<<endl;
	getline(cin,str);
	str=trim(str);
	// добавление одного пробела в начале и в конце исходной строки
	// для того, чтобы каждое слово было ограничено пробелами
	str=" "+str+" ";
	int n=str.length();
	chec(str,n);
	getch();
}
lenincore вне форума Ответить с цитированием
Старый 15.01.2012, 17:14   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

lenincore

Подскажите, пожалуйста, что делаю не так.

слишком заморочено.

Код:
#include <iostream>
#include <sstream>
#include <locale>

#include <string>
#include <set>

#include <algorithm>
#include <iterator>

struct F : public std::binary_function<std::string, std::string, bool>
{
	bool operator()(const std::string& s1, const std::string& s2) const
	{
		return unique(s1) < unique(s2);
	}

	static size_t unique(const std::string& s)
	{
		std::set<char> v;
		std::copy(s.begin(), s.end(), std::inserter(v, v.begin()));
		return v.size();
	}
};

int main()
{
	setlocale(LC_ALL, "");

	std::string s;
	std::getline(std::cin, s);

	std::set<std::string, F> v;
	std::stringstream ss(s);

	typedef std::istream_iterator<std::string> I;
	std::copy(I(ss), I(), std::inserter(v, v.begin()));

	if (v.size())
		std::cout << *v.rbegin() << std::endl;

	return 0;
}
Rififi вне форума Ответить с цитированием
Старый 15.01.2012, 18:17   #3
lenincore
Новичок
Джуниор
 
Регистрация: 15.01.2012
Сообщений: 2
По умолчанию

Rififi, спасибо за рабочий код, но мне все же хотелось бы узнать, что не так с моим. Мне важно научится и понять, а как работает ваша программа я, к сожалению, не понимаю, т.к. с классами работала довольно посредственно.
lenincore вне форума Ответить с цитированием
Старый 16.01.2012, 00:28   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
#include <stdio.h>

int	unic( char *str ) {
	int i, j, n;

	n = i = 0;
	for( i = 0; str[ i ]; i ++ ) {
		for( j = 0; j < i; j ++ )
			if( str[ i ] == str[ j ] )
				break;
		n += ( j == i );
	}
	return n;
}
int main() {
	char	*str,
			**words;
	int		i, n, j;

	str = new char[ 255 ];
	words = new char*[255];
	gets( str );

	n = i = j = 0;
	while( 1 ) {
		words[ n ] = new char[ 255 ];
		while( ' ' == str[ i ] )
			i ++;
		j = 0;
		while( str[ i ] && ' ' != str[ i ] )
			words[ n ][ j ++ ] = str[ i++ ];
		words[ n ++ ][ j ] = 0;

		if( 0 == str[ i ++ ] )
			break;
	}

	delete []str;

	for( i = j = 0; i < n; i ++ )
		if( unic( words[ i ] ) > unic( words[ j ] ) )
			j = i;

	printf( "%s", words[ j ] );

	for( i = 0; i < n; i ++ )
		delete[] words[ i ];
	delete[] words;

	getchar();
	return 0;
}
что вы пытаетесь сделать в chec я не понял )
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками Katrina* Паскаль, Turbo Pascal, PascalABC.NET 3 20.12.2011 14:08
Работа со строками ЛераСочи Помощь студентам 4 13.12.2010 17:45
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Работа со строками. Galacticus Общие вопросы C/C++ 0 11.03.2009 16:49
работа со строками Milker-Monster Помощь студентам 1 02.11.2008 21:32