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

Сортировка массива строк - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
sniper304
1 / 1 / 0
Регистрация: 24.12.2011
Сообщений: 9
29.09.2012, 23:44     Сортировка массива строк #1
Здравствуйте!Не могу разобраться с сортировкой массива строк по алфавиту!
Ввести массив из n строк и n столбцов, отсортировать по алфавиту, и вывести первую букву первого слова!
Ниже приведен код что написал(правда без сортировки)ну это черновик =)
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
 
string **mass;
int n,n1;
void vvod(int a, int b)
 {
   mass=new string *[a];
 for(int i=0;i<a;i++)
 mass[i]=new string [30];
 getch();
  for (int i=0;i<a;i++)
  for (int j=0;j<b;j++)
  {
   cout<<"Stroka ["<<i+1<<"] slovo ["<<j+1<<"] ";
   cin>>mass[i][j];
  }
 }
 
void main()
{
 cout<<"Vvedite kolichestvo strok";
 cin>>n;
 cout<<"Vvedite kolichestvo slov v stroke";
 cin>>n1;
 vvod(n,n1);
 for(int i=0;i<n;i++){
 for (int j=0;j<n1;j++){
 cout<<mass[i][j];
 cout<<"\n";}}
 getch();
}
Думаю, этого мало, но все же я учусь!
Возникли вопросы:
1)Каким образом сделать такую сортировку?(Нужно ли создать еще один дин.массив с той же размерностью,чтобы присваивать элементы при сортировке, если да то как сделать?

Большое спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
30.09.2012, 11:17     Сортировка массива строк #2
у тебя есть массив указателей, имя массива-указатель на первый элемент того массива. просто меняй значения указателей в массиве массивов и не парься.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.09.2012, 12:05     Сортировка массива строк #3
Можно так сделать
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
#include <iostream> 
using namespace std; 
 
int main() 
{ 
    int n; 
    int i, j;
    char** matrix;
    cout << "Inter n " << endl; 
    cin >> n; 
 
    matrix = new char*[n]; 
    for ( int i = 0; i < n; i++) 
        matrix[i] = new char[n]; 
 
    for ( i = 0; i < n; i++) 
    { 
        cout << "Inter " << i+1 << " word" << endl;  
        cin >> matrix[i]; 
    }
 
    cout << "Primari Matrix " << endl; 
        for (i = 0; i < n; i++) 
            cout << matrix[i] << " "; 
        cout << endl; 
 
    for ( i = 0; i < n - 1; i++) 
        for ( j = i + 1; j < n - 1; j++) 
        { 
            if(strcmp(matrix[i], matrix[j]) > 0)  
            {
                char* temp = new char[n]; 
                strcpy(temp, matrix[i]); 
                strcpy(matrix[i], matrix[j]); 
                strcpy(matrix[j], temp); 
            } 
        } 
 
        
        cout << "Sorted Matrix " << endl; 
        for ( i = 0; i < n; i++) 
            cout << matrix[i] << " "; 
        cout << endl; 
 
        cout << "First letter is " << matrix[0][0] << endl;
}
sniper304
1 / 1 / 0
Регистрация: 24.12.2011
Сообщений: 9
30.09.2012, 22:38  [ТС]     Сортировка массива строк #4
David Sylva
Большое спасибо!

Добавлено через 2 часа 34 минуты
David Sylva,
вы немножко ошиблись, т.к. если написана строка
C++
1
 for ( j = i + 1; j < n - 1; j++)
то сортирует, все элементы, кроме последнего.
я изменил на
C++
1
 for ( j = i + 1; j < n; j++)
AXSystems
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 3
09.11.2012, 15:41     Сортировка массива строк #5
Цитата Сообщение от David Sylva Посмотреть сообщение
Можно так сделать
C++
1
2
3
4
5
6
7
            if(strcmp(matrix[i], matrix[j]) > 0)  
            {
                char* temp = new char[n]; 
                strcpy(temp, matrix[i]); 
                strcpy(matrix[i], matrix[j]); 
                strcpy(matrix[j], temp); 
            }
Не будет ли ошибки в strcpy, связанной с большей длиной источника, чем память выделенная в месте назначения. То есть, если в matrix[j] 7 символов, а в matrix[i] выделено памяти для 6 символов, то strcpy(matrix[i], matrix[j]) приведет к ошибке...
sniper304
1 / 1 / 0
Регистрация: 24.12.2011
Сообщений: 9
09.11.2012, 17:32  [ТС]     Сортировка массива строк #6
Цитата Сообщение от AXSystems Посмотреть сообщение
Не будет ли ошибки в strcpy, связанной с большей длиной источника, чем память выделенная в месте назначения. То есть, если в matrix[j] 7 символов, а в matrix[i] выделено памяти для 6 символов, то strcpy(matrix[i], matrix[j]) приведет к ошибке...
Может и ошибаюсь, но, тут память выделяется динамически, т.е. по не должно быть ошибки!
AXSystems
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 3
12.11.2012, 02:50     Сортировка массива строк #7
Сам тупанул... Как раз на аналогичной программе завис. Здесь используется константное значение длины слова. То есть в начале программы определяется n, и потом под слово выделяет n символов. Таким образом для слова из одного символа(предлог какой нить) будет выделено памяти что и под слово из n букв... Только у меня слова разной длины... Сам я так и не смог сортировку побороть, уже 3 день мучаюсь. Кто может подсказать? Закоменнтаренная функция qsort выбивает прогу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int MySort(char** ArrOfStr, int Count)
{
    // определим минимальную длину слова в списке
    // чтобы не было ошибок сортировки строк встроенной функцией qsort
    // 
    int MinLen  = 9999; // заведомо большое число
    int SeekLen = 0;
    int i = 0;
    for (i = 0; i<Count;i++)
    {
        SeekLen = strlen(ArrOfStr[i]);
        if (SeekLen<MinLen)
        {
            MinLen = SeekLen;
        }
    }
    //qsort(ArrOfStr,Count,sizeof(char)*MinLen, (int (*)(const void *,const  void *)) strcmp);
    return EXIT_SUCCESS;
};
Добавлено через 23 минуты
Взял из МСДН код, работает... почему сразу не залез в примеры qsort - не пойму... Жалко время потраченное на поиски, но теперь хоть правильно работать с памятью научился
C++
1
2
3
4
5
6
7
8
9
10
11
12
/* Сортировка массива строк                                             */
int compare( const void *arg1, const void *arg2 )
{
    /* Compare all of both strings: */
    return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
int MySort(char** ArrOfStr, int Count)
{
    qsort( (void *)ArrOfStr, (size_t)Count, sizeof( char * ), compare );
   // qsort(ArrOfStr,Count,sizeof(char*)*MinLen, (int (*)(const void *,const  void *)) strcmp);
    return EXIT_SUCCESS;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 14:56     Сортировка массива строк
Еще ссылки по теме:

C++ Сортировка массива строк
Сортировка строк массива C++
C++ Сортировка строк массива

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

Или воспользуйтесь поиском по форуму:
Hikari12
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 15
14.12.2013, 14:56     Сортировка массива строк #8
а по длине строки как отсортировать? Подскажите пожалуйста)
Yandex
Объявления
14.12.2013, 14:56     Сортировка массива строк
Ответ Создать тему
Опции темы

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