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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
#1

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

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

Прошу поправить мою прогу. По заданию должна быть с рекурсией, я понимаю как она работает, но как правильно её написать я не уверен.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2010, 19:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Постигая рекурсию. (C++):

Вставить рекурсию - C++
Есть программа, она записывает число задом на перед, её нужно записать при помощи рекурсии #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Задачи на рекурсию - C++
Здорова господа! У меня щас появилась проблема. Решаю задачки на рекурсию от первая задача //палиндромы//создать функцию...

Задача на рекурсию - C++
Дано число. Вывести все цифры этого числа, не используя дополнительных библиотек, массивов, списков и т.д. Использовать только...

Программа на рекурсию - C++
Задача о рюкзаке. В рюкзаке объёмом V содержится запас из N предметов. Для каждого предмета задан объем и стоимость. В рюкзак можно...

Поясните за рекурсию - C++
Учу язык на одном из сайтов, столкнулся с таким примером программы с рекурсией: рекурсия в C++C++ #include &lt;iostream&gt; using...

Задача на рекурсию - C++
Вот код проги которую я написал: #include &lt;iostream&gt; using namespace std; int factr(double i){ int answer; if(i==1) ...

43
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.05.2010, 06:32 #31
Хм, в этой проге стек во-о-обще ни к чему.... Я даже не знаю, к чему его приладить... Мне совесть не позволяет перед помещением элементов из файла в A помещать их сначала в стек... Ну прям вообще не позволяет))). Глупо изучать структуру "стек" на примерах, где она нафиг не нужна...
0
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
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
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
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
01.05.2010, 16:19  [ТС] #34
омномном как сложно звучит, а про i <= N просто когда я делал i < N то выводилось 7 элементов из 8. ща буду осмысливать как сделать то что вы предложили.
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
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
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;
}
создаётся стек для А, но для Н не создаётся почемуто, что тут не так я написал?
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
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
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 элементов. Ну если там ещё есть косяки в проге поправьте плз)) мне по ней полный отчёт делать надо.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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;
}
1
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 15:27  [ТС] #40
о супер, намного проще код стал, но только дело в том что N = 8 тоесть количество элементов, а программа выдаёт по 7 всегда
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.05.2010, 15:30 #41
Нет, выдает 8
Просто она выдаёт их, начиная с нулевого элемента. получается
0 1 2 3 4 5 6 7
А теперь пересчитай их. Насчитаешь 8
0
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 15:34  [ТС] #42
C++
1
2
for (i = 0; i < N; i++) 
       fprintf(fout, "%d\n", pop());
можно так писать в файл из последнего стека?

Добавлено через 1 минуту
о и правда чтото я на счёт N не туда смотрел ))
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.05.2010, 15:47 #43
Нет, так не получится. Ведь вы когда выводили стэк на экран, вы уже использовали функцию pop, а она именно вытаскивает элементы из стека, и в самом стеке их не оставляет. Можно модифицировать код так:

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
146
147
148
149
#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(N) âûäåëèò 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);
    
    FILE *fout;
    
    if ((fout = fopen("F2.txt", "w+")) == NULL)
    {
        printf("error writing file");
        getch();
        return -1;
    }
    
    printf("Stack of H:\n");
    
    int temp;
    
    for(i = 0; i < N; i++)
    {
        temp = pop();
        printf("%d\n", temp);
        fprintf(fout, "%d\n", temp);
    }
          
    for (i = 0, S = 0; i < N; i++)
        S += A[i] * H[i];
    
    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 минуту
Т.е. мы вытаскиваем элемент из стека во временную переменную temp, а потом выводим её и на экран, и в файл
1
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
03.05.2010, 16:11  [ТС] #44
о понятно)) ну думаю всё готово для сдачи, спасибо добрым программистам
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 16:11
Привет! Вот еще темы с ответами:

Задача на рекурсию - C++
Помогите решить след. задачу: Вот мой вариант, но здесь не сохраняется порядок: void Func() { int x; cin&gt;&gt;x; if(0==x) ...

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

понять рекурсию - C++
Здравствуйте! Хочу понять рекурсию:) для этого хочу реализовать рекурсивный выход из лабиринта. точка (.) можно ходить, решетка (#) стена,...

Задачка на рекурсию... - C++
в общем нужно сделать прогу чтоб выводила дерево файлов и папок указанной директории.... Сделать это надо с помощью рекурсии... ...


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

Или воспользуйтесь поиском по форуму:
44
Yandex
Объявления
03.05.2010, 16:11
Ответ Создать тему
Опции темы

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