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

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

02.07.2016, 09:26. Просмотров 894. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

5
shvyrevvg
523 / 496 / 255
Регистрация: 12.05.2016
Сообщений: 1,438
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
Модератор
23575 / 11676 / 2043
Регистрация: 12.02.2012
Сообщений: 19,049
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Эксперт С++
10053 / 5973 / 1493
Регистрация: 25.07.2009
Сообщений: 11,312
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

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

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

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


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

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

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