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

Сортировка строк в алфавитном порядке - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.74
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
25.06.2011, 22:38     Сортировка строк в алфавитном порядке #1
Собственно сабж) Вроде бы сделал что-то похожее, но ошибка запрета доступа, если вводить строки с клавиатуры (понимаю, что не выделил память под содержимое строк, но не знаю как это сделать). А если задать их заранее, то почему-то не выводятся на экран...

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
//Программа сортировки строк в алфавитном порядке
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
 
//начало функции main
int main()
{   
    /*смена кодовой страницы для корректного
    отображения русского языка*/
    system( "chcp 1251" ); 
 
    // объявление переменных
    const int amount = 20;
    char *string[ amount ];
    char temp[ 40 ];
    int i = 0;
    bool exit = 0; 
 
    // ввод строк
    cout << "Введите строку номер " << i << " или СТОП для завершения: ";
    cin >> temp;
    for ( ; i < amount && strcmp( temp, "СТОП" ); i++ )
    {
        strcpy ( string[ i ], temp );
        cout << "Введите строку номер " << i + 1 << " или СТОП для завершения: ";
        cin >> temp;
    }
    
 
    // сортировка в алфавитном порядке
    for ( int l = 0;  exit != 1; l++ ) // l - количество проверенных символов
    {
        exit = 1;
        for (int j = 0; j < i - 1; j++ )
            for ( int k = j + 1; k < i; k++ )
            {
                if ( *string[ j ] != '\0' && *string[ k ] != '\0' )
                    if ( strncmp( string[ j ], string[ k ], l ) == 0 && *string[ j ] > *string[ k ] )
                    {
                        swap( string[ j ], string[ k ] );
                    }
            }
 
        for( int j = 0; j < i; j++) 
            if ( *string[ j ] != '\0' )
            {
                string[ j ]++;
                exit = 0;
            }
    }
    
    // вывод сортированных строк
    cout << "\nУпорядоченные в алфавитном порядке строки:\n";
    for ( int j = 0; j < i; j++ )
        cout << j << ". " << string[ j ] << endl;
 
    //ожидание нажатия клавиши и выход из программы
    cout << endl;
    system( "pause" );
    return 0;
}
И еще вдогонку вопрос: как можно завершить ввод строк, кроме того, как я это сделал? Например что-то вроде EOF для строк? Просто сами строки с EOF сравнивать нельзя, т.к. у них разные типы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
25.06.2011, 23:03     Сортировка строк в алфавитном порядке #2
можно использовать "матрицу", объявив
C++
1
char string[ amount ][ 300/*или, скажем, как в вашем примере, 40*/ ]
ещё можно использовать динамическое выделение памяти, тогда объявление можно не трогать но перед
C++
1
strcpy ( string[ i ], temp );
нужно вписать
C++
1
string [ i ] = new char[strlen(temp)];
и в конце программы освободить память вызвав для каждого элемента массива
C++
1
delete[] string [ i ];
То что я написал - очень мало, чтобы разобраться нужно почитать в гугле.

Добавлено через 1 минуту
насчёт завершения вывода - в учебных программах принято сначала спрашивать о количестве вводимых строк, потом предлагать последовательный ввод каждой...
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
25.06.2011, 23:15  [ТС]     Сортировка строк в алфавитном порядке #3
Цитата Сообщение от CEBEP Посмотреть сообщение
можно использовать "матрицу", объявив
C++
1
char string[ amount ][ 300/*или, скажем, как в вашем примере, 40*/ ]
ещё можно использовать динамическое выделение памяти, тогда объявление можно не трогать но перед
C++
1
strcpy ( string[ i ], temp );
нужно вписать
C++
1
string [ i ] = new char[strlen(temp)];
и в конце программы освободить память вызвав для каждого элемента массива
C++
1
delete[] string [ i ];
То что я написал - очень мало, чтобы разобраться нужно почитать в гугле.

Добавлено через 1 минуту
насчёт завершения вывода - в учебных программах принято сначала спрашивать о количестве вводимых строк, потом предлагать последовательный ввод каждой...
Переделав под матрицу получилось вот что:

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
//Программа сортировки строк в алфавитном порядке
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
 
