Официальный сайт студ.городка НГТУ
Программирование и БД » Нужна помощь с задачкой на С++ 

#1  16.12.09 20:16

Нужна помощь с задачкой на С++

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

Вообще не понимаю, как это реализовать.

Offline

#2  16.12.09 21:11

Re: Нужна помощь с задачкой на С++

что непонятного?

циклом ходишь по строке и ищешь пробелы - они означают границы между словами. Затем (как вариант) каждую найденную строку добавляешь в специальный массив строк, потом его сортируешь и записываешь в строку с помощью ф-ции strcat(char* исходная_строка, char* добавляемая_строка). Фсё.

Сравнение строк по алфавиту реализуется с помощью функции int strcmp(char* s1, char* s2).
если строки равны (алфавитно, s1==s2), то вызов данной функции возвращает 0,
если s1 > s2 , то возвращается число > 0
если s1 < s2 , то возвращается число < 0

например:
int result = strcmp("vtd", "vtb");
Здесь result будет больше нуля, потому что первые два символа совпадают, но третий нет - символ d больше чем символ b

Исправлено Смайлек (16.12.09 21:12)

Offline

#3  16.12.09 22:04

Re: Нужна помощь с задачкой на С++

Я не понимаю сам цикл разбития строки на массив слов, последующее их сравнение

Offline

#4  17.12.09 00:29

Re: Нужна помощь с задачкой на С++

вот примерный код для работы цикла разбиения:

Код: cpp:

#include <stdio.h>
#include <conio.h>
#include <string.h>
 
// функция, которая получает слово и производит с ним некие манипуляции
void work_with_word (char * word) {
   // выводим слово на экран.
   printf("[%d] %s\n", strlen(word), word);
 
   // -------------------------------------------------
   // в твоём случае сюда можно вместо вывода на экран
   // вставить код для добавления слова в массив строк или 
   // любые другие манипуляции с полученным словом
   // -------------------------------------------------
}
 
// main
int main() {
   // строка слов
   char * s = "  aaa   bbbb   ccc   dddd ";
   // длина строки
   int N = strlen(s); 
 
   // длина массива куда копируется очередное слово
   const int WLEN = 30; 
   // массив символов составляющих очередное найденное слово
   char word[WLEN] = {0};    
 
   int i; // i- индекс первой буквы в очередном слове
   int j; // j- индекс последней буквы в очередном слове
 
   // флаг, сигнализирующий о том, что текущий шаг цикла 
   // (текущий символ) находится внутри слова, а не между словами
   bool inWord = false; 
 
   // цикл по строке
   for(int n=0; n < N+1; n++) {
      // найден не-пробел, значит началось очередное слово
      if (inWord == false && s[n] != ' ') { 			 	
         // запомнили индекс первой буквы
         i = n;
         // переключили флаг, указывая на то, что "вошли" в слово
         inWord = true;
         continue;
      }
 
      // найден пробельный символ или символ конца строки
      // значит слово закончилось
      if (s[n] == ' ' || s[n] == '\0') {
         // если до этого момента цикл шёл по слову, а не пробелам
         if (inWord == true) {
            // запомнить индекс последней буквы
            j = n-1;
            // переключили флаг
            inWord = false;    
 
            // если слово имеет нулевую длину значит это пробел, 
            // окруженный другими пробелами, пропускаем такое "слово".
            // эта затычка нужна если исходная строка начинается с пробела или
            // если в строке встречаются несколько пробелов подряд.
            if (i >= j) continue;
 
            // копируем последовательность символов начиная с i-ого.
            // эта последовательность имеет длину j-i+1
            strncpy(word, s+i, j-i+1);	
 
            // обрабатываем полученное слово
            work_with_word( word );
 
            // затираем слово
            memset(word, 0, WLEN);
         } 
      }       
   }
 
   // приостановка программы для просмотра результатов работы программы
   getch();
}


Внутрь функции work_with_word вставишь свой код для обработки слова.

Как сравнивать строки по алфавиту, я привёл в предыдущем посте.

Исправлено Смайлек (17.12.09 00:36)

Offline

#5  22.12.09 20:10

Re: Нужна помощь с задачкой на С++

Код::

/*
Функция находит в строке самое первое (по алфавиту) слово. 
С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке. 
*/
#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();
}

Как можно бы упростить, чтобы было менее громозско?

Исправлено DaZzle (22.12.09 20:46)

Offline

#6  22.12.09 21:27

Re: Нужна помощь с задачкой на С++

убрать все пробелы и знаки переноса строки. gl

Offline

#7  22.12.09 23:09

Re: Нужна помощь с задачкой на С++

И убрать операторные скобки там, где один оператор в блоке :)

Offline

Программирование и БД » Нужна помощь с задачкой на С++ 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.113 сек.
Выполнено 11 запросов.