Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
Niklss
0 / 0 / 0
Регистрация: 24.12.2015
Сообщений: 15
#1

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

02.07.2016, 09:26. Просмотров 261. Ответов 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 (СИ)):

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

Вывести сначала все отрицательные а затем все остальные числа массива - C (СИ)
Дана задача: Дан массив из 100 чисел..вывести сначала все отрицательные а затем все остальные.. вот код: j=0,i=0; while(i&lt;=100) ...

В файле расположить сначала все положительные числа, а затем отрицательные - C (СИ)
Дан файл целых чисел. Нулевых компонент в файле нет. Число отрицательных компонент равно числу положительных. Преобразовать файл таким...

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

Преобразовать одномерный массив так, чтобы сначала располагались числа в интервале, а затем все остальные - C (СИ)
1. Преобразовать одномерный массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале , а потом...

Вывести все простые числа из заданного промежутка - C (СИ)
#include &lt;stdio.h&gt; #include &lt;math.h&gt; int main() {int i,M,N,f=1; scanf(&quot;%d%d&quot;, &amp;M,&amp;N); for ( ; M &lt;= N; M++) { for (i = 2; i...

5
shvyrevvg
495 / 474 / 183
Регистрация: 12.05.2016
Сообщений: 1,372
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
728 / 533 / 294
Регистрация: 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
95 / 184 / 63
Регистрация: 13.12.2015
Сообщений: 994
02.07.2016, 17:25 #4
Цитата Сообщение от Niklss Посмотреть сообщение
Дан файл с числами типа float, пользователь вводит 2 числа а и b, за 1 просмотр файла нужно вывести сначала числа меньше а, потом числа из промежутка а b ,затем, числа больше b.
имхо лучше динамический список, а не автоматический массив
Цитата Сообщение от Niklss Посмотреть сообщение
float queue[3][1000];
3 то зачем? числа меньшие а можно сразу печатать, тк
Цитата Сообщение от Niklss Посмотреть сообщение
чтоб эти числа выводились в том порядке,в котором они стоят в файле
1
Catstail
Модератор
23032 / 11399 / 1857
Регистрация: 12.02.2012
Сообщений: 18,655
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Эксперт С++
9913 / 5836 / 975
Регистрация: 25.07.2009
Сообщений: 11,005
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
Привет! Вот еще темы с ответами:

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

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

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

Найти элементы в каждом столбце матрицы, которые больше числа А и меньшие числа С - C (СИ)
3 Найти элементы в каждом столбце матрицы G размером 7х4, которые больше числа А и меньшие числа С. определить количество таких элементов....


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

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

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