Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

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

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

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

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

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

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

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

Строки. Составить программу сортировки массива строк, введенных пользователем. - C++
Составить программу сортировки массива строк, введенных пользователем. Использовать функцию strcmp ().

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

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

57
don_keyhot
5 / 5 / 2
Регистрация: 02.04.2014
Сообщений: 60
03.04.2014, 10:23 #16
после ввода числа, перед вводом строки нужно проигнорировать "/n"

C++
1
2
3
4
5
6
7
8
9
10
11
    
    for (int i = 0; i<n; i++)
        list[i] = new char[size -1];
    
    cin.ignore(); //+ после ввода числа проигнорировать "/n" сидящий в буфере
 
    for (int i = 0; i<n; i++)
    {
        cout << " Ведите текст: ";
        cin.getline(list[i], size); // НЕ РАБОТАЕТ!
    }
Добавлено через 20 минут
fmtuner, наверное, вернее сказать это getline() хавает интер, нажатый после последнего cin'а
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 11:14  [ТС] #17
Цитата Сообщение от don_keyhot Посмотреть сообщение
C++
1
list[i] = new char[size -1];
Почему size -1????

Добавлено через 7 минут
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
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;
    }
 
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    delete [] list;
    return 0;
}
Нужна функция какая будет сравнивать и сортировать строки по количеству символов.
При этом сортировка должна происходит с помощью указателей (как я понял, без перемещения самих строк)
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
03.04.2014, 11:49 #18
а в си массивы и так передаются через указатели.
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 11:50  [ТС] #19
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
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] << " adress = " << sizeof(list[i]) << endl;
 
    [B]char *add[n];[/B] // указатель на адрес строк
 
    [B]for(int i=0; i<n; i++)
       add[i]=list[i];[/B] // вот так в add[i] что скопируется? адреса строк или само строки???
 
    for(int i=0; i<n; i++)
        cout << add[i] << " adress = " << sizeof(add[i]) << endl;
 
 
    //освобождение выделеной под массив памяти.
    for(int i=0; i<n; i++)
        delete [] list[i];
    delete [] list;
    return 0;
}
По заданию, я должен сделать двумерный массив char, записать в него строки, потом создать массив указателей на char и записать в него адреса строк. И уже его использовать для сортировки.

Так вот вопрос: имеет ли это смысл в моем коде? У меня же получается, выделяется память под строки, на какую изначально указывает массив указателей, ВЕРНО? (вот я проверял, у всех размер 4 байта, как и положено для указателя, я так думаю))) )
Раз так, тогда для сортировки я могу использовать первый массив **list и переписываться будут только адреса, а не сами строки????
help me=)
0
Миниатюры
Программа для сортировки массива строк  
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
03.04.2014, 11:51 #20
andreyananas, а какие условия сортировки?
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 11:53  [ТС] #21
Цитата Сообщение от fmtuner Посмотреть сообщение
а в си массивы и так передаются через указатели.
в С++? или в С# тоже?

Добавлено через 2 минуты
Цитата Сообщение от fmtuner Посмотреть сообщение
andreyananas, а какие условия сортировки?
Та как я понял, единственное условие, что бы при сортировки сами строки не "передвигались" по памяти, а только их адреса.
0
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, через а.
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 12:08  [ТС] #23
ничего не понял)
0
don_keyhot
5 / 5 / 2
Регистрация: 02.04.2014
Сообщений: 60
03.04.2014, 12:13 #24
andreyananas, list[i] = new char[size -1]; ой, извините, это я нечаянно, обшибся не туда вставил, хотел в getline(, size-1) потому что последний символ должен быть '\0'.
0
fmtuner
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
03.04.2014, 12:23 #25
andreyananas,
имею ввиду как отсортировать надо?
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
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()?
0
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 19:13  [ТС] #27
Вот объясните мне кто нибудь,
C++
1
 cout << " После сортировки: " << *(list+i) << ", его адрес: " << (list+i) << endl;
C++
1
 cout << [B](list+i)[/B];
Это адрес указателя? Или это адрес на который указывает указатель???
0
Миниатюры
Программа для сортировки массива строк  
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
03.04.2014, 23:54  [ТС] #28
никто не может подсказать? Я просто запутался с этими указателями

Добавлено через 2 часа 54 минуты
Народ ну подскажите, как посмотреть адрес, на какой указывает указатель???
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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; 
}
1
andreyananas
22 / 22 / 9
Регистрация: 15.10.2013
Сообщений: 862
Завершенные тесты: 2
04.04.2014, 00:44  [ТС] #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сама сортировка, - фантазия на тему выбора. Не это главное.
А можно закомментировать, код?

Добавлено через 3 минуты
и поясни ты мне, как посмотреть адрес на который указывает указатель?
0
04.04.2014, 00:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 00:44
Привет! Вот еще темы с ответами:

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

Составить программу для сортировки данного набора строк по символу - C++
Составить программу для сортировки данного набора строк по символу с номером k&gt;0. Значение k не превосходит длины с самой короткой строки...

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

Два счетчика для обмена и сравнений для сортировки массива - C++
написал два счетчика для обмена и сравнений для сортировки массива.Проблема при выводе выводится сначала кучу чисел сортировки и обмена,а...


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

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

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