Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Niklss
0 / 0 / 1
Регистрация: 24.12.2015
Сообщений: 15
#1

За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b - C (СИ)

02.07.2016, 09:26. Просмотров 289. Ответов 5
Метки нет (Все метки)

Дан файл с числами типа 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
а мне нужно в обратном порядке,пробовал через массив,у меня не получилось=(
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 09:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос За 1 просмотр файла вывести сначала числа меньше а, потом числа из промежутка а b, затем, числа больше b (C (СИ)):

Создать файл целых чисел. За один просмотр файла вывести на экран сначала все четные числа, а потом все нечетные
Помогите пожалуйста написать программу. Создать файл целых чисел. За один...

Вывести сначала все отрицательные а затем все остальные числа массива
Дана задача: Дан массив из 100 чисел..вывести сначала все отрицательные а...

В файле расположить сначала все положительные числа, а затем отрицательные
Дан файл целых чисел. Нулевых компонент в файле нет. Число отрицательных...

Переставить элементы массива: сначала положительные числа, а потом отрицательные (порядок должен сохраняться)
Переставить элементы одномерного массива А {20} так чтобы сначала были все...

Переставить числа так, чтобы сначала шли только 0, затем только 1, затем только 2
Даны целые числа A,A,A,...,A, каждое из которых является либо 0, либо 1, либо...

Преобразовать одномерный массив так, чтобы сначала располагались числа в интервале, а затем все остальные
1. Преобразовать одномерный массив таким образом, чтобы сначала располагались...

5
shvyrevvg
497 / 476 / 247
Регистрация: 12.05.2016
Сообщений: 1,389
02.07.2016, 16:06 #2
Цитата Сообщение от Niklss Посмотреть сообщение
C
1
queue[w][mas[w]++]= z; // тут вы увеличиваете счетчик
Цитата Сообщение от Niklss Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
float TrimExcess(int i) // а тут выводите начиная с последнего
{
    if (mas[i] > 0)
    {
        mas[i]--;
        return queue[i][mas[i]];
    }
    else
        return -1;
}
Переработайте логику, что бы вывод начинался с 0 элемента по mas[i]. Если оставлять так как у вас реализовано, можно добавить массив с текущими позициями.
Цитата Сообщение от Niklss Посмотреть сообщение
C
1
return queue[i][mas[i]]; // а в файле не могут быть отрицательные числа(-1.0)?
0
LFC
729 / 534 / 416
Регистрация: 17.09.2015
Сообщений: 1,597
02.07.2016, 16:41 #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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;
}
void TrimExcess(int i)
{
    int j;
    for(j = 0; j < mas[i]; ++j)
        printf("%f ", queue[i][j]);
}
int 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: ");
    TrimExcess(0);
    printf("\n\n");
    printf("числа => A и числа <= B: ");
    TrimExcess(1);
    printf("\n\n");
    printf("числа больше B:");
    TrimExcess(2);
    printf("\n\n");
}
0
SergioO
168 / 184 / 90
Регистрация: 13.12.2015
Сообщений: 995
02.07.2016, 17:25 #4
Цитата Сообщение от Niklss Посмотреть сообщение
Дан файл с числами типа float, пользователь вводит 2 числа а и b, за 1 просмотр файла нужно вывести сначала числа меньше а, потом числа из промежутка а b ,затем, числа больше b.
имхо лучше динамический список, а не автоматический массив
Цитата Сообщение от Niklss Посмотреть сообщение
float queue[3][1000];
3 то зачем? числа меньшие а можно сразу печатать, тк
Цитата Сообщение от Niklss Посмотреть сообщение
чтоб эти числа выводились в том порядке,в котором они стоят в файле
1
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,992
02.07.2016, 20:22 #5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
void Enque(int n, int *Arr, int *ptr)
{
     Arr[++(*ptr)]=n;
}
 
int main(int argc, char *argv[])
{
  FILE *fi;
  int *Q1,*Q2,*Q3;
  int ptr1,ptr2,ptr3;
  int i,a,b,n;
  
  if ((fi=fopen("f.txt","r"))==NULL)
  {
     printf("Error by open\n");
     system("PAUSE");
     return 1;
  }
  else
  {
     printf("a=");
     scanf("%d",&a);
     printf("b=");
     scanf("%d",&b);
      
     Q1=(int *) calloc(1000,sizeof(int));
     Q2=(int *) calloc(1000,sizeof(int));
     Q3=(int *) calloc(1000,sizeof(int));
  
     ptr1=-1;
     ptr2=-1;
     ptr3=-1;
                                         
     while (!feof(fi)) 
     {
        fscanf(fi,"%d",&n); 
        
        if (n<a) 
           Enque(n,Q1,&ptr1);
        else
           if (n<=b) 
              Enque(n,Q2,&ptr2);
           else
              Enque(n,Q3,&ptr3);        
     }
     
     fclose(fi);
     
     for (i=0; i< ptr1; i++) printf("%d ",Q1[i]);
     printf("\n");
     for (i=0; i< ptr2; i++) printf("%d ",Q2[i]);
     printf("\n");
     for (i=0; i< ptr3; i++) printf("%d ",Q3[i]);
     printf("\n");
     
     free(Q1);
     free(Q2);
     free(Q3);
     
  }
  system("PAUSE");  
  return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
03.07.2016, 01:20 #6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от SergioO Посмотреть сообщение
3 то зачем? числа меньшие а можно сразу печатать
Кстати, да, логично.

Удобная вещь GLib. И что её в школах не проходят?..
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#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;
}
Код
andrew@debppc:~/workspace/c/glib$ gcc -Wall less_inbounds_greather.c `pkg-config --cflags --libs glib-2.0`
andrew@debppc:~/workspace/c/glib$ ./a.out Low bound: 20
High bound: 40
12.20 3.23 17.10 1.01 5.00 33.30 31.00 26.70 54.00 91.40 
andrew@debppc:~/workspace/c/glib$ cat data.txt
33.3 31 54 12.2 3.23 26.7 91.4 17.1 1.01 5
andrew@debppc:~/workspace/c/glib$
0
03.07.2016, 01:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 01:20
Привет! Вот еще темы с решениями:

Вывести все простые числа из заданного промежутка
#include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() {int i,M,N,f=1;...

Считать из массива числа больше 10 и меньше 100 и суммировать их
Здравствуйте! Создал программу, которая считывает из массива числа больше 10 и...

Вывести числа из промежутка (a; b), при делении которых на 7 остаток 1, 2 или 5
Здравствуйте, уважаемые участники форума! Есть задача. Вывести на экран числа...

Перестроить односвязный список так, чтобы сначала стояли все нечетные числа, затем все четные
Построить линейный список из входной последовательности чисел. Перестроить его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru