Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
6
Добавлен:
19.08.2022
Размер:
7.91 Кб
Скачать
#include <iostream>
#include <ctime>
#include <vector>
#include <string>
#include <fstream>
#include <cmath>
#include <cassert>

using namespace std;

int getRandomNumber(int min, int max);
int choose_number();
int numbersFromFile(int n, vector <vector<int> > &matrix);
int amount(int n, vector <vector <int> > &matrix);
int side_diagonal(int n, vector <vector<int> > &matrix, unsigned short int &temp, unsigned short int choice);
void keyboard(int n, vector <vector<int> > &matrix);
void printMatrix(int n, int m, vector <vector<int> > &matrix);
void fillRandomNumbersMatrix(int n, vector <vector<int> > &matrix, int min, int max);
void insertElements(int n, unsigned short int temp, vector <vector <int> > &matrix, vector <vector <int> > &matrix_final);

int main(){
    setlocale(LC_ALL, "rus");

    cout << "Вариант №3" << endl;
    cout << "Лабораторная работа №11" << endl;

    srand(time(NULL));

    int N = getRandomNumber(3, 10);

    /* test data */
    // N = 2; 
    assert((N >= 3 && N <= 10) && "Значение N не соответствует заявленному диапазону.");


    cout << "Сгенерировано cлучайное число - для создания матрицы = " << N << "\n" << endl;
    vector <vector<int> > matrix(N, vector<int>(N));
    vector <vector<int> > matrix_final(N+1, vector<int>(N));
    unsigned short int choice = 0;
    unsigned short int temp = 0;
    int amnt = 0;
    int sdig = 0;

    /* test data */
    // choice = 4;
    // assert(!(choice < 1 || choice > 3) && "Выбор значения выходит за установленный диапазон.");

    cout << "Выберите способ заполнения матрицы числами:\n";
    cout << "\tввод с клавиатуры - 1\n";
    cout << "\tквазислучайными числами - 2\n"; 
    cout << "\tзаполнение из текстового файла - 3\n";

    while(choice < 1 || choice > 3){
        choice = choose_number();
        if (choice < 1 || choice > 3){
            cout << "Вы ввели число не соответствующее диапазону значений." << endl;
        }
    }
    cout << "Принято!" << endl;

    switch (choice){
        case 1:{
            cout << "\nНачало ввода элементов матрицы:\n";
            keyboard(N, matrix);
            cout << "\nМатрица введенная с клавиатуры:\n";
            printMatrix(N, N, matrix);
            break;
        }
        case 2:{
            int min = 0, max = 0;
            cout << "Выберите начальную точку для генерации случайных чисел.\n\tMIN ";
            min = choose_number();

            cout << "\nВыберите конечную точку диапазона.\n\tMAX (Обязательно должно быть больше MIN) ";
            do{
                max = choose_number();
            } while (max <= min);

            fillRandomNumbersMatrix(N, matrix, min, max);

            cout << "\nМатрица сгенерированная из случайных чисел вышеуказанного диапазона:\n";
            printMatrix(N, N, matrix);
            break;
        }
        case 3:{
            numbersFromFile(N, matrix);
            cout << "\nМатрица заполнена числами из файла:\n";
            printMatrix(N, N, matrix);
            break;
        }
    }

    amnt = amount(N, matrix);
    /* test data */
    // amnt = 0;
    assert((amnt != 0) && "Функция считает не корректно!!");
    cout << "\nCумма элементов, расположенных ниже главной диагонали матрицы = " << amnt << endl;

    sdig = side_diagonal(N, matrix, temp, choice);
    cout << "\nМинимум среди сумм модулей элементов диагоналей, параллельной побочной диагонали матрицы = " << sdig << endl;

    cout << "temp = " << temp << endl; //test
    cout << "\nВыполнение задания 2.\n" << endl;
    insertElements(N, temp, matrix, matrix_final);
    printMatrix(matrix_final.size(), N, matrix_final);

    return 0;
}

int getRandomNumber(int min, int max){
    return static_cast<int>(min + rand() % (max - min + 1));
}

int choose_number(){
    int n = 0;
    while (true){
        cin >> n;
        if (cin.fail()){
            cin.clear();
            cin.ignore(32767, '\n');
            cout << "Ошибка ввода!\n";
        }
        else{
            cin.clear();
            cin.ignore(32767, '\n');
            return n;
        }
    }
}

void keyboard(int n, vector <vector<int> > &matrix){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            matrix[i][j] = choose_number();
        }
    }
}

void fillRandomNumbersMatrix(int n, vector <vector<int> > &matrix, int min, int max){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            matrix[i][j] = getRandomNumber(min, max);
        }
    }
}

void printMatrix(int n, int m, vector <vector<int> > &matrix){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }
    
}

int numbersFromFile(int n, vector <vector<int> > &matrix){
    string path = "path11cpp.txt";
    const int M = 10;

    ofstream fout;
    fout.open(path, std::ios::trunc);
    if (!fout.is_open()){
        cout << "Ошибка открытия файла." << endl;
        return -1;
    }
    else{
        int rand_number = 0;
        for (int i = 0; i < M; i++){
            rand_number = getRandomNumber(0, 1000);
            fout << rand_number << '\n';
        }
    }
    fout.close();

    ifstream fin;
    fin.open(path);
    if (!fin.is_open()){
        cout << "Ошибка открытия файла!" << endl;
        return -1;
    }
    else{
        string ch;
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                ch = "";
                getline(fin, ch);
                if (ch == "")
                    break;
                else
                    matrix[i][j] = stoi(ch);  
            }
            if (ch == "")
                break;
        }
    }
    fin.close();
    return 0;
}

int amount(int n, vector <vector<int> > &matrix){
    int sum = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            if (i == j){
                break;
            }
            sum += matrix[i][j];
        }
    }
    return sum;
}

int side_diagonal(int n, vector <vector<int> > &matrix, unsigned short int &temp, unsigned short int choice){
    int sum = 0, min = 0;

    for (int i = 0; i < n; i++){
        sum = 0;
        for (int j = 0; j < n; j++){
            if ((i + j < n - 1) || (i + j > n - 1)){
                sum += matrix[i][j];
            }   
        }
        temp = i;
        if (i == 0){
            min = abs(sum);
        }
        else if (min == abs(sum) && (choice == 3 || choice == 1)){
            temp -= 1;
            break;
        }
        else if (min > abs(sum)){
            min = abs(sum);
        }
    }
    return min;
}

void insertElements(int n, unsigned short int temp, vector <vector <int> > &matrix, vector <vector <int> > &matrix_final){
    for (int i = 0; i <= n; i++){
        
        for (int j = 0; j < n; j++){
            if (i <= temp){
                matrix_final[i][j] = matrix[i][j];
            }
            else if (i == temp + 1){
                matrix_final[i][j] = matrix[0][j];
            }
            else{
                matrix_final[i][j] = matrix[i-1][j];
            }
        }
    }
}
Соседние файлы в папке 2 курс - Основы алгоритмизации _ вариант 3