//начало функции main
int main()
{   
    /*смена кодовой страницы для корректного
    отображения русского языка*/
    system( "chcp 1251" ); 
 
    // объявление переменных
    const int amount = 20;
    const int length = 40;
    char string[ amount ][ length ];
    char temp[ length ];
    int i = 0;
    bool exit = 0; 
 
    // ввод строк
    cout << "Введите строку номер " << i << " или СТОП для завершения: ";
    cin >> temp;
    for ( ; i < amount && strcmp( temp, "СТОП" ); i++ )
    {
        strcpy ( string[ i ], temp );
        cout << "Введите строку номер " << i + 1 << " или СТОП для завершения: ";
        cin >> temp;
    }
    
 
    // сортировка в алфавитном порядке
    for ( int l = 0;  exit != 1; l++ ) // l - количество проверенных символов
    {
        exit = 1;
        for (int j = 0; j < i - 1; j++ )
            for ( int k = j + 1; k < i; k++ )
            {
                if ( string[ j ][ l ] != '\0' && string[ k ][ l ] != '\0' )
                    if ( strncmp( string[ j ], string[ k ], l ) == 0 && string[ j ][ l ] > string[ k ][ l ] )
                    {
                        swap( string[ j ], string[ k ] );
                    }
            }
    }
    
    // вывод сортированных строк
    cout << "\nУпорядоченные в алфавитном порядке строки:\n";
    for ( int j = 0; j < i; j++ )
        cout << j << ". " << string[ j ] << endl;
 
    //ожидание нажатия клавиши и выход из программы
    cout << endl;
    system( "pause" );
    return 0;
}
Но так даже не компилируется. Вот такое пишет:
Warning 1 warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\игорь\c++ progs\exerci\exerci\main.cpp 27
Error 2 error C2075: '_Tmp' : array initialization needs curly braces c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility 102
Error 3 error C2106: '=' : left operand must be l-value c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility 103
Error 4 error C2106: '=' : left operand must be l-value c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility 104

А динамическую память мне пока и не надо, я просто по книжке Дейтелов занимаюсь, динамическая память только через главу будет.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 23:23     Сортировка строк в алфавитном порядке #4
Цитата Сообщение от Seatless Посмотреть сообщение
как можно завершить ввод строк, кроме того, как я это сделал? Например что-то вроде EOF для строк? Просто сами строки с EOF сравнивать нельзя, т.к. у них разные типы.
C++
1
2
 while(std::cin >> temp)
    strcpy(string[i++], temp);
конец ввода - EOF, Ctrl+Z под виндой
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
25.06.2011, 23:39  [ТС]     Сортировка строк в алфавитном порядке #5
Цитата Сообщение от Maxwe11 Посмотреть сообщение
C++
1
2
 while(std::cin >> temp)
    strcpy(string[i++], temp);
конец ввода - EOF, Ctrl+Z под виндой
Вообще-то я подразумевал условие завершения цикла. А если в условии не указано ничего про EOF, то сам цикл будет выполняться, просто больше ничего не надо будет вводить. Например, если вот тут
C++
1
2
3
4
5
6
 for ( ; i < amount && strcmp( temp, "СТОП" ); i++ )
        {
                strcpy ( string[ i ], temp );
                cout << "Введите строку номер " << i + 1 << " или СТОП для завершения: ";
                cin >> temp;
        }
выйти с помощью ctrl+z, то после завершения выведутся до конца цикла все надписи cout << "Введите строку номер " << i + 1 << " или СТОП для завершения: ";
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 23:47     Сортировка строк в алфавитном порядке #6
Цитата Сообщение от Seatless Посмотреть сообщение
Вообще-то я подразумевал условие завершения цикла. А если в условии не указано ничего про EOF, то сам цикл будет выполняться, просто больше ничего не надо будет вводить.
да ну, уверены?
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
25.06.2011, 23:53  [ТС]     Сортировка строк в алфавитном порядке #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
да ну, уверены?
Ну судя по работе моей программы, которая приведена в первом посте, да. Если нажать ctrl+z например на 5й строке, то сразу выведется еще 15 надписей "Введите строку номер..." с соответствующими индексами. Не спроста же в условиях циклов указываются while ( ... != EOF ), ведь если бы ctrl+z завершало цикл, то это не нужно было бы указывать.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 23:56     Сортировка строк в алфавитном порядке #8
ну, будьте уверены и дальше)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2011, 13:21     Сортировка строк в алфавитном порядке
Еще ссылки по теме:

Сортировка в алфавитном порядке C++
C++ Сортировка слов в алфавитном порядке
C++ Сортировка строк матрицы в алфавитном порядке

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.06.2011, 13:21     Сортировка строк в алфавитном порядке #9
завершение ввода - enter в новой строке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <set>
#include <iterator>
    
int main(){
    std::string str;
    std::set<std::string> set;
    
    while ( std::cout << "> " && std::getline(std::cin, str) && ! str.empty() )
        set.insert(str);
    
    std::cout << "Alphabet sorted:" << std::endl;
    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    return 0;
}
Yandex
Объявления
26.06.2011, 13:21     Сортировка строк в алфавитном порядке
Ответ Создать тему
Опции темы

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