Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 806
02.04.2014, 20:56     Программа для сортировки массива строк #1
Нужно написать программу для сортировки строк, используя указатели.

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

Собственно суть проблемы в том, что при попытки сделать массив например char list[n][100]; (n - вводимое количество строк) -- выдает ошибку. Я так понимаю, n - должна быть const, а не переменной.
Но как же тогда сделать вводимое значение количества строк?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 806
04.04.2014, 18:34  [ТС]     Программа для сортировки массива строк #41
Цитата Сообщение от fmtuner Посмотреть сообщение
Вот что получилось.
К тому что было - добавилась инициализация пустого массива list NULLами;
ну и... вроде работает
Работает так же как и мое((
Вот я скинул скрин результата, посмотри.
Строки местами поменялись, а адреса остались те же.
А нужно, что бы строка куда записалась, там и осталась, после сортировки.
Миниатюры
Программа для сортировки массива строк  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
вот тебе
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 806
04.04.2014, 21:18  [ТС]     Программа для сортировки массива строк #43
swap

length


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

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

п.с. по ссылке моей прочитал про ссылки с++?
Миниатюры
Программа для сортировки массива строк  
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;
ПОТОМУ ЧТО ТИП ДОЛЖЕН БЫТЬ У УКАЗАТЕЛЯ!!!!!
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 806
05.04.2014, 00:50  [ТС]     Программа для сортировки массива строк #55
есть такое чувство, что все работает правильно, просто я не понимаю чего то))))) вот вопрос на засыпку:

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

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

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

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

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

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

а такой результат как в твоем коде, у меня уже есть в моем коде, тут то сложного ничего нету.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 01:38     Программа для сортировки массива строк
Еще ссылки по теме:

Составить программу сортировки массива строк по длине строки C++
Составить программу сортировки массива строк по длине строки C++
C++ Два счетчика для обмена и сравнений для сортировки массива

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

Или воспользуйтесь поиском по форуму:
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;
}
Yandex
Объявления
05.04.2014, 01:38     Программа для сортировки массива строк
Ответ Создать тему
Опции темы

Текущее время: 07:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru