За 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;
}

Объяснение кода листинга программы

Код читает из файла числа и сортирует их по заданным пределам. Ввод начинается с запроса на ввод нижнего предела, затем верхнего. После проверки корректности ввода, программа читает числа из файла и распределяет их между двумя списками: один для чисел меньше нижнего предела, другой для чисел больше верхнего. Затем числа из каждого списка выводятся в указанном порядке. После этого списки освобождаются для предотвращения утечки памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы