За 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 а мне нужно в обратном порядке,пробовал через массив,у меня не получилось=(
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. float queue[3][1000];
  5. int mas[3]={0};
  6. void funk(int w, float z)
  7. {
  8. queue[w][mas[w]++]= z;
  9. }
  10. float TrimExcess(int i)
  11. {
  12. if (mas[i] > 0)
  13. {
  14. mas[i]--;
  15. return queue[i][mas[i]];
  16. }
  17. else
  18. return -1;
  19. }
  20. void main()
  21. { setlocale(LC_ALL, "");
  22. system("chcp 1251 & cls");
  23. float num,a,b;
  24. printf("Введите числа A,B: ");
  25. scanf("%f %f",&a,&b);
  26. FILE *f = fopen("nums.txt","r");
  27. while (!feof(f)) {
  28. fscanf(f,"%f",&num);
  29. if (num < a)
  30. funk(0,num);
  31. if ((num >= a) && (num <= b))
  32. funk(1,num);
  33. if (num > b)
  34. funk(2,num);
  35. }
  36. printf("числа меньше A: ");
  37. while ((num = TrimExcess(0)) != -1)
  38. {
  39. printf("%f ",num);
  40. }
  41. printf("\n\n");
  42. printf("числа => A и числа <= B: ");
  43. while ((num = TrimExcess(1)) != -1)
  44. {
  45. printf("%f ",num);
  46. }
  47. printf("\n\n");
  48. printf("числа больше B:");
  49. while ((num = TrimExcess(2)) != -1)
  50. {
  51. printf("%f ",num);
  52. }
  53. printf("\n\n");
  54. }

Решение задачи: «За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <glib.h>
  3.  
  4. void dump_double(gpointer valueptr, gpointer afterpoint) {
  5.     g_print("%.*f ", GPOINTER_TO_INT(afterpoint), *(double*)valueptr);
  6. }
  7.  
  8. #define AFTER_POINT (2)
  9. #define FILE_NAME "data.txt"
  10.  
  11. int main(void) {
  12.     double value, lowBound, hiBound;
  13.     GSList * inBound = NULL, * outBound = NULL;
  14.     FILE * inp = fopen(FILE_NAME, "r");
  15.    
  16.     if ( ! inp )
  17.         g_error("Can't open file for input!\n");
  18.    
  19.     printf("Low bound: ");
  20.     if ( scanf("%lf", &lowBound) != 1 )
  21.         g_error("Wrong input!\n");
  22.     printf("High bound: ");
  23.     if ( scanf("%lf", &hiBound) != 1 )
  24.         g_error("Wrong input!\n");
  25.     if ( lowBound >= hiBound )
  26.         g_error("Low bound must be less than high!\n");
  27.    
  28.     while ( fscanf(inp, "%lf", &value) == 1 ) {
  29.         if ( value < lowBound )
  30.             dump_double((gpointer)&value, GINT_TO_POINTER(AFTER_POINT));
  31.         else if ( value > hiBound )
  32.             outBound = g_slist_append(outBound, g_memdup((gconstpointer)&value, sizeof(value)));
  33.         else
  34.             inBound = g_slist_append(inBound, g_memdup((gconstpointer)&value, sizeof(value)));
  35.     }
  36.    
  37.     fclose(inp);
  38.    
  39.     g_slist_foreach(inBound, dump_double, GINT_TO_POINTER(AFTER_POINT));
  40.     g_slist_foreach(outBound, dump_double, GINT_TO_POINTER(AFTER_POINT));
  41.     g_print("\n");
  42.    
  43.     g_slist_free_full(inBound, g_free);
  44.     g_slist_free_full(outBound, g_free);
  45.    
  46.     return 0;
  47. }

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

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

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


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

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

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы