Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- #include <iomanip>
- using namespace std;
- typedef vector<vector<int>> TSquare;
- int inputDoubleEvenNumber(const int MIN_NUMBER, const int MAX_NUMBER) {
- bool IsIncorrect;
- int Number;
- string Input = "";
- do {
- getline(cin, Input);
- IsIncorrect = false;
- try {
- Number = stoi(Input);
- }
- catch (invalid_argument ex) {
- cout << "Введите число:\n";
- IsIncorrect = true;
- }
- catch (out_of_range ex) {
- cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
- << MAX_NUMBER << "\n";
- IsIncorrect = true;
- }
- if (!IsIncorrect && (Number < MIN_NUMBER || Number > MAX_NUMBER)) {
- cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
- << MAX_NUMBER << "\n";
- IsIncorrect = true;
- }
- if (!IsIncorrect && ((Number % 4) != 0)) {
- cout << "Число должно делиться на 4.\n";
- IsIncorrect = true;
- }
- } while (IsIncorrect);
- return Number;
- }
- int inputIntegerNumber(const int MIN_NUMBER, const int MAX_NUMBER) {
- bool IsIncorrect;
- int Number;
- string Input = "";
- do {
- getline(cin, Input);
- IsIncorrect = false;
- try {
- Number = stoi(Input);
- }
- catch (invalid_argument ex) {
- cout << "Введите число:\n";
- IsIncorrect = true;
- }
- catch (out_of_range ex) {
- cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
- << MAX_NUMBER << "\n";
- IsIncorrect = true;
- }
- if (!IsIncorrect && (Number < MIN_NUMBER || Number > MAX_NUMBER)) {
- cout << "Число не должно быть меньше " << MIN_NUMBER << " и больше, чем "
- << MAX_NUMBER << "\n";
- IsIncorrect = true;
- }
- } while (IsIncorrect);
- return Number;
- }
- bool checkPermissionForWriting(const string& PathToFile) {
- bool Flag;
- ofstream FileOut(PathToFile);
- if (FileOut.is_open()) {
- FileOut.close();
- Flag = true;
- }
- else {
- cout << "Файл не доступен для записи.\n";
- Flag = false;
- }
- return Flag;
- }
- bool checkExtension(const string& PathToFile) {
- const string extension = "txt";
- bool Flag;
- if (PathToFile.length() > 4 && PathToFile.substr(PathToFile.length() - 3) == extension) {
- Flag = true;
- }
- else {
- cout << "Неверное расширение.\n";
- Flag = false;
- }
- return Flag;
- }
- const string inputPathToFileForWriting() {
- string PathToFile;
- do {
- cout << "Введите путь к файлу для записи: \n";
- getline(cin, PathToFile);
- } while (!checkExtension(PathToFile) || !checkPermissionForWriting(PathToFile));
- return PathToFile;
- }
- int findSum(TSquare& MagicSquare) {
- int Sum = 0;
- int Size = MagicSquare.size();
- for (int j = 0; j < Size; j++)
- Sum += MagicSquare[0][j];
- return Sum;
- }
- void saveToFile(TSquare MagicSquare){
- if (MagicSquare.size() != 1) {
- string path = inputPathToFileForWriting();
- ofstream fileOut;
- fileOut.open(path, ios::trunc);
- int Sum = findSum(MagicSquare);
- fileOut << "Магический квадрат:\n";
- for (int i = 0; i < MagicSquare.size(); i++) {
- for (int j = 0; j < MagicSquare[i].size(); j++)
- fileOut << setw(4) << MagicSquare[i][j] << " ";
- fileOut << '\n';
- }
- fileOut << "Сумма элемнетов на каждой линии: " << to_string(Sum);
- fileOut.close();
- cout << "Информация записана в файл.\n";
- }
- else
- cout << "Магический квадрат не построен.\n";
- }
- void printSquare(TSquare& Square) {
- for (int i = 0; i < Square.size(); i++) {
- for (int j = 0; j < Square[i].size(); j++)
- cout << setw(4) << Square[i][j] << " ";
- cout << '\n';
- }
- }
- void buildSquare(TSquare& StartSquare, int Size) {
- StartSquare.resize(Size);
- for (int i = 0; i < Size; i++) {
- StartSquare[i].resize(Size);
- }
- }
- void fillLowerPartOfFirstSquare(TSquare& FirstLatinSquare) {
- int Size = FirstLatinSquare.size();
- for (int i = (Size / 2); i < Size; i++)
- for (int j = 0; j < Size; j++) {
- if ((j % 2) == 0)
- FirstLatinSquare[i][j] = Size - i - 1;
- else
- FirstLatinSquare[i][j] = i;
- }
- }
- void fillUpperPartOfFirstSquare(TSquare& FirstLatinSquare) {
- int Size = FirstLatinSquare.size();
- for (int i = 0; i < (Size / 2); i++)
- for (int j = 0; j < Size; j++) {
- FirstLatinSquare[i][j] = FirstLatinSquare[Size / 2 + i][Size - j - 1];
- }
- }
- void receiveSecondLatinSquare(TSquare& FirstLatinSquare, TSquare& SecondLatinSquare) {
- int Size = FirstLatinSquare.size();
- for (int i = (Size - 1); i > -1; i--)
- for (int j = 0; j < Size; j++)
- SecondLatinSquare[j][Size - i - 1] = FirstLatinSquare[i][j];
- }
- TSquare receiveResultSquare(TSquare& FirstLatinSquare, TSquare& SecondLatinSquare, TSquare& MagicSquare) {
- int Size = FirstLatinSquare.size();
- for (int i = 0; i < Size; i++)
- for (int j = 0; j < Size; j++)
- MagicSquare[i][j] = Size * FirstLatinSquare[i][j] + SecondLatinSquare[i][j] + 1;
- return MagicSquare;
- }
- void receiveMagicSquare(TSquare& MagicSquare, int* Sum) {
- cout << "Введите порядок магического квадрата: ";
- int Size = inputDoubleEvenNumber(4, 40);
- TSquare FirstLatinSquare;
- buildSquare(FirstLatinSquare, Size);
- cout << "\n\nЗаполненная нижняя половина первого латинского квадрата:\n\n";
- fillLowerPartOfFirstSquare(FirstLatinSquare);
- printSquare(FirstLatinSquare);
- cout << "\n\nПервый латинский квадрат:\n\n";
- fillUpperPartOfFirstSquare(FirstLatinSquare);
- printSquare(FirstLatinSquare);
- cout << "\n\nВторой латинский квадрат:\n\n";
- TSquare SecondLatinSquare;
- buildSquare(SecondLatinSquare, Size);
- receiveSecondLatinSquare(FirstLatinSquare, SecondLatinSquare);
- printSquare(SecondLatinSquare);
- buildSquare(MagicSquare, Size);
- receiveResultSquare(FirstLatinSquare, SecondLatinSquare, MagicSquare);
- cout << "\n\nМагический квадрат:\n\n";
- printSquare(MagicSquare);
- *Sum = findSum(MagicSquare);
- cout << "\nСумма элементов на каждой линии: " << *Sum << '\n';
- }
- int main() {
- system("chcp 1251");
- cout << "Данная программа строит магический квадрат латинским способом.\n";
- bool IsEnd = false;
- int CurrentInstruction;
- TSquare MagicSquare;
- int Sum = 0;
- MagicSquare.resize(1);
- cout << "Выберите команду:\n1 - построить магический квадрат;\n2 - сохранить его в файл;\n3 - завершить программу.\n";
- do {
- cout << "Введите команду:\n";
- CurrentInstruction = inputIntegerNumber(1, 3);
- switch (CurrentInstruction) {
- case 1: {
- receiveMagicSquare(MagicSquare, &Sum);
- break;
- }
- case 2: {
- saveToFile(MagicSquare);
- break;
- }
- case 3: {
- IsEnd = true;
- break;
- }
- default: {
- cout << "Неизвестная команда.\n";
- }
- }
- } while (!IsEnd);
- cout << "Программа завершена";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement