kiraventom

1laba

May 22nd, 2018
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <clocale>
  4. #include <string>
  5. #include <ctime>
  6. #include <conio.h>
  7. #include <windows.h>
  8. #include <fstream>
  9. #include "code.h"
  10. using namespace std;
  11.  
  12. void NextBlock() {
  13.     cout << "\n" << endl;
  14. }
  15.  
  16. void StartScreen() {
  17.     cout << "Автор программы - Темирканов Алихан Заурович, студент СПБГТИ, 474 группа." << endl;
  18.     cout << "Её назначение - поворот квадратного массива по часовой стрелке." << endl;
  19.     cout << "Нажмите любую кнопку для продолжения" << endl;
  20.     _getch();
  21. }
  22.  
  23. void StartMenu() {
  24.     char Input = '1';
  25.     //Меню
  26.     do {
  27.         NextBlock();
  28.         if (Input != '1' && Input != '2' && Input != '3' && Input != '4') {
  29.             cout << "Некорректный ввод! Попробуйте ещё раз" << endl;
  30.         }
  31.         cout << "Что вы хотите сделать?\n" << endl;
  32.         cout << "1. Ввести массив из файла" << endl;
  33.         cout << "2. Ввести массив вручную" << endl;
  34.         cout << "3. Заполнить массив случайными значениями" << endl;
  35.         cout << "4. Закрыть программу" << endl;
  36.         Input = _getch();
  37.     } while (Input != '1' && Input != '2' && Input != '3' && Input != '4');
  38.     switch (Input) {
  39.     case '1':
  40.         InputFromFile();
  41.         break;
  42.     case '2':
  43.         InputFromKeyboard();
  44.         break;
  45.     case '3':
  46.         InputRandom();
  47.         break;
  48.     case '4':
  49.         exit(0);
  50.         break;
  51.     }
  52. }
  53.  
  54. int** AllocateMemory(int Size) {//Функция для выделения памяти
  55.     int **Ptr = new int*[Size];
  56.     for (int i = 0; i < Size; i++) {
  57.         Ptr[i] = new int[Size];
  58.     }
  59.     return Ptr;
  60. }
  61.  
  62. void InputFromFile() {//Обобщающая функция проверки и чтения массива из файла
  63.     bool isOkay;
  64.     string FilePath;
  65.     //Требуем ввести путь файла, пока он и данные в нём не окажутся корректными
  66.     do {
  67.         FilePath = CheckFilePath();
  68.         isOkay = isDataOkay(FilePath);
  69.     } while (!isOkay);
  70.     CreateArray(FilePath);
  71. }
  72.  
  73. void CreateArray(string FilePath) { //Функция для чтения массива из файла
  74.     int Input;
  75.     int Size;
  76.     ifstream File;
  77.     //Ввод размера массива
  78.     File.open(FilePath);
  79.     File >> Size;
  80.     //Выделяем память
  81.     int **pArray = AllocateMemory(Size);
  82.     //Ввод элементов массива
  83.     for (int i = 0; i < Size; i++) {
  84.         for (int j = 0; j < Size; j++) {
  85.             File >> Input;
  86.             pArray[i][j] = Input;
  87.         }
  88.     }
  89.     ShowArray(pArray, Size);
  90.     RotateArray(pArray, Size);
  91. }
  92.  
  93. string CheckFilePath() {//Функция для проверки пути файла и сохранения его в случае успеха
  94.     string FilePath;
  95.     bool isFileOkay = true;
  96.     ifstream File;
  97.     //Ввод имени файла
  98.     do {
  99.         NextBlock();
  100.         if (!isFileOkay) {
  101.             cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
  102.             cin.clear();
  103.             cin.ignore(10000, '\n');
  104.         }
  105.         cout << "Введите путь к файлу:" << endl;
  106.         cin >> FilePath;
  107.         //попытка открыть файл по указанному пути
  108.         //File.clear();
  109.         File.open(FilePath);
  110.         isFileOkay = File.is_open();
  111.     } while (!isFileOkay);
  112.     File.close();
  113.     return FilePath;
  114. }
  115.  
  116. bool isDataOkay(string FilePath) {//Функция для проверки данных в файле, возвращает true, если данные в порядке
  117.     int Size;
  118.     //Проверка значения размера массива, должно быть целое число больше 0
  119.     ifstream File;
  120.     File.open(FilePath);
  121.     File >> Size;
  122.     if (!File.good() || Size < 1) {//Странно, что cin.fail() не срабатывает, когда пытаешься ввести в unsigned отрицательное число
  123.         cout << "Размер массива указан некорректно! Используйте другой файл." << endl;
  124.         File.clear();
  125.         File.close();
  126.         return false;
  127.     }
  128.     int Element;
  129.     //Проверка значений элементов массива, должны быть целые числа
  130.     for (int i = 0; i < Size; i++) {
  131.         for (int j = 0; j < Size; j++) {
  132.             File >> Element;
  133.             if (!File.good()) {
  134.                 cout << "Элемент массива на " << i + 1 << "-й строке, в " << j + 1 << "-м столбце некорректен! Используйте другой файл." << endl;
  135.                 File.clear();
  136.                 File.close();
  137.                 return false;
  138.             }
  139.         }
  140.     }
  141.     File.close();
  142.     return true;
  143. }
  144.  
  145. void InputFromKeyboard() {//Функция ввода массива с клавиатуры
  146.     int Size = 1;
  147.     bool isInputOkay = true;
  148.     //Ввод размерности массива
  149.     do {
  150.         NextBlock();
  151.         if (!isInputOkay || Size < 1) {
  152.             cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
  153.             cin.clear();
  154.             cin.ignore(10000, '\n');
  155.         }
  156.         cout << "Введите размер массива: " << endl;
  157.         cin >> Size;
  158.         isInputOkay = !cin.fail();
  159.     } while (!isInputOkay || Size < 1);
  160.     //Выделяем память
  161.     int **pArray = AllocateMemory(Size);
  162.     //заполняем массив значениями по умолчанию
  163.     for (int i = 0; i < Size; i++) {
  164.         for (int j = 0; j < Size; j++) {
  165.             pArray[i][j] = 0;
  166.         }
  167.     }
  168.     //Сбрасываем значения флага и переменной ввода
  169.     isInputOkay = true;
  170.     int Input = 0;
  171.     //Ввод элементов массива
  172.     for (int i = 0; i < Size; i++) {
  173.         for (int j = 0; j < Size; j++) {
  174.             do {
  175.                 NextBlock();
  176.                 if (!isInputOkay) {
  177.                     cout << "Некорректный ввод! Попробуйте ещё раз." << endl;
  178.                     cin.clear();
  179.                     cin.ignore(10000, '\n');
  180.                 }
  181.                 ShowArray(pArray, Size);
  182.                 cout << "Введите значение элемента на " << i + 1 << "-й строке, во " << j + 1 << "-м столбце:" << endl;
  183.                 cin >> Input;
  184.                 isInputOkay = !cin.fail();
  185.             } while (!isInputOkay);
  186.             pArray[i][j] = Input;
  187.         }
  188.     }
  189.     ShowArray(pArray, Size);
  190.     RotateArray(pArray, Size);
  191. }
  192.  
  193. void InputRandom() {//Функция для случайного заполнения массива
  194.     int Size;
  195.     //Генерация случайного размера (не слишком большого, чтобы в консоль помещалось)
  196.     Size = 3 + rand() % 10;
  197.     //Выделение памяти
  198.     int **pArray = AllocateMemory(Size);
  199.     //Заполнение случайными значениями
  200.     for (int i = 0; i < Size; i++) {
  201.         for (int j = 0; j < Size; j++) {
  202.             pArray[i][j] = 0 + rand() % 50;
  203.         }
  204.     }
  205.     cout << "Случайно сгенерированный размер: " << Size << endl;
  206.     ShowArray(pArray, Size);
  207.     RotateArray(pArray, Size);
  208. }
  209.  
  210. void ShowArray(int **Ptr, int Size) {//Функция для вывода массива
  211.     for (int i = 0; i < Size; i++) {
  212.         for (int j = 0; j < Size; j++) {
  213.             cout << Ptr[i][j] << " ";
  214.         }
  215.         cout << endl;
  216.     }
  217. }
  218.  
  219. void RotateArray(int **Ptr, int Size) {//Функция для поворота массива по часовой
  220.                                        //Выделение памяти
  221.     int **pNewArray = AllocateMemory(Size);
  222.     //Поворот массива
  223.     for (int i = 0; i < Size; i++) {
  224.         for (int j = 0; j < Size; j++) {
  225.             pNewArray[j][(Size - 1) - i] = Ptr[i][j];
  226.         }
  227.     }
  228.     NextBlock();
  229.     cout << "Повернутый массив:" << endl;
  230.     ShowArray(pNewArray, Size);
  231. }
  232.  
  233. /*void FreeMemory(int **Ptr) {
  234. for (int count = 0; count < 2; count++)
  235. delete[] Ptr[count];
  236. delete[] Ptr;
  237. }
  238. */
  239.  
  240. int main() {
  241.     setlocale(LC_ALL, "Russian");
  242.     StartScreen();
  243.     do {
  244.         srand(time(0));
  245.         StartMenu();
  246.         cout << "Нажмите любую кнопку для возврата в главное меню" << endl;
  247.         _getch();
  248.     } while (true);
  249. }
Advertisement
Add Comment
Please, Sign In to add comment