Добавил:
wso_studf
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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];
}
}
}
}