
1 семестр / Прога лаба 4 отчет
.docxМинобрнауки РФ
Санкт-Петербургский государственный электротехнический университет
им. В.И. Ульянова (Ленина) «ЛЭТИ»
(СПбГЭТУ)
Факультет компьютерных технологий и информатики
Кафедра САПР
ОТЧЁТ
По лабораторной работе №4
«Обработка последовательности значений с использованием массивов»
Преподаватель: ______________________Калмычков В. А.
Студент гр. 4353: ______________________
Санкт-Петербург
2024
Оглавление:
Исходная формулировка………………………………………....……...…3
Анализ задания и устранение неточностей……………………...………..3
Математическая постановка задачи………………………………..……...3
Ограничения………………………………………………………………..3
Разработка интерфейса…………………………………………………….3
Реализация ввода/вывода…………………………………………………..4
Внутреннее представление данных в программе………………………...4
Представление алгоритма………………………………………………….5
Текст программ……………………………………………………………..7
Результат работы программ………………………………………………..9
Вывод…………………………………………………………………........10
Исходная формулировка
Дано: Массив чисел, состоящий из N чисел, каждое число в массиве ∈ Z
Задача: В массиве целых чисел переставить значения таким образом, чтобы сначала располагались четные, а затем нечетные значения
Анализ задания и устранение неточностей
Условные обозначение:
N – количество элементов массива
A[i] – элемент массива.
i – индекс элемента массива.
Математическая постановка задачи и способ решения:
Числа делящиеся без остатка на 2 поставить в начало массива, остальные в конец. Массив вывести в файл.
В программе используется метод двух указателей. Создаются две переменные. У одной нулевое значение – начало массива, у другой значение – индекс последнего элемента массива. Указатели движутся по массиву пока первый не встретит нечетное число, а второй четное. Когда такое случается, то элементы меняются местами и движение продолжается дальше. Все заканчивается только когда указатели пересекаются.
Ограничения
Из-за особенностей типа данных double в языке С++ входной массив должен состоять из чисел, которые должны быть в диапазоне от ±10-38 до ±1038
Разработка интерфейса
O1:
Автор:
Группа:
Задание: В массиве целых чисел переставить значения таким образом, чтобы сначала располагались четные, а затем нечетные значения.
Версия: 4.1.1
Дата: Начало: 10.11.24
Конец:
O2:
Файл не открылся. Не знаю почему, честно (
O3:
Файл in пустой. Запишите в него что-нибудь, умоляю(((
O4:
Реализация ввода/вывода
-
Библиотека
Функция
Назначение
iostream
cout
Вывод текста
cin
Ввод числа
fstream
open()
Открыть файл
close()
Закрыть файл
iomanip
setprecision()
Установить точность вывода
setw()
Количество символов на вывод числа
left
Перемещает выводимый текст влево
fixed
Полный вывод числа
algorithm
sort
Сортировка массива
Внутреннее представление данных в программе
Работа с файлами
Для реализации данной программы требуются входные файлы с записанными построчно числами (по одному для каждой версии). В моём случае это файл in.txt (для версии 4.1) и файл in2.txt (для версии 4.2). На выходе по окончании выполнения программы создаются (или заполняются новым содержимым) файлы out.txt (для версии 4.1) и out2.txt (для версий 4.2).
-
Имя
Тип
Назначение
f
ifstream
Входной файл
g
ofstream
Выходной файл
N
int
Длина массива A
i
Итерация в цикле for
A
Версия 1:
long
Версия 2:
long*
Массив A
Алгоритм
Версия 1:
Версия 2:
Текст программ
Версия 1:
/*
Автор:
Группа:
Задание: В массиве целых чисел переставить значения таким образом, чтобы сначала располагались четные, а затем нечетные значения.
Версия: 4.1.1
Дата: Начало: 10.11.24
Конец:
*/
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main() {
setlocale(LC_ALL, "RU");
cout << "Автор: \nГруппа : \nЗадание : В массиве целых чисел переставить значения таким образом, чтобы сначала распологались четные, а затем нечетные значения.\nВерсия : 4.1.1\nНачало: 10.11.24\nКонец:15.11.24\n\n";
long N;
ifstream f("in.txt");
ofstream g("out.txt");
f >> N;
long A[100];
N = size(A);
if (N < 0) { N = 0; }
if (not f.is_open()) {
g << "Файл не открылся. Не знаю почему, честно(";
g.close();
system("out.txt");
return 0;
}
if (f.eof()) {
g << "Файл in пустой. Запишите в него что нибудь, умоляю(((";
g.close();
system("out.txt");
return 0;
}
for (long i = 0; i < N; i++) { f >> A[i]; } // из файла в массив
g << "массив до\n";
for (long i = 0; i < N; i++) { if (A[i] != -858993460) { g << A[i] << "\n"; } }
long even_index = 0;
long odd_index = N - 1;
while (even_index < odd_index) {
if (A[even_index] % 2 == 0) {
even_index++;
}
else if (A[odd_index] % 2 != 0) {
odd_index--;
}
else {
swap(A[even_index], A[odd_index]);
}
}
g << "\nмассив после сортировки:\n";
for (long i = 0; i < N; i++) { if (A[i] != -858993460) { g << A[i] << "\n";} }
cout << "массив в файле\n";
f.close();
g.close();
system("out.txt");
}
Версия 2:
/*
Автор:
Группа:
Задание: В массиве целых чисел переставить значения таким образом, чтобы сначала распологались четные, а затем нечетные значения.
Версия: 4.1.1
Дата: Начало: 10.11.24
Конец:
*/
#include <iostream>
#include <fstream>
#include <locale>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
cout << "Автор: \nГруппа : \nЗадание : В массиве целых чисел переставить значения таким образом, чтобы сначала распологались четные, а затем нечетные значения.\nВерсия : 4.1.1\nНачало: 10.11.24\nКонец:15.11.24\n\n";
long* A;
long tmp = 0;
int N = 0;
unsigned int i = 0, j = 0;
ifstream f("in2.txt");
ofstream g("out2.txt");
if (!g.is_open())
cout << "Нет выходного файла";
else
{
if (!f.is_open())
cout << "Нет входного файла";
else
{
while (f >> tmp)
N++;
if (N == 0) {
g << "Файл пуст" << endl;
}
else
{
A = new long[N];
f.clear();
f.seekg(0, ios::beg);
i = 0;
while (f >> tmp)
*(A + i++) = tmp;
g << "массив до\n";
for (long i = 0; i < N; i++) { if (*(A + i) != -858993460) { g << *(A + i) << "\n"; } }
long even_index = 0;
long odd_index = N - 1;
while (even_index < odd_index) {
if (*(A + even_index) % 2 == 0) {
even_index++;
}
else if (*(A + odd_index) % 2 != 0) {
odd_index--;
}
else {
swap(*(A + even_index), *(A + odd_index));
}
}
g << "\nмассив после сортировки:\n";
for (long i = 0; i < N; i++) { if (*(A + i) != -858993460) { g << *(A + i) << "\n"; } }
delete[] A;
cout << "\nмассив в файле\n";
}
}
f.close();
g.close();
system("out2.txt");
}
}
Результат работы программ
Версия 1:
Входной файл: Выходной файл:
Версия 2:
Входной файл: Выходной файл:
Вывод
В ходе выполнения задания были освоены базовые конструкции со статическими и динамическими массивами и указателями в языке С++, также получены практические навыки использования массивов для решения задач.