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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.74
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
#1

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

25.06.2011, 22:38. Просмотров 6768. Ответов 12
Метки нет (Все метки)

Собственно сабж) Вроде бы сделал что-то похожее, но ошибка запрета доступа, если вводить строки с клавиатуры (понимаю, что не выделил память под содержимое строк, но не знаю как это сделать). А если задать их заранее, то почему-то не выводятся на экран...

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

Сортировка строк в алфавитном порядке - C++
Помогите пожалуйста написать программу для сортировки строк в алфавитном порядке Программа открывает фаил input.txt и отоброжает его...

Сортировка строк матрицы в алфавитном порядке - C++
Создаем двумерный динамический массив в котором надо отсортировать строки в алфавитном порядке. Вот код: void sortirowka(char...

Сортировка строк в алфавитном порядке (переделать на wstring) - C++
Доброго времени суток. Рыскал по форуму и нашел замечательный код сортировки строк в алфавитном порядке. std::string str; ...

Сортировка в алфавитном порядке - C++
Написал скрипт сортировки по алфавиту. По идее работать должен, но к сожалению не работает. Вот код: struct stud{ char...

Сортировка в алфавитном порядке... - C++
Здравствуйте, не могли бы вы помочь мне с задачей? Просто мы на лекциях ещё не разобрали как работать с файлами и текстом на C++, а на...

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

12
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
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 минуту
насчёт завершения вывода - в учебных программах принято сначала спрашивать о количестве вводимых строк, потом предлагать последовательный ввод каждой...
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

А динамическую память мне пока и не надо, я просто по книжке Дейтелов занимаюсь, динамическая память только через главу будет.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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 под виндой
0
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 << " или СТОП для завершения: ";
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 23:47 #6
Цитата Сообщение от Seatless Посмотреть сообщение
Вообще-то я подразумевал условие завершения цикла. А если в условии не указано ничего про EOF, то сам цикл будет выполняться, просто больше ничего не надо будет вводить.
да ну, уверены?
0
Seatless
1 / 1 / 0
Регистрация: 19.06.2011
Сообщений: 24
25.06.2011, 23:53  [ТС] #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
да ну, уверены?
Ну судя по работе моей программы, которая приведена в первом посте, да. Если нажать ctrl+z например на 5й строке, то сразу выведется еще 15 надписей "Введите строку номер..." с соответствующими индексами. Не спроста же в условиях циклов указываются while ( ... != EOF ), ведь если бы ctrl+z завершало цикл, то это не нужно было бы указывать.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 23:56 #8
ну, будьте уверены и дальше)
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
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;
}
2
MariaFitzgerald
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 104
Завершенные тесты: 1
25.06.2017, 15:50 #10
easybudda, как вывести без ведущих стрелок?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
25.06.2017, 18:14 #11
MariaFitzgerald, без каких стрелок?
0
MariaFitzgerald
0 / 0 / 0
Регистрация: 06.03.2017
Сообщений: 104
Завершенные тесты: 1
25.06.2017, 20:13 #12
easybudda,
Цитата Сообщение от easybudda Посмотреть сообщение
"> "
вот этих, я попробовала их убрать, но проблема в том, что он выводит первый элемент, пропуская одну строку, как сделать, чтобы он выводил без стрелок и с самого начала?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
26.06.2017, 02:29 #13
Цитата Сообщение от MariaFitzgerald Посмотреть сообщение
проблема в том, что он выводит первый элемент, пропуская одну строку, как сделать, чтобы он выводил без стрелок и с самого начала?
Чево?!! "Стрелки" - это просто приглашение к вводу, на вывод вообще никаким боком не влияют. И выводится всё без пропусков.
Сортировка строк в алфавитном порядке
Пишите подробно, что и как Вы делаете...
0
26.06.2017, 02:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2017, 02:29
Привет! Вот еще темы с ответами:

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

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

сортировка строки в алфавитном порядке - C++
как сделать так, чтоб программа выводила строку с повторами ? то есть ввожу abcddff программа выведет abcdf нужно чтоб...

Сортировка структур в алфавитном порядке - C++
Помогите пожалуйста, как сделать сортировку структур по алфавиту?) Заранее спасибо!) Программа осуществляет:  ввод с клавиатуры данных...


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

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

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