0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
1

Простая сортировка массива

15.11.2015, 10:55. Показов 2868. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Прошу помочь разобраться с лабораторной работой по C++.
Задание:
"Написать программу в которой:
1) Описать динамический массив целых чисел (количество Эл-тов указывает пользователь), для выделения памяти использовать операцию new
2) Заполнить массив случайными числами (отдельная функция с аргументами: указатель на массив, количество элементов (по умолчанию 10)
3) Дать пользователю возможность выбрать вариант обмена: ссылки(0)/указатели(1).
4) Описать функцию сортировки массива по неубыванию любым доступным способом (для обмена использовать функцию в зависимости от выбора пользователя: встраиваемую функцию с аргументами – указателями на меняемые ячейки или встраиваемую функцию с аргументами – ссылками на меняемые ячейки. Функции должны называться одинаково, отличаться лишь аргументами).
5) Снабдить программу комментариями стиля Си++
6) Результат вывести на экран и сохранить в файл (описать функцию сохранения массива в файл с аргументами: массив, количество элементов, имя файла).
Замечание: Для клавиатурного/экранного ввода/вывода использовать объекты cin и cout. Для файлового вывода – объект класса fstream."
Я создал массив и заполнил его случайными числами. Однако при сортировке где-то происходит ошибка и появляется несколько 5-значных чисел.
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
#include <iostream>
#include <ctime>
#include <iomanip>
 
using namespace std;
void Pr(int *Arr, int);
void Pr2(int *Arr, int);
 
int main(int argc, char* argv[])
{
    srand(time(0));
    int N;
    cout<< "Vvedite kolichestvo: ";
    cin>>N;
    int *Arr = new int [N];
        for (int count = 0; count < N; count++)
            Arr[count] = (rand() % N + 1);
        cout << "array = ";
                for (int count = 0; count < N; count++)
            cout << setprecision(2) << Arr[count] << "    ";
        delete [] Arr; // высвобождение памяти
        cout << endl;
        Pr(Arr, N); // вызов функции сортировки пузырьком
        for (int count = 0; count < N; count++)
        {
            cout << setw(2) << Arr[count] << "  "; // печать отсортированного массива
        }
        cout << "\n";
                Pr2(Arr, N); // вызов функции сортировки пузырьком
        for (int count = 0; count < N; count++)
        {
            cout << setw(2) << Arr[count] << "  "; // печать отсортированного массива
        }
        cout << "\n";
    system("pause");
    return 0;
}
 
void Pr (int *Arr, int size)
{
     int tmp;
     for(int i = 0; i < size - 1; ++i) // i - номер прохода
     {
             for(int j = 0; j < size - 1; ++j) // внутренний цикл прохода
             {
                     if (Arr[j + 1] < Arr[j])
                     {
                               tmp = Arr[j + 1];
                               Arr[j + 1] = Arr[j];
                               Arr[j] = tmp;
                     }
             }
     }
}
 
void Pr2 (int *Arr, int size)
{
     int tmp;
     for(int i = 0; i < size - 1; ++i) // i - номер прохода
     {
             for(int j = 0; j < size - 1; ++j) // внутренний цикл прохода
             {
                     if (Arr[j + 1] > Arr[j])
                     {
                               tmp = Arr[j + 1];
                               Arr[j + 1] = Arr[j];
                               Arr[j] = tmp;
                     }
             }
     }
}
Итого мне непонятен 3-й пункт, плюс ошибка при сортировке.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2015, 10:55
Ответы с готовыми решениями:

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

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

Простая сортировка массива, с использованием входного и выходного файла
Добрый день. Задача: дан массив целых чисел - отсортировать его в порядке неубывания. Формат...

PHP не простая сортировка
Добрый день. Есть сайт на wordpress и список регионов. Нужно было отсортировать регионы. Всё...

8
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
15.11.2015, 11:06 2
1.
Цитата Сообщение от strelok18 Посмотреть сообщение
delete [] Arr; // высвобождение памяти
cout << endl;
Pr(Arr, N); // вызов функции сортировки пузырьком
После освобождения памяти массива УЖЕ НЕТ!
Интересно, что Вы сортируете?

2. Зачем две одинаковых функции pr и pr2?
Смысл функции в основном именно в том, чтобы ее код не писать несколько раз.
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
15.11.2015, 11:08  [ТС] 3
Но если ставить вызов сортировки до освобождения памяти, он вообще ничего не сортирует и плюс нарушается вывод результатов изначального массива, он сразу почему-то отсортированный.
Pr и Pr2 - первая по возрастанию, вторая по убыванию.
Миниатюры
Простая сортировка массива  
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
15.11.2015, 11:13 4
Цитата Сообщение от strelok18 Посмотреть сообщение
вообще ничего не сортирует
Проверяли отладчиком? https://www.cyberforum.ru/cpp-... 62479.html
Цитата Сообщение от strelok18 Посмотреть сообщение
Pr и Pr2 - первая по возрастанию, вторая по убыванию
Добавьте еще один bool параметр, который определяет тип сортировки.
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
15.11.2015, 11:16  [ТС] 5
Не проверял, через Dev-C++ делаю. Возможно, где-то в знаках ошибся.
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
15.11.2015, 11:26 6
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
#include <iostream>
#include <ctime>
using namespace std;
 
void Pr(int *Arr, int,bool);
void Print(int *Arr, int size)
{
    for (int count = 0; count < size; count++)
    {
        cout<<Arr[count]<<" "; // печать отсортированного массива
    }
    cout <<endl;
}
void Fill(int *Arr, int size)
{
    for (int count = 0; count < size; count++)
    {
        Arr[count] = rand() % 100 + 1;
    }
    cout <<endl;
}
int main()
{
    srand((unsigned)time(0));
    int N;
    cout<< "Enter size: ";
    cin>>N;
    int *Arr = new int [N];
    Fill(Arr,N);
    
    cout << "array =\n";
    Print(Arr, N);
    Pr(Arr, N,true); // вызов функции сортировки по возрастанию
    Print(Arr, N);
    Pr(Arr, N,false); // вызов функции сортировки по убыванию
    Print(Arr, N);
    
    delete [] Arr; // высвобождение памяти
    cout <<endl;
    system("pause");
    return 0;
}
void Pr (int *Arr, int size,bool direction)
{
    int tmp;
    for(int i = 0; i < size - 1; ++i) // i - номер прохода
    {
        for(int j = 0; j < size - 1-i; ++j) // внутренний цикл прохода
        {
            if ( direction && Arr[j + 1] < Arr[j] || !direction && Arr[j + 1] > Arr[j])
            {
                tmp = Arr[j + 1];
                Arr[j + 1] = Arr[j];
                Arr[j] = tmp;
            }
        }
    }
}
Лучше, конечно, сделать как в стандартных алгоритмах: условие сортировки вынести в отдельную функцию:
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
#include <iostream>
#include <ctime>
using namespace std;
 
void Pr (int *Arr, int size,bool (*sort_type)(int,int));
void Print(int *Arr, int size)
{
    for (int count = 0; count < size; count++)
    {
        cout<<Arr[count]<<" "; // печать отсортированного массива
    }
    cout <<endl;
}
void Fill(int *Arr, int size)
{
    for (int count = 0; count < size; count++)
    {
        Arr[count] = rand() % 100 + 1;
    }
    cout <<endl;
}
// inline означает вставлять код функции в каждый ее вызов
inline bool Gt(int a,int b)
{
    return a>b;
}
inline bool Lt(int a,int b)
{
    return a<b;
}
 
int main()
{
    srand((unsigned)time(0));
    int N;
    cout<< "Enter size: ";
    cin>>N;
    int *Arr = new int [N];
    Fill(Arr,N);
    
    cout << "array =\n";
    Print(Arr, N);
    Pr(Arr, N,Gt); // вызов функции сортировки по возрастанию
    Print(Arr, N);
    Pr(Arr, N,Lt); // вызов функции сортировки по убыванию
    Print(Arr, N);
    
    delete [] Arr; // высвобождение памяти
    cout <<endl;
    system("pause");
    return 0;
}
void Pr (int *Arr, int size,bool (*sort_type)(int,int))
{
    int tmp;
    for(int i = 0; i < size - 1; ++i) // i - номер прохода
    {
        for(int j = 0; j < size - 1-i; ++j) // внутренний цикл прохода
        {
            if ( sort_type(Arr[j],Arr[j+1]))
            {
                tmp = Arr[j + 1];
                Arr[j + 1] = Arr[j];
                Arr[j] = tmp;
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
15.11.2015, 11:33  [ТС] 7
Спасибо. Ругается на srand, но общий смысл я понял.
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
15.11.2015, 11:38 8
Лучший ответ Сообщение было отмечено strelok18 как решение

Решение

Цитата Сообщение от strelok18 Посмотреть сообщение
Ругается на srand
Добавьте
C++
1
#include <stdlib.h>
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
15.11.2015, 11:40  [ТС] 9
Спасибо, работает. Теперь сделаю выбор через case и сохранение в файл.
0
15.11.2015, 11:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2015, 11:40
Помогаю со студенческими работами здесь

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

Сортировка в отчете (не простая)
Есть два отчета по денежным средствам: 1-й - Итоговая таблица денежных средств в разрезе компаний...

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

Не работает простая формула массива
Что не так? (Excel 2003) СЧЁТЕСЛИ(B1:D1-B2:D2;&quot;&gt;0&quot;) А вот так работает:...


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

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

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