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


#include <stdio.h>
#include <stdlib.h>

// Структура узла
typedef struct Node {
    double data;
    struct Node* next;
} Node;

// --- Безопасное чтение целого числа ---
int safe_read_int(const char* prompt) {
    int value;
    int result;
    char ch;
    while (1) {
        printf("%s", prompt);
        result = scanf("%d", &value);
        // Если прочитали целое и следующий символ — перевод строки (или пробел)
        if (result == 1) {
            // Проверяем, что после числа не идёт мусор (например, "5abc")
            // Для простоты достаточно проверить, что буфер пуст или содержит только пробелы
            // Можно считать все до конца строки, но для краткости просто очистим буфер.
            // Однако чтобы избежать проблем, сделаем полную очистку.
            while ((ch = getchar()) != '\n' && ch != EOF);
            if (value > 0) return value;
            else printf("Ошибка: количество должно быть положительным.\n");
        } else {
            // Очищаем буфер до конца строки
            while ((ch = getchar()) != '\n' && ch != EOF);
            printf("Ошибка: введите целое число.\n");
        }
    }
}

// --- Безопасное чтение вещественного числа ---
double safe_read_double(const char* prompt) {
    double value;
    int result;
    char ch;
    while (1) {
        printf("%s", prompt);
        result = scanf("%lf", &value);
        if (result == 1) {
            // Очищаем буфер (оставшийся перевод строки или пробелы)
            while ((ch = getchar()) != '\n' && ch != EOF);
            return value;
        } else {
            while ((ch = getchar()) != '\n' && ch != EOF);
            printf("Ошибка: введите вещественное число (например, 3.14).\n");
        }
    }
}

// --- Добавление в конец списка ---
void append(Node** head, double value) {
    Node* new_node = (Node*)malloc(sizeof(Node));
    if (!new_node) {
        fprintf(stderr, "Ошибка выделения памяти!\n");
        exit(1);
    }
    new_node->data = value;
    new_node->next = NULL;

    if (*head == NULL) {
        *head = new_node;
        return;
    }

    Node* cur = *head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = new_node;
}

// --- Произведение min * max ---
double product_min_max(Node* head) {
    if (head == NULL) {
        fprintf(stderr, "Список пуст!\n");
        return 0.0;
    }
    double min = head->data;
    double max = head->data;
    Node* cur = head->next;
    while (cur != NULL) {
        if (cur->data < min) min = cur->data;
        if (cur->data > max) max = cur->data;
        cur = cur->next;
    }
    return min * max;
}

// --- Печать списка ---
void print_list(Node* head) {
    printf("Список: ");
    for (Node* cur = head; cur != NULL; cur = cur->next) {
        printf("%.2f ", cur->data);
    }
    printf("\n");
}

// --- Освобождение памяти ---
void free_list(Node** head) {
    Node* cur = *head;
    while (cur != NULL) {
        Node* next = cur->next;
        free(cur);
        cur = next;
    }
    *head = NULL;
}

// --- Главная функция ---
int main() {
    Node* head = NULL;

    int n = safe_read_int("Введите количество элементов (положительное целое): ");

    printf("Введите %d вещественных чисел:\n", n);
    for (int i = 0; i < n; i++) {
        char prompt[50];
        sprintf(prompt, "  Элемент %d: ", i + 1);
        double value = safe_read_double(prompt);
        append(&head, value);
    }

    print_list(head);

    double result = product_min_max(head);
    printf("Произведение минимального и максимального элементов = %.2f\n", result);

    free_list(&head);
    return 0;
}