Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
3 / 3 / 1
Регистрация: 06.07.2016
Сообщений: 73
1

Сортировка массива указателей на строки

24.11.2016, 15:48. Просмотров 3596. Ответов 8
Метки нет (Все метки)

Приветствую.
Есть задание: "Напишите программу, которая вводит строки с клавиатуры с помощью cin>>...в объявленный Вами двухмерный встроенный массив 5*80 элементов типа char; признаком конца ввода является символ * (то есть строка - "*") или заполнение массива (больше свободных строк нет); сортировка строк в алфавитном порядке. Пояснение: крайне
не рекомендуется для сортировки сложных объектов физически перемещать их в памяти. Намного эффективнее завести массив указателей на соответствующие строки и перемещать только указатели".
Что есть:
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
const char  STOP_STRING = '*';
const int N = 5;
const int M = 80;
char cBuffer[N][M];
char* cPointers[N];
 
    
for (int i = 0; i < N; i++)
{
    std:: cout << "\nInput " << i+1 << " row of array: ";
        std::cin >> cBuffer[i];
 
        if (cBuffer[i][0] == STOP_STRING)
        {
            break;
        }
            
        char * p = cBuffer[i];
        cPointers[i] = p;
}
std::cout << "\n\nEnd of array!\n\n";
 
 
int tmp;
 
 
for (int i = 0; i < N-1; i++)
{
    for (int j = 0; j < N-1 ; j++ )
    {
        int res = strcmp(cPointers[j+1], cPointers[j]);
        if (res < 0)
        {
            tmp = *(cPointers[j + 1]);
            *(cPointers[j + 1]) = *(cPointers[j]);
            *(cPointers[j]) = tmp;
            
        }
    }
}
В результате сортирует только 1ые элементы каждой строки между собой(причем верно). Как сделать сортировку строк целиком?
Знаю, что в указатель заносится 1 элемент строки, как адрес начала. Но как получить в этом случае всю строку, а не только 1 элемент?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2016, 15:48
Ответы с готовыми решениями:

Сортировка массива указателей на строки
Здравствуйте. Есть две функции, которые используются для сортировки - одна, реализуя метод...

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

Сортировка массива структур через сортировку массива указателей
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку -...

Сортировка массива указателей
Всем доброго вечера Столкнулся я с проблемой примерно вот такого: типа у меня есть класс class...

8
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,347
24.11.2016, 16:08 2
Цитата Сообщение от GetShuk Посмотреть сообщение
cBuffer[i][0] == STOP_STRING
Не взлетит. Сишный массив символов не является строкой и ни про какие == не знает. Вернее, это сравнивает указатели на строки массивы символов.
Цитата Сообщение от GetShuk Посмотреть сообщение
В результате сортирует только 1ые элементы каждой строки между собой(причем верно). Как сделать сортировку строк целиком?
cPointers[j + 1] = cPointers[j];
0
3 / 3 / 1
Регистрация: 06.07.2016
Сообщений: 73
24.11.2016, 16:57  [ТС] 3
Renji,
По 1 замечанию: указано преподом и работает. Но замечание учту.
По 2ому: почпму именно так? И куда это?
0
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,347
24.11.2016, 17:34 4
Цитата Сообщение от GetShuk Посмотреть сообщение
По 1 замечанию: указано преподом и работает. Но замечание учту.
А, пардон, сбило с толку STOP_STRING и не заметил что это просто const char (не строка, а один символ). Впрочем, если делать именно const char, программа остановится на "*test*". А по ТЗ должна останавливаться только на "*".
Цитата Сообщение от GetShuk Посмотреть сообщение
По 2ому: почпму именно так? И куда это?
Потому что по техзаданию надо сортировать указатели. Вы же подписали в 35 и 36 строке "*" и пытаетесь тем самым сортировать то, на что эти указатели указывают. Причем, с попыткой копировать сишный массив. А копирование сишного массива, это одни сплошные грабли.

Вам надо убрать из 35 и 36 строк этот "*", отсортировать указатели, а потом выдать эти указатели на печать. Так как указатель на строку считается сишной (недо)строкой, то на печать пойдут именно отсортированные строки, а не указатели на них.
0
3 / 3 / 1
Регистрация: 06.07.2016
Сообщений: 73
24.11.2016, 17:42  [ТС] 5
Renji, * убрать можно еще из 35 строки, но не из 36: нельзя присвоить типу char* тип char. Или вы намекаете на static_cast?
Избавиться от * полностью можно только если указывать оба индекса, а не только j.
Если не сложно, напишите сортировку, как вы ее подразумеваете, хочу понять.
И да, в 24 строке ошибка, должно быть:
C++
1
char tmp;
0
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,347
24.11.2016, 17:46 6
Лучший ответ Сообщение было отмечено GetShuk как решение

Решение

Цитата Сообщение от GetShuk Посмотреть сообщение
Renji, * убрать можно еще из 35 строки, но не из 36: нельзя присвоить типу char* тип char.
Так объявите tmp как char*tmp.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    const int N=5;
    const char*cPointers[N]={"4","3","2","1","0"};
    for (int i = 0; i < N-1; i++)
    {
        for (int j = 0; j < N-1 ; j++ )
        {
            int res = strcmp(cPointers[j+1], cPointers[j]);
            if (res < 0)
            {
                const char*tmp= (cPointers[j + 1]);
                (cPointers[j + 1]) = (cPointers[j]);
                (cPointers[j]) = tmp;
 
            }
        }
    }
    for (int i = 0; i < N; i++)
        std::cout<<cPointers[i]<<std::endl;
    return 0;
}
2
3 / 3 / 1
Регистрация: 06.07.2016
Сообщений: 73
24.11.2016, 17:52  [ТС] 7
Renji, все, работает, спасибо.
Если еще подскажете, какую область плюсов надо подтянуть, цены вам не будет
0
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,347
24.11.2016, 18:00 8
Цитата Сообщение от GetShuk Посмотреть сообщение
Если еще подскажете, какую область плюсов надо подтянуть, цены вам не будет
Видимо, сишные строки и указатели. Где-то до уровня способности накатать свою версию strcat исключительно на указателях, без единого [] (ничего сложного).
0
3 / 3 / 1
Регистрация: 06.07.2016
Сообщений: 73
24.11.2016, 18:02  [ТС] 9
Renji, учту, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2016, 18:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сортировка динамического массива указателей
Собственно я написал шаблон класса, а там нужно сделать сортировку выбором. Как это сделать с...

Сортировка массива указателей на char
Есть массив указателей на char-ы. Нужно отсортировать их по алфавиту. Прошу помочь как можно...

Сортировка массива указателей на структуру
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; struct Person...

сортировка массива стуктур посредством указателей
Доброго времени суток. Есть у меня 1 задачка: пытаюсь её решить: #include&lt;iostream&gt;...


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

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

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