За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b - C (СИ)
Формулировка задачи:
Дан файл с числами типа float, пользователь вводит 2 числа а и b, за 1 просмотр файла нужно вывести сначала числа меньше а, потом числа из промежутка а b ,затем, числа больше b. Нужно сделать так,чтоб эти числа выводились в том порядке,в котором они стоят в файле. У меня они выводятся в обратном. Как реализовать нужный мне вывод?
Например числа в файле {0 1 2 3 4 5 6 7 8 9} a=2; b= 4
у меня выводит как
<a 1 0
числа => A и числа <= B 4 3 2
числа больше B 9 8 7 6 5
а мне нужно в обратном порядке,пробовал через массив,у меня не получилось=(
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- float queue[3][1000];
- int mas[3]={0};
- void funk(int w, float z)
- {
- queue[w][mas[w]++]= z;
- }
- float TrimExcess(int i)
- {
- if (mas[i] > 0)
- {
- mas[i]--;
- return queue[i][mas[i]];
- }
- else
- return -1;
- }
- void main()
- { setlocale(LC_ALL, "");
- system("chcp 1251 & cls");
- float num,a,b;
- printf("Введите числа A,B: ");
- scanf("%f %f",&a,&b);
- FILE *f = fopen("nums.txt","r");
- while (!feof(f)) {
- fscanf(f,"%f",&num);
- if (num < a)
- funk(0,num);
- if ((num >= a) && (num <= b))
- funk(1,num);
- if (num > b)
- funk(2,num);
- }
- printf("числа меньше A: ");
- while ((num = TrimExcess(0)) != -1)
- {
- printf("%f ",num);
- }
- printf("\n\n");
- printf("числа => A и числа <= B: ");
- while ((num = TrimExcess(1)) != -1)
- {
- printf("%f ",num);
- }
- printf("\n\n");
- printf("числа больше B:");
- while ((num = TrimExcess(2)) != -1)
- {
- printf("%f ",num);
- }
- printf("\n\n");
- }
Решение задачи: «За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b»
textual
Листинг программы
- #include <stdio.h>
- #include <glib.h>
- void dump_double(gpointer valueptr, gpointer afterpoint) {
- g_print("%.*f ", GPOINTER_TO_INT(afterpoint), *(double*)valueptr);
- }
- #define AFTER_POINT (2)
- #define FILE_NAME "data.txt"
- int main(void) {
- double value, lowBound, hiBound;
- GSList * inBound = NULL, * outBound = NULL;
- FILE * inp = fopen(FILE_NAME, "r");
- if ( ! inp )
- g_error("Can't open file for input!\n");
- printf("Low bound: ");
- if ( scanf("%lf", &lowBound) != 1 )
- g_error("Wrong input!\n");
- printf("High bound: ");
- if ( scanf("%lf", &hiBound) != 1 )
- g_error("Wrong input!\n");
- if ( lowBound >= hiBound )
- g_error("Low bound must be less than high!\n");
- while ( fscanf(inp, "%lf", &value) == 1 ) {
- if ( value < lowBound )
- dump_double((gpointer)&value, GINT_TO_POINTER(AFTER_POINT));
- else if ( value > hiBound )
- outBound = g_slist_append(outBound, g_memdup((gconstpointer)&value, sizeof(value)));
- else
- inBound = g_slist_append(inBound, g_memdup((gconstpointer)&value, sizeof(value)));
- }
- fclose(inp);
- g_slist_foreach(inBound, dump_double, GINT_TO_POINTER(AFTER_POINT));
- g_slist_foreach(outBound, dump_double, GINT_TO_POINTER(AFTER_POINT));
- g_print("\n");
- g_slist_free_full(inBound, g_free);
- g_slist_free_full(outBound, g_free);
- return 0;
- }
Объяснение кода листинга программы
Код читает из файла числа и сортирует их по заданным пределам. Ввод начинается с запроса на ввод нижнего предела, затем верхнего. После проверки корректности ввода, программа читает числа из файла и распределяет их между двумя списками: один для чисел меньше нижнего предела, другой для чисел больше верхнего. Затем числа из каждого списка выводятся в указанном порядке. После этого списки освобождаются для предотвращения утечки памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д