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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 18:32   #1
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию Указатели

Функция находит в строке самое первое (по алфавиту) слово. С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке.

Например: Янтарь Гранит Мрамор

Гранит Мрамор Янтарь
AquaticSoul вне форума Ответить с цитированием
Старый 15.12.2009, 20:51   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

ПОдожди, автор, уже скоро придет Волшебник, который за всех пишет домашние задания по программированию!
З.Ы. Тема обречена на удаление модератором
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 15.12.2009, 22:18   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ни тебе здрасьте, ни до свидания.
Я, конечно, понимаю, что тут пропущено "ХЕЛП!!! ПАМАГИТЕ ПЛЗ РЕШИТЕ БЕСПЛАТНА ПЖЛ ВСЕМ СПС!!!", но даже в C++ отменили "int по умолчанию"!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 15.12.2009, 22:22   #4
Дырдин
Пользователь
 
Аватар для Дырдин
 
Регистрация: 26.09.2009
Сообщений: 81
По умолчанию

Парься с Аски-таблицой
Дырдин вне форума Ответить с цитированием
Старый 16.12.2009, 01:42   #5
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

#include <algorithm>
метод sort()
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 22.12.2009, 15:13   #6
AquaticSoul
Нубик в С++
Пользователь
 
Аватар для AquaticSoul
 
Регистрация: 15.12.2009
Сообщений: 42
По умолчанию

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


char *F(char *str, char** word) 
{
	char *p = str; // указатель на просматриваемый символ	

	// первый раз просматривая строку считаю количество слов в ней:

	int count = 0; // счётчик слов в строке

	for(int b = 0; 1; p++) 
	{
		if(*p == ' ' || *p == '\n' || *p == ',' || *p == '.' || *p == ':' || *p == ';' || *p == '!')
		{
			if(b == 1) 
			{
				count++;
				b = 0;
			}
		}
		else if(*p == '\0')
		{
			if(b == 1) 
			{
				count++;
				b = 0;
			}
			break;
		}
		else
		{
			b = 1;
		}
	}
	if(count==0)return "";
	// второй раз просматривая строку считаю длину каждого слова:

	int len = 0; // длина текущего слова
	int *mas_len = new int[count]; // массив всех длин

	
	p = str; // устанавливаюсь на начало строки

	for(int index = 0, b=0; 1; p++) 
	{
		if(*p == ' ' || *p == '\n' || *p == ',' || *p == '.' || *p == ':' || *p == ';' || *p == '!')
		{
			if(b == 1) 
			{
				mas_len[index] = len;
				len = 0;
				b = 0;
				index++;
			}
		}
		else if(*p == '\0')
		{
			mas_len[index] = len;
			break;
		}
		else
		{
			len++;
			b = 1;
		}
	}

	// выделяю память под массив слов:
	char **mas_word = new char*[count];
	for(int i=0; i<count; i++) 
	{
		mas_word[i] = new char[mas_len[i]+1];
	}
	// третий раз просматривая строку записываю каждое слово в отдельный массив:

	p = str;

	for(int w=0, c=0, b=0; 1; p++)
	{
		if(*p == ' ' || *p == '\n' || *p == ',' || *p == '.' || *p == ':' || *p == ';' || *p == '!')
		{
			if(b == 1) 
			{
				mas_word[w][c] = '\0';
				w++;
				c=0;
			}
			b=0;
		}
		else if(*p == '\0')
		{
			if(b==1)
			{
				mas_word[w][c] = '\0';
			}
			break;
		}
		else
		{
			b=1;
			mas_word[w][c] = *p;
			c++;
		}
	}
	

	// // // // // // // // // // // // // // // // // // // // // // // // //


	int *l_str = new int[count]; // логическая строка
	for(int i=0; i<count; i++) l_str[i] = 1;

	for(int c=0; 1; c++) // i-ые символы
	{
		// ищу минимальный в строке
		char min = 'z';
		for(int w=0; w<count; w++)
		{
			if(l_str[w] == 1)if(mas_word[w][c] < min) min = mas_word[w][c];
		}
		if(min == 0) // одна или несколько строк закончились
		{
			// нахожу первую закончившуюся строку и возвращаю
			for(int i=0; i<count; i++)
			{
				if(l_str[i] == 1 && mas_word[i][c] == '\0') 
				{
					*word = mas_word[i];
					l_str[i] = -1;
					// вычисляю длинну возвращаемой строки:
					int len_returned_str = 0;
					for(int b=0; b<count; b++) if(l_str[b] != -1) len_returned_str += mas_len[b] + 1;
					char* string = new char[len_returned_str + 1];
					for(int ww=0, ind=0; ww<count; ww++) 
					{
						if(l_str[ww] != -1)
						{
							char *p = mas_word[ww];
							while(*p != '\0')
							{
								string[ind]=*p;
								p++;
								ind++;
							}
							string[ind] = ' ';
							ind++;
						}
					}
					string[len_returned_str] = '\0';
					return string;
				}
			}
		}
		// корректировка логической строки:
		for(int w=0; w<count; w++)
		{
			if(l_str[w] == 1) if(mas_word[w][c] > min) l_str[w] = 0;
		}
		// считаю количество оставшихся строк:
		int kol = 0;
		for(int i=0; i<count; i++) 
		{
			if(l_str[i] == 1) 
			{
				kol++;
			}
		}
		// если осталась одна - возвращаю её:
		if(kol == 1) 
		{
			for(int i=0; i<count; i++) if(l_str[i] == 1) 
			{
				*word = mas_word[i];
				// вычисляю длинну возвращаемой строки:
				int len_returned_str = 0;
				for(int b=0; b<count; b++) if(l_str[b] != 1) len_returned_str += mas_len[b] + 1;
				char* string = new char[len_returned_str + 1];
				for(int ww=0, ind=0; ww<count; ww++) 
				{
					if(l_str[ww] != 1)
					{
						char *p = mas_word[ww];
						while(*p != '\0')
						{
							string[ind]=*p;
							p++;
							ind++;
						}
						string[ind] = ' ';
						ind++;
					}
				}
				string[len_returned_str] = '\0';
				return string;
			}
		}
	}
}


char* sum_str(char* s1, char* s2)
{
	// размер первой:
	int s1_len = 0;
	for(int i=0; s1[i] != '\0'; i++) s1_len++;

	// размер второй:
	int s2_len = 0;
	for(int i=0; s2[i] != '\0'; i++) s2_len++;

	char* new_str = new char[s1_len + s2_len + 1];

	int index = 0;

	// переписываю первую:
	for(int i=0; s1[i] != '\0'; i++, index++) new_str[index] = s1[i];

	// переписываю вторую:
	for(int i=0; s2[i] != '\0'; i++, index++) new_str[index] = s2[i];

	// конец строки:
	new_str[s1_len + s2_len] = '\0';

	return new_str;
}


void main()
{
	printf("Vvedite stroku: ");
	char* string = new char[150];
	gets(string);

	
	char* word = new char[100];

	char* new_str = "";

	while(1)
	{
		string = F(string,&word);
		new_str = sum_str(new_str,word);
		new_str = sum_str(new_str," ");
		if(string[0]=='\0') break;
		
	}
	printf("%s",new_str);
	_getch();
}
Как можно было бы упростить, чтобы было не так громозско?
AquaticSoul вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели olli Общие вопросы C/C++ 3 20.05.2009 19:40
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
указатели Armina Общие вопросы C/C++ 4 22.04.2009 20:05
Указатели spirit0k Общие вопросы C/C++ 2 26.03.2009 15:16
Указатели Mango Помощь студентам 2 09.12.2008 12:15