Загрузка данных
#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;
}