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

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

Войти
Регистрация
Восстановить пароль
 
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
#1

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

19.05.2016, 17:55. Просмотров 1108. Ответов 9
Метки нет (Все метки)

Не могу сообразить как по алфавиту отсортировать, что нужно изменить?
Если можно, то скажите что не так конкретно в этом коде, другой готовый код не нужен.
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
#include <iostream>
using namespace std;
const int DAYS = 7;
 
int main () 
{
    setlocale(LC_ALL, "Russian");
    // массив указателей на строки
    char* arrptrs[DAYS] = { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница",
                            "Суббота", "Воскресенье" };
    for(int k = 0; k < DAYS; k++) // покажем все строки
        cout << arrptrs[k] << endl;
    for (int i=0; i<7; i++)
        for (int j=0; j<7; j++)
        {
            if (arrptrs[i] <= arrptrs[j])
            {
                char* temp;
                temp = arrptrs[j];
                arrptrs[j] = arrptrs[i];
                arrptrs[i] = temp;
            }
        }
    cout << endl << endl;
    for(int k = 0; k < DAYS; k++) // покажем все строки
        cout << arrptrs[k] << endl;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2016, 17:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка по алфавиту (C++):

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

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...

сортировка по алфавиту - C++
Задача: Описать структуру с именем PRICE, содержащую следующие поля: название товара; название магазина, в котором продается...

Сортировка по алфавиту - C++
#include &lt;iostream&gt; #include&lt;cstring&gt; using namespace std; int main() { int i,j,s=1,k=0,space=0,n; char str,str1; ...

Сортировка по алфавиту - C++
Правильные глаголы находятся и все нормально выводится, но сортировка по алфавиту не работает почему-то. В чем ошибка? for...

Сортировка по алфавиту - C++
Нужно ввести в программу данные о футболисте, отсортировать их по фамилии футболиста(т.е. первой строке таблицы) и вывести на экран....

9
_Ivana
3206 / 1834 / 153
Регистрация: 01.03.2013
Сообщений: 5,054
Записей в блоге: 4
19.05.2016, 18:03 #2
Ну во-первых, имеет смысл сравнивать все-таки буквы, а не указатели на них (звезды нужны) - сравните
C++
1
if (*arrptrs[i] <= *arrptrs[j])
Во-вторых, все равно результат не тот, потому что неправильный алгоритм сортировки
И в третьих, алгоритм неправильный, потому что сортирует только по первой букве строки, а надо лексикографически по всем буквам слов.
1
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
19.05.2016, 18:47  [ТС] #3
Цитата Сообщение от _Ivana Посмотреть сообщение
Ну во-первых, имеет смысл сравнивать все-таки буквы, а не указатели на них (звезды нужны) - сравните
Спасибо) Я просто думал, что при сравнении без звезд сравнивает по первой букве по умолчанию.
У понедельника буквы перебираются, тоесть у первого слова. А как у остальных?
*arrptrs[0] - первая буква первого слова
0
nmcf
5764 / 5075 / 1735
Регистрация: 14.04.2014
Сообщений: 20,784
19.05.2016, 19:21 #4
strcmp() для сравнения.
0
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
19.05.2016, 22:03  [ТС] #5
Каким образом получить доступ к первой букве второго слова? Или ко второй букве второго слова?

Добавлено через 59 минут
Цитата Сообщение от nmcf Посмотреть сообщение
strcmp() для сравнения.
пример применения strcmp():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int password(void)
{
  char s[80];
 
  printf("Введите пароль: ");
  gets(s);
 
  if(strcmp(s, "pass")) {
    printf("Неверный пароль\n");
    return 0;
  }
  return 1;
}
Не могу сообразить каким образом она поможет в сортировке по алфавиту.
Цитата Сообщение от Alek70694 Посмотреть сообщение
Каким образом получить доступ к первой букве второго слова? Или ко второй букве второго слова?
C++
1
2
arrptrs[1][0] 
arrptrs[1][1]
0
nmcf
5764 / 5075 / 1735
Регистрация: 14.04.2014
Сообщений: 20,784
19.05.2016, 22:37 #6
В любой сортировке есть сравнение элементов. Для строк - strcmp().
1
Melvil
48 / 47 / 13
Регистрация: 20.05.2015
Сообщений: 251
19.05.2016, 22:44 #7
Alek70694, Если вам нужен именно алгоритм лексикографической сортировки, то смотрите посты выше. Я же хочу сказать, что самый оптимальный способ - это создание вектора из std::string и затем применение функции std::sort к этому вектору, займет буквально 2-3 строчки.
1
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
19.05.2016, 23:16  [ТС] #8
Цитата Сообщение от Melvil Посмотреть сообщение
Alek70694, Если вам нужен именно алгоритм лексикографической сортировки, то смотрите посты выше. Я же хочу сказать, что самый оптимальный способ - это создание вектора из std::string и затем применение функции std::sort к этому вектору, займет буквально 2-3 строчки.
к сожалению понятие не имею, что за вектора, еще не дошел до них
Цитата Сообщение от nmcf Посмотреть сообщение
В любой сортировке есть сравнение элементов. Для строк - strcmp().
понятно, спасибо, к сожалению готовая сортировка мне не нужна, т.к. я хочу разобраться
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
#include <iostream>
using namespace std;
const int N = 4;
 
