Загрузка данных


#include "func.h"

#include <cmath>
#include <cstdlib>
#include <fstream>
#include <iostream>


void print_menu()
{
    std::cout << "Задача 1. Вариант 8\n";
    std::cout << "1 - решить задачу из input.txt\n";
    std::cout << "2 - сгенерировать input.txt\n";
    std::cout << "0 - выход\n";
}


int read_menu_item()
{
    int value{};

    std::cout << "Выберите пункт: ";
    std::cin >> value;

    return value;
}


bool correct_data(
    flist::FLIST& list,
    int min_value,
    int max_value,
    int min_count,
    int max_count
)
{
    int count{};

    flist::ptrNODE ptr{ list.get_head()->next };

    while (ptr)
    {
        if (ptr->info < min_value || ptr->info > max_value)
            return false;

        ++count;
        ptr = ptr->next;
    }

    return count >= min_count && count <= max_count;
}


bool read_and_check_list(
    flist::FLIST& list,
    const char input_file_name[],
    int min_value,
    int max_value,
    int min_count,
    int max_count
)
{
    std::ifstream input(input_file_name);

    if (!input)
    {
        std::cout << "File error: нет "
            << input_file_name << '\n';

        return false;
    }

    list.create_by_queue(input);

    if (!correct_data(
        list,
        min_value,
        max_value,
        min_count,
        max_count
    ))
    {
        std::cout << "Ошибка данных: в "
            << input_file_name
            << " должно быть от "
            << min_count
            << " до "
            << max_count
            << " чисел в диапазоне "
            << min_value
            << '-'
            << max_value
            << ".\n";

        return false;
    }

    return true;
}


double geometric_mean(flist::FLIST& list)
{
    double proizvedenie{ 1.0 };
    int count{};

    flist::ptrNODE ptr{ list.get_head()->next };

    while (ptr)
    {
        proizvedenie *= ptr->info;
        ++count;

        ptr = ptr->next;
    }

    return std::pow(proizvedenie, 1.0 / count);
}


void insert_geometric_mean(flist::FLIST& list)
{
    double mean{ geometric_mean(list) };

    int rounded_mean{
        static_cast<int>(std::round(mean))
    };

    std::cout << "Среднее геометрическое: "
        << mean << '\n';

    std::cout << "После округления: "
        << rounded_mean << '\n';

    list.push_front(rounded_mean);
}


void process_data(
    const char input_file_name[],
    const char output_file_name[],
    int min_value,
    int max_value,
    int min_count,
    int max_count
)
{
    flist::FLIST list;

    if (!read_and_check_list(
        list,
        input_file_name,
        min_value,
        max_value,
        min_count,
        max_count
    ))
        return;

    std::cout << "Список после чтения из файла:\n";
    list.print();

    list.sorting();

    std::cout
        << "Список после сортировки по возрастанию:\n";

    list.print();

    insert_geometric_mean(list);

    std::cout << "Итоговый список:\n";
    list.print();

    std::ofstream output(output_file_name);

    if (output)
    {
        list.print(output);

        std::cout << "Результат записан в "
            << output_file_name << ".\n";
    }
    else
    {
        std::cout << "File error: не удалось создать "
            << output_file_name << '\n';
    }
}


void generate_input(
    const char file_name[],
    int count,
    int min_value,
    int max_value
)
{
    std::ofstream file(file_name);

    if (!file)
    {
        std::cout << "File error: не удалось создать "
            << file_name << '\n';

        return;
    }

    std::cout << "Сгенерировано чисел: "
        << count << '\n';

    std::cout << "Данные: ";

    for (int i{}; i < count; ++i)
    {
        int elem{
            min_value +
            std::rand() % (max_value - min_value + 1)
        };

        file << elem;
        std::cout << elem;

        if (i != count - 1)
        {
            file << ' ';
            std::cout << ' ';
        }
    }

    file << '\n';

    std::cout << "\nФайл "
        << file_name
        << " создан.\n";
}


---

#pragma once

#include "flist.h"

void print_menu();

int read_menu_item();

bool correct_data(
    flist::FLIST& list,
    int min_value,
    int max_value,
    int min_count,
    int max_count
);

bool read_and_check_list(
    flist::FLIST& list,
    const char input_file_name[],
    int min_value,
    int max_value,
    int min_count,
    int max_count
);

double geometric_mean(flist::FLIST& list);

void insert_geometric_mean(flist::FLIST& list);

void process_data(
    const char input_file_name[],
    const char output_file_name[],
    int min_value,
    int max_value,
    int min_count,
    int max_count
);

void generate_input(
    const char file_name[],
    int count,
    int min_value,
    int max_value
);


----

/*
    ФИО: 
    Задача 1, вариант 8.

    Условие:
    В файле только натуральные числа 1-9, причем их количество от 1 до 18.
    Прочитав данные из файла создать упорядоченный по возрастанию список.
    Найти среднее геометрическое чисел списка, округлить до целого
    и вставить в начало списка. Результат вывести в файл и на консоль.
*/

#include "func.h"

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <windows.h>

int main()
{
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);

    std::srand(static_cast<unsigned int>(std::time(nullptr)));

    const char input_file_name[]{ "input.txt" };
    const char output_file_name[]{ "output.txt" };

    const int min_value{ 1 };
    const int max_value{ 9 };
    const int min_count{ 1 };
    const int max_count{ 18 };

    int menu_item{};

    do
    {
        print_menu();
        menu_item = read_menu_item();

        std::cout << '\n';

        switch (menu_item)
        {
        case 1:
            process_data(
                input_file_name,
                output_file_name,
                min_value,
                max_value,
                min_count,
                max_count
            );
            break;

        case 2:
        {
            int count{
                min_count +
                std::rand() % (max_count - min_count + 1)
            };

            generate_input(
                input_file_name,
                count,
                min_value,
                max_value
            );

            break;
        }

        case 0:
            std::cout << "Завершение программы\n";
            break;

        default:
            std::cout << "Нет такого пункта меню\n";
        }

        std::cout << '\n';

    } while (menu_item != 0);

    return 0;
}