Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовая 1 семестр. Власенко

.cpp
Скачиваний:
6
Добавлен:
12.02.2018
Размер:
12.69 Кб
Скачать
#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
int ind_i,ind_j; //Глобальные переменные, отвечающие за индексы редактируемого элемента
int n; //Глобальная переменная, отвечающая за размерность массивов. Предполагается, что размерность будет одинаковой для 2-х массивов и будет совпадать с размерностью вводимых массивов
int i, j; //Индексы элементов матриц
float **array_1 = NULL;
float **array_2 = NULL;
float **task1_1 = NULL;
float **task1_2 = NULL;
float **task2 = NULL;
float new_value; //Значение, на которое меняют элемент в массиве
void DeleteArray(float **&mass) //Очистка памяти от динамического массива
{
	if (mass)
	{
		for (i = 0; i < n; i++)
			delete[] mass[i];
		delete[] mass, mass = NULL;
	}
};
float **NewArray(float **&mass) //Создание массивов, их пересоздание в случае, если они не пустые
{ 
	float **arr;
	if (mass != NULL)
		DeleteArray(mass);
	arr = new float*[n];
	for (i = 0; i < n; i++)
		arr[i] = new float[n];
	return arr;
};
void InputArrayConsole(float **&mass) //Ввод массива через консоль
{
	cout << "Размерность:" << endl << endl;
	cin >> n;
	cout << "Матрица: "<< endl << endl;
	mass = NewArray(mass);
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			cin >> mass[i][j];
	system("cls");
};
void InputArrayFile(ifstream & f, float **&mass) //Считывание массива из файла
{
	f >> n;
	mass = NewArray(mass);
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			f >> mass[i][j];
};
void OutputArrayConsole(float **mass) //Вывод массива через консоль
{
	if (mass != NULL)
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			cout << mass[i][j] << "\t";
		cout << endl;
	}
	else
		cout << "Нечего выводить!" << endl;
	system("pause");
	system("cls");
};
void OutputArrayFile(ofstream & f, float **mass) //Сохранение массива в файл
{
	if (mass != NULL)
	{
		f << n << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
				f << mass[i][j] << "\t";
			f << endl;
		}
	}
	else
	{
		cout << "Нечего выводить!" << endl;
		system("pause");
		system("cls");
	}
}; 
void EditArrayElement(float **&mass)
{
	system("cls");
	cout << "Введите индекс элемента в формате: <Номер строки> <Номер столбца>" << endl;
	cin >> ind_i >> ind_j;
	ind_i--;
	ind_j--;
	cout << "Введите новое значение элемента" << endl;
	cin >> new_value;
	mass[ind_i][ind_j] = new_value;
	system("cls");
};
void CompleteTask_1(float **mass, float **&arr1, float **&arr2)
{
	if (n % 2 == 0)
	{

		int half;
		half = (n - 1) / 2;
		arr1 = NewArray(arr1);
		arr2 = NewArray(arr2);
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
			{
				if (i <= half && j <= half)
				{
					arr1[i][j] = 0;
					arr2[i][j] = mass[i + half + 1][j + half + 1];
				}
				if (i <= half && j > half)
				{
					arr2[i][j] = mass[i + half + 1][j - half - 1];
					arr1[i][j] = 0;
				}
				if (i > half && j > half)
				{
					arr1[i][j] = mass[i - half - 1][j];
					arr2[i][j] = 0;
				}
				if (i > half && j <= half)
				{
					arr1[i][j] = mass[i - half - 1][j];
					arr2[i][j] = 0;
				}
			}
	}
	else
	{
		cout << "Ошибка! Размерность должна быть четной!";
		system("pause");
	}
	system("cls");
};
void OutputArrayTask1Console(float **arr1, float **arr2)
{
	if (arr1 != NULL || arr2 != NULL)
	{
		cout << "Первая матрица:" << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
				cout << arr1[i][j] << "\t";
			cout << endl;
		}
		cout << "Вторая матрица" << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
				cout << arr2[i][j] << "\t";
			cout << endl;
		}
	}
	else
		cout << "Нечего выводить!" << endl;
	system("pause");
	system("cls");
};
void OutputArrayTask1File(ofstream & f, float **arr1, float **arr2)
{
	if (arr1 != NULL || arr2 != NULL)
	{
		f << "Первая матрица:" << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
				f << arr1[i][j] << "\t";
			f << endl;
		}
		f << "Вторая матрица" << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < n; j++)
				f << arr2[i][j] << "\t";
			f << endl;
		}
	}
	else
	{
		cout << "Нечего выводить!"<<endl;
		system("pause");
		system("cls");
	}
};
float *SearchAverage(float **mass) //Нахождение среднего арифметического i-строки
{
	float *average = new float[n];
	for (i = 0; i < n; i++)
	{
		average[i] = 0;
		for (j = 0; j < n; j++)
		{
			average[i] += mass[i][j];
		}
		average[i] = average[i] / n;
	}
	return average;
};
float **CompleteTask2(float **arr1, float **arr2)
{
	float *average1 = new float[n];
	float *average2 = new float[n];
	average1 = SearchAverage(arr1);
	average2 = SearchAverage(arr2);
	float *maxaverage = new float[n];
	for (i = 0; i < n; i++)
		if (average1[i] >= average2[i])
			maxaverage[i] = average1[i];
		else
			maxaverage[i] = average2[i];
	task2 = NewArray(task2);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (maxaverage[i] != 0)
				task2[i][j] = (arr1[i][j] + arr2[i][j]) / maxaverage[i];
			else
				task2[i][j] = arr1[i][j] + arr2[i][j];
		}
	}
	return task2;
};
void main()
{
	setlocale(LC_ALL, "Russian");
	int menu;
	while (1) //Начало меню, меню состоит из 4 уровней. Выход из программы осуществяет exit. Возвращение на предыдущий уровень - goto
	{
		cout << "Меню: \n1.Ввод матриц;\n2.Вывод матриц;\n3.Редактировать элемент;\n4.Индивидуальное задание;\n0.Выход из программы. " << endl << endl;
		cin >> menu;
		system("cls"); //Очистка консоли, работает только в Windows
		switch (menu)
		{
		case 1:
		{
			while (1)
			{
				cout << "1.Ввод 1 матрицы;\n2.Ввод 2 матрицы;\n0.Назад." << endl << endl;
				cin >> menu;
				system("cls");
				switch (menu)
				{
				case 1:
				{
					while (1)
					{
						cout << "1.Ввести через консоль;\n2.Взять из файла;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{
							InputArrayConsole(array_1);
							goto end;
						}
						case 2:
						{						
							ifstream arr1("Array1.txt");
							InputArrayFile(arr1, array_1);
							arr1.close();
							goto end;
						}
						case 0:
							goto end21;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
				end21:;
					break;
				}
				case 2:
				{
					while (1)
					{
						cout << "1.Ввести через консоль;\n2.Взять из файла;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{						
							InputArrayConsole(array_2);
							goto end;
						}
						case 2:
						{
							ifstream arr2("Array2.txt");
							InputArrayFile(arr2, array_2);
							arr2.close();
							goto end;
						}
						case 0:
							goto end21;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
					break;
				}
				case 0:
					goto end;
				default:
				{
					cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
					break;
				}
				}
			}
			end:;
			break;
		}
		case 2:
		{
			while (1)
			{
				cout << "1.Вывод 1 матрицы;\n2.Вывод 2 матрицы;\n0.Назад." << endl << endl;
				cin >> menu;
				system("cls");
				switch (menu)
				{
				case 1:
				{
					while (1)
					{
						cout << "1.Вывести через консоль;\n2.Сохранить в файл;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{
							OutputArrayConsole(array_1);
							goto end;
						}
						case 2:
						{
							ofstream outarr1("OutArray1.txt");
							OutputArrayFile(outarr1, array_1);
							outarr1.close();
							goto end;
						}
						case 0:
							goto end31;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
				end31:;
					break;
				}
				case 2:
				{
					while (1)
					{
						cout << "1.Вывести через консоль;\n2.Сохранить в файл;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{
							OutputArrayConsole(array_2);
							goto end;
						}
						case 2:
						{
							ofstream outarr2("OutArray2.txt");
							OutputArrayFile(outarr2, array_2);
							outarr2.close();
							goto end;
						}
						case 0:
							goto end31;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
					break;
				}
				case 0:
					goto end;
				default:
				{
					cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
					break;
				}
				}
			}
			break;
		}
		case 3:
		{
			while (1)
			{
				cout << "1.В 1 матрцие;\n2.Во 2 матрице;\n0.Назад." << endl << endl;
				cin >> menu;
				system("cls");
				switch (menu)
				{
				case 1:
				{
					EditArrayElement(array_1);
					goto end;
				}
				case 2:
				{
					EditArrayElement(array_2);
					goto end;
				}
				case 0:
					goto end;
				default:
				{
					cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
					break;
				}
				}
			}
			break;
		}
		case 4:
		{
			while (1)
			{
				cout << "1.Задание 1;\n2.Задание 2;\n3.Вывести получившиеся матрицы;\n0.Назад." << endl << endl;
				cin >> menu;
				system("cls");
				switch (menu)
				{
				case 1:
				{
					while (1)
					{
						cout << "1.Использовать 1 матрицу;\n2.Использовать 2 матрицу;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{
							CompleteTask_1(array_1, task1_1, task1_2);
							goto end;
						}
						case 2:
						{
							CompleteTask_1(array_2, task1_1, task1_2);
							goto end;
						}
						case 0:
							goto end51;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
				end51:;
					break;
				}
				case 2:
				{
					task2 = CompleteTask2(array_1, array_2);
					goto end;
				}
				case 3:
				{
					while (1)
					{
						cout << "1.Из 1 задания;\n2.Из 2 задания;\n0.Назад." << endl << endl;
						cin >> menu;
						system("cls");
						switch (menu)
						{
						case 1:
						{
							while (1)
							{
								cout << "1.Вывести через консоль;\n2.Сохранить в файл;\n0.Назад." << endl << endl;
								cin >> menu;
								system("cls");
								switch (menu)
								{
								case 1:
								{
									OutputArrayTask1Console(task1_1, task1_2);
									goto end;
								}
								case 2:
								{
									ofstream outarrtask1("Task1.txt");
									OutputArrayTask1File(outarrtask1, task1_1, task1_2);
									outarrtask1.close();
									goto end;
								}
								case 0:
									goto end531;
								default:
								{
									cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
									break;
								}
								}
							}
							end531:;
								break;
						}
						case 2:
						{
							{
								while (1)
								{
									cout << "1.Вывести через консоль;\n2.Сохранить в файл;\n0.Назад." << endl << endl;
									cin >> menu;
									system("cls");
									switch (menu)
									{
									case 1:
									{
										OutputArrayConsole(task2);
										goto end;
									}
									case 2:
									{
										ofstream outarrtask2("Task2.txt");
										OutputArrayFile(outarrtask2, task2);
										outarrtask2.close();
										goto end;
									}
									case 0:
										goto end531;
									default:
									{
										cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
										break;
									}
									}
								}
								break;
							}
						}
						case 0:
							goto end53;
						default:
						{
							cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
							break;
						}
						}
					}
				end53:;
					break;
				}
				case 0:
					goto end;
				default:
				{
					cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
					break;
				}
				}
			}
			break;
		}
		case 0:
			exit(1);
		default:
		{
			cout << "Ошибка! Нет такого пункта меню. Введите номер заново." << endl;
			break;
		}
		}
	}
};