Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 семестр / отчет лаба 5 прог.docx
Скачиваний:
0
Добавлен:
28.03.2025
Размер:
215.65 Кб
Скачать

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

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

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

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

Кафедра САПР

отчет

по лабораторной работе №5

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

Тема: Файлы для ввода-вывода данных, двумерные массивы. Функции

Студент(ка) гр. 4353

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

Калмычков В.А.

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

2024

Оглавление:

  1. Исходная формулировка………………………………………....……...…3

  2. Анализ задания и устранение неточностей……………………...………..3

  3. Математическая постановка задачи………………………………..……...3

  4. Ограничения………………………………………………………………..3

  5. Разработка интерфейса…………………………………………………….3

  6. Реализация ввода/вывода…………………………………………………..4

  7. Внутреннее представление данных в программе………………………...4

  8. Работа с файлами…………………………………………………………...4

  9. Алгоритм………………...………………………………………………….5

  10. Текст программ……………………………………………………………..9

  11. Результат работы программ………………………………………………12

  12. Вывод…………………………………………………………………........10

Исходная формулировка задания

Найти в каждой строке матрицы n на m наибольший элемент и поменять его местами с элементом главной строки.

Анализ задания, устранение неточностей

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

Математическая постановка задачи

Дано: Прямоугольная матрица AA размером n × m, где n, m>0.

Найти: в каждой строке матрицы n на m наибольший элемент и поменять его местами с элементом главной строки.

Способ решения: Заголовок файла считывается, чтобы получить размеры nn и mm (число строк и столбцов матрицы).Если размеры некорректны (например, отрицательные), программа завершает выполнение. Построчно считываются элементы матрицы. Если в строке меньше элементов, чем указано в заголовке, строка не учитывается, а матрица обрезается.Используется динамическое выделение памяти для хранения данных. После формирования корректной матрицы (с учётом отсечения лишних данных) она записывается в файл. Для каждой строки ищется максимальный элемент. Этот элемент меняется местами с элементом главной диагонали в соответствующей строке. Финальная матрица записывается в файл с указанием, что она получена после перестановки элементов.

Контрольный пример

Исходная матрица: Матрица после обработки:

Ограничения

Ограничений нет

Разработка интерфейса пользователя

O1:

Автор:

Группа:

Задание: Найти в каждой строке матрицы n на m наибольший элемент и поменять его местами с элементом главной строки.

Версия: 5.2.Ж.

Дата: Начало: 14.11.24

Конец:

О2: готово нащальника

O3: takaia bila

matrix

takaia stala

matrix(измененная)

Реализация ввода/вывода

Библиотека

Вывод чисел

Вывод текста

Переход к новой строке

Ввод

fstream

ofstream

ofstream

\n

ifstream

Внутреннее представление данных в программе

Реализация ввода и вывода

Ввод

Вывод

Число в дробной части

Показать знак числа

Ширина поля таблицы

Следующая строка

iostream

cin>>

cout<<

-

-

-

<<endl

iomanip

-

-

setprecision

showpos

setw

-

Описание функций

Параметры функций

Параметры переменных

Имя функции

Тип функции

Параметры назначения

Тип переменной

Имя

Изменение

переменной

razmer

int

Забор предполагаемого размера матрицы

char

Name

-

createMatrix

void

Создает матрицу

unsigned

size

&

deleteMatrix

int

Удаляет матрицу

int

Matrix, size

-

is

int

Считает числа из файла составляя массивы.

string

line

-

sborka

int

Контроль правильности

int

line

-

main

int

Управляет общим процессом, включая чтение матрицы, обрезку, вывод результата и освобождение памяти

double

sum

&

v

void

Выводит контрольный вывод, требуемый размер, итоговый размер матрицы, видоизмененную матрицу.

int

Matrix, size, realsize

-

readMatrix

int

Считывает матрицу

int

size

&

Работа с файлами

Для реализации данной программы требуются один входной файл и один файл для записи результатов. В данной работе этими файлами являются «in» (входной файл) и «out» (файл, для записи результатов). Файл «in» должен содержать набор чисел, которые должны быть натуральными.

Алгоритм

Razmer:

createMatrix:

deleteMatrix:

V:

rakirofkaexe:

sborka:

Текст программы #include <iostream>

#include <fstream>

using namespace std;

bool razmer(const char* filename, int& rows, int& cols) {

setlocale(LC_ALL, "russian");

ifstream inputFile(filename);

if (!inputFile) {

cout << "Не удалось открыть файл " << "\n";

return false;

}

inputFile >> rows >> cols;

if (rows <= 0 || cols <= 0) {

cout << "Размеры матрицы должны быть положительными.\n";

inputFile.close();

return false;

}

inputFile.close();

return true;

}

int** createMatrix(int rows, int cols) {

int** matrix = new int* [rows];

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

matrix[i] = new int[cols];

}

return matrix;

}

void deleteMatrix(int** matrix, int rows) {

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

delete[] matrix[i];

}

delete[] matrix;

}

int sborka(char* line, int* values, int maxValues) {

int count = 0;

int number = 0;

bool hasNumber = false;

bool isNegative = false;

for (int i = 0; line[i] != '\0'; ++i) {

if (line[i] >= '0' && line[i] <= '9') {

number = number * 10 + (line[i] - '0');

hasNumber = true;

}

else if (line[i] == '-' && !hasNumber && (i == 0 || line[i - 1] == ' ')) {

isNegative = true;

hasNumber = true;

}

else if (hasNumber) {

if (isNegative) number = -number;

values[count++] = number;

number = 0;

hasNumber = false;

isNegative = false;

if (count >= maxValues) break;

}

}

if (hasNumber && count < maxValues) {

if (isNegative) number = -number;

values[count++] = number;

}

return count;

}

int** is(const char* filename, int& rows, int& cols) {

setlocale(LC_ALL, "russian");

ifstream inputFile(filename);

if (!inputFile) {

cout << "Не удалось открыть файл " << filename << "\n";

return nullptr;

}

char line[1024];

inputFile.getline(line, 1024);

int** matrix = createMatrix(rows, cols);

int rowCount = 0;

int* values = new int[cols];

while (inputFile.getline(line, 1024)) {

if (rowCount >= rows) break;

int colCount = sborka(line, values, cols);

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

matrix[rowCount][j] = values[j];

}

if (colCount < cols) {

cols = colCount;

}

rowCount++;

}

if (rowCount < rows) {

rows = rowCount;

}

delete[] values;

inputFile.close();

return matrix;

}

void v(ofstream& outputFile, int** matrix, int rows, int cols, const char* message) {

setlocale(LC_ALL, "russian");

outputFile << message << ":\n";

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

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

outputFile << matrix[i][j] << (j + 1 < cols ? " " : "");

}

outputFile << "\n";

}

outputFile << "\n";

}

void rakirofkaexe(int** matrix, int rows, int cols) {

int size = min(rows, cols);

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

int maxIdx = i;

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

if (matrix[i][j] > matrix[i][maxIdx]) {

maxIdx = j;

}

}

swap(matrix[i][i], matrix[i][maxIdx]);

}

}

int main() {

setlocale(LC_ALL, "russian");

const char* inputFilename = "input.txt";

const char* outputFilename = "output.txt";

int rows, cols;

if (!razmer(inputFilename, rows, cols)) {

return 1;

}

int** matrix = is(inputFilename, rows, cols);

if (!matrix) {

return 1;

}

ofstream outputFile(outputFilename);

if (!outputFile) {

cout << " "<< "\n";

deleteMatrix(matrix, rows);

return 1;

}

v(outputFile, matrix, rows, cols, "takaia bila");

rakirofkaexe(matrix, rows, cols);

v(outputFile, matrix, rows, cols, "takaia stala");

deleteMatrix(matrix, rows);

outputFile.close();

cout << "Автор: \nГруппа: \nЗадание : Найти в каждой строке матрицы n на m наибольший элемент и поменять его местами с элементом главной строки.\nВерсия : 5.2.Ж.\nДата : Начало : 14.11.24\nКонец :\n";

cout << "готово нащальника"<< "\n";

system(outputFilename);

return 0;

}