int main () 
{
    setlocale(LC_ALL, "Russian");
    int a = 0;
    char* massiv[N] = {"Приставка", "Просто", "Правота", "Пила"};
    for (int i=0; i<4; i++) // первое сравниваемое слово
        for (int j=0; j<4; j++) // буква
            for (int k=1; k<4; k++) // второе сравниваемое слово
                if (massiv[i][j] > massiv[k][j]) //если j-ая буква i-ого слова больше j-ой буквы k-ого слова, то меняем местами слова
                {
                    char* temp;
                    temp = massiv[k];
                    massiv[k] = massiv[i];
                    massiv[i] = temp;
                }
    for (int i=0; i<4; i++)
        cout << massiv[i];
    system("pause");
    return 0;
}
Не могу понять как исправить ту же ошибку, что и в прошлом алгоритме.
Как работает по идее:
1) Сравниваем первую "п" букву первого слова с остальными - совпадают, идем дальше
2) Сравниваем вторую "р" букву первого слова с остальными - буква "и" в слове "Пила" меньше, значит меняем местами слова
3) Дальше получается мы уже в слове ПИЛА начинаем третью букву сравнивать с остальными словами?
Как тут быть в этом случае? Возможно начинать сравнивать с самого начала?
Или может кто конкретный алгоритм сказать, не применяя готовые сортировки и вектора.
0
nmcf
5764 / 5075 / 1735
Регистрация: 14.04.2014
Сообщений: 20,784
20.05.2016, 08:22 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Alek70694, причём тут готовая? strcmp() не сортирует, а только сравнивает. И массив у тебя неправильно задан, его нельзя изменять.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char massiv[N][20] = {"Приставка", "Просто", "Правота", "Пила"};
    char tmp[20];
 
    for(int i = 0; i < N - 1; ++i)
    {            
        for(int j = 0; j < N - 1; ++j)
        {     
            if (strcmp(massiv[j + 1], massiv[j]) < 0) 
            {
                strcpy(tmp, massiv[j + 1]); 
                strcpy(massiv[j + 1], massiv[j]); 
                strcpy(massiv[j], tmp);
            }
        }
    }
1
Alek70694
4 / 4 / 0
Регистрация: 27.10.2012
Сообщений: 247
22.05.2016, 17:05  [ТС] #10
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
#include <iostream>
using namespace std;
const int N = 7;
 
int main ()
{
setlocale(LC_ALL, "Russian");
int a = 0;
char* massiv[N] = {"Приставка", "Арка", "Правота", "Пила", "Прабабушка", "Папа", "Абзац"};
for (int i=0; i<7; i++)
for (int k=i+1; k<7; k++)
//for (int j=0; j<4; j++)
if (strcmp(massiv[i],massiv[k])>0)
{
char* temp;
temp = massiv[k];
massiv[k] = massiv[i];
massiv[i] = temp;
}
for (int i=0; i<7; i++)
cout << massiv[i];
system("pause");
return 0;
}
Вот еще помогли сделать, возможно кому то понадобится
1
22.05.2016, 17:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2016, 17:05
Привет! Вот еще темы с ответами:

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

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...

Сортировка по алфавиту - C++
Доброго времени суток. Имеется задача: Описать структуру с именем ORDER, содержащую следующие поля: *расчетный счет плательщика ...

Сортировка по алфавиту - C++
На вход подается некоторое количество описаний книг (автор, название, количество страниц). Отсортировать и вывести в алфавитном порядке по...


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

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

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