0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
1

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

27.04.2010, 19:34. Показов 2654. Ответов 43
Метки нет (Все метки)

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
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2010, 19:34
Ответы с готовыми решениями:

Задача на рекурсию
С помощью рекурсии вычислить произведение ненулевых элементов динамического массива. Кто-то знает?...

В файл рекурсию
Как мне результаты этой программы вывести в файл ? #include&lt;iostream&gt; #include&lt;fstream&gt; using...

Задача на рекурсию
Вот код проги которую я написал: #include &lt;iostream&gt; using namespace std; int factr(double...

Задача на рекурсию
Всем доброго времени суток. Прошу подсказать мне условие задачи на рекурсию(нам дали задание самим...

43
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:22  [ТС] 21
Author24 — интернет-сервис помощи студентам
а понял понял, из первого файла надо считать количество элементов N и сами эти числа в массив A
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.04.2010, 23:24 22
Ну по крайней мере эта реализация более универсальная, потому как ввел массив - получил число...
А если читать сначала количество элементов, это не трушно)))
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:26  [ТС] 23
хаха ну да)) но чёто пока не работает у меня она
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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 секунды
У меня всё работает, как первый вариант, так и второй.
0
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
29.04.2010, 23:33  [ТС] 25
ааа ща попробую

Добавлено через 2 минуты
так, похоже что S он у меня теперь считает)) осталось все H вывести
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
30.04.2010, 11:42  [ТС] 27
о спасибо большое, могу теперь спать спокойно завтра сдам программу!

всё работает

Добавлено через 11 часов 49 минут
что такое стек?
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
30.04.2010, 11:47 28
http://ru.wikipedia.org/wiki/Стек
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
30.04.2010, 22:43  [ТС] 29
ясно, надо терь сделать ту же прогу только A и Н отправляя сначало в стек штоле.... я не знаю как это
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
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;
}
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.05.2010, 06:32 31
Хм, в этой проге стек во-о-обще ни к чему.... Я даже не знаю, к чему его приладить... Мне совесть не позволяет перед помещением элементов из файла в A помещать их сначала в стек... Ну прям вообще не позволяет))). Глупо изучать структуру "стек" на примерах, где она нафиг не нужна...
0
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
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
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;
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
01.05.2010, 16:19  [ТС] 34
омномном как сложно звучит, а про i <= N просто когда я делал i < N то выводилось 7 элементов из 8. ща буду осмысливать как сделать то что вы предложили.
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
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;
}
1
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;
}
создаётся стек для А, но для Н не создаётся почемуто, что тут не так я написал?
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
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;
и ваш стек снова свежий)
1
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 элементов. Ну если там ещё есть косяки в проге поправьте плз)) мне по ней полный отчёт делать надо.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 15:27  [ТС] 40
о супер, намного проще код стал, но только дело в том что N = 8 тоесть количество элементов, а программа выдаёт по 7 всегда
0
03.05.2010, 15:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2010, 15:27
Помогаю со студенческими работами здесь

Задача на рекурсию
Задание : Напишите функцию возведения в степень, которая работала бы как для положительных, так и...

понять рекурсию
Здравствуйте! Хочу понять рекурсию:) для этого хочу реализовать рекурсивный выход из лабиринта....

Задача на рекурсию
помогите написать пожалуйста программу на с++ по теме рекурсия. Задано действительное A, найти...

Задача на рекурсию
Нашел одну задачу, она по моему на рекурсию, но не могу реализовать это. Сколько существует...


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

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

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