/
kopatu4Ka
/
OOP_lab
Обзор
Документация
Войти
/
kopatu4Ka
/
OOP_lab
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
116 строк
4 KB
kopatu4Ka
Внесенные исправления:
18 мар 2026, 09:13
18 мар 2026, 09:13
2ed13f3
Код
Авторство
О чём код?
#include <iomanip> #include <iostream> #include <vector> #ifdef _WIN32 #include <fcntl.h> #include <io.h> #endif namespace { /** * @brief Сбрасывает состояние ошибки потока ввода и очищает остаток строки. */ void clearInputError() { std::cin.clear(); char ch; while (std::cin.get(ch) && ch != '\n') {} } /** * @brief Запрашивает у пользователя корректное положительное число K. * @return Значение K больше нуля. */ std::size_t readPositiveK() { std::size_t k{0}; std::wcout << L"Введите целое положительное число K: "; while (true) { long long inputK{0}; if (!(std::cin >> inputK)) { std::wcout << L"Некорректный ввод. Введите целое положительное число: "; clearInputError(); continue; } if (inputK <= 0) { std::wcout << L"K должно быть больше 0. Повторите ввод: "; continue; } k = inputK; break; } return k; } /** * @brief Вычисляет первые K чисел Фибоначчи и сумму чётных элементов. * @param k Количество чисел в последовательности. * @param evenSum Выходной параметр для суммы чётных чисел. * @return Вектор из первых K чисел Фибоначчи. */ std::vector<unsigned long long> Fibonacci(const std::size_t k, unsigned long long& evenSum) { // Вектор хранит первые K чисел Фибоначчи: F1 = 1, F2 = 1 // unsigned long long увеличивает допустимый диапазон значений перед переполнением std::vector<unsigned long long> fibonacciNumbers{}; fibonacciNumbers.reserve(k); evenSum = 0; for (std::size_t i{0}; i < k; ++i) { unsigned long long current{0}; if (i < 2) { current = 1ULL; } else { current = fibonacciNumbers[i - 1] + fibonacciNumbers[i - 2]; } fibonacciNumbers.push_back(current); if (current % 2ULL == 0ULL) { evenSum += current; } } return fibonacciNumbers; } /** * @brief Выводит последовательность Фибоначчи и сумму её чётных элементов. * @param fibonacciNumbers Последовательность для вывода. * @param evenSum Сумма чётных чисел последовательности. */ void printFibonacci(const std::vector<unsigned long long>& fibonacciNumbers, const unsigned long long evenSum) { std::wcout << L"Первые " << fibonacciNumbers.size() << L" чисел Фибоначчи:\n"; // Выводим по 10 чисел в строке, каждое поле шириной 10 std::wcout << std::left; for (std::size_t i{0}; i < fibonacciNumbers.size(); ++i) { std::wcout << std::setw(10) << fibonacciNumbers[i]; // Переход на новую строку после каждого 10-го числа и после последнего элемента if ((i + 1) % 10 == 0 || i + 1 == fibonacciNumbers.size()) { std::wcout << L'\n'; } } std::wcout << L"\nСумма чётных чисел: " << evenSum << L'\n'; } } // namespace /** * @brief Точка входа программы. * @return Код завершения. */ int main() { #ifdef _WIN32 // Переключаем stdout в wide-режим, чтобы wcout корректно выводил Unicode в консоль #ifdef _O_WTEXT _setmode(_fileno(stdout), _O_WTEXT); #endif #endif unsigned long long evenSum{0}; const std::size_t k{readPositiveK()}; const std::vector<unsigned long long> fibonacciNumbers{Fibonacci(k, evenSum)}; printFibonacci(fibonacciNumbers, evenSum); return 0; }