Файл: Курсовой проект по дисциплине Программирование.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 30.11.2023

Просмотров: 17

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНОБРНАУКИ РОССИИ

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

электротехнический университет

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

Кафедра АПУ
КУРСОВОЙ ПРОЕКТ

по дисциплине «Программирование»

Тема: Разработка приложения для обработки матриц

Студент гр. 2392




Чиджиоке Ф

Преподаватель




Власенко С. В.


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

2022

ЗАДАНИЕ

НА КУРСОВОЙ ПРОЕКТ


Студент Чиджиоке Ф.

Группа 2392

Тема работы: Разработка приложения для обработки матриц


Исходные данные: 

 Скопировать в матрицу С те элементы матрицы А, которые совпадают с каким-либо из диагональных элементов матрицы В.


Содержание пояснительной записки:

«Аннотация», «Содержание», «Введение», «Заключение», «Список использованных источников», «Приложение»

Предполагаемый объем пояснительной записки:

Не менее 15 страниц.

Дата выдачи задания: 28.10.2022

Дата сдачи реферата: 26.12.2022

Дата защиты задания: 26.12.2022

Студент




Чиджиоке Ф.

Преподаватель




Власенко С.В.

АННОТАЦИЯ
В ходе выполнения проекта, была разработана программа для работы с матрицами. А именно, было реализовано задание матриц разных размерностей, интерактивное редактирование матриц и главной способностью программы стало нахождение строчек в матрице С, которые совпадают со столбцами матрицы A и В.


SUMMARY

During the project, a program for working with matrices was developed. Namely, the assignment of a matrix of different dimensions, interactive editing of matrices was implemented, and the main aim or function of the program was to find and exchange corresponding elements in the diagonals of the Matrix A and Matrix B in Matrix C. Now since it was not specified that it had to be the major or main diagonal of the matrix ( all square matrices have two diagonals) both diagonals were taken into consideration.

СОДЕРЖАНИЕ




1.

Введение
ЗАГОЛОВОЧНЫЕ ФАЙЛЫ / БИБЛИОТЕКИ

5
6

2.

Меню программы 

6



Создание главного меню

7



Создание дополнительных подменю

8

3.

Ввод и вывод матриц

9



Реализация консольного ввода, и ввода из файла






Реализация консольного вывода, и вывода в файл

11



Интерактивное изменение элементов в матрице

13

4.1.

РЕШЕНИЕ ЗАДАЧИ

14




Заключение

15




Список использованных источников

16




Приложение

17


ВВЕДЕНИЕ
В ходе выполнения этого проекта, была разработана программа позволяющая работать с квадратными матрицами. Таким образом разработанная программа позволяет загружать матрицы, выводить их, производить замену элементов в матрице и находить решение по поставленной задаче. Задача заключается в том, что  Скопировать в матрицу С те элементы матрицы А, которые совпадают с каким-либо из диагональных элементов матрицы В.

Заголовочные файлы / библиотеки

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




Рис. 1. библиотек или заголовочных файлов

2. МЕНЮ ПРОГРАММЫ



  • СОЗДАНИЕ ГЛАВНОГО МЕНЮ

Главное меню программы было реализовано внутри консоли, так что для навигации требовалось использовать специальные кнопки или цифры с клавиатуры для взаимодействия и навигации в главном меню. Само главное меню было создано с использованием файла заголовка или библиотеки, известной как conio.h, что означает консольный ввод и вывод


Рис. 2 – Создание главного меню



  • СОЗДАНИЕ ДОПОЛНИТЕЛЬНОГО ПОДМЕНЮ

Как и в задаче, которая требовалась, в программе реализовано подменю, где пользователь должен сделать выбор ввода между файлом и консолью


Рис. 3 – Создание подменю

Как было замечено, схема кодов для создания окружений меню и подменю - это функции, которые были настолько повторяющимися, что их нужно было сделать функциями, чтобы их можно было вызывать в любое время при необходимости. Ниже приведен полный блок кода, отображающий функции


Рис. 4 – схема функций главного и подменю

3. ВВОД И ВЫВОД МАТРИЦ


  • РЕАЛИЗАЦИЯ КОНСОЛЬНОГО ВВОДА, И ВВОДА ИЗ ФАЙЛА

Консольный ввод матриц был реализован как обычно с помощью функции. Алгоритм определяет, что введенное значение должно быть допустимым целым числом или небуквенным значением (у пользователя запрашивается только одно значение, поскольку это квадратная матрица, и одного значения достаточно, чтобы узнать ее размерность). Программа строит матрицы, используя серию циклов for после получения размера от пользователя




Рис. 5 – Консольный матричный ввод

При выборе программа автоматически запрашивает файл, и он появляется для ввода данных и строго предупреждает пользователя о необходимости сохранения после редактирования..


Рис. 6 – Файловый ввод матриц

4. ВЫВОД ФАЙЛОВ И КОНСОЛЬНЫЙ ВЫВОД И ИХ РЕАЛИЗАЦИЯ
В главном меню есть опция "Отображать матрицу", она отвечает за вывод на экран любой заданной матрицы, и это также делается двумя способами, с помощью консоли и, конечно же, с помощью файла. Соответствующие схемы кодов, используемые для их реализации, показаны на следующих рисунках



Рис. 7 – Консольный вывод


Рис. 8 – вывод файла

5. РЕШЕНИЕ ЗАДАЧИ
Матрицы, являющиеся квадратными матрицами, могут упростить и логизировать решение проблем. Также дает пользователю возможность увидеть, насколько интерактивна сама программа.

пользователь может добавлять или удалять из матриц с помощью файла или консоли по своему усмотрению.
ОПРЕДЕЛЕНИЕ ДИАГОНАЛЕЙ

Именно здесь располагались диагонали матриц A и B, а соответствующие элементы перемещались в матрицу C. Это набор циклов, условных состояний и сравнений


Рис. 9 – расположение диагоналей матриц
ЗАКЛЮЧЕНИЕ
Эта задача включает в себя реализацию программы с несколькими стилями ввода и вывода, файловыми и консольными

Основной и наиболее важной частью этой программы является удобство для пользователя, поскольку она была очень интерактивной, а ее меню легко доступны и легко редактируемы

При успешной реализации этой программы многое было использовано и изучено одновременно.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


  1. The C++ Programming Lnaguage, Bjarne Stroustrup

  2. C++ Primer (5th Edition)

  3. Stack Overflow. URL; https://stackoverflow.com/. Date of usage 26/12/2022



ИСХОДНЫЙ КОД

#include

#include

#include

#include

#include

#include

#include

using namespace std;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // Получение дескриптора консоли

void menu(int matSize, double MatrixA[], double MatrixB[], double MatrixC[]);

void mainMenu();

void consoleFillMatrixElements(string matrix, int matsize, double aMatrix[]);

void options(int matSize, double MatrixA[], double MatrixB[], double MatrixC[]);

void MatrixInputOptionsMenu();

void fillMatrixElementsFromFile(int matSize, double MatrixA[], double MatrixB[], double MatrixC[], string fileName);

bool isConvertibleToDouble(string inputString, double& result);

void consoleOutput(double aMatrix[], double bMatrix[], double cMatrix[], int n);

void fileOutput(double aMatrix[], double bMatrix[], double cMatrix[], int n, string fileName);

void solveMatrices(int matSize, double MatrixA[], double MatrixB[], double MatrixC[]);

int choice1 = 0;

int choice2 = 3;

bool matricesIsEmpty = true;

int main()

{

int matSize;

system("CLS");

cout << "Input the dimension of the square matrices (one integer only)" << endl;

cin >> matSize;

system("cls");

double* MatrixA = new double[matSize * matSize]; // Создание матрицы для работы (1)

double* MatrixB = new double[matSize * matSize]; // Создание матрицы для работы (2)

double* MatrixC = new double[matSize * matSize]; // Создание матрицы для работы (3)

menu(matSize, MatrixA, MatrixB, MatrixC);

delete [] MatrixA; // Удаление матриц

delete [] MatrixB; // Удаление матриц

delete [] MatrixC; // Удаление матриц

}

void menu(int matSize, double MatrixA[], double MatrixB[], double MatrixC[]) {

system("cls");

choice1 = 0;

string topicName;

string editfileName = "editableFile.txt";

do {

choice2 = 0;

mainMenu();

switch (choice1) {

case 1:

options(matSize, MatrixA, MatrixB, MatrixC);

break;

case 2:

if (matricesIsEmpty)

cout << "Please enter the matrix elements";

else {

// edit the matrices

fileOutput(MatrixA, MatrixB, MatrixC, matSize, editfileName);

topicName = "notepad \"" + editfileName + "\"";

system(topicName.c_str());

fillMatrixElementsFromFile(matSize, MatrixA, MatrixB, MatrixC, editfileName);

}

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

case 3:

if (matricesIsEmpty)

cout << "Please enter the matrix elements";

else {

// Display the matrices

consoleOutput(MatrixA, MatrixB, MatrixC, matSize);

fileOutput(MatrixA, MatrixB, MatrixC, matSize, editfileName);

}

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

case 4:

if (matricesIsEmpty)

cout << "Please enter the matrix elements";

else

// Solve the matrices

solveMatrices(matSize, MatrixA, MatrixB, MatrixC);

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

case 5:

break;

}

} while ((choice1 < 1) && (choice1 > 4));

}

void options(int matSize, double MatrixA[], double MatrixB[], double MatrixC[]) {

system("cls");

string fileName = "inputFile.txt";

do {

MatrixInputOptionsMenu();

switch (choice2) {

case 1:

cout << "via console\n";

consoleFillMatrixElements("A", matSize, MatrixA);

consoleFillMatrixElements("B", matSize, MatrixB);

consoleFillMatrixElements("C", matSize, MatrixC);

matricesIsEmpty = false;

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

case 2:

cout << "via text file\n Please remember to save after editing \n";

fillMatrixElementsFromFile(matSize, MatrixA, MatrixB, MatrixC, fileName);

matricesIsEmpty = false;

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

case 3:

menu(matSize, MatrixA, MatrixB, MatrixC);

break;

default:

break;

}

} while ((choice1 < 1) && (choice1 > 3));

}

void mainMenu(void) {

cout << "Main Menu\n";

cout << "1 - Input matrix elements\n";

cout << "2 - Edit matrices\n";

cout << "3 - Display the matrices\n";

cout << "4 - Solve the matrix\n";

cout << "5 - Quit\n";

cout << "Please choose: ";

cin >> choice1;

}

void MatrixInputOptionsMenu(void) {

cout << "Matrix Input Option Menu\n";

cout << "1 - via console\n";

cout << "2 - via text file\n";

cout << "3 - Back\n";

cout << "Please choose: \t";

cin >> choice2;

}

void consoleFillMatrixElements(string matrix, int matsize, double aMatrix[]) {

string dispString = "please input the elements of matrix " + matrix;

cout << dispString << endl;

int col = 0;

for (int i = 0; i < (matsize * matsize); i++) {

int row = (i + 1) % matsize;

if (row == 0) {

row = matsize;

}

else if (row == 1)

col++;

string strr = "Element " + matrix + to_string(col) + to_string(row);

cout << strr << endl;

cin >> aMatrix[i];

cout << "\n";

}

}

void fillMatrixElementsFromFile(int matSize, double MatrixA[], double MatrixB[], double MatrixC[], string fileName) {

ifstream infile;

do {

cout << "Please input a valid file name" << endl;

infile.open(fileName);

} while (infile.fail());

string s;

int i = 0;

bool isNewMatrix = false;

int matrix = 0;

while (getline(infile, s)) {

istringstream iss(s);

do {

string subs;

iss >> subs;

if (subs == "A") {

matrix = 1;

i = 0;

cout << "newMatrix A" << endl;

}

else if (subs == "B") {

matrix = 2;

i = 0;

cout << "newMatrix B" << endl;

}

else if (subs == "C") {

matrix = 3;

i = 0;

cout << "newMatrix C";

}

switch (matrix) {

case 1:

if (isConvertibleToDouble(subs, MatrixA[i])) {

i++;

cout << "subs double" << endl;

}

break;

case 2:

if (isConvertibleToDouble(subs, MatrixB[i])) {

i++;

cout << "subs double" << endl;

}

break;

case 3:

if (isConvertibleToDouble(subs, MatrixC[i])) {

i++;

cout << "subs double" << endl;

}

break;

default:

break;

}

//cout << subs << endl;

} while (iss);

isNewMatrix = false;

};

}

bool isConvertibleToDouble(string inputString, double& result) {

char* end;

result = strtod(inputString.c_str(), &end);

if (end == inputString.c_str() || *end != '\0') return false;

return true;

}

// Функция вывода заданных матриц в консоль

void consoleOutput(double aMatrix[], double bMatrix[], double cMatrix[], int n)

{

cout << "A\n";

int j = 0;

for (int i = 0; i < (n * n); i++) {

cout << aMatrix[i] << " ";

j++;

if (j == n)

{

cout << "\n";

j = 0;

}

}

cout << endl;

cout << "B\n";

j = 0;

for (int i = 0; i < (n * n); i++) {

cout << bMatrix[i] << " ";

j++;

if (j == n)

{

cout << "\n";

j = 0;

}

}

cout << endl;

cout << "C\n";

j = 0;

for (int i = 0; i < (n * n); i++) {

cout << cMatrix[i] << " ";

j++;

if (j == n)

{

cout << "\n";

j = 0;

}

}

cout << endl;

system("pause");

}

// Функция вывода заданных матриц в файл

void fileOutput(double aMatrix[], double bMatrix[], double cMatrix[], int n, string fileName)

{

ofstream file(fileName);

file << "A\n";

int j = 0;

for (int i = 0; i < (n * n); i++)

{

file << aMatrix[i] << " ";

j++;

if (j == n)

{

file << "\n";

j = 0;

}

}

file << "\n\n";

file << "B\n";

j = 0;

for (int i = 0; i < (n * n); i++)

{

file << bMatrix[i] << " ";

j++;

if (j == n)

{

file << "\n";

j = 0;

}

}

file << "\n\n";

file << "C\n";

j = 0;

for (int i = 0; i < (n * n); i++)

{

file << cMatrix[i] << " ";

j++;

if (j == n)

{

file << "\n";

j = 0;

}

}

file << "\n\n";

}

void solveMatrices(int matSize, double MatrixA[], double MatrixB[], double MatrixC[])

{

int changes = 0;

string displayString;

//Major Diagonal

for (int i = 0; i < (matSize * matSize); i += matSize + 1)

{

if (MatrixA[i] == MatrixB[i]) {

MatrixC[i] = MatrixB[i];

changes++;

}

}// Minor Diagonal

for (int i = matSize - 1; i < (matSize * matSize - 1); i += matSize - 1) {

{

if (MatrixA[i] == MatrixB[i]) {

MatrixC[i] = MatrixB[i];

changes++;

}

}

displayString = to_string(changes) + "changes were made";

cout << displayString << endl;

system("pause");

}

}