С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
1

Выполнить сортировку слияниям (Merge Sort) и вывести данные и результаты на экран

24.06.2020, 22:45. Показов 3819. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Совсем запутался. 1.Требуется выполнить чтение данных с клавиатуры и из файла с возможностью выбора. 2.Выполнить сортировку слияниям (Merge Sort) и вывести данные и результаты на экран
Смог реализовать сортировку масива и его вывод на екран и в файл, но не смог реализовать ввод данных из файла или клавиатуры на выбор.
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
#include <stdio.h>
#include <iostream>
#include <time.h> 
#include <fstream>
 
using namespace std;
 
//Слияние
void merge(int* a, int* b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (a[h] <= a[j])
        {
            b[i] = a[h];
            h++;
        }
        else
        {
            b[i] = a[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    for (k = low; k <= high; k++)
        a[k] = b[k];
}
 
//Сортировка слиянием
void mergesort(int* a, int* b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(a, b, low, pivot);
        mergesort(a, b, pivot + 1, high);
        merge(a, b, low, pivot, high);
    }
}
int main()
{
    ofstream out;
    out.open("D:\\hello.txt");
    return 0;
    int n;
    cout << "n = "; cin >> n;
    int* a = new int[n];
    int* b = new int[n];
 
    //Записываем рандомные числа в массив А и заодно выводим в консоль
    for (int i = 0; i < n; i++) {
        a[i] = rand() % n + 1;
        cout << a[i] << " ";
        out << a[i] << " ";
    }
    cout << endl;
    out << endl;
    //Сортируем
    mergesort(a, b, 0, n - 1);
 
    //Выводим на экран отсортированный массив А
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
        out << a[i] << " ";
    }
    cout << endl << endl;
    out << endl << endl;
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2020, 22:45
Ответы с готовыми решениями:

Выполнить сортировку с помощью прямого обмена и вывести данные и результаты на экран
Здравствуйте. Совсем запутался. 1.Требуется выполнить чтение данных с клавиатуры и из файла с...

Выполнить расчеты и вывести результаты на экран через окно сообщений
В течение 6-ти дней (рабочая неделя) рабочий изготавливает детали 7-ми различных типов. Известно...

Выполнить пузырьковую сортировку массива по возрастанию и вывести исходный массив обработанный на экран
Выполнить пузырьковую сортировку массива по возрастанию и вывести исходный массив обработанный на...

Ввести строки из файла, записать в список ArrayList. Выполнить сортировку строк, используя метод sort()
Ввести строки из файла, записать в список ArrayList. Выполнить сортировку строк, используя метод...

19
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.06.2020, 00:24 2
Xao, в чём именно сложность ? записываете приглашение к выбору, например:
C++
1
2
int choice;
cout << "Make a choice: 1 - Keyboard, 2 - Fail "; cin >> choice;
затем оператор выбора (на Ваше усмотрение). если choice=1 - вызывайте функцию заполнения с клавиатуры, если
choice=2 - функцию чтения с файла

не по теме вопроса:
не забывайте освобождать память динамического массива
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
25.06.2020, 00:31  [ТС] 3
А где именно нужно это организовать, дело в тому что я никогда не делал подобного рода функцию
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.06.2020, 00:47 4
Цитата Сообщение от Xao Посмотреть сообщение
дело в тому что я никогда не делал подобного рода функцию
как раз хорошая возможность потренироваться. приглашение пишите в main, а функции напишите выше.

рекомендую начать с такой задачи: напишите программу с тремя функциями (заполнение с клавиатуры + рандомное заполнение + вывод на печать) пока без сортировки, но с выбором способа заполнения - и сбросьте что получилось

Добавлено через 3 минуты
кстати не заметил чтобы в условии говорилось что массивы одного размера
0
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1797
Регистрация: 18.10.2014
Сообщений: 16,902
25.06.2020, 01:01 5
Цитата Сообщение от Yetty Посмотреть сообщение
кстати не заметил чтобы в условии говорилось что массивы одного размера
Вы о чем? В условии только один массив. Второй массив в коде - не более чем вспомогательный внутренний буфер. Это деталь реализации, к условию задачи никакого отношения не имеющая.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.06.2020, 01:26 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В условии только один массив
решил почему-то что ТС нужно слить массивы конечно один, согласен
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
25.06.2020, 20:34  [ТС] 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
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include<iostream>
#include<fstream>
#include <time.h>
#include<cstdio>
using namespace std;
//Слияние
void merge(int* a, int* b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (a[h] <= a[j])
        {
            b[i] = a[h];
            h++;
        }
        else
        {
            b[i] = a[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    for (k = low; k <= high; k++)
        a[k] = b[k];
}
 
//Сортировка слиянием
void mergesort(int* a, int* b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(a, b, low, pivot);
        mergesort(a, b, pivot + 1, high);
        merge(a, b, low, pivot, high);
    }
}
 
int input(int Max)//Ввод размера и сравнение с Max
{
    int n;
    cout<<"Введите размер массива:";
    cin>>n;
    while(n<=0||n>Max)
    {
        cout<<"Введите размер массива снова:";
        cin>>n;
    }return n;
}
void Zap(int A[],int n)//Ручной ввод
{
    for(int i=0;i<n;i++)
    {
        cout<<i+1<<"Элемент массива->";
        cin>>A[i];
    }
}
void Zap(int A[],int n,int a,int b)//Рандомный ввод
{
    
    for(int i=0;i<n;i++)
 
        {
            A[i]=rand()%(b-a+1)+a;
    
        }
}
bool Zap(int A[],int n,char Name1[])//Чтение из файла
{
    ifstream out(Name1);
    if(!out) 
    {
        cout<<"Ошибка,файл не открыт."<<endl;
        return 1;
    }
    int k;
    for(int i(0);i<n&&out>>k;++i)
        {
            A[i]=k;
        }
    
    out.close();
    return 0;
 
}
 
void display(int A[],int n)//Вывод на экран
{
    cout<<"Как будем выводить массив?: \n 1-горизонтально 2- вертикально\n 3-вертикально и горизонтально->";
    int a;
    cin>>a;
    cout<<endl;
    switch(a)
    {
    case 1:
        {
    cout<<"Вывод на экран горизонтально: ";
    for (int i=0; i<n; i++)
    {
        cout<<"["<<i+1<<"]"<<":"<<A[i] <<" ";
    }
    cout<<endl;
        }break;
    case 2:
        {
    cout<<"Вывод на экран вертикально: "<<endl;
    for (int i=0; i<n; i++)
    {
        cout<<"["<<i+1<<"]"<<":"<<A[i]<<" "<<endl;
    }
        }break;
    case 3:
        {
            cout<<"Вывод на экран горизонтально: ";
            for (int i=0; i<n; i++)
            {
                cout<<"["<<i+1<<"]"<<":"<<A[i] <<" ";
            }
            cout<<endl;
 
            cout<<"Вывод на экран вертикально: "<<endl;
            for (int i=0; i<n; i++)
            {
                cout<<"["<<i+1<<"]"<<":"<<A[i]<<" "<<endl;
            }
        }}
}
 
 
int main()
{
    setlocale(0,""); 
    srand((unsigned)time(NULL));
    char Name1[]="Input.bin";
    int a,b;
    const int Max=200;
    int A[Max];
    int N,n=input(Max);
    cout<<"Как будем вводить: \n 1-вручную 2- рандом 3- из файла->";
    cin>>N;
    switch(N)
    {
    case 1://Через ввод
        {
            Zap(A,n);
        }break;
    case 2: //Через рандом
        {
            cout<<"Введите диапазон:"<<endl;
            cout<<"введите a=";cin>>a;
            cout<<"введите b=";cin>>b;
            int k;
    if(a>b)
    {
        int t=a;a=b;b=t;
    }
    
    Zap(A,n,a,b);
 
        }break;
    case 3://Заполнение из файла???
        {
 
            ifstream out("D:\\hello.txt",ios::out); 
            if(!out){cerr<<"error/n"<<endl;
            return 1;}
            for(int i=0;i<n;i++)
            {
                out.read((char*)&A[i],sizeof(i));
                out.close();
                char ch=getchar();
            }}break;
    }
    display(A,n);
    system ("pause");
    return 0;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 00:15 8
Xao, рандомный ввод не нужен по условию задачи - насчёт рандома я написал чтобы Вы потестили выбор.
тип лучше double, т.к. в условии не говорится насчёт целых.

C++
1
2
3
4
5
6
void Set (double *a, int n) 
{
    cout << "Enter " << n << " numbers:\n";
    for (int i = 0; i < n; i++)      
        cin >> a[i];    
}
Добавлено через 12 минут
вариант чтения данных из файла в динамический массив
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
double *Create () 
{
    int n=0;
    double *a=NULL, x;
    ifstream in("D:\\hello.txt");
    if (in.is_open())
    {        
        while(in >> x)
        {
            n++;
        }
        
        if(n) a = new double[n];
        
        in.clear();
        in.seekg(0, ios::beg);
        
        n=0;
        while(in >> x)
        { 
            a[n++]=x; 
        }
    in.close();
    }
    else cout << "Unable to open file\n";
    return a;
}
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
26.06.2020, 01:17  [ТС] 9
Блин, я не понимаю в какую часть когда надо вставлять то что вы скинули...

Добавлено через 27 минут
Можете помочь пожалуйста совместить мой код в вашими дополнениями, дело в тому что завтра к обеду надо будет уже сдавать роботу, я просто не могу понять как сделать что бы данные которые читаются с файла потом сортировались за алгоритмом Merge sort
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 01:39 10
Xao, у Вас всё получится. посмотрите рабочий вариант (переделайте под свою задачу - я читал данные со строки и сортировал пузырём)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 
void Random (double *a, int n) 
{
    for (int i = 0; i < n; i++)        
        a[i]=rand()%9 + 1;    
}
 
double *Create (int &n) 
{      
    double *a=NULL, x;    
    string s="5 78 23 1 17 31 23 55 4 11";
    stringstream in(s);       
        while(in >> x)
        {            
            n++;
        }        
        
        if(n) a = new double[n];
        
        in.clear();
        in.seekg(0, ios::beg);
        
        n=0;
        while(in >> x)
        { 
            a[n++]=x; 
        }         
    return a;
}
 
void BubbleSort (double *a, int n)
{
for (int i=0; i<n-1; i++)    
    for (int j=0; j<n-i-1; j++)        
      if (a[j] > a[j+1]) 
      swap(a[j], a[j+1]);
}
 
void Print (double *a, int n)
{
    for (int i = 0; i < n; i++)             
        cout << a[i] << " ";        
    cout << "\n";    
}  
 
int main()
{    
    int choice;
    cout << "Make a choice: 1 - Random, 2 - Fail "; cin >> choice;
 
    if (choice==1)
    {
        int n;
        cout << "n="; cin >> n;
        
        double *a = new double[n];
        
        Random(a,n);
        Print(a,n);
        BubbleSort(a,n);
        Print(a,n);
        delete[]a;
    }
    else if (choice==2)
    { 
        int n=0;       
        double *a=Create(n);        
        Print(a,n); 
        BubbleSort(a,n);
        Print(a,n);
        delete[]a;
    }   
    
system("pause"); 
return 0;
}
1
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
26.06.2020, 16:11  [ТС] 11
Прошу прощение, знаю что уже порядком надоел своей работой. Сделал по примеру выше своё задание, ошибок нету, но сортирует почему то не правильно.
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
 
void Random(double* a, int n)
{
    for (int i = 0; i < n; i++)
        a[i] = rand() % 9 + 1;
}
 
double* Create(int& n)
{
    double* a = NULL, x;
    string s = "5 78 23 1 17 31 23 55 4 11";
    stringstream in(s);
    while (in >> x)
    {
        n++;
    }
 
    if (n) a = new double[n];
 
    in.clear();
    in.seekg(0, ios::beg);
 
    n = 0;
    while (in >> x)
    {
        a[n++] = x;
    }
    return a;
}
 
void merge(int* c, int* b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (c[h] <= c[j])
        {
            b[i] = c[h];
            h++;
        }
        else
        {
            b[i] = c[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] =c[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = c[k];
            i++;
        }
    }
    for (k = low; k <= high; k++) c[k] = b[k];
}
void mergesort(int* с, int* b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(с, b, low, pivot);
        mergesort(с, b, pivot + 1, high);
        merge(с, b, low, pivot, high);
    }
}
 
void Print(double* a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << "\n";
}
 
int main()
{
    int choice;
    cout << "Make a choice: 1 - Random, 2 - Fail "; cin >> choice;
 
    if (choice == 1)
    {
        int n;
        cout << "n="; cin >> n;
 
        double* a = new double[n];
        int* c = new int[n];
        int* b = new int[n];
 
 
        Random(a, n);
        Print(a, n);
        mergesort(c, b, 0, n - 1);
        Print(a, n);
        delete[]a;
    }
    else if (choice == 2)
    {
        int n = 0;
        int* c = new int[n];
        int* b = new int[n];
 
        double* a = Create(n);
        Print(a, n);
        mergesort(c, b, 0, n - 1);
        Print(a, n);
        delete[]a;
    }
 
    system("pause");
    return 0;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 16:40 12
Цитата Сообщение от Xao Посмотреть сообщение
Сделал по примеру выше своё задание
Вы практически ничего не сделали - на ввод с клавиатуры не поменяли, на ввод с файла не поменяли хотя казалось бы уже написал Вам код практически полностью, осталось только заменить пару моментов, уже кстати написанных.

насчёт сортировки Merge Sort - Вы проверяли её работу на каком-нибудь массиве ? насколько вижу Вы
передаёте в функцию сортировки массивы, которые не заполнены
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
26.06.2020, 17:05  [ТС] 13
Я поменял на то что вы писали, просто, с файла данные все равно не читает, так и теперь еще и массив не правильно сортирует, хотя лучше сказать вообще не сортирует, я проверял Merge sort на массиве, в самом начале я скинул код который правильно сортировал, только там был ввод только с клавиатуры, а мне надо было на выбор или с клавиатуры либо из файла
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include<iostream>
#include<fstream>
#include <time.h>
#include<cstdio>
#include <string>
#include <sstream>
using namespace std;
 
void Set(double* a, int n)
{
    cout << "Enter " << n << " numbers:\n";
    for (int i = 0; i < n; i++)
        cin >> a[i];
}
 
double* Create()
{
    int n = 0;
    double* a = NULL, x;
    ifstream in("D:\\hello.txt");
    if (in.is_open())
    {
        while (in >> x)
        {
            n++;
        }
 
        if (n) a = new double[n];
 
        in.clear();
        in.seekg(0, ios::beg);
 
        n = 0;
        while (in >> x)
        {
            a[n++] = x;
        }
        in.close();
    }
    else cout << "Unable to open file\n";
    return a;
}
 
void merge(int* c, int* b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (c[h] <= c[j])
        {
            b[i] = c[h];
            h++;
        }
        else
        {
            b[i] = c[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] =c[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = c[k];
            i++;
        }
    }
    for (k = low; k <= high; k++) c[k] = b[k];
}
void mergesort(int* c, int* b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(c, b, low, pivot);
        mergesort(c, b, pivot + 1, high);
        merge(c, b, low, pivot, high);
    }
}
 
void Print(double* a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << "\n";
}
 
int main()
{
    int choice;
    cout << "Make a choice: 1 - keyboard, 2 - Fail "; cin >> choice;
    if (choice == 1)
    {
        int n;
        cout << "n="; cin >> n;
 
        double* a = new double[n];
        int* c = new int[n];
        int* b = new int[n];
 
 
        Set(a, n);
        Print(a, n);
        mergesort(c, b, 0, n - 1);
        Print(a, n);
 
        delete[]c;
    }
    else if (choice == 2)
    {
        int n = 0;
        int* c = new int[n];
        int* b = new int[n];
 
        double* a = Create();
        Print(a, n);
        mergesort(c, b, 0, n - 1);
        Print(a, n);
        delete[]a;
    }
 
    system("pause");
    return 0;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 17:20 14
Цитата Сообщение от Xao Посмотреть сообщение
с файла данные все равно не читает
что значит не читает ? со строки читает, с файла не читает ?

и ещё раз:
Цитата Сообщение от Yetty Посмотреть сообщение
Вы передаёте в функцию сортировки массивы, которые не заполнены
определитесь также с количеством массивов и их типом

Добавлено через 6 минут
зачем возврат размера через ссылку убрали ?
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
26.06.2020, 17:24  [ТС] 15
Цитата Сообщение от Yetty Посмотреть сообщение
что значит не читает ? со строки читает, с файла не читает ?
Когда я ввожу число 2, для выбора с файла, выдаёт просто пустую строчку. Определиться с количеством массива я не смогу наверное потому что у меня стоит задача проверить скорость с который алгоритм будет сортировать массив тем самым я буду подставлять разные количество элементов.
Цитата Сообщение от Yetty Посмотреть сообщение
Вы передаёте в функцию сортировки массивы, которые не заполнены
я понял это но не знаю как исправить
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 17:43 16
Цитата Сообщение от Xao Посмотреть сообщение
Определиться с количеством массива я не смогу
я про число массивов - нужно оставить 2 массива (a и b) одного типа - как у Вас в первом коде
Цитата Сообщение от Xao Посмотреть сообщение
Когда я ввожу число 2, для выбора с файла, выдаёт просто пустую строчку
не удивительно:
Цитата Сообщение от Yetty Посмотреть сообщение
зачем возврат размера через ссылку убрали ?
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
26.06.2020, 20:29  [ТС] 17
Ладно, как бы я не пытался нечего выходит, спасибо за помощь но я бездарь
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.06.2020, 23:38 18
Лучший ответ Сообщение было отмечено Xao как решение

Решение

что там может не выходить, если всё уже написано, причём не один раз ? на файл поменяете ? и оставьте int &n на месте
Кликните здесь для просмотра всего текста
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <sstream>
using namespace std;
 
void Set (double *a, int n)
{
    cout << "Enter " << n << " numbers:\n";
    for (int i = 0; i < n; i++)
        cin >> a[i];
}
 
double *Create (int &n)
{    
    double *a = NULL, x;
    string s = "5 78 23 1 17 31 23 55 4 11";
    stringstream in(s);
        while (in >> x)
        {
            n++;
        }
 
        if (n) a = new double[n];
 
        in.clear();
        in.seekg(0, ios::beg);
 
        n = 0;
        while (in >> x)
        {
            a[n++] = x;
        }
    
    return a;
}
 
void merge (double *a, double *b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (a[h] <= a[j])
        {
            b[i] = a[h];
            h++;
        }
        else
        {
            b[i] = a[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    for (k = low; k <= high; k++)
        a[k] = b[k];
}
 
//Сортировка слиянием
void mergesort (double *a, double *b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(a, b, low, pivot);
        mergesort(a, b, pivot + 1, high);
        merge(a, b, low, pivot, high);
    }
}
 
void Print (double* a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << "\n";
}
 
int main()
{
    int choice;
    cout << "Make a choice: 1 - Keyboard, 2 - Fail "; cin >> choice;
    if (choice == 1)
    {
        int n;
        cout << "n="; cin >> n;
 
        double *a = new double[n];        
        double *b = new double[n]; 
 
        Set(a, n);        
        mergesort(a, b, 0, n - 1);
        Print(a, n); 
        delete[]a;
        delete[]b;
    }
    else if (choice == 2)
    {
        int n=0;       
 
        double *a = Create(n);
 
        double *b = new double[n];
 
        Print(a, n);
        mergesort(a, b, 0, n - 1);
        Print(a, n);
        delete[]a;
        delete[]b;
    }
 
    system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 67
27.06.2020, 12:58  [ТС] 19
Спасибо большое за потраченное время, все работает идеально. Оставлю для тех кто потом будет гуглить фулл задание.
Условие задачи: Реализовать сортировку Merge Sort алгоритм сортировки элементов одномерного массива действительных чисел.Реализовать программное приложение, которое имеет следующие возможности: возможность ввода данных с клавиатуры; возможность ввод данных из файла.
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
#include <sstream>
using namespace std;
 
void Set(double* a, int n)
{
    cout << "Enter " << n << " numbers:\n";
    for (int i = 0; i < n; i++)
        cin >> a[i];
}
 
double* Create(int& n)
{
    double* a = NULL, x;
    ifstream in("D:\\hello.txt");
    if (in.is_open())
    {
        while (in >> x)
        {
            n++;
        }
 
        if (n) a = new double[n];
 
        in.clear();
        in.seekg(0, ios::beg);
 
        n = 0;
        while (in >> x)
        {
            a[n++] = x;
        }
        in.close();
    }
    else cout << "Unable to open file\n";
    return a;
}
 
void merge(double* a, double* b, int low, int pivot, int high)
{
    int h, i, j, k;
    h = low;
    i = low;
    j = pivot + 1;
 
    while ((h <= pivot) && (j <= high))
    {
        if (a[h] <= a[j])
        {
            b[i] = a[h];
            h++;
        }
        else
        {
            b[i] = a[j];
            j++;
        }
        i++;
    }
    if (h > pivot)
    {
        for (k = j; k <= high; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    else
    {
        for (k = h; k <= pivot; k++)
        {
            b[i] = a[k];
            i++;
        }
    }
    for (k = low; k <= high; k++)
        a[k] = b[k];
}
 
//Сортировка слиянием
void mergesort(double* a, double* b, int low, int high)
{
    int pivot;
    if (low < high)
    {
        pivot = (low + high) / 2;
        mergesort(a, b, low, pivot);
        mergesort(a, b, pivot + 1, high);
        merge(a, b, low, pivot, high);
    }
}
 
void Print(double* a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << "\n";
}
 
int main()
{
    int choice;
    cout << "Make a choice: 1 - Keyboard, 2 - Fail "; cin >> choice;
    if (choice == 1)
    {
        int n;
        cout << "n="; cin >> n;
 
        double* a = new double[n];
        double* b = new double[n];
 
        Set(a, n);
        mergesort(a, b, 0, n - 1);
        Print(a, n);
        delete[]a;
        delete[]b;
    }
    else if (choice == 2)
    {
        int n = 0;
 
        double* a = Create(n);
 
        double* b = new double[n];
 
        Print(a, n);
        mergesort(a, b, 0, n - 1);
        Print(a, n);
        delete[]a;
        delete[]b;
    }
 
    system("pause");
    return 0;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2020, 15:42 20
Xao, пожалуйста. но лучше эту задачу решить на векторе.
1
27.06.2020, 15:42
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2020, 15:42
Помогаю со студенческими работами здесь

Требуется скопировать данные из одного файла в другой, но в обратном порядке. Вывести на экран все результаты
Задание: Требуется скопировать данные из одного файла в другой, но в обратном порядке. Вывести на...

Merge Sort
написал реализацию Merge Sort но что то не так получилось))) помогите найти ошибку ) using...

Merge sort
Здравствуйте, пытаюсь написать сортировку по методу слияния (merge). не получается, подскажите...

Merge sort
Было 100500 раз, знаю. Видел коды, но всеравно не понимаю. У меня есть класс Array. class Array {...

Реализация merge sort на C++14
Помогите найти (или покажите сами) профессиональную реализацию merge sort с использованием 14-го...

Не работает merge sort
Пытаюсь реализовать merge sort, но она не работает. Где ошибка?: Array = def...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru