Главная страница

Курсовая работа. 0391_Сеник_отчет. Программа должна оперировать тремя квадратными матрицами (А, в и С), размерность которых задается (или определяется) на фазе работы программы


Скачать 96.49 Kb.
НазваниеПрограмма должна оперировать тремя квадратными матрицами (А, в и С), размерность которых задается (или определяется) на фазе работы программы
АнкорКурсовая работа
Дата17.09.2021
Размер96.49 Kb.
Формат файлаdocx
Имя файла0391_Сеник_отчет.docx
ТипПрограмма
#233461

Федеральное государственное автономное

образовательное учреждение высшего образования

«Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

им. В. И. Ульянова (Ленина)»

Отчёт по курсовому проекту.

Выполнила: Сеник Е.А

Группа: 0391

Преподаватель: Власенко Сергей Владимирович

Текст задания:

Программа должна оперировать тремя квадратными матрицами (А, В и С), размерность которых задается (или определяется) на фазе работы программы.

Необходимо:

1) реализовать динамические структуры данных и алгоритмы их обработки, позволяющие поддерживать выполнение следующих функций:

-консольный ввод / вывод данных о матрицах А, В и С;

-файловый ввод / вывод данных о матрицах А, В и С;

-интерактивное редактирование элементов матриц;

2) разработать и реализовать алгоритмы обработки базы данных, предусмотренные персональным заданием.

18. Вывести на экран строки матрицы С в порядке возрастания количества элементов, присутствующих в матрицах А или В

3. Записать в матрицу С сумму матриц А и В, заменяя все отрицательные числа в С нулями.
Текст программы:

#include "stdafx.h"

#include "iostream"

#include "fstream"

using namespace std;
int lenghtA = 0, lenghtB = 0, lenghtC = 0, lenghtN, sizeA, sizeB, sizeC;

char name2, name3;

int * A, *B, *C;

void menu() //функция для вывода меню

{

setlocale(LC_ALL, "Russian");

system("cls");

cout << "1.Ввод матрицы A, B, C с клавиатуры " << "\n";

cout << "2.Ввод матрицы из файла " << "\n";

cout << "3.Вывести матрицу" << "\n";

cout << "4.Редактировать элементы матрицы " << "\n";

cout << "5.Задание 1" << "\n";

cout << "6.Задание 2" << "\n";

cout << "7.Выход из меню" << "\n" << "\n";

}
void lenght(int lenght) { //функция для ввода длины и ее проверки на натуральное число

do {

cout << "Введите размер матрицы : ";

cin >> lenght;

lenghtN = lenght;

if (lenght <= 0)

{

cout << "Введите натеральное число \n";

}

} while (lenght <= 0);

}
void matrix(int* matrixName, int size) { //функция для ввода матрицы

cout << "Введите элемент матрицы : ";

for (int i = 0; i < size; i++) {

cin >> matrixName[i];

}

}
void vivod(int* matrixName, int size, int lenght) { //функция для вывода матрицы

if (lenght > 0) {

for (int i = 0; i < size; i++) {

cout << matrixName[i] << " ";

if ((i + 1) % lenght == 0) {

cout << endl;

}

}

}

else {

cout << "матрица не была введена " << endl;

}

}
void vvodf() //Функция, осуществляющая импорт матриц из файла.

{

ifstream inf("vvod.txt", ios_base::in);

if (!inf.is_open())

{

cout << "Ошибка! Не удалось открыть файл для чтения." << endl;

return;

}

inf >> lenghtA;

sizeA = lenghtA * lenghtA;

A = new int[sizeA];

for (int i = 0; i < sizeA; i++)

{

inf >> A[i];

}

inf >> lenghtB;

sizeB = lenghtB * lenghtB;

B = new int[sizeB];

for (int i = 0; i < sizeB; i++)

{

inf >> B[i];

}

inf >> lenghtC;

sizeC = lenghtC * lenghtC;

C = new int[sizeC];

for (int i = 0; i < sizeC; i++)

{

inf >> C[i];

}

inf.close();

}
void vivodf(int* matrixName, int lenght, int size) { //файловый вывод

ofstream out("vivod.txt");

for (int i = 0; i < size; i++) {

out << matrixName[i] << " ";

if ((i + 1) % lenght == 0) {

out << endl;

}

}

cout << endl;

}
void vvod() { //функция для выполнения первого пункта меню

char matrixName;

do { //оператор для повторного ввода матрицы

cout << "Введите имя матрицы :(A/B/C) ";

cin >> matrixName;

switch (matrixName) //оператор для выбора матрицы, которую хочешь ввести

{

case 'A':

lenght(lenghtA);

lenghtA = lenghtN;

sizeA = lenghtA * lenghtA;

A = new int[sizeA];

matrix(A, sizeA);

vivod(A, sizeA, lenghtA);

break;

case 'B':

lenght(lenghtB);

lenghtB = lenghtN;

sizeB = lenghtN * lenghtN;

B = new int[sizeB];

matrix(B, sizeB);

vivod(B, sizeB, lenghtB);

break;

case 'C':

lenght(lenghtC);

lenghtC = lenghtN;

sizeC = lenghtN * lenghtN;

C = new int[sizeA];

matrix(C, sizeC);

vivod(C, sizeC, lenghtC);

break;

default:

cout << "Такой матрицы не существует" << endl;

}

cout << "Хотите ввести другую матрицу?(y/n): ";

cin >> name2;

if (name2 == 'n') {

break;

}

} while (name2 == 'y');

}
int getSingleIndex(int row, int col, int numberOfCol) { //функция, которая предоставляет доступ к элементу сплющенного двумерного массива

return (row * numberOfCol) + col;

}
void editm(int* matrixName, int lenght) { //функция для ввода элемента, который хочешь отредактировать

int col, row, el;

cout << "Введите строку и столбец: ";

cin >> row;

cin >> col;

row--;

col--;

cout << "Введите новое значение элемента: ";

cin >> el;

if (row < lenght && col < lenght) { //проверка на существование выбранной строки и столбца в данной матрице

matrixName[getSingleIndex(row, col, lenght)] = el;

}

else {

cout << "Этот элемент не входит в матрицу" << endl;

}

}
void matrixcheck(int* matrixName, int size, int lenght) { //проверка на существование матриц

if (lenght > 0) {

editm(matrixName, lenght);

vivod(matrixName, size, lenght);

}

else {

cout << "матрица не введена" << endl;

}

}
void edit() { //функция для редактирования отдельного элемента матрицы

char matrixName;

do {

cout << "Введите имя матрицы (A/B/C): ";

cin >> matrixName;

switch (matrixName) { //оператор для выбора матрицы, в которой будет отредактирован этот элемент

case 'A':

matrixcheck(A, sizeA, lenghtA);

break;

case 'B':

matrixcheck(B, sizeB, lenghtB);

break;

case 'C':

matrixcheck(C, sizeC, lenghtC);

break;

default:

cout << "Такой матрицы не существует" << endl;

}

cout << "Хотите изменить другой элемент?(y/n): ";

cin >> name2;

if (name2 == 'n') {

break;

}

} while (name2 == 'y');

}
void zadanie1() {

int* bufM = new int[lenghtC]; //создание буферной матрицы по длине равной длине строки в матрице С

int k = 0, n = 0, min;

for (int i = 0; i < lenghtC; i++) {

for (int j = 0; j < sizeA; j++) {

if (C[i] == A[j]) { //цикл, проверяющий сколько раз элемнты первой строки матрицы С встречаются в матрице А

n++;

}

}

for (int j = 0; j < sizeB; j++) {

if (C[i] == B[j]) { //цикл, проверяющий сколько раз элемнты первой строки матрицы С встречаются в матрице B

n++;

}

}

}

min = n;

n = 0;

for (int i = lenghtC; i < sizeC; i++) { //цикл, проверяющий сколько раз элемнты остальных строк матрицы С встречаются в матрице А и B

for (int j = 0; j < sizeA; j++) {

if (C[i] == A[j]) {

n++;

}

}

for (int j = 0; j < sizeB; j++) {

if (C[i] == B[j]) {

n++;

}

}

if ((i + 1) % lenghtC == 0) { //условие, проверяющее, дошел ли цикл до конца строки

if (n < min) { //условие, для нахождения строки с минимальным количеством элементов, встречающихся в матрице А и В

k = 0;

for (int l = i - lenghtC + 1; l <= i; l++) { //запись строки с минимальным количеством элементов, встречающихся в матрице А и В в буферный массив

bufM[k] = C[l];

k++;

}

for (int l = i - lenghtC; l >= 0; l--) { //сдвигаем массив C вправо, чтобы освободить место для строки из буферного массива

C[l + lenghtC] = C[l];

}

k = 0;

for (int l = 0; l < lenghtC; l++) { //замена первой строки матрицы С на строку из буферного массива

C[l] = bufM[k];

k++;

}

}

n = 0;

}

}

cout << "Куда вывести результат задания?(с - в консоль, f- в файл): ";

cin >> name3;

ofstream out("vivod.txt");

switch (name3) //опреатор для выбора файлового вывода или вывода в консоли результата задания

{

case 'f':

out << "Результат выполнения задания: " << endl; //файловый вывод

for (int i = 0; i < sizeC; i++) {

out << C[i] << " ";

if ((i + 1) % lenghtC == 0) {

out << endl;

}

}

break;

case 'c':

vivod(C, sizeC, lenghtC); //вывод в консоль

break;

default:

cout << "Введите 'f' или 'c'" << endl;

}

delete[]bufM;

}
void zadanie2() {

int* bufm = new int[sizeC]; //создание буферной матрицы, равной матрице С, чтобы не изменять матрицу С

if (sizeA == sizeB && sizeA == sizeC) { //проверка на возможность сложения матриц А и В и записи результата в буферную матрицу С

for (int i = 0; i < sizeC; i++) { //цикл для сложения матриц А и В

bufm[i] = A[i] + B[i];

if (bufm[i] < 0) { //проверка элементов матрицы С на отрицательные числа

bufm[i] = 0; //замена отрицательного числа на ноль
}

}

cout << "Куда вывести результат задания?(с - в консоль, f- в файл): ";

cin >> name3;

ofstream out("vivod.txt");

switch (name3) //опреатор для выбора файлового вывода или вывода в консоли результата задания

{

case 'f':
out << "Результат выполнения задания: " << endl; //файловый вывод

for (int i = 0; i < sizeC; i++) {

out << bufm[i] << " ";

if ((i + 1) % lenghtC == 0) {

out << endl;

}

}

break;

case 'c': //вывод в консоль

for (int i = 0; i < sizeC; i++) {

cout << bufm[i] << " ";

if ((i + 1) % lenghtC == 0) {

cout << endl;

}

}

break;

default:

cout << "Введите 'f' или 'c'";

}

}

else {

cout << "Эти матрицы нельзя сложить " << endl;

}

delete[]bufm;

}

int main()

{

int x;

do {

menu();

cin >> x; //выбор пункта меню

switch (x) {

case 1:

vvod();

break;

case 2:

vvodf();

break;

case 3:

cout << "Введите имя матрицы:(A/B/C) ";

cin >> name3;

switch (name3) {

case 'A':

cout << "Матрица A" << endl;

vivod(A, sizeA, lenghtA);

break;

case 'B':

cout << "Матрица B" << endl;

vivod(B, sizeB, lenghtB);

break;

case 'C':

cout << "Матрица C" << endl;

vivod(C, sizeC, lenghtC);

break;

default: break;

}

break;

case 4:

edit();

break;

case 5:

zadanie1();

break;

case 6:

zadanie2();

break;

}

if (x != 7) {

system("pause");

}

} while (x != 7);

return 0;

}

Скриншоты выполнения программы:

1)Ввод матриц







2)Задание 1



3) Задание 2



Санкт-Петербург, 2020



написать администратору сайта