Форум программистов, компьютерный форум CyberForum.ru

Постигая рекурсию. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
27.04.2010, 19:34     Постигая рекурсию. #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
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
void inp(int *N, double *X)
{
     
     printf("Sissestage X: ");
     scanf("%d", &X);
     
     FILE *ololo;
     ololo = fopen("f1.txt", "r");
     do
     {
     fscanf(ololo, "%d", &N);
     }
     while(!feof(ololo) && (*N < 15));
}
 
void rec_func(double *H[20], int *i, int *N, double *X)
{    
     double temp;
     double temp2;
     {
     H[0] = 1;
     H[1] = X;
     if (*i == 2)
     {
            do
            {
            H[i] = X * H[i-1] - (i-1) * H[i-2];
            *i = *i+1;
            void rec_func(H, i, N, X);
            while (i < N);
     }
     fclose(ololo);
}
 
void output(char *H, int *X)
{
     FILE *trololo;
     trololo = fopen("f2.txt", "w");
     fprintf("H[0] = 1")
     fprintf("H[2] = %d", &X)
     for (i = 2; i < N; i++);
     {
     fprintf("lf", &H[i]);
     }
     fclose(trololo);
     
     
int main()
{
    int N;
    double X;
    
    //char A[50];
    char H[50];
    inp(&X, &N);
    
    rec_func(H, i, N, X);
    output(H, X);
}
само задание - из файла F1 вводим чило элементов N и просто цифра X, затем при помощи рекурсии по той формуле что в коде находим все H[i] и выводим результат в файл F2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2010, 19:34     Постигая рекурсию.
Посмотрите здесь:

C++ Программа на рекурсию
C++ В файл рекурсию
понять рекурсию C++
Задачи на рекурсию C++
C++ Задача на рекурсию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:22  [ТС]     Постигая рекурсию. #21
а понял понял, из первого файла надо считать количество элементов N и сами эти числа в массив A
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.04.2010, 23:24     Постигая рекурсию. #22
Ну по крайней мере эта реализация более универсальная, потому как ввел массив - получил число...
А если читать сначала количество элементов, это не трушно)))
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:26  [ТС]     Постигая рекурсию. #23
хаха ну да)) но чёто пока не работает у меня она
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.04.2010, 23:29     Постигая рекурсию. #24
Не уж то не прокатит так? Наоборот, один лишний параметр убран, файл входной чистенький - только массив)))

Ну ладно, тогда так:

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
#include <stdio.h>
 
#define N 15
 
void calcH(int *H, int X, int i, int n)
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, n);
}
 
int main()
{
    int A[N];
    int X;
    int H[N];
    int n = 0;
    int S;
    int i;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL)
    {
        printf("error reading file");
        getch();
        return -1;
    }
    
    fscanf(fin, "%d", &n);
    
    for (i = 0; i < n; i++)
        fscanf(fin, "%d", &A[i]);
    
    close(fin);
        
    printf("Input X: ");
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, n);
    
    for (i = 0, S = 0; i < n; i++)
        S += A[i] * H[i];
    
    FILE *fout;
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getch();
        return -1;
    }
    
    fprintf(fout, "%d", S);
    fclose(fout);
    
    return 0;
}
Но всё же согласись, первый вариант лучше)))

Добавлено через 26 секунд
Формат входного файла

5
1 2 3 4 5

Добавлено через 33 секунды
У меня всё работает, как первый вариант, так и второй.
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:33  [ТС]     Постигая рекурсию. #25
ааа ща попробую

Добавлено через 2 минуты
так, похоже что S он у меня теперь считает)) осталось все H вывести
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.04.2010, 23:36     Постигая рекурсию. #26
На экран?

Добавлено через 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
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
#include <stdio.h>
 
#define N 15
 
void calcH(int *H, int X, int i, int n)
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, n);
}
 
int main()
{
    int A[N];
    int X;
    int H[N];
    int n = 0;
    int S;
    int i;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL)
    {
        printf("error reading file");
        getch();
        return -1;
    }
    
    fscanf(fin, "%d", &n);
    
    for (i = 0; i < n; i++)
        fscanf(fin, "%d", &A[i]);
    
    /*while(!feof(fin))
        fscanf(fin, "%d", &A[n++]);*/
    
    close(fin);
        
    printf("Input X: ");
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, n);
    
    for (i = 0, S = 0; i < n; i++)
        S += A[i] * H[i];
    
    for (i = 0; i < n; i++)
        printf("H[%d] = %d\n", i, H[i]);
    
    FILE *fout;
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getch();
        return -1;
    }
    
    fprintf(fout, "%d", S);
    fclose(fout);
    
    getch();
    return 0;
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
30.04.2010, 11:42  [ТС]     Постигая рекурсию. #27
о спасибо большое, могу теперь спать спокойно завтра сдам программу!

всё работает

Добавлено через 11 часов 49 минут
что такое стек?
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
30.04.2010, 11:47     Постигая рекурсию. #28
http://ru.wikipedia.org/wiki/Стек
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
30.04.2010, 22:43  [ТС]     Постигая рекурсию. #29
ясно, надо терь сделать ту же прогу только A и Н отправляя сначало в стек штоле.... я не знаю как это
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
30.04.2010, 23:13     Постигая рекурсию. #30
простой пример стека:
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 <conio.h>
 
#define size 3
int tos = 0; //top of stack
int stck[size];
 
void push(int i){    //заносим элементы в стек
        if(tos==size){
                cprintf("Stack is full\n");
                return;
        }
        stck[tos] = i;
        tos++;
}
 
int pop(void){       //получаем элемент из стека
        if(tos==0){
                cprintf("Stack is empty\n");
                return 0;
        }
        tos--;
        return stck[tos];
}
 
int main(void){
        int i;
        push(4);
        push(-90);
        push(23);
 
        for(i = 0; i < 3; i++)
                cprintf("%d ", pop());
        getch();
        return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.05.2010, 06:32     Постигая рекурсию. #31
Хм, в этой проге стек во-о-обще ни к чему.... Я даже не знаю, к чему его приладить... Мне совесть не позволяет перед помещением элементов из файла в A помещать их сначала в стек... Ну прям вообще не позволяет))). Глупо изучать структуру "стек" на примерах, где она нафиг не нужна...
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
01.05.2010, 14:28  [ТС]     Постигая рекурсию. #32
я согласен, что и без стека здесь всё отлично работает, но приходится выполнять прихоти препода... такое уж задание

Добавлено через 1 минуту
Vorona, я понял как оно работает, попробую сегодня вписать это в свою программу

Добавлено через 1 час 41 минуту
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
#include <stdio.h>
#include <conio.h>
#define n 15
#define size 15
 
int tos = 0;
int stck[size];
 
void push(int H){   
        if(tos==size){
                printf("Stack is full\n");
                return;
        }
        stck[tos] = H;
        tos++;
}
 
int pop(void){       
        if(tos==0){
                printf("Stack is empty\n");
                return 0;
        }
        tos--;
        return stck[tos];
}
 
void calcH(int *H, int X, int i, int N)
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, N);
}
 
int main()
{
    int A[n];
    int X;
    int H[n];
    int N = 0;
    int S;
    int i;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL)
    {
        printf("error reading file");
        getchar();
        return -1;
    }
    
    fscanf(fin, "%d", &N);
    if (N >= 15)
    {
          printf("ERROR!!!!!!");
          getchar();
          return -1;
          }
    for (i = 0; i < N; i++)
        fscanf(fin, "%d", &A[i]);
    
    /*while(!feof(fin))
        fscanf(fin, "%d", &A[n++]);*/
    
    fclose(fin);
        
    printf("Input X: ");
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, N);
    
    for (i = 0, S = 0; i < N; i++)
        S += A[i] * H[i];
    
    for (i = 0; i <= N; i++)
        printf("H[%d] = %d\n", i, H[i]);
    
    FILE *fout;
    
   // for (i = 0; i <= n; i++){
     //  fprintf(fout, "H[%d] = %d\n", i, H[i]);}
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getchar();
        return -1;
    }
    
    fprintf(fout, "%d\n", S);
    for (i = 0; i <= n; i++){
       fprintf(fout, "H[%d] = %d\n", i, H[i]);}
    push(H[0]);
    push(H[1]);
    push(H[2]);
    push(H[3]);
    push(H[4]);
    push(H[5]);
    push(H[6]);
    push(H[7]);
    push(H[8]);
    for(i = 0; i <= n; i++)
                printf("%d \n", pop());
    fclose(fout);
    
    getchar();
    getchar();
    return 0;
}
так правильно? я все элементы Н в стек добавил но кривовато, как H[i] добавлять, чтобы не писать по одному как у меня?

