Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.87
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
#1

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

16.12.2010, 16:26. Просмотров 9351. Ответов 16
Метки нет (Все метки)

Дана строка из слов через пробел.Надо рассортировать слова по алфавиту и распечатать новую строку.
Использовать библиотеки 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ов это только для меня чтоб смотреть что происходит с переменными,в конечной функций их не будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2010, 16:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка слов в строке по алфавиту (C++):

Сортировка слов в строке по алфавиту - C++
Собственно вот задание:Определить класс-строку. В класс включить два конструктора: для опре-деления класса строки строкой символов и путем...

Сортировка слов в строке в лексикографическом порядке (по алфавиту) - C++
Как отсортировать слова в строке в лексикографическом порядке (по алфавиту)?Помогите , пожалуйста.

Сортировка слов по алфавиту - C++
Здравствуйте уважаемы программисты. Необходимо отсортировать слова по алфавиту. #include &quot;stdio.h&quot; #include &quot;conio.h&quot; #include...

Сортировка слов по алфавиту - C++
Всем привет, помогите мне пожалуйста с сортировкой слов по алфавиту, словом считают группу символов между двумя пробелами. Упорядочить...

Сортировка слов по алфавиту - C++
MFC GUI. Собственно в чем задача:Нужно прочитать слова из файла, отсортировать их по алфавиту методом выбора и записать в новый файл. ...

Сортировка слов из массива по алфавиту - C++
Помогите пожалуйста найти ошибку. Неправильно сортирует слова. #include&lt;iostream&gt; using namespace std; const int n=4; ...

16
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
16.12.2010, 17:02 #2
более простой вариант: создать массив слов размерностью k, равной числу пробелов +1. И просто сравнить их в двойном цикле.
0
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
16.12.2010, 18:49  [ТС] #3
Цитата Сообщение от vx5 Посмотреть сообщение
более простой вариант: создать массив слов размерностью k, равной числу пробелов +1. И просто сравнить их в двойном цикле.
Нельзя пользоваться поинтерами и динамичискими массивами.
0
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 минуты
без динамических массивов, без поинтеров. со ССЫЛКОЙ, иначе непонятно зачем такая функция нужна, ничего не вернешь, ничего не преобразуешь.
1
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
16.12.2010, 23:28  [ТС] #5
Не совсем то что нужно,на сколько я понял то что ты написал сортирует по буквам.А мне надо сортировать слова.
В принципе это только часть задания.
Целиком задание написать 3 функций.
1.Получить от пользователя размер числового масива, попросить его заполнить и выдать в ответе число повторяющееся больше всего раз и сколько раз оно повторяется
2.Получить от пользователя список слов через пробел отсортировать слова по алфавиту и выписать так же через пробел обратно
3.Поучить от пользователя список слов через пробел,поисковое слово и слово на замену.Найти поисковое слово в начальном списке и заменить его на 3ье.

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

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

В принципе мне не к спеху,на оценку это не влияет.Мне главное понять как это сделать и где моя ошибка.На зачете интернета с ответами не будет,поэтому важно дойти до уровня когда я сам могу писать свободно функций со строками
0
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
16.12.2010, 23:56 #6
2.Получить от пользователя список слов через пробел отсортировать слова по алфавиту и выписать так же через пробел обратно
именно это и делает
Алгоритм такой: Программа находит пробелы, по ним слова и добавляет слова в массив слов. Далее соритирует массив слов по алфавиту и вводит слова в отсортированной порядке в строку.
0
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;
       }
это именно побуквенная замена или я не прав?
0
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 - массив СЛОВ.
0
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 00:39  [ТС] #9
Тоесть string[x] это чтото типо двухмерного масива char[x][y]?
И string[2] например обозначает не место буквы в стринге а место строчки в которой целое слово?
0
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
17.12.2010, 00:47 #10
нет, строка - одномерный массив, в 9-ой строке я обращаюсь именно к символам.
А вот в 10-ой строке я создаю массив строк, т.е массив массивов, вот этой уже двухмерный массив.
0
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 00:56  [ТС] #11
Спасибо за помощь,очень жаль что нам забыли рассказать это на лекциях.
Ваш код почему то не компилируеться,но это не страшно.Главное базовая идея есть,буду завтра дальше ковыряться.
Сдать бы этот курс уже и по человеческий сесть за Си самостоятельно.

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

Добавлено через 20 секунд
а для спасибо есть кнопочка под сообщением
0
Nerevarine
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 8
17.12.2010, 20:32  [ТС] #15
Все подправил немного под себя код,работает отлично.
Только сейчас понял когда именно начал разбираться на сколько красивое разбитие строки на под строки вы написали.Мне еще учиться и учиться.
0
17.12.2010, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2010, 20:32
Привет! Вот еще темы с ответами:

Сортировка слов в предложении по алфавиту - C++
доброго времени суток! у меня такая проблема - нужно распечатать в алфавитном порядке слова из предложения. так вот, когда на английском...

Сортировка слов в char по алфавиту - C++
Доброго всем времени! Помогите пожалуйста! Напечатать слова, входящие в предложение, в алфавитном порядке. Человек, попросивший...

Сортировка слов из массива по алфавиту - C++
Здравствуйте! Возникла проблема. Написал программу для сортировки слов по алфавиту. Без использования функций все работало. Теперь...

Сортировка слов по алфавиту с ипользованием классов - C++
Есть задание - написать программу, которая бы сортировала слова в строке по алфавиту. У меня есть такой вот алгоритм. Надо его...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru