Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
1

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

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

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

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

Собственно суть проблемы в том, что при попытки сделать массив например char list[n][100]; (n - вводимое количество строк) -- выдает ошибку. Я так понимаю, n - должна быть const, а не переменной.
Но как же тогда сделать вводимое значение количества строк?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2014, 20:56
Ответы с готовыми решениями:

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

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

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

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

57
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 18:34  [ТС] 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от fmtuner Посмотреть сообщение
Вот что получилось.
К тому что было - добавилась инициализация пустого массива list NULLами;
ну и... вроде работает
Работает так же как и мое((
Вот я скинул скрин результата, посмотри.
Строки местами поменялись, а адреса остались те же.
А нужно, что бы строка куда записалась, там и осталась, после сортировки.
Миниатюры
Программа для сортировки массива строк  
0
-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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 21:18  [ТС] 43
swap

length


а это что?
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 21:46 44
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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
04.04.2014, 22:59  [ТС] 45
Цитата Сообщение от fmtuner Посмотреть сообщение
если без свапа, то наверное вот так надо:
а почему в string ???
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 23:15 46
а почему бы и нет? стринг - тот же массив чаров.
0
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
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
-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/%... 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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:26  [ТС] 49
Так в том коде на каждую строку ошибка, я понимаю, что там уже не логичные вещи написаны...
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:28 50
и на If чтоли тоже ошибка?
а дальше - указатель должен иметь тип
0
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:33  [ТС] 51
Вот твоя программа (на скрине)
ничего не менял, просто вставил твой код
проблема все та же. Какой был адрес первой строки , таким и остался, а строка изменилась
Миниатюры
Программа для сортировки массива строк  
0
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
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
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
05.04.2014, 00:44 53
mingw Тоже использую

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

п.с. по ссылке моей прочитал про ссылки с++?
Миниатюры
Программа для сортировки массива строк  
0
-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
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
05.04.2014, 00:50  [ТС] 55
есть такое чувство, что все работает правильно, просто я не понимаю чего то))))) вот вопрос на засыпку:

есть массив 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 56
слушай я такими темпами сам уже освою это программирование
char *p=&arr; тогда он указывает на адрес
а не просто arr; тогда он указывает на элемент (наверное )

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

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

а такой результат как в твоем коде, у меня уже есть в моем коде, тут то сложного ничего нету.
0
-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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2014, 01:38
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru