Динамический массив не устанавливается C++
Я делал программу сортировки массивов, с 2 режимами работы:
- сортировка одного массива, сформированного случайным образом;
- режим накопления статистических данных;
В первом режиме все нормально работает, но во втором какие-то проблемы. Динамический массив не устанавливается - создается всего один случайный элемент. Пытался исправить путем замены типа переменной размера (int -> size_t), названия самого массива (создавал доп. массив k, но там была такая же ситуация).
Код ниже
#include <iostream>
using namespace std;
#include <time.h>
#include <math.h>
#include <locale>
#include <fstream>
#include <cstring>
#pragma warning(disable : 4996)
// Даные по количеству сравнений и перестановок
int result[2] = { 0, 0 };
// Сортировка выбором
int* selectSort(int* mass, int size) {
int x, k;
for (int i = 0; i < size; i++) {
k = i;
x = mass[i];
for (int j = i + 1; j < size; j++) {
result[0] += 1;
if (mass[j] < x) {
k = j;
x = mass[j];
result[1] += 2;
}
}
mass[k] = mass[i];
mass[i] = x;
result[1] += 2;
}
return result;
}
// Быстрая сортировка
int* quickSort(int* mass, int size) {
long i = 0, j = size;
int temp = 0, p;
p = mass[size >> 1];
do {
while (mass[i] < p) i++;
while (mass[j] > p) j--;
result[0] += 1;
if (i <= j){
temp = mass[i]; mass[i] = mass[j]; mass[j] = temp;
result[1] += 2;
}
} while (i < j);
if (j > 0) quickSort(mass, j);
if (size > i) quickSort(mass + i, size - i);
return result;
}
// Функционал первого режима
void one(int size, int from, int till, int sortType, char* fileName) {
int* mass = new int[size];
ofstream f, fs;
f.open(fileName, ios::app | ios::out);
fs.open(strncpy(fileName, "Sorted\n", 100), ios::app | ios::out);
// Заполенение массива и запись элементов в файл
for (int i = 0; i < size; i++) {
mass[i] = rand() % (till - from) + from;
f << i << ": " << mass[i] << endl;
}
// Сохранеие данных о перестановках и сравнениях в массив
int* result = sortType == 1 ? selectSort(mass, size) : quickSort(mass, size);
for (int i = 0; i < size; i++)
fs << i << ": " << mass[i] << endl;
fs.close();
cout << "Количество сравнений: '" << result[0] << endl << "Количество перестановок : " << result[1] << endl;
delete [] mass;
}
// Меню первого режима
void oneMenu() {
int size = 0, from = 0, till = 0;
int sortType = 0;
char fileName[100];
cout << "Введите размер массива: \n";
cin >> size;
cout << "Введите максимальный элемент массива: \n";
cin >>till;
cout << "Введите минимальный элемент массива: \n";
cin >>from;
cout << "Введите тип сортировки: \n1. Cортировка прямым выбором \n2. Сортировка прямыми обменами \n";
cin >>sortType;
cout << "Введите файл для записи результатов: " << endl;
cin >> fileName;
one(size, from, till, sortType, fileName);
}
// Функционал второго режима
void two(int step, int from, int till, int sortType, int generateType, char* fileName) {
ofstream f;
f.open(fileName);
double d = 0;
for (size_t size = from; size <= till; size += step) {
int *mass = new int[size]; //проблема в этом массиве
if (generateType == 1)
for (int i = 0; i < size; i++) {
mass[i] = rand();
}
else if (generateType == 2)
for (int i = 0; i < size; i++) {
mass[i] = i * size;
}
else
for (int i = size; i > size; i--) {
mass[size - i] = i * size;
}
clock_t start = clock();
if (sortType == 1){
selectSort(mass, size);
}
else {
quickSort(mass, size);
}
clock_t end = clock();
d = (end - start) / CLOCKS_PER_SEC;
f << size << ": " << d << endl;
delete [] mass;
}
f.close();
}
// Меню второго режима
void twoMenu() {
int step = 0, from = 0, till = 0, generateType = 0, sortType = 0;
char fileName[100];
cout << "Введите шаг изменения размеров массива: \n";
cin >> step;
cout << "Введите минимальное количество элементов массива: \n";
cin >> from;
cout << "Введите максимальное количество элементов массива: \n";
cin >> till;
cout << "Введите тип сортировки: \n 1. Cортировка прямым выбором \n 2. Сортировка быстрая сортировка\n";
cin >> sortType;
cout << "Введите способ формирования массива: \n 1. Cлучайные значения \n 2. Упорядоченная последовательность значений \n 3. Значения расположены в обратном порядке\n";
cin >> generateType;
cout << "Введите файл для записи результатов(с расширением .txt):\n";
cin >> fileName;
two(step, from, till, sortType, generateType, fileName);
}
// Главное меню
void menu() {
while (1) {
cout << "1. Сортировка одного массива, сформированного случайным образом \n2. Режим накопления статистических данных \n3. Выход\n";
char c;
cin >> c;
if (c == '1')
oneMenu();
else if (c == '2')
twoMenu();
else if (c == '3')
break;
}
}
int main() {
srand((int)time(NULL));
setlocale(0, "");
menu();
return 0;
}