Добавлено через 1 минуту
ещё нужно сделать чтобы size = N или обойтись както без size и указать размер стека через N
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
01.05.2010, 14:46     Постигая рекурсию. #33
просто динамически выделить память под stck, когда будет известно N, и stck сделать не глобальной, а в main объявить и передавать в ф-ции, ну и освобождать в конце память не забывайте
обычно в цикле присваивайте элементам стека значения
C
1
2
3
4
5
int element;
for(i = 0; i < N; i++){
    scanf("%d", &element)
    push(element);
}
и у вас циклы немного не правильно организованы в 80 и 96 строках, вместо i<=N должно быть i<N, раз вы начинаете циклы при i = 0;
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
01.05.2010, 16:19  [ТС]     Постигая рекурсию. #34
омномном как сложно звучит, а про i <= N просто когда я делал i < N то выводилось 7 элементов из 8. ща буду осмысливать как сделать то что вы предложили.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
01.05.2010, 18:25     Постигая рекурсию. #35
ну вот впринципе ничего сложного, просто + передаем размер стека в функцию, где он нужен и все
оказалось еще проще, чем представил
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 <conio.h>
#include <stdio.h>
#include <malloc.h>
 
int tos = 0; 
int *stck;
 
void push(int H, int size){ 
    if(tos==size){
        printf("Stack is full\n");
        return;
    }
    stck[tos] = H;
    tos++;
}
 
int pop(void){    
    if(tos==0){
        printf("Stack is empty\n");
        return 0;
    }
    tos--;
    return stck[tos];
}
 
int main(void){
    int i, element, size;
 
    printf("Enter size of stack: ");
    scanf("%d", &size);   
    stck = (int*)malloc(size*sizeof(int));
 
    for(i = 0; i < size; i++){
        printf("%d: ", i);
        scanf("%d", &element);
        push(element, size);
    }
 
    printf("Stack:\n");
    for(i = 0; i < size; i++)
        printf("%d ", pop());
       
    free(stck);
    getch();
    return 0;
}
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
02.05.2010, 13:35  [ТС]     Постигая рекурсию. #36
вроде понял

Добавлено через 37 минут
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <stdio.h>
#include <conio.h>
#define n 15
#include <malloc.h>
 
int tos = 0;
int *stck;
 
void push1(int A, int size){   
        if(tos==size){
                printf("Stack is full\n");
                return;
        }
        stck[tos] = A;
        tos++;
}
void push2(int H, int size){   
        if(tos==size){
                printf("Stack is full\n");
                return;
        }
        stck[tos] = H;
        tos++;
}
int pop1(void){       
        if(tos==0){
                printf("Stack is empty\n");
                return 0;
        }
        tos--;
        return stck[tos];
}
int pop2(void){       
        if(tos==0){
                printf("Stack is empty\n");
                return 0;
        }
        tos--;
        return stck[tos];
}
 
void calcH(int *H, int X, int i, int N)
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, N);
}
 
int main(void)
{
    int A[n];
    int X;
    int H[n];
    int N = 0;
    int S;
    int i;
    int element;
    int size;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL)
    {
        printf("error reading file");
        getchar();
        return -1;
    }
    
    fscanf(fin, "%d", &N);
    if (N >= 15)
    {
          printf("ERROR!!!!!!");
          getchar();
          return -1;
          }
          
    while(!feof(fin)) {
    for (i = 0; i < N; i++)
        fscanf(fin, "%d", &A[i]);}
    
    
    fclose(fin);
    // Na4alo sozdanija steka dlja A
    size = N;
    stck = (int*)malloc(size*sizeof(int));
    for(i = 0; i < size; i++){
                fscanf(fin, "%d", &A[i]);
                push1(A[i], size);
        }
    printf("Stack of A:\n");
        for(i = 0; i < size; i++)
                printf("%d\n", pop1());
    printf("Input X: ");
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, N);
    for (i = 0; i <= N; i++)
        printf("H[%d] = %d\n", i, H[i]);
    // Stek dlja H
    for(i = 0; i < size; i++)
          scanf("%d\n", &H[i]);
          push2(H[i], size);
    
    printf("Stack of H:\n");
                  for(i = 0; i < size; i++)
                        printf("%d\n", pop2());
          
    for (i = 0, S = 0; i < N; i++)
        S += A[i] * H[i];
    
  /*  for (i = 0; i <= N; i++)
        printf("H[%d] = %d\n", i, H[i]);*/
    
    FILE *fout;
    
   // for (i = 0; i <= n; i++){
     //  fprintf(fout, "H[%d] = %d\n", i, H[i]);}
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getchar();
        return -1;
    }
    
    fprintf(fout, "%d\n", S);
    for (i = 0; i <= n; i++){
       fprintf(fout, "H[%d] = %d\n", i, H[i]);}
       
   /* printf("Enter size of stack: ");
        scanf("%d", &size);   */
 
       
    free(stck);
    fclose(fout);
    
    getchar();
    getchar();
    return 0;
}
создаётся стек для А, но для Н не создаётся почемуто, что тут не так я написал?
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
02.05.2010, 17:12     Постигая рекурсию. #37
хм, а что значит scanf("%d\n", &H[i]); ?
так должно быть:
C
1
scanf("%d", &H[i]);
в ковычках вы указываете только тип данных, элементам которого, вы собираетесь присвоить введенные с клавиатуры значения
и еще: стек-то у вас один, а функции две должно ведь наоборот быть: int *stckA, *stckH; и ф-ция push(int, int); и pop(void);
или можно обойтись и одним *stck: если вы закончили работу со стеком и хотите его снова использовать, только для других данных, то просто обнулите его в цикле и присвойте вершине стека нулевое значение
C
1
2
3
for(i = 0; i < size; i++)
    push(0, size);
tos = 0;
и ваш стек снова свежий)
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 12:37  [ТС]     Постигая рекурсию. #38
хорошо) так и сделаю

Добавлено через 17 часов 55 минут
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
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <conio.h>
#define n 15 //izna4alno po usloviju ne bolee 15 elementov A
#include <malloc.h>
 
int tos = 0;
int *stck;
 
void push1(int A, int size){   //zapolnenie steka dlja A
        if(tos==size){
                printf("Stack is full\n");
                return;
        }
        stck[tos] = A;
        tos++;
}
void push2(int H, int size){   //zapolnenie steka dlja H
        if(tos==size){
                printf("Stack is full\n");
                return;
        }
        stck[tos] = H;
        tos++;
}
int pop1(void){       //eto navero dlja vivoda dannih
        if(tos==0){
                printf("Stack is empty\n");
                return 0;
        }
        tos--;
        return stck[tos];
}
void calcH(int *H, int X, int i, int N)//ras4et H s ispolzovaniem rekursii
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, N);
}
 
int main(void)
{
    int A[n];
    int X;
    int H[n];
    int N = 0;
    int S;
    int i;
    int size;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL) //proverka faila
    {
        printf("error reading file");
        getchar();
        return -1;
    }
    
    fscanf(fin, "%d", &N);  //4tenie koli4estva elementov N iz faila
    if (N >= 15)
    {
          printf("ERROR!!!!!!");
          getchar();
          return -1;
          }
          
    while(!feof(fin)) {  //4tenie elementov massiva A iz faila
    for (i = 0; i < N; i++)
        fscanf(fin, "%d", &A[i]);}
    
    
    fclose(fin);
    // Na4alo sozdanija steka dlja A
    size = N;
    stck = (int*)malloc(size*sizeof(int));  //vot eto ne4to neponjatnoe mne
    for(i = 0; i < size; i++){
                fscanf(fin, "%d", &A[i]);
                push1(A[i], size);
        }
    printf("Stack of A:\n");
        for(i = 0; i < size; i++)
                printf("%d\n", pop1());
    
    for(i = 0; i < size; i++)
          push1(0, size);
          tos = 0;
     
    printf("Input X: "); // Vvodim X
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, N);  //s4iteam H 4erez funkciju
    for (i = 0; i <= N; i++)
        printf("H[%d] = %d\n", i, H[i]);
    // Stek dlja H
    for(i = 0; i < size; i++)
          push2(H[i], size);
    
    printf("Stack of H:\n");
                  for(i = 0; i < size; i++)
                        printf("%d\n", pop1());
          
    for (i = 0, S = 0; i < N; i++)
        S += A[i] * H[i];
    
    FILE *fout; //na4inaem rabotu s failom f2 dlja vivoda informacii
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getchar();
        return -1;
    }
    
    fprintf(fout, "%d\n", S); //zapis S v fail f2
    for (i = 0; i <= N; i++)
       fprintf(fout, "H[%d] = %d\n", i, H[i]); //zapis vseh elementov H v fail f2
       
    free(stck);  //osvobozdaem stek ot dannih =)
    fclose(fout);
    
    getchar();
    getchar();
    return 0;
}
вот так вот получилось, сначала на экран выводится стек из элементов А, затем ввожу Х и выводятся все элементы Н[i] подсчитанные через рекурсию, они же отправляются в стек для Н, и в конце подсчёт S и вывод инфы в файл. Одна загвоздка - в стек для Н не выводится последний элемент H[8] в случае если 8 элементов. Ну если там ещё есть косяки в проге поправьте плз)) мне по ней полный отчёт делать надо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.05.2010, 13:30     Постигая рекурсию. #39
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <stdio.h>
 
#define n 15
 
int tos = 0;
int *stck;
 
void push(int T, int size)
{
    if(tos == size)
    {
        printf("Stack is full\n");
        return;
    }
        
    stck[tos] = T;
    tos++;
}
 
int pop()
{
    if(tos == 0)
    {
        printf("Stack is empty\n");
        return 0;
    }
    
    tos--;
    
    return stck[tos];
}
 
void calcH(int *H, int X, int i, int N)
{
    H[i] = X * H[i - 1] - (i - 1) * H[i - 2];
    i++;
    
    if (i != n)
        calcH(H, X, i, N);
}
 
int main(void)
{
    int A[n];
    int X;
    int H[n];
    int N = 0;
    int S;
    int i;
    
    FILE *fin;
    
    if ((fin = fopen("F1.txt", "r")) == NULL)
    {
        printf("error reading file");
        getchar();
        return -1;
    }
    
    fscanf(fin, "%d", &N);
    
    if (N >= 15)
    {
        printf("ERROR!!!!!!");
        getch();
        return -1;
    }
          
    while(!feof(fin))
        for (i = 0; i < N; i++)
            fscanf(fin, "%d", &A[i]);
    
    
    fclose(fin);
    
    stck = (int *)malloc(N * sizeof(int)); // Здесь происходит динамическое выделение памяти по стек - массив целых чисел.
                                           // Функция malloc(n) выделяет кусок оперативной памяти размером n (своего аргумента) байт.
                                           // В данном случае выделяется N * sizeof(int) байт, т.к. N - всего лишь количество
                                           // элементов. Если, скажем, N = 6, то функция malloc выделит 6 байт. Но нам же нужно
                                           // записать в выделенную память не 6 байт, а 6 целых чисел, каждое из которых занимает
                                           // 4 байта (размер типа int). Т.е. нам надо выделить 6 * 4 = 6 * sizeof(int).
                                           // Далее. Зачем (int *). Функция malloc выделяет память и возвращает указатель
                                           // на начало выделенной памяти. В принципе, можно и не преобразовывать его тип
                                           // в тип "указатель на int", но лучше это сделать, т.к. мы всё-таки хотим получить
                                           // в итоге массив из N _целых_ чисел, а не просто участок памяти размером N * sizeof(int).
    
    for(i = 0; i < N; i++)
    {
        fscanf(fin, "%d", &A[i]);
        push(A[i], N);
    }
    
    printf("Stack of A:\n");
        for(i = 0; i < N; i++)
                printf("%d\n", pop());
    
    for(i = 0; i < N; i++)
          push(0, N);
          
    tos = 0;
     
    printf("Input X: ");
    scanf("%d", &X);
    
    H[0] = 1;
    H[1] = X;
    
    calcH(H, X, 2, N);
    
    for (i = 0; i < N; i++) // У вас здесь было условие i <= N, а надо i < N
        printf("H[%d] = %d\n", i, H[i]);
        
    for(i = 0; i < N; i++)
          push(H[i], N);
    
    printf("Stack of H:\n");
    
    for(i = 0; i < N; i++)
        printf("%d\n", pop());
          
    for (i = 0, S = 0; i < N; i++)
        S += A[i] * H[i];
    
    FILE *fout;
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getch();
        return -1;
    }
    
    fprintf(fout, "%d\n", S);
    
    for (i = 0; i < N; i++) // У вас здесь было условие i <= N, а надо i < N
       fprintf(fout, "H[%d] = %d\n", i, H[i]);
       
    free(stck);
    fclose(fout);
    
    getch();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 15:27     Постигая рекурсию.
Еще ссылки по теме:

Задача на рекурсию C++
Рекурсию в цикл C++
Задача на рекурсию C++

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

Или воспользуйтесь поиском по форуму:
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 15:27  [ТС]     Постигая рекурсию. #40
о супер, намного проще код стал, но только дело в том что N = 8 тоесть количество элементов, а программа выдаёт по 7 всегда
Yandex
Объявления
03.05.2010, 15:27     Постигая рекурсию.
Ответ Создать тему
Опции темы

Текущее время: 22:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru