Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <clocale>
- #include <string>
- #include <ctime>
- #include <conio.h>
- #include <windows.h>
- #include <fstream>
- #include "code.h"
- using namespace std;
- void NextBlock() {
- cout << "\n" << endl;
- }
- void StartScreen() {
- cout << "Автор программы - Темирканов Алихан Заурович, студент СПБГТИ, 474 группа." << endl;
- cout << "Её назначение - поворот квадратного массива по часовой стрелке." << endl;
- cout << "Нажмите любую кнопку для продолжения" << endl;
- _getch();
- }
- void StartMenu() {
- char Input = '1';
- //Меню
- do {
- NextBlock();
- if (Input != '1' && Input != '2' && Input != '3' && Input != '4') {
- cout << "Некорректный ввод! Попробуйте ещё раз" << endl;
- }
- cout << "Что вы хотите сделать?\n" << endl;
- cout << "1. Ввести массив из файла" << endl;
- cout << "2. Ввести массив вручную" << endl;
- cout << "3. Заполнить массив случайными значениями" << endl;
- cout << "4. Закрыть программу" << endl;
- Input = _getch();
- } while (Input != '1' && Input != '2' && Input != '3' && Input != '4');
- switch (Input) {
- case '1':
- InputFromFile();
- break;
- case '2':
- InputFromKeyboard();
- break;
- case '3':
- InputRandom();
- break;
- case '4':
- exit(0);
- break;
- }
- }
- int** AllocateMemory(int Size) {//Функция для выделения памяти
- int **Ptr = new int*[Size];
- for (int i = 0; i < Size; i++) {
- Ptr[i] = new int[Size];
- }
- return Ptr;
- }
- void InputFromFile() {//Обобщающая функция проверки и чтения массива из файла
- bool isOkay;
- string FilePath;
- //Требуем ввести путь файла, пока он и данные в нём не окажутся корректными
- do {
- FilePath = CheckFilePath();
- isOkay = isDataOkay(FilePath);
- } while (!isOkay);
- CreateArray(FilePath);
- }
- void CreateArray(string FilePath) { //Функция для чтения массива из файла
- int Input;
- int Size;
- ifstream File;
- //Ввод размера массива
- File.open(FilePath);
- File >> Size;
- //Выделяем память
- int **pArray = AllocateMemory(Size);
- //Ввод элементов массива
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- File >> Input;
- pArray[i][j] = Input;
- }
- }
- ShowArray(pArray, Size);
- RotateArray(pArray, Size);
- }
- string CheckFilePath() {//Функция для проверки пути файла и сохранения его в случае успеха
- string FilePath;
- bool isFileOkay = true;
- ifstream File;
- //Ввод имени файла
- do {
- NextBlock();
- if (!isFileOkay) {
- cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
- cin.clear();
- cin.ignore(10000, '\n');
- }
- cout << "Введите путь к файлу:" << endl;
- cin >> FilePath;
- //попытка открыть файл по указанному пути
- //File.clear();
- File.open(FilePath);
- isFileOkay = File.is_open();
- } while (!isFileOkay);
- File.close();
- return FilePath;
- }
- bool isDataOkay(string FilePath) {//Функция для проверки данных в файле, возвращает true, если данные в порядке
- int Size;
- //Проверка значения размера массива, должно быть целое число больше 0
- ifstream File;
- File.open(FilePath);
- File >> Size;
- if (!File.good() || Size < 1) {//Странно, что cin.fail() не срабатывает, когда пытаешься ввести в unsigned отрицательное число
- cout << "Размер массива указан некорректно! Используйте другой файл." << endl;
- File.clear();
- File.close();
- return false;
- }
- int Element;
- //Проверка значений элементов массива, должны быть целые числа
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- File >> Element;
- if (!File.good()) {
- cout << "Элемент массива на " << i + 1 << "-й строке, в " << j + 1 << "-м столбце некорректен! Используйте другой файл." << endl;
- File.clear();
- File.close();
- return false;
- }
- }
- }
- File.close();
- return true;
- }
- void InputFromKeyboard() {//Функция ввода массива с клавиатуры
- int Size = 1;
- bool isInputOkay = true;
- //Ввод размерности массива
- do {
- NextBlock();
- if (!isInputOkay || Size < 1) {
- cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
- cin.clear();
- cin.ignore(10000, '\n');
- }
- cout << "Введите размер массива: " << endl;
- cin >> Size;
- isInputOkay = !cin.fail();
- } while (!isInputOkay || Size < 1);
- //Выделяем память
- int **pArray = AllocateMemory(Size);
- //заполняем массив значениями по умолчанию
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- pArray[i][j] = 0;
- }
- }
- //Сбрасываем значения флага и переменной ввода
- isInputOkay = true;
- int Input = 0;
- //Ввод элементов массива
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- do {
- NextBlock();
- if (!isInputOkay) {
- cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
- cin.clear();
- cin.ignore(10000, '\n');
- }
- ShowArray(pArray, Size);
- cout << "Введите значение элемента на " << i + 1 << "-й строке, во " << j + 1 << "-м столбце:" << endl;
- cin >> Input;
- isInputOkay = !cin.fail();
- } while (!isInputOkay);
- pArray[i][j] = Input;
- }
- }
- ShowArray(pArray, Size);
- RotateArray(pArray, Size);
- }
- void InputRandom() {//Функция для случайного заполнения массива
- int Size;
- //Генерация случайного размера (не слишком большого, чтобы в консоль помещалось)
- Size = 3 + rand() % 10;
- //Выделение памяти
- int **pArray = AllocateMemory(Size);
- //Заполнение случайными значениями
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- pArray[i][j] = 0 + rand() % 50;
- }
- }
- cout << "Случайно сгенерированный размер: " << Size << endl;
- ShowArray(pArray, Size);
- RotateArray(pArray, Size);
- }
- void ShowArray(int **Ptr, int Size) {//Функция для вывода массива
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- cout << Ptr[i][j] << " ";
- }
- cout << endl;
- }
- }
- void RotateArray(int **Ptr, int Size) {//Функция для поворота массива по часовой
- //Выделение памяти
- int **pNewArray = AllocateMemory(Size);
- //Поворот массива
- for (int i = 0; i < Size; i++) {
- for (int j = 0; j < Size; j++) {
- pNewArray[j][(Size - 1) - i] = Ptr[i][j];
- }
- }
- NextBlock();
- cout << "Повернутый массив:" << endl;
- ShowArray(pNewArray, Size);
- }
- /*void FreeMemory(int **Ptr) {
- for (int count = 0; count < 2; count++)
- delete[] Ptr[count];
- delete[] Ptr;
- }
- */
- int main() {
- setlocale(LC_ALL, "Russian");
- StartScreen();
- do {
- srand(time(0));
- StartMenu();
- cout << "Нажмите любую кнопку для возврата в главное меню" << endl;
- _getch();
- } while (true);
- }
Advertisement
Add Comment
Please, Sign In to add comment