Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
andreyananas
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
#1

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

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

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

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

Собственно суть проблемы в том, что при попытки сделать массив например char list[n][100]; (n - вводимое количество строк) -- выдает ошибку. Я так понимаю, n - должна быть const, а не переменной.
Но как же тогда сделать вводимое значение количества строк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 20:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа для сортировки массива строк (C++):

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

Составить программу сортировки массива строк по длине строки
Помогите пожалуйста

Составить программу сортировки массива строк по длине строки
Составить программу сортировки массива строк по длине строки.

Программа сортировки массива методом пузырька
Здравствуйте! Пожалуйста, помогите написать программу! Вот задание: ...

Строки. Составить программу сортировки массива строк, введенных пользователем.
Составить программу сортировки массива строк, введенных пользователем....

Где тут ошибка? Программа сортировки массива по возрастанию
программа сортирует массив по возрастанию. кусок кода который выполняет...

57
andreyananas
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
04.04.2014, 18:34  [ТС] #41
Цитата Сообщение от fmtuner Посмотреть сообщение
Вот что получилось.
К тому что было - добавилась инициализация пустого массива list NULLами;
ну и... вроде работает
Работает так же как и мое((
Вот я скинул скрин результата, посмотри.
Строки местами поменялись, а адреса остались те же.
А нужно, что бы строка куда записалась, там и осталась, после сортировки.
0
Миниатюры
Программа для сортировки массива строк  
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 21:04 #42
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
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
04.04.2014, 21:18  [ТС] #43
swap

length


а это что?
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 21:46 #44
http://www.cplusplus.com/reference/string/string/?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
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
04.04.2014, 22:59  [ТС] #45
Цитата Сообщение от fmtuner Посмотреть сообщение
если без свапа, то наверное вот так надо:
а почему в string ???
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 23:15 #46
а почему бы и нет? стринг - тот же массив чаров.
0
andreyananas
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
05.04.2014, 00:03  [ТС] #47
Цитата Сообщение от 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
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:23 #48
смотри на вещи проще:
если по условию задачи надо использовать именно чар - это одно.
если надо просто отсортировать строки - можно решить задачу не используя чары.

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

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

http://ru.wikipedia.org/wiki/%D1%F1%FB%EB%EA%E0_(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
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
05.04.2014, 00:26  [ТС] #49
Так в том коде на каждую строку ошибка, я понимаю, что там уже не логичные вещи написаны...
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:28 #50
и на If чтоли тоже ошибка?
а дальше - указатель должен иметь тип
0
andreyananas
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
05.04.2014, 00:33  [ТС] #51
Вот твоя программа (на скрине)
ничего не менял, просто вставил твой код
проблема все та же. Какой был адрес первой строки , таким и остался, а строка изменилась
0
Миниатюры
Программа для сортировки массива строк  
andreyananas
22 / 22 / 11
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
05.04.2014, 00:36  [ТС] #52
Цитата Сообщение от andreyananas Посмотреть сообщение
C++
1
2
3
4
*str1=&add[i];
* * * * * * * * *str2=&add[j];
* * * * * * * * add[i]=&str2;
* * * * * * * * add[j]=&str1;
на это 4 ошибки в каждой строке

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

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

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

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

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

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

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

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

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

а такой результат как в твоем коде, у меня уже есть в моем коде, тут то сложного ничего нету.
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 01:38 #58
Кликните здесь для просмотра всего текста
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
05.04.2014, 01:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 01:38
Привет! Вот еще темы с решениями:

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

Составить программу для сортировки данного набора строк по символу
Составить программу для сортировки данного набора строк по символу с номером...

Программа для поиска соответствие строк, учитывая регистр, в текстовом файле с 10000+ строк
Уважаемые форумчане, прошу у вас помощи я неделю в поисках. Мне нужна программа...

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


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

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

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