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

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

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

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

Собственно суть проблемы в том, что при попытки сделать массив например char list[n][100]; (n - вводимое количество строк) -- выдает ошибку. Я так понимаю, n - должна быть const, а не переменной.
Но как же тогда сделать вводимое значение количества строк?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
03.04.2014, 11:53  [ТС]     Программа для сортировки массива строк #21
Цитата Сообщение от fmtuner Посмотреть сообщение
а в си массивы и так передаются через указатели.
в С++? или в С# тоже?

Добавлено через 2 минуты
Цитата Сообщение от fmtuner Посмотреть сообщение
andreyananas, а какие условия сортировки?
Та как я понял, единственное условие, что бы при сортировки сами строки не "передвигались" по памяти, а только их адреса.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
03.04.2014, 11:56     Программа для сортировки массива строк #22
ты про бери свой массив и передавай в функцию, конструкция типа
C++
1
2
3
4
5
6
7
8
9
10
viod function (int a[])
{
 
}
 
int main
{
 int arr[5];
function(arr);
}
передает ссылку на массив. соответственно в функции ты будешь обрабатывать arr, через а.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
03.04.2014, 12:08  [ТС]     Программа для сортировки массива строк #23
ничего не понял)
don_keyhot
 Аватар для don_keyhot
4 / 4 / 2
Регистрация: 02.04.2014
Сообщений: 60
03.04.2014, 12:13     Программа для сортировки массива строк #24
andreyananas, list[i] = new char[size -1]; ой, извините, это я нечаянно, обшибся не туда вставил, хотел в getline(, size-1) потому что последний символ должен быть '\0'.
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
03.04.2014, 12:23     Программа для сортировки массива строк #25
andreyananas,
имею ввиду как отсортировать надо?
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
03.04.2014, 18:03  [ТС]     Программа для сортировки массива строк #26
Цитата Сообщение от fmtuner Посмотреть сообщение
имею ввиду как отсортировать надо?
по количеству символов

Добавлено через 5 часов 22 минуты
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
char **sort(char**, int);
 
int main()
{
    SetConsoleOutputCP(1251);
    system("cls");
    int n, size;
    cout << " Введите количество рядков: ";
    cin >> n;
    cout << " Введите размер рядков: ";
    cin >> size;
    //Сначала объявляется указатель второго  порядка char **list, который ссылается на массив указателей char*[n]
    char **list = new char*[n];
    for(int i=0; i<n; i++)
        list[i] = new char[size];
    fflush(stdin);
    for(int i=0; i<n; i++)
    {
        cout << " Ведите текст: ";
        cin.getline(list[i],size);
    }
    for(int i=0; i<n; i++)
    {
        cout << list[i]<< endl;
    }
 
    list=sort(list,n); // НЕ РАБОТАЕТ сортировка!!!!!
 
    for(int i=0; i<n; i++)
    {
        cout << " После сортировки: " << list[i]<< endl;
    }
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    delete [] list;
    return 0;
}
char **sort(char **arr, int N)
{
    char *tmp;
    for(int i = 0; i < N - 1; ++i) // i - номер прохода
        {
            for(int j = 0; j < N - 1; ++j) // внутренний цикл прохода
            {
                if (strcmp(arr[j], arr[j + 1])>0)
                {
                    tmp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
    return arr;
}
вот прикрутил функцию по сортировки, но она не хочет работать(

Добавлено через 14 минут
Вот если эту функцию
Цитата Сообщение от andreyananas Посмотреть сообщение
C++
1
(strcmp(arr[j], arr[j + 1])>0)
Заменить на вот такое
C++
1
((strlen(arr[j])) > (strlen(arr[j+1])))
Тогда все работает. Но почему не работает с функцией strcmp()?
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
03.04.2014, 19:13  [ТС]     Программа для сортировки массива строк #27
Вот объясните мне кто нибудь,
C++
1
 cout << " После сортировки: " << *(list+i) << ", его адрес: " << (list+i) << endl;
C++
1
 cout << [B](list+i)[/B];
Это адрес указателя? Или это адрес на который указывает указатель???
Миниатюры
Программа для сортировки массива строк  
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
03.04.2014, 23:54  [ТС]     Программа для сортировки массива строк #28
никто не может подсказать? Я просто запутался с этими указателями

Добавлено через 2 часа 54 минуты
Народ ну подскажите, как посмотреть адрес, на какой указывает указатель???
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6158 / 2887 / 282
Регистрация: 04.12.2011
Сообщений: 7,685
Записей в блоге: 3
04.04.2014, 00:37     Программа для сортировки массива строк #29
Сама сортировка, - фантазия на тему выбора. Не это главное.
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
#include <iostream>
using namespace std;
int main(){
const size_t maх_strlen = 512;//можете больше сделать)
char **array_string;
int arr_str_size;
cout<<"Enter the string number ";
cin>>arr_str_size;
cout<<endl;
array_string= new char* [arr_str_size];
for (int i = 0; i < arr_str_size; ++i){
    cout<<"Enter the Array_string["<<i<<"] :";
    char tmp_cs[maх_strlen];
cin>>tmp_cs;
array_string[i] = new char[strlen(tmp_cs)+1];
strcpy(array_string[i], tmp_cs);
}
cout<<endl;
cout<<"String Array:"<<endl;
for (int i = 0; i < arr_str_size; ++i)
cout<<i<<" "<< array_string[i] <<endl;
 
char **pointers_to_cs;
pointers_to_cs=new char* [arr_str_size];
for(int i=0; i<arr_str_size; ++i)pointers_to_cs[i]=0;
 
char *pointer_carrent;
bool broker=false;
 
//sorting by length
for(int a=0; a<arr_str_size; ++a){
pointer_carrent= array_string[0];
for(int i=0; i<arr_str_size; ++i){
 
//find already exist pointers and jump to next if found
for(int j=0; j<arr_str_size; ++j){
if(!pointers_to_cs[j])continue;
    if(pointers_to_cs[j] == array_string[i]){
if(pointer_carrent == array_string[i] && i != arr_str_size-1)pointer_carrent = array_string[i+1];
 broker=true;
 break;
    }   
}
if(broker){
broker = false;
continue;
}
 
if(strlen(pointer_carrent)>strlen(array_string[i]))pointer_carrent=array_string[i];
}
pointers_to_cs[a]=pointer_carrent;
}
 
cout<<endl<<"sorted pointers array"<<endl<<endl;
for(int i=0; i<arr_str_size; ++i) cout<<pointers_to_cs[i]<<endl;
 
cout<<endl;
system("pause"); 
    return 0; 
}
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 00:44  [ТС]     Программа для сортировки массива строк #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сама сортировка, - фантазия на тему выбора. Не это главное.
А можно закомментировать, код?

Добавлено через 3 минуты
и поясни ты мне, как посмотреть адрес на который указывает указатель?
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 00:48     Программа для сортировки массива строк #31
Вот что получилось.
К тому что было - добавилась инициализация пустого массива list NULLами;
ну и... вроде работает
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <windows.h>
#include <locale>
 
using namespace std;
 
void sort_chars (char **a, int n, int stolb)
{
 
    int arr[n],temp_1;
    char temp;
    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;
                for (int j=0;j<stolb;j++)
                {
                    temp=a[i][j];
                    a[i][j]=a[k][j];
                    a[k][j]=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];
        }
    }
 
    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];
        }
    }
 
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    return 0;
}


вообще наверно если использовать вектора всё проще будет
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 00:57  [ТС]     Программа для сортировки массива строк #32
Цитата Сообщение от fmtuner Посмотреть сообщение
C++
1
2
3
for (int i=0; i<n;i++)
* * * * for (int j=0;j<size;j++)
* * * * * * list[i][j]=NULL;
А зачем это?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6158 / 2887 / 282
Регистрация: 04.12.2011
Сообщений: 7,685
Записей в блоге: 3
04.04.2014, 00:57     Программа для сортировки массива строк #33
Цитата Сообщение от andreyananas Посмотреть сообщение
А можно закомментировать, код?
Элемнентарно. Но обычно после этого не работает. Если хотите понять, - смотрите. Спрашивайте конкретно.
Цитата Сообщение от andreyananas Посмотреть сообщение
и поясни ты мне, как посмотреть адрес на который указывает указатель?
char *ptr = "chupacka";
cout<<(void*)ptr;
Но что это даст? Не значения указателей же нужно сортировать. Нужно записать указатели в соответствии с заданным порядком строк на которые они указывают. Поэтому совершенно неважно что в них было и что будет. Интересней то, как их записать в нужном порядке.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 01:00  [ТС]     Программа для сортировки массива строк #34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но что это даст? Не значения указателей же нужно сортировать. Нужно записать указатели в соответствии с заданным порядком строк на которые они указывают. Поэтому совершенно неважно что в них было и что будет. Интересней то, как их записать в нужном порядке.
Это даст возможность проверить правильно я выполнил задание или нет)
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 01:00     Программа для сортировки массива строк #35
Цитата Сообщение от andreyananas Посмотреть сообщение
А зачем это?
в сортировке надо посчитать количество пустых символов в строке. (длина строки 7, а введено 3 символа например).
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 01:07  [ТС]     Программа для сортировки массива строк #36
Цитата Сообщение от IGPIGP Посмотреть сообщение
char *ptr = "chupacka";
cout<<(void)ptr;
Не хочет даже компилировать(

Добавлено через 1 минуту
Цитата Сообщение от fmtuner Посмотреть сообщение
в сортировке надо посчитать количество пустых символов в строке. (длина строки 7, а введено 3 символа например).
Хм об этом я забыл)
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
04.04.2014, 01:12     Программа для сортировки массива строк #37
Цитата Сообщение от andreyananas Посмотреть сообщение
Не хочет даже компилировать(
(void*)ptr;
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 01:22  [ТС]     Программа для сортировки массива строк #38
Что просто p
что (void*)p
одинаковый адрес показывает(
Так это показывает адрес указателя? или адрес на какой указывает указатель?
Миниатюры
Программа для сортировки массива строк  
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
04.04.2014, 01:24  [ТС]     Программа для сортировки массива строк #39
Цитата Сообщение от IGPIGP Посмотреть сообщение
const size_t
Почему size_t ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 04:02     Программа для сортировки массива строк
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6158 / 2887 / 282
Регистрация: 04.12.2011
Сообщений: 7,685
Записей в блоге: 3
04.04.2014, 04:02     Программа для сортировки массива строк #40
Цитата Сообщение от andreyananas Посмотреть сообщение
Почему size_t ?
Можно и целое со знаком. Если остальное Вам понятно, то проблем нет.
Цитата Сообщение от andreyananas Посмотреть сообщение
Что просто p
что (void*)p
одинаковый адрес показывает(
Если указатель на тип char, не напечатает адрес, а выведет строку.
Yandex
Объявления
04.04.2014, 04:02     Программа для сортировки массива строк
Ответ Создать тему
Опции темы

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