Форум программистов, компьютерный форум CyberForum.ru

Сортировка слов в строке по алфавиту - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.87
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
16.12.2010, 16:26     Сортировка слов в строке по алфавиту #1
Дана строка из слов через пробел.Надо рассортировать слова по алфавиту и распечатать новую строку.
Использовать библиотеки iostream и string.Нельзя пользоваться поинтерами и динамичискими массивами.

То что я сделал работает так,выдирает слова из строки в 2 дополнительные строки сравнивает и меняет их если нужно.Если все слова одинаковой длинны все работает отлично,как только слова разной длинны начинается бардак.Не могу понять почему

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
void sorting(string user_string,int word_count)
{ int arr[max_size];
  int offset=0,a=0;
  cout << "Array one:" << endl;
     while((offset=user_string.find(" ", offset))!=string::npos)   // проверяет где стоят пробелы
        {      offset++;
               arr[a]=offset;
               a++;
               cout << offset << ", " << endl;
                
        }
    int u_length=user_string.length();
    int m1_length=0;
    int s1_length=0;
    string main_string;
    string slave_string;
    int mloop=word_count-1,sloop=mloop;
    int m_start=0;
    int m_length=arr[0]-1;
    int s_start=0;
    int s_length=0;
    int d=0;
  
    for(int i=0,j=1;i<mloop;i++,j++)    // верхний луп работатет с первым словом
  {
      
      main_string=user_string.substr(m_start,m_length);   
      for(int n=0,m=1;n<sloop;n++,m++)     //этот по одному сравнивает остальные слова с первым
       {
        s_start=arr[n+d];
        cout << "S_start:" << s_start << endl;      
        if(n==sloop-1){s_length=u_length-arr[n+d];}
        else {s_length=arr[m+d]-arr[n+d]-1;}
        cout << "User l:"<< u_length<<endl;
        cout << "Array:" << arr[n]<< endl;
        cout << "S_lengh:" << s_length << endl;
        slave_string=user_string.substr(s_start,s_length);
        cout << "Main string before:"<< main_string << endl << "Slave string before:"<< slave_string<< endl;
        if(main_string.compare(slave_string)>0)
          {main_string.swap (slave_string);}
        cout <<"main string:"<< main_string << endl << "slave string:" << slave_string << endl;
        cout<< "M_start:"<<m_start<<endl;
        m1_length=main_string.length();
        s1_length=slave_string.length();
        //if(m1_length>m_length){m_start=m_start+(m1_length-m_length);}
        user_string.replace(m_start,m_length,main_string);
        if(m1_length>m_length){s_start=s_start+(m1_length-m_length); s_length=m1_length;}
        user_string.replace(s_start,s_length,slave_string);
        cout << "user_string:" << user_string << endl;
          offset=0;
          cout << "array:" ;
        while((offset=user_string.find(" ", offset))!=string::npos)    // очередной поиск пробелов после замены
         {      offset++;
                arr[a]=offset+1;
                a++;
                cout << arr[a]<< ", " << endl;
          }
        
      }
      sloop--;
      d++;
      m_start=arr[i];
      m_length=arr[j]-arr[i]-1;
 
  }
Вообщем использую пузырьковый метод.
Буду очень благодарен если все это можно сделать более легким способом.Кстати если слова только 2 то проблемы нет
Вся куча coutов это только для меня чтоб смотреть что происходит с переменными,в конечной функций их не будет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
16.12.2010, 17:02     Сортировка слов в строке по алфавиту #2
более простой вариант: создать массив слов размерностью k, равной числу пробелов +1. И просто сравнить их в двойном цикле.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
16.12.2010, 18:49  [ТС]     Сортировка слов в строке по алфавиту #3
Цитата Сообщение от vx5 Посмотреть сообщение
более простой вариант: создать массив слов размерностью k, равной числу пробелов +1. И просто сравнить их в двойном цикле.
Нельзя пользоваться поинтерами и динамичискими массивами.
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
16.12.2010, 22:34     Сортировка слов в строке по алфавиту #4
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void sorting(string& str)
int k=0;
//считаем пробелы
for(int i=0;i<str.length();i++) if(str[i]==" ") k++;
string words[k+1]; 
k=0;
int word_begin=0,word_end=0;
//заполняем массив строк
for (int i=0; i<str.length();i++)  
  {
    if(str[i]==" ") 
    {
      word_end=i;
      for(int j=word_start;j<word_end;j++) words[k]+=str[j];
      k++;
    }
  }
// сортируем массив строк
for(int i=0;i<k;i++)
  for(int j=i;j<k;j++)
    if(words[i]>words[j]) 
      {
         tmp=words[i]; 
         words[i]=words[j];
         words[j]=tmp;
       }
str="";
//вставляем отсортированный вариант в исходную строку(теперь можно из маина просто считать строку, вызвать функцию и вывести строку, уже отсортированную)
for(int i=0;i<k;i++) str+=words[i];
}
Добавлено через 4 минуты
без динамических массивов, без поинтеров. со ССЫЛКОЙ, иначе непонятно зачем такая функция нужна, ничего не вернешь, ничего не преобразуешь.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
16.12.2010, 23:28  [ТС]     Сортировка слов в строке по алфавиту #5
Не совсем то что нужно,на сколько я понял то что ты написал сортирует по буквам.А мне надо сортировать слова.
В принципе это только часть задания.
Целиком задание написать 3 функций.
1.Получить от пользователя размер числового масива, попросить его заполнить и выдать в ответе число повторяющееся больше всего раз и сколько раз оно повторяется
2.Получить от пользователя список слов через пробел отсортировать слова по алфавиту и выписать так же через пробел обратно
3.Поучить от пользователя список слов через пробел,поисковое слово и слово на замену.Найти поисковое слово в начальном списке и заменить его на 3ье.

Все это объединить в меню где пользователь выбирает что он хочет сделать.

Я сделал уже почти все,не могу справиться со 2ой функцией.Принять предложение и посчитать количество слов у меня вышло.Не выходит именно сортировка,функция которую я написал получает принятую строку и уже подсчитаное количество слов.Опять же когда слова одной длинны все работает отлично.Проблема именно в словах разной длинный.Видимо я где то напутал с координатами для str.replace(),но ни как не могу понять где.

В принципе мне не к спеху,на оценку это не влияет.Мне главное понять как это сделать и где моя ошибка.На зачете интернета с ответами не будет,поэтому важно дойти до уровня когда я сам могу писать свободно функций со строками
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
16.12.2010, 23:56     Сортировка слов в строке по алфавиту #6
2.Получить от пользователя список слов через пробел отсортировать слова по алфавиту и выписать так же через пробел обратно
именно это и делает
Алгоритм такой: Программа находит пробелы, по ним слова и добавляет слова в массив слов. Далее соритирует массив слов по алфавиту и вводит слова в отсортированной порядке в строку.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 00:17  [ТС]     Сортировка слов в строке по алфавиту #7
Странно
Просто вот этот кусок
C++
1
2
3
4
5
6
if(words[i]>words[j]) 
      {
         tmp=words[i]; 
         words[i]=words[j];
         words[j]=tmp;
       }
это именно побуквенная замена или я не прав?
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
17.12.2010, 00:24     Сортировка слов в строке по алфавиту #8
Там есть очепятки, писал прямо здесь. Вот полностью рабочий вариант, даже проверил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <iostream>
using namespace std;
 
string sorting(string str)
{
int k=0;
//считаем пробелы
 for(int i=0;i<str.length();i++) if(str[i]==' ') k++;
string words[k+1]; 
k=0;
int word_begin=0,word_end=0;
//заполняем массив строк
for (int i=0; i<str.length();i++)  
  {
    if(str[i]==' ' || i==str.length()-1) 
    {
      word_end=i;
      for(int j=word_begin;j<word_end;j++) words[k]+=str[j];
      k++;
      word_begin=word_end+1;
    }
  }
// сортируем массив строк
string tmp="";
for(int i=0;i<k;i++)
  for(int j=i;j<k;j++)
    if(words[i]>words[j]) 
      {
         tmp=words[i]; 
         words[i]=words[j];
         words[j]=tmp;
       }
str="";
//вставляем отсортированный вариант в исходную строку(теперь можно из маина просто считать строку, вызвать функцию и вывести строку, уже отсортированную)
for(int i=0;i<k;i++) str+=words[i]+ " ";
return str;
}
 
int main()
{
  string str="asdf zvbsdfs vsgswer jsfwrw vdfs bsfdfwe";
  str=sorting(str);
  cout << str;
}
Добавлено через 39 секунд
вы не правы, words - массив СЛОВ.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 00:39  [ТС]     Сортировка слов в строке по алфавиту #9
Тоесть string[x] это чтото типо двухмерного масива char[x][y]?
И string[2] например обозначает не место буквы в стринге а место строчки в которой целое слово?
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
17.12.2010, 00:47     Сортировка слов в строке по алфавиту #10
нет, строка - одномерный массив, в 9-ой строке я обращаюсь именно к символам.
А вот в 10-ой строке я создаю массив строк, т.е массив массивов, вот этой уже двухмерный массив.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 00:56  [ТС]     Сортировка слов в строке по алфавиту #11
Спасибо за помощь,очень жаль что нам забыли рассказать это на лекциях.
Ваш код почему то не компилируеться,но это не страшно.Главное базовая идея есть,буду завтра дальше ковыряться.
Сдать бы этот курс уже и по человеческий сесть за Си самостоятельно.

Кстати такой вопрос,я могу в подобном масиве масивов обрашаться к определенной букве?Если да то как?
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
17.12.2010, 01:00     Сортировка слов в строке по алфавиту #12
в чем компилируете? последний приведенный код скомпилировал с g++, все работает.
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 01:06  [ТС]     Сортировка слов в строке по алфавиту #13
visual studio 2008,
То что и в лабаротриях в институте.Чтоб точно компилировалось и там.
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
17.12.2010, 01:10     Сортировка слов в строке по алфавиту #14
тогда в вашем случае k должно быть константным. на это скорее всего и ругается.

Добавлено через 20 секунд
а для спасибо есть кнопочка под сообщением
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 20:32  [ТС]     Сортировка слов в строке по алфавиту #15
Все подправил немного под себя код,работает отлично.
Только сейчас понял когда именно начал разбираться на сколько красивое разбитие строки на под строки вы написали.Мне еще учиться и учиться.
Zarik
3 / 3 / 0
Регистрация: 26.03.2012
Сообщений: 22
17.05.2012, 00:32     Сортировка слов в строке по алфавиту #16
в C
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <string.h>
 
char s[255],t[255],c1[255],c2[255];
bool c1b=true,c2b=false;
int pn=0,l=0;
 
void asort(bool end)
{
if((unsigned char)c1[0]>(unsigned char)c2[0])
{
 strcat(t,c2);
 strcat(t," ");
 pn++;
 if(end)
    strcat(t,c1);
}
else
{
 strcat(t,c1);
 strcat(t," ");
 if(end)
    strcat(t,c2);
 else
    memcpy(c1,c2,255);
}
if(end)
 memset(c1,(char)0,sizeof(c1));
memset(c2,(char)0,sizeof(c2));
if(end)
{
 c1b=true;
 c2b=false;
}
else c2b=true;
}
 
int main()
{
printf("Enter string:");
gets(s);
do
{
 l=strlen(s);
 pn=0;
 for(int n=0;n<l;n++)
 {
    if(s[n]!=' ' && c1b)
    {
   strncat(c1,&s[n],1);
    }
    else if(s[n]==' ' && s[n+1]!=' ' && c1[0]!=0 && c1b)
    {
   c1b=false;
   c2b=true;
   continue;
    }
    else if(s[n]!=' ' && c2b)
    {
   strncat(c2,&s[n],1);
    }
    else if(s[n]==' ' && s[n+1]!=' ' && c2b)
    {
   c2b=false;
    }
    if((!c1b && !c2b) || (n==l-1))
    {
   if(n==l-1)
    asort(1);
   else asort(0);
    }
 }
 memcpy(s,t,255);
 memset(t,(char)0,sizeof(t));
}while(pn!=0);
printf("After sort:%s",s);
return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 14:55     Сортировка слов в строке по алфавиту
Еще ссылки по теме:

Сортировка слов из массива по алфавиту C++
C++ Сортировка слов из массива по алфавиту
Сортировка слов в char по алфавиту C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
jenek0855
0 / 0 / 0
Регистрация: 12.07.2013
Сообщений: 14
15.07.2013, 14:55     Сортировка слов в строке по алфавиту #17
Сортировка выполняется только по первым символам. Как сделать, что бы по всем символам слова?
Yandex
Объявления
15.07.2013, 14:55     Сортировка слов в строке по алфавиту
Ответ Создать тему
Опции темы

Текущее время: 19:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru