
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра САПР
отчет
по лабораторной работе №5
по дисциплине «Программирование»
Тема: Файлы для ввода-вывода данных, двумерные массивы. Функции
Студент(ка) гр. 4353 |
|
|
Преподаватель |
|
Калмычков В.А. |
Санкт-Петербург
2024
Оглавление:
Исходная формулировка………………………………………....……...…3
Анализ задания и устранение неточностей……………………...………..3
Математическая постановка задачи………………………………..……...3
Ограничения………………………………………………………………..3
Разработка интерфейса…………………………………………………….3
Реализация ввода/вывода…………………………………………………..4
Внутреннее представление данных в программе………………………...4
Работа с файлами…………………………………………………………...4
Алгоритм………………...………………………………………………….5
Текст программ……………………………………………………………..9
Результат работы программ………………………………………………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;
}