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 |
//Visual Studio Перемешивание массива предложений #include <iostream> #include <cstdlib> #include <windows.h> #include <ctime> #include <iomanip> using std::cout; //Вместо using namespace std лучше так, отдельно using std::cin; using std::swap; int main() { setlocale(LC_ALL, ""); //Для кириллицы в консоли SetConsoleCP(1251); SetConsoleOutputCP(1251); srand(unsigned(time(0))); //Запуск генератора, для случайности const int N = 255; //Количество символов в предложении int sentence_count = 0; //Счётчик предложения char *S[255]; //Двумерный массив для хранения 255 предложений, каждое предложение вмещает 255 символов for (int i = 0; i<255; i++) S[i] = new char[255]; //Выделяем массиву предложений ячейки в 255 символов while (cin.getline(S[sentence_count++], N)); //Сохраняем предложение в массив предложений sentence_count--; //Откидываем последнее наращение счётчик (он увеличен, но ввода нет) /*Выводим оригиналный массив на экран*/ cout << "\n\noriginal array:\n========================\n"; for (int i = 0; i<sentence_count; i++) cout << S[i] << '\n'; cout << "========================\n"; /*ПРИМЕНЯЕМ АЛГОРИТМ ПЕРЕМЕШИВАНИЯ ОДНОМЕРНОГО МАССИВА*/ //1. Создаём вспомогательный массив int *temp_arr = new int[sentence_count]; int buf = 0; //временная переменная для перестановок int rnd = 0; //временная переменная для случайного выбора for (int i = 0; i<sentence_count; i++) temp_arr[i] = i; //2. Заполняем вспомогательный массив числами по порядку for (int i = 0; i<sentence_count; i++) { //3. Меняем местами индексы rnd = rand() % sentence_count; //выбираем случайный индекс buf = temp_arr[i]; //меняем ячейки местами if (i != rnd) { //это проверка, чтобы не менять индекс местами с самим собой buf = temp_arr[i]; temp_arr[i] = temp_arr[rnd]; temp_arr[rnd] = buf; } } //4. Меняем местами ячейки массива предложений, используя вспомогательный массив индексов char *temp = new char[N]; //указатель, нужен для перестановки строк for (int i = 0; i<sentence_count; i++) { strncpy(temp, S[i], N); //обычный алгоритм перестановки строк, копированием строк strncpy(S[i], S[temp_arr[i]],N); strncpy(S[temp_arr[i]], temp, N); } delete []temp; //обязательно чистим память, которая выделялась указателю, используемому как времянка для строки delete[]temp_arr; //обязательно чистим!, вспомогательный массив больше не нужен /*Выводим перемешанный массив на экран*/ cout << "\n\nshuffled array:\n========================\n"; for (int i = 0; i<sentence_count; i++) cout << S[i] << '\n'; cout << "========================\n"; for (int i = 0; i<255; i++) delete[]S[i]; cin.clear(); //Магия против закрывания окна cin.sync(); cin.ignore(); } |
Добавить комментарий