За 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; }
Объяснение кода листинга программы
Код читает из файла числа и сортирует их по заданным пределам. Ввод начинается с запроса на ввод нижнего предела, затем верхнего. После проверки корректности ввода, программа читает числа из файла и распределяет их между двумя списками: один для чисел меньше нижнего предела, другой для чисел больше верхнего. Затем числа из каждого списка выводятся в указанном порядке. После этого списки освобождаются для предотвращения утечки памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д