5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
1

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

29.05.2010, 19:32. Показов 2711. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных экстремумов исходного файла в порядке убывания.
помогите плиз кто чем может.вот у меня даж не получаеться перенести в новый файл в порядке возрастаниятуплю
кто чем может хелп)

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
#include <stdio.h>
#include <stdlib.h>
#define a 100
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main()
{
        FILE *fin, *fout;
        float num;
        int cnt;
        
        fin = fopen(FIN_NAME, "r");      
        fout = fopen(FOUT_NAME, "w");
        cnt=0;     
        while ( fscanf(fin, "%f", &num) == 1 )
        {
            if ( cnt++)
            {
                if ( (num-1)>num<(num+1)  ||  (num-1)<num>(num+1))
                {
                        if ( fprintf(fout, "%.1f\n", cnt) < 0 )
                        {
                                perror("fprintf");
                                fclose(fin);
                                fclose(fout);
                                exit(1);
                        }
                }
        }
        }
         fclose(fin);
         fclose(fout);
         return 0;
}
Добавлено через 8 часов 54 минуты
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
#include <stdio.h>
#include <stdlib.h>
#define a 100
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main(void)
{
        FILE *fin, *fout;
        float num;
        int i,v;
        
        fin = fopen(FIN_NAME, "r");      
        fout = fopen(FOUT_NAME, "w");
             v=fstrlen(fin);
        while ( fscanf(fin, "%f", &num) == 1 )
        {
            for(i=v;;i--)
                if ( (num-1)>num<(num+1)  ||  (num-1)<num>(num+1))
                {
                        if ( fprintf(fout, "%.1f\n", i) < 0 )
                        {
                                perror("fprintf");
                                fclose(fin);
                                fclose(fout);
                                exit(1);
                        }
                }
        }
}
вот типа так???
C
1
 v=fstrlen(fin);
я знаю что тут надо какуето функцию для файла наподобии.какую??
помогите кто чем может
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2010, 19:32
Ответы с готовыми решениями:

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

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

Создать файл целых чисел, содержащий номера всех локальных максимумов исходного файла в порядке возрастания
Добрый вечер! Помогите пожалуйста! Завтра экзамен:cry: Не правильно работает программа, выводит не...

Дан файл вещественных чисел Создать файл целых чисел, содержащий номера локальных максимумов исходного файла
2-File. Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных...

19
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
01.06.2010, 20:09 2
Цитата Сообщение от Бо Посмотреть сообщение
v=fstrlen(fin);
Забавно...
C
1
2
3
4
5
6
7
8
...
FILE *f;
long len;
/* открытие файла, проверка, etc... */
fseek(f, 0, SEEK_END);
len = ftell(f);
rewind(f);
/* в len длинна файла в байтах */
но это для двоичных файлов (или открытых, как двоичные: f = fopen(FILE_NAME, "rb")), в текстовых в винде об символ перевода строки спотыкаться будет...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
01.06.2010, 20:27  [ТС] 3
Цитата Сообщение от easybudda Посмотреть сообщение
но это для двоичных файлов (или открытых, как двоичные: f = fopen(FILE_NAME, "rb")), в текстовых в винде об символ перевода строки спотыкаться будет...
а как тада быть??
вот изменил
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
#include <stdio.h>
#include <stdlib.h>
#define a 100
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main(void)
{
        FILE *fin, *fout;
        long len;
        float num;
        int i;
        
        fin = fopen(FIN_NAME, "r");
        fseek(fin, 0, SEEK_END);
        len = ftell(fin);
        rewind(fin);
 
        fout = fopen(FOUT_NAME, "w");
        while ( fscanf(fin, "%f", &num) == 1 )
        {
            for(i=len;;i--)
                if ( (num-1)>num<(num+1)  ||  (num-1)<num>(num+1))
                {
                        if ( fprintf(fout, "%.1f\n", i) < 0 )
                        {
                                perror("fprintf");
                                fclose(fin);
                                fclose(fout);
                                exit(1);
                        }
                }
        }
        fclose(fin);
        fclose(fout);
}
,а мне заполняет новый файл 0.0
причем таких нулей очень много
что делать?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
01.06.2010, 20:32 4
Цитата Сообщение от Бо Посмотреть сообщение
номера всех локальных экстремумов
вот с этого места поподробнее...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
01.06.2010, 20:38  [ТС] 5
Цитата Сообщение от easybudda Посмотреть сообщение
вот с этого места поподробнее...
вы имеете ввиду что это значит?
Создать файл целых чисел, содержащий номера всех локальных экстремумов исходного файла в порядке убывания (локальным минимумом называется элемент, который меньше своих соседей, локальным максимумом называется элемент, который больше своих соседей).
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
01.06.2010, 20:56 6
Бо, всё равно не понятно... Пример приведите из нескольких чисел с обозначением - какие там из них экстремумы, или как их там...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
01.06.2010, 21:43  [ТС] 7
Цитата Сообщение от easybudda Посмотреть сообщение
Пример приведите из нескольких чисел с обозначением - какие там из них экстремумы, или как их там...
вот допустим:
1.3
2.3
6.6
3.2
1.8
9.2
5.7
7.5
2.2


локальный максимум:6.6 , 9.2 и 7.5
локальный минимум:1.8 и 5.7
а вместе они локальные экстремумы

Добавлено через 39 минут
ну так как тут быть?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
02.06.2010, 01:52 8
Цитата Сообщение от Бо Посмотреть сообщение
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных экстремумов исходного файла в порядке убывания.
Если я правильно понял, их номера ещё и в обратном порядке от последнего к первому записать надо? Если так, то учитывая, что первый - это первый, а не нулевой, вот:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
 
typedef struct NODE {
    double val;
    struct NODE * prev;
    struct NODE * next;
    size_t pos;
} node_t;
 
node_t * new_node(const double val) {
    node_t * node;
    if ( ( node = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return NULL;
    node->val = val;
    node->next = NULL;
    node->prev = NULL;
    node->pos = 0;
    return node;
}
 
int is_it(const node_t * node) {
    if ( ! node->prev || ! node->next )
        return 0;
    return ( ( node->val > node->prev->val && node->val > node->next->val) ||
             ( node->val < node->prev->val && node->val < node->next->val ) );
}
 
void delete_nodes(node_t * node) {
    node_t * tmp;
    while ( node ) {
        tmp = node->next;
        free(node);
        node = tmp;
    }
}
 
#define MIN_NODES 3
#define FIN_NAME "in.txt"
#define FOUT_NAME "out.txt"
 
int main(void){
    node_t * first, * last, * current;
    FILE * fin, * fout;
    double val;
 
    first = last = NULL;
    if ( ( fin = fopen(FIN_NAME, "r") ) == NULL ) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
 
    while ( fscanf(fin, "%lf", &val) == 1 ) {
        if ( ! first ) {
            if ( ( first = new_node(val) ) == NULL ) {
                fprintf(stderr, "Can't create a new node!\n");
                exit(EXIT_FAILURE);
            }
            first->pos = 1;
            last = first;
        }
        else {
            if ( ( current = new_node(val) ) == NULL ) {
                fprintf(stderr, "Can't create a new node!\n");
                delete_nodes(first);
                exit(EXIT_FAILURE);
            }
            current->prev = last;
            last->next = current;
            current->pos = last->pos + 1;
            last = current;
        }
    }
    if ( ferror(fin) ){
        perror("ferror");
        delete_nodes(first);
        exit(EXIT_FAILURE);
    }
    if ( fclose(fin) )
        perror("fclose"); /* если файл уже прочитан, не критичная, но всё-таки ошибка */
 
    /* параноидальные проверки */
    if ( ! first ){
        fprintf(stderr, "No values assigned!\n");
        exit(EXIT_FAILURE);
    }
    if ( last->pos < MIN_NODES ){
        fprintf(stderr, "Not enough values in file!\n");
        delete_nodes(first);
        exit(EXIT_FAILURE);
    }
 
    if ( ( fout = fopen(FOUT_NAME, "w") ) == NULL ){
        perror("fopen");
        delete_nodes(first);
        exit(EXIT_FAILURE);
    }
 
    for ( current = last->prev; current != first; current = current->prev ){
        if ( is_it(current) ){
            if ( fprintf(fout, "%d\n", current->pos) < 0 ){
                perror("fprintf");
                delete_nodes(first);
                exit(EXIT_FAILURE);
            }
        }
    }
 
    delete_nodes(first);
 
    if ( fclose(fout) ){
        perror("fclose");
        exit(EXIT_FAILURE);
    }
 
    printf("Done.\n");
    exit(EXIT_SUCCESS);
}
Создать файл целых чисел, содержащий номера всех локальных экстремумов исходного файла в порядке убывания.

Можно было и попроще как-нибудь, но я тут умных книжек про двусвязные списки начитался, решил попробовать - действительно по-своему удобно. Короче, разбирайтесь...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
02.06.2010, 15:38  [ТС] 9
ухх ёёё!!!!

а что это??
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
typedef struct NODE {
        double val;
        struct NODE * prev;
        struct NODE * next;
        size_t pos;
} node_t;
 
node_t * new_node(const double val) {
        node_t * node;
        if ( ( node = (node_t*)malloc(sizeof(node_t)) ) == NULL )
                return NULL;
        node->val = val;
        node->next = NULL;
        node->prev = NULL;
        node->pos = 0;
        return node;
}
 
int is_it(const node_t * node) {
        if ( ! node->prev || ! node->next )
                return 0;
        return ( ( node->val > node->prev->val && node->val > node->next->val) ||
                         ( node->val < node->prev->val && node->val < node->next->val ) );
}
 
void delete_nodes(node_t * node) {
        node_t * tmp;
        while ( node ) {
                tmp = node->next;
                free(node);
                node = tmp;
        }
}
а это??
C
1
#define MIN_NODES 3

и это что значит??
C
1
->


стока указателей.
а по проше можна??а то я не знаю как вот это буду объяснять
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
typedef struct NODE {
        double val;
        struct NODE * prev;
        struct NODE * next;
        size_t pos;
} node_t;
 
node_t * new_node(const double val) {
        node_t * node;
        if ( ( node = (node_t*)malloc(sizeof(node_t)) ) == NULL )
                return NULL;
        node->val = val;
        node->next = NULL;
        node->prev = NULL;
        node->pos = 0;
        return node;
}
 
int is_it(const node_t * node) {
        if ( ! node->prev || ! node->next )
                return 0;
        return ( ( node->val > node->prev->val && node->val > node->next->val) ||
                         ( node->val < node->prev->val && node->val < node->next->val ) );
}
 
void delete_nodes(node_t * node) {
        node_t * tmp;
        while ( node ) {
                tmp = node->next;
                free(node);
                node = tmp;
        }
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
02.06.2010, 16:10 10
Цитата Сообщение от Бо Посмотреть сообщение
а что это??
Именно то, на что похоже Структура узла двусвязного списка, содержащая данные (число типа double), указатели на предыдущий и следующий объекты структуры и позицию данных в файле.
Функция is_it() возвращает 1, если val больше или меньше, чем у обоих соседей. Ну а что делают new_node() и delete_nodes() не сложно по названию догадаться...

Цитата Сообщение от Бо Посмотреть сообщение
а это??
C
1
#define MIN_NODES 3
А чего по-вашему должно быть не меньше трёх, чтобы программа работала?

Цитата Сообщение от Бо Посмотреть сообщение
и это что значит??
C
1
->
А вот про это в учебниках пишут
Чтобы с помощью указателя на структуру получить доступ к ее членам, необходимо использовать оператор стрелка ->. Вот, например, как можно сослаться на поле balance:

p->balance

Оператор ->, который обычно называют оператором стрелки, состоит из знака "минус", за которым следует знак "больше". Стрелка применяется вместо оператора точки тогда, когда для доступа к члену структуры используется указатель на структуру.
Г. Шилдт "Полный справочник по С"

Добавлено через 1 минуту
Цитата Сообщение от Бо Посмотреть сообщение
а по проше можна?
Ага... Создать динамически увеличивающийся массив и писать в него числа. А потом по нему в цикле от хвоста к началу искать нужные числа, но это не интересно...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
02.06.2010, 17:23  [ТС] 11
ага,ща буду пробовать.

Цитата Сообщение от easybudda Посмотреть сообщение
но это не интересно...
просто пока уровень не тот,чтоб такое творить

Добавлено через 1 час 2 минуты
толи я так туплю,но шо то не в какую не хочет делаться
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
#include <stdio.h>
#include <stdlib.h>
#define a 20
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main()
{
        FILE *fin, *fout;
        long len=0;
        float num,d[a];
        int i;
        
        fin = fopen(FIN_NAME, "r");
 
        fout = fopen(FOUT_NAME, "w");
 
        while ( fscanf(fin, "%f", &num) == 1 )
        {
            d[i]=num;
            len++;
        }
        
        for(i=len;;i--)
        {
            if(d[i-1]>d[i]<d[i+1]  ||  d[i-1]<d[i]>d[i+1])
            {
                fprintf(fout, "%d\n",i);
                fclose(fin);
                fclose(fout);
                exit(1);
            }
        }
 
        fclose(fin);
        fclose(fout);
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
02.06.2010, 17:46 12
1.
Цитата Сообщение от Бо Посмотреть сообщение
for(i=len;;i--)
Сразу выход за границу массива! Если len - количество элементов массива, то индекс последнего len - 1. Мало того, и проверять Вам их нужно с предпоследнего (у которого индекс аж len - 2) и до второго (индекс 1) - у двух крайних соседей маловато... При этом не плохо бы убедиться, что будет, что проверять. То есть должно быть как минимум три элемента, чтобы средний из них мог или быть экстренумом (или как там его), или не быть...То самое #define MIN_NODES 3...
2. Тут же... А цикл вообще когда прерваться должен?
3.
Цитата Сообщение от Бо Посмотреть сообщение
C
1
2
fprintf(fout, "%d\n",i); 
fclose(fin);
Нормальный подход... Записали первое подходящее число в файл и тут же его закрыли... На всякий случай, чтобы не вывалилось... А остальные-то куда девать? В уже закрытый файл не получится...
4.
Цитата Сообщение от Бо Посмотреть сообщение
#define a 100
Если уж задали максимальное количество элементов в массиве, при чтении значений из файла и добавлении их в массив не плохо бы количество добавленных отслеживать...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
02.06.2010, 18:25  [ТС] 13
1.,2.
C
1
for(i=len-2;i>1;i--)
??
3.
Цитата Сообщение от easybudda Посмотреть сообщение
Нормальный подход... Записали первое подходящее число в файл и тут же его закрыли... На всякий случай, чтобы не вывалилось...

ой и вправду,завтыкал
4.
Цитата Сообщение от Бо Посмотреть сообщение
len++;
вот же вроде я считал или я не так понял?

Добавлено через 23 минуты
вот вроде раьотает
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
#include <stdio.h>
#include <stdlib.h>
#define a 20
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main()
{
        FILE *fin, *fout;
        long len=0;
        float num,d[a];
        int i=0;
        
        fin = fopen(FIN_NAME, "r");
 
        fout = fopen(FOUT_NAME, "w");
 
        while ( fscanf(fin, "%f", &num) == 1 )
        {
 
            d[i]=num;
            len++;
        }
        for(i=len-2;i>1;i--)
        {
            if(d[i-1]>d[i]<d[i+1]  ||  d[i-1]<d[i]>d[i+1])
            {
                fprintf(fout, "%d\n",i+1);
 
            }
        }
 
        fclose(fin);
        fclose(fout);
        exit(1);
}
тока записывает пару лишних номеров.почему не пойму?
заданныне числа:
1.3
2.3
6.6
3.2
1.8
9.2
5.7
7.5
2.2
ответ:
8
7
6
5
4
3

Добавлено через 2 минуты
4 лишняя
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
02.06.2010, 18:31 14
Цитата Сообщение от Бо Посмотреть сообщение
C
1
2
3
4
while ( fscanf(fin, "%f", &num) == 1 ) 
{
 d[i]=num; len++; 
}
теперь все числа из файла в первый элемент массива по очереди записываются. Что там потом с чем сравнивается - загадка... И кстати, мало просто len увеличивать, нужно ещё проверять, сколько ей до а осталось...
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
02.06.2010, 18:34  [ТС] 15
ну я тама просто переписал все числа из файла в массив и подсчитывал сколько их всего будет,а потом уже сравнивал.
я ща ухожу не много,поже дорешаю.
если есть еще де ошибки укажите плиз
зараннее спс))
0
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
04.06.2010, 16:57  [ТС] 16
мне тут подсказали что можно как то через динамический массив сделать.
а как тока??подскажите плиз
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
#include <stdio.h>
#include <stdlib.h>
 
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
int main()
{
   int num, buf, i, j;
   int *number;
   FILE * in, * out;
 
   in = fopen(FIN_NAME, "r");
   out = fopen(FOUT_NAME, "w");
 
            //Зчитування данних з файлу до динамічного масиву:
   fscanf(in, "%i", &num);
   number = (int*)calloc(num, sizeof(int));
   for (i = 0; i < num; i++)
   {
      fscanf(in, "%i", &number[i]);
 
   }            //Пошук всех локальных экстремумов:
   for (i = 0; i < num; i++)
   {
          ????????????????
}
printf("%d",number[i]);
   fclose(in);
   fclose(out);
   return 0;
}
0
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
06.06.2010, 15:07  [ТС] 17
нужна еще помощь!
хелп плиз)

Добавлено через 3 часа 1 минуту
ау!

Добавлено через 17 часов 50 минут
невыходит что то эта задача,капец какойто
исправте что не так,плиз.
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
#include <stdio.h>
#include <stdlib.h>
 
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
main()
{
   int num, i, j;
   int *number;
   float a=0,b=0,c=0, buf;
   FILE * in, * out;
 
   in = fopen(FIN_NAME, "r");
   out = fopen(FOUT_NAME, "w");
 
            //Зчитування данних з файлу до динамічного масиву:
   fscanf(in, "%f", &num);
   number = (int*)calloc(num, sizeof(int));
   for (i = 0; i < num; i++)
   {
      fscanf(in, "%f", &number[i]);
 
   }            //Пошук всех локальных экстремумов:
   for (i = 0; i < num; i++)
   {
      for (j = 0; j <number[i]; j++)
      {
         fscanf(in, "%f", &buf);
         a=buf-1;
         b=buf;
         c=buf+1;
      } 
      if(a>b<c || a<b>c)
      {
          fprintf(out,"%d\n",number[i]);
         
      }
          a=0;
          b=0;
          c=0;
   }
   fclose(in);
   fclose(out);
   return 0;
}
0
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
07.06.2010, 16:26  [ТС] 18
ну помогите,будте человеками!!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12703 / 7534 / 1761
Регистрация: 25.07.2009
Сообщений: 13,867
07.06.2010, 17:28 19
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
#include <stdio.h>
#include <stdlib.h>
 
#define FIN_NAME "in.txt"
#define FOUT_NAME "out.txt"
 
int main(void){
    double *arr = NULL, val;
    long size = 0, i;
    FILE *fin, *fout;
 
    if ( ( fin = fopen(FIN_NAME, "r") ) == NULL ){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    while ( fscanf(fin, "%lf", &val) == 1 ){
        if ( ( arr = realloc(arr, sizeof(double) * (size + 1)) ) == NULL ){
            perror("realloc");
            exit(EXIT_FAILURE);
        }
        arr[size++] = val;
    }
    if ( ferror(fin) ){
        perror("ferror");
        free(arr);
        exit(EXIT_FAILURE);
    }
    fclose(fin);
 
    if ( size < 3 ){
        fprintf(stderr, "Not enough data in file!\n");
        free(arr);
        exit(EXIT_FAILURE);
    }
 
    if ( ( fout = fopen(FOUT_NAME, "w") ) == NULL ){
        perror("fopen");
        free(arr);
        exit(EXIT_FAILURE);
    }
 
    for ( i = size - 2; i > 1; --i ){
        if ( ( arr[i] > arr[i - 1] && arr[i] > arr[i + 1] ) || ( arr[i] < arr[i - 1] && arr[i] < arr[i + 1] ) ){
            if ( fprintf(fout, "%d\n", i + 1) < 0 ){
                perror("fprintf");
                free(arr);
                exit(EXIT_FAILURE);
            }
        }
    }
 
    free(arr);
 
    exit( ( fclose(fout) ) ? EXIT_FAILURE : EXIT_SUCCESS );
}
1
5 / 5 / 2
Регистрация: 08.12.2009
Сообщений: 158
07.06.2010, 17:39  [ТС] 20
easybudda, спасибо огромное!!!
0
07.06.2010, 17:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2010, 17:39
Помогаю со студенческими работами здесь

Дан файл состоящий из целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла
Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла...

Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла
Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла...

Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла.
Задачу нужно решить в Borland C++ 3.11 Дан файл целых чисел. Создать новый файл целых чисел,...

Создать файл, содержащий номера всех локальных максимумов в порядке возрастания
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru