#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
#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
#7 22.12.09 23:09
Re: Нужна помощь с задачкой на С++
И убрать операторные скобки там, где один оператор в блоке :)
Offline

