Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880

Программа для сортировки массива строк

02.04.2014, 20:56. Показов 7405. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать программу для сортировки строк, используя указатели.

Программа должна считать количество элементов массива (вот тут и возникла проблема) строк и сам массив.
Сортированный вывести на экран.
Нужно написать функцию сортировки массива строк, параметры какой -- массив указателей и количество элементов.
===============================

Собственно суть проблемы в том, что при попытки сделать массив например char list[n][100]; (n - вводимое количество строк) -- выдает ошибку. Я так понимаю, n - должна быть const, а не переменной.
Но как же тогда сделать вводимое значение количества строк?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2014, 20:56
Ответы с готовыми решениями:

Пример быстрой сортировки массива строк и сортировки методом выбора
Добрый вечер. Скиньте пожалуйста пример быстрой сортировки массива строк и сортировки массива строк методом выбора. Очень срочно надо,...

Не работает программа для сортировки массива строк
Здравствуйте. Из учебника Уэйта, Прата нашел программу для сортировки массива строк. После ввода 20 строк программа падает. Не подскажете...

Не работает программа сортировки строк с помощью двумерного массива указателей
Не работает программа сортировки строк с помощью двумерного массива указателей. Не подскажете где ошибка? #include...

57
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 18:34  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от fmtuner Посмотреть сообщение
Вот что получилось.
К тому что было - добавилась инициализация пустого массива list NULLами;
ну и... вроде работает
Работает так же как и мое((
Вот я скинул скрин результата, посмотри.
Строки местами поменялись, а адреса остались те же.
А нужно, что бы строка куда записалась, там и осталась, после сортировки.
Миниатюры
Программа для сортировки массива строк  
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 21:04
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
#include <iostream>
#include <locale>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"RUS");
    int n;
    cout << " Введите количество рядков: ";
    cin >> n;
 
    cout<<endl;
 
    string list[n];
 
    cin.ignore();
 
    for(int i=0; i<n; i++)
    {
        cout << " Ведите текст: ";
        cin>>list[i];
    }
 
    cout<<endl<<endl<<"Что сформировалось:"<<endl;
    for (int i=0;i<n;i++)
        cout<<list[i]<<" Адрес строки "<<&list[i]<<endl;
/// сортировка
    for (int i=0;i<n-1;i++)
    {
        for (int j=i;j<n;j++)
        if (list[i].length()<list[j].length())
        {
            list[i].swap(list[j]);
            /*string *adr,*adr2;
            adr=&list[i];
            adr2=&list[j];
            */
        }
    }
    cout<<endl<<endl<<"Что получилось:"<<endl;
    for (int i=0;i<n;i++)
        cout<<list[i]<<" Адрес строки "<<&list[i]<<endl;
 
 
    cout << "Hello world!" << endl;
    return 0;
}
вот тебе
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 21:18  [ТС]
swap

length


а это что?
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 21:46
http://www.cplusplus.com/refer... ?kw=string

Добавлено через 13 минут
если без свапа, то наверное вот так надо:
C++
1
2
3
4
5
6
            string temp_str;  //переменная в которой хранится данное строки
            temp_str=list[i]; //
            string *adr=&list[i]; // присвоили adr"у адрес i-ой строки
            string *adr2=&list[j]; // присвоили adr2"у адрес j-ой строки
            *adr=list[j]; // присвоили значению хранящемуся в adr'e (i-ой строке) значение j-ой строки
            *adr2=temp_str; // тоже самое только для adr2
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 22:59  [ТС]
Цитата Сообщение от fmtuner Посмотреть сообщение
если без свапа, то наверное вот так надо:
а почему в string ???
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 23:15
а почему бы и нет? стринг - тот же массив чаров.
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:03  [ТС]
Цитата Сообщение от fmtuner Посмотреть сообщение
а почему бы и нет? стринг - тот же массив чаров.
просто над в char-e вообще изначально логика такова:
сделать двумерный массив, вбить туда строки и прированять к нему двойной указатель, а дальше работать с указателем. То есть у меня даже с первым пунктом (двумерный массив) не вышло, пришлось указатель делать, а дальше я даже не знаю, есть ли смысл в еще одном указателе....

вообщем у меня проблема с абстрактным пониманием что к чему и в чем есть смысл, а в чем нету)

Добавлено через 35 минут
C++
1
2
3
4
5
6
7
if((strlen(add[i])) > (strlen(add[j])))
            {
                *str1=&add[i];
                *str2=&add[j];
                add[i]=&str2;
                add[j]=&str1;
            }
выбивает ошибки(
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:23
смотри на вещи проще:
если по условию задачи надо использовать именно чар - это одно.
если надо просто отсортировать строки - можно решить задачу не используя чары.

ну потом - двумерный динамический массив в си походу по другому не объявишь, поэтому теперь ты знаешь как это делать

Добавлено через 4 минуты
Цитата Сообщение от andreyananas Посмотреть сообщение
выбивает ошибки(
конечно
*str1=&add[i]; - это у тебя создается указатель str1 в которой содержится адрес add[i]
add[i]=&str2; - а здесь ты что чему собрался приравнять? сам подумай немного.
значению переменной ты собрался присвоить адрес указателя?

http://ru.wikipedia.org/wiki/%... 0_(C%2B%2B)
вот прочти вдумчиво.

Добавлено через 15 минут
вот тебе мой вариант сортировки с чарами, с сохранением адресов и походу то что тебе нужно
Кликните здесь для просмотра всего текста
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <windows.h>
#include <locale>
 
using namespace std;
 
void sort_chars (char **a, int n, int stolb)
{
 
    int arr[n],temp_1;
    int nuli=0;
    for (int i=0;i<n;i++)   ///формируем массив длин строк
    {
        for (int j=0;j<stolb;j++)
        {
            if (a[i][j]==NULL)
            {
               nuli++;
            }
        }
        arr[i]=stolb-nuli;
 
        nuli=0;
    }
 
    for (int i=0;i<n;i++) /// массив сортировки строк
    {
       for (int k=i;k<n;k++){
 
            if (arr[i]<=arr[k])
            {
                    temp_1=arr[i];
                    arr[i]=arr[k];
                    arr[k]=temp_1;
 
                    char *temp =new char[stolb];
                    temp=a[i];
                    char **adr1=&a[i];
                    char **adr2=&a[k];
                    *adr1=a[k];
                    *adr2=temp;
 
            }
        }
    }
 
}
 
int main()
{
    setlocale(LC_ALL,"RUS");
      int n, size;
    cout << " Введите количество рядков: ";
    cin >> n;
    cout << " Введите размер строки: ";
    cin >> size; size++;
    cout<<endl;
    //Сначала объявляется указатель второго  порядка char **list, который ссылается на массив указателей char*[n]
    char **list = new char*[n];
    for(int i=0; i<n; i++)
        list[i] = new char[size];
 
    for (int i=0; i<n;i++)
        for (int j=0;j<size;j++)
            list[i][j]=NULL;
 
 
 
    cin.ignore();
    for(int i=0; i<n; i++)
    {
        cout << " Ведите текст: ";
        cin.getline(list[i],size);
    }
 
cout<<"Что сформировалось"<<endl;
    for (int i=0; i<n;i++)
    {
        cout<<endl;
        for (int j=0;j<size;j++)
        {
            cout<<list[i][j];
        }
            cout<<"Строка "<<i<<" имеет адрес "<<&list[i]<<endl;
 
    }
 
   sort_chars(list,n,size);
    cout<<endl<<endl<<"После сортировки"<<endl;
    for (int i=0; i<n;i++)
    {
        cout<<endl;
        for (int j=0;j<size;j++)
        {
            cout<<list[i][j];
        }
            cout<<"Строка "<<i<<" имеет адрес "<<&list[i]<<endl;
 
    }
 
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    return 0;
}
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:26  [ТС]
Так в том коде на каждую строку ошибка, я понимаю, что там уже не логичные вещи написаны...
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:28
и на If чтоли тоже ошибка?
а дальше - указатель должен иметь тип
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:33  [ТС]
Вот твоя программа (на скрине)
ничего не менял, просто вставил твой код
проблема все та же. Какой был адрес первой строки , таким и остался, а строка изменилась
Миниатюры
Программа для сортировки массива строк  
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:36  [ТС]
Цитата Сообщение от andreyananas Посмотреть сообщение
C++
1
2
3
4
*str1=&add[i];
* * * * * * * * *str2=&add[j];
* * * * * * * * add[i]=&str2;
* * * * * * * * add[j]=&str1;
на это 4 ошибки в каждой строке

Добавлено через 1 минуту
Цитата Сообщение от fmtuner Посмотреть сообщение
вот тебе мой вариант сортировки с чарами, с сохранением адресов и походу то что тебе нужно
А где ты компилируешь? Мб это из-за компилятора (если у тебя все норм с адресами)
у меня свежий Qt MinGW
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:44
mingw Тоже использую

ты уверен что именно тот который надо проект запустил?

п.с. по ссылке моей прочитал про ссылки с++?
Миниатюры
Программа для сортировки массива строк  
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:46
Цитата Сообщение от andreyananas Посмотреть сообщение
*str1=&add[i];
* * * * * * * * *str2=&add[j];
* * * * * * * * add[i]=&str2;
* * * * * * * * add[j]=&str1;
ПОТОМУ ЧТО ТИП ДОЛЖЕН БЫТЬ У УКАЗАТЕЛЯ!!!!!
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:50  [ТС]
есть такое чувство, что все работает правильно, просто я не понимаю чего то))))) вот вопрос на засыпку:

есть массив char arr[4]={'A'};
и есть указатель на этот массив char *p=arr;
строка cout << p; должна вывести АДРЕС на какой указывает указатель(так же?)
а выводит: А !!!!!!!!!!!!!!! Получается "А" и есть адрес ?

вот как тут не запутаться?))

Добавлено через 1 минуту
Цитата Сообщение от fmtuner Посмотреть сообщение
mingw Тоже использую
ты уверен что именно тот который надо проект запустил?
ДА!))) Так посмотри, у тебя так же адреса остались, а строки поменялись.

Добавлено через 21 секунду
Цитата Сообщение от fmtuner Посмотреть сообщение
ПОТОМУ ЧТО ТИП ДОЛЖЕН БЫТЬ У УКАЗАТЕЛЯ!!!!!
Я их в начале функции объявил
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:54
слушай я такими темпами сам уже освою это программирование
char *p=&arr; тогда он указывает на адрес
а не просто arr; тогда он указывает на элемент (наверное )

Добавлено через 1 минуту
Цитата Сообщение от andreyananas Посмотреть сообщение
ДА!))) Так посмотри, у тебя так же адреса остались, а строки поменялись.
а тебе чего надо было добиться?
Цитата Сообщение от andreyananas Посмотреть сообщение
Я их в начале функции объявил
как объявлял?

Добавлено через 2 минуты
точнее тогда *str надо без * использовать
0
 Аватар для andreyananas
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:59  [ТС]
Цитата Сообщение от fmtuner Посмотреть сообщение
char *p=&arr; тогда он указывает на адрес
char *p=&arr; - так ошибку выбивает)))
Цитата Сообщение от fmtuner Посмотреть сообщение
а тебе чего надо было добиться?
что бы... строки в памяти не передвигались.
при вводе первая строка получает адрес, он у нее и должен остатся, а указатель на этот адрес должен получить индекс в зависимости от результатов сортировки.

а такой результат как в твоем коде, у меня уже есть в моем коде, тут то сложного ничего нету.
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 01:38
Кликните здесь для просмотра всего текста
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <windows.h>
#include <locale>
 
using namespace std;
 
char sort_chars (char **a, int n, int stolb)
{
    char **adres[n];
    int arr[n];
    int nuli=0;
    for (int i=0;i<n;i++)   ///формируем массив длин строк
    {
        for (int j=0;j<stolb;j++)
        {
            if (a[i][j]==NULL)
            {
               nuli++;
            }
        }
        arr[i]=stolb-nuli;
        adres[i]=&a[i];
        nuli=0;
    }
 
    for (int i=0;i<n;i++) /// массив сортировки строк
    {
       for (int k=i;k<n;k++){
 
            if (arr[i]<arr[k])
            {
                    adres[i]=&a[k];
                    adres[k]=&a[i];
 
         /*           temp_1=arr[i];
                    arr[i]=arr[k];
                    arr[k]=temp_1;
                    char *temp =new char[stolb];
                    temp=a[i];
                    char **adr1=&a[i];
                    char **adr2=&a[k];
                    *adr1=a[k];
                    *adr2=temp;
*/
            }
        }
    }
    cout<<endl<<"Получилось:"<<endl;
    for (int i=0;i<n;i++)
    {
        cout<<*adres[i]<<" адрес строки "<<adres[i]<<endl;
    }
}
 
int main()
{
    setlocale(LC_ALL,"RUS");
      int n, size;
    cout << " Введите количество рядков: ";
    cin >> n;
    cout << " Введите размер строки: ";
    cin >> size; size++;
    cout<<endl;
    //Сначала объявляется указатель второго  порядка char **list, который ссылается на массив указателей char*[n]
    char **list = new char*[n];
    for(int i=0; i<n; i++)
        list[i] = new char[size];
 
    for (int i=0; i<n;i++)
        for (int j=0;j<size;j++)
            list[i][j]=NULL;
 
 
 
    cin.ignore();
    for(int i=0; i<n; i++)
    {
        cout << " Ведите текст: ";
        cin.getline(list[i],size);
    }
 
cout<<"Что сформировалось"<<endl;
    for (int i=0; i<n;i++)
    {
        cout<<endl;
        for (int j=0;j<size;j++)
        {
            cout<<list[i][j];
        }
            cout<<"Строка "<<i<<" имеет адрес "<<&list[i]<<endl;
 
    }
    sort_chars(list,n,size);
 
 
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2014, 01:38

Программа для сортировки любого массива
Отсортировать любой массив. Создать программу для отсортировки любого массива.

Программа для сортировки одномерного массива нуждается в доработке
var A:array of integer; i, Res:integer; f:boolean; begin for i:=1 to 5 do begin write ('Элемент ', i,...

Процедура сортировки строк двумерного массива
Напишите, пожалуйста, процедуру (Не обязательно всю программу) сортировки строки двумерного массива по возрастанию.

Переделать код для сортировки массива на код для сортировки двумерной матрицы
возникла проблема, не могу переделать код для сортировки массива на код для сортировки двумерной матрицы. вот исходный код void...

Не работает программа сортировки массива
Помогите найти ошибку program pas1; var i, j, n, k, t: integer; ax: array of integer; c: array of integer; sum: array of...


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

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru