#include < stdio.h> //Библиотека функций ввода и вывода
#include < stdlib.h> //Библиотека стандартных функций
int Put(double); //Помещение значения в очередь
int Get(double*); //Получение значения из очереди
/* --------------- Главная функция main ---------------- */
int main(int argc, char *argv[])
{
double value, mid = 0.0; //Локальные переменные
unsigned count = 0; //Счетчик введенных значений
//Если имя файла не указано или указано неверно, то
if (argc != 2){ //вывод сообщения и выход
puts(“Неправильно указаны параметры!”);
return 0;
}
FILE *f = fopen(argv[1],"wb");//Открытие файла для записи
if (!f) { //Если открыть файл не удалось, то
puts("Невозможно создать файл!"); //вывод сообщения
return 0; //и выход
}
while (1){ //Цикл ввода значений
char str[100]="", *ptr = NULL; //Локальные переменные
gets(str); //Ввод строки
if (str[0]==0) break ; //Если строка пустая, то выход
value = strtod(str,&ptr);//Преобразование в число
if (strlen(ptr)==0){ //Если преобразовалось успешно
if (Put(value)){ //Помещение в очередь
puts("Мало памяти!");//и проверка результата
break ;
}
mid += value;//Подсчет суммы введенных значений
count++; //Подсчет количества введенных значений
}
}
mid /= count; //Вычисление среднего значения
while (!Get(&value)) //Цикл пока в очереди есть значения,
//то извлечение значения из очереди
if (value>mid) //Проверка: значение больше среднего
fwrite(&value,sizeof (double ),1,f);//запись в файл
fclose(f); //Закрытие файла
return 0; //Завершение программы
}
/* ----- Описание структуры и указателей на очередь ---- */
typedef struct _Element{
doubl e value;
struct _Element *next;
} Element;
Element *head = NULL, *tail = NULL;
/* --------- Функция помещения значения в очередь ---------
Параметры: value - помещаемое значение.
Возвращаемое значение: 0 - успешное завершение,
1 - ошибка выделения памяти
-------------------------------------------------------- */
int Put(double value)
{
//Выделение памяти под новый элемент
Element *tmp = (Element *)malloc(sizeof (Element));
if (!tmp) return 1; //Если память не выделилась, то выход
//Инициализация ссылки на следующий элемент в очереди
tmp->next = NULL; //нулевым значением
tmp->value = value; //Запись значения в новый элемент
//Связывание последнего элемента в очереди с новым
if (tail) tail->next = tmp; //элементом
tail = tmp; //Установка указателя на конец очереди
//Если это первый элемент, то установка указателя
if (!head) head = tmp; //на начало очереди
return 0; //Успешное завершение
}
/* --------- Функция получения значения из очереди --------
Параметры: value - полученное значение (по ссылке).
Возвращаемое значение: 0 - успешное завершение,
1 - очередь пуста
-------------------------------------------------------- */
int Get(double *val)
{
if (!head) return 1; //Если очередь пуста, то выход
*value = head->value;//Запись значения в параметр
Element *tmp = head; //Установка локального указателя
head = head->next; //Установка нового начала очереди
//Если это последний элемент, то инициализация указателя
if (!head) tail=NULL; //на конец очереди нулевым значением
free(tmp); //Освобождение памяти
return 0; //Успешное завершение
}
Задача 9.4: Пользователь с клавиатуры построчно вводит слова (максимальная длина слова - 50 символов). Признак завершения ввода - пустая строка. Записать слова в текстовый файл в обратном порядке. Имя файла передается в параметрах командной строки. При реализации использовать динамическую структуру - стек.