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

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

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

рекурсивная обработка списков - C++

23.12.2010, 23:25. Просмотров 486. Ответов 0
Метки нет (Все метки)

написал программу для вычисления первообразной...все работает,но при введении коэфициэнта при x^0 равного нулю выскакивает ошибка...а он не должен включаться в список. если мы делаем равный нулю коэфициэнт при любом другом х то все работает как надо...помогите пожалуйста исправить косяк. вот задание
1.Многочлен P(x)=anxn+an-1xn-1+…+a0 с целыми коэффициентами представьте в виде списка, причем, если ai=0, то соответствующее звено в список не включается. Построить его первообразную

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
// lab0808inf.cpp: определяет точку входа для консольного приложения.
// л.р. (информатика) №8-9 вариант 1 (первообразная)
 
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
 
struct numb
//элемент списка
{
    int a; //коэффициент перед x
    int pow; //степень
    numb* next;
};
 
//добавление элементов список (рекурсивно, один за другим)
void add_numbs(numb*& beg, numb*& end, int stepen, numb* p = NULL, int prim = 0)
//ук-ль на начало списка (только для первого элемента)
//ук-ль на конец списка
//степень (только для исходного списка)
//ук-ль на элемент исходного списка (только для первообразной)
//если первообразная - true
{
    int num, pow_;
 
    //ввод данных
    if (!prim) //для исходного списка
    {
        pow_ = stepen;
        cout << "vvedi a dlya x^" << pow_ << ":\n";
        cin >> num;
    }
    else //для списка с первообразной
    {
        num = (p->a)/((p->pow)+1);
        pow_ = (p->pow)+1;
        p = p->next;
    }
 
    if (num!=0) //если коэффициент не 0
 
    {
        numb* t = new numb;
        if (beg != NULL) //не первый элемент
        {
            t->a = num; 
            t->pow = pow_;
            t->next = NULL;
 
            end->next = t;
            end = t;
        }
        else //первый элемент
        {
            t->a = num;
            t->pow = pow_;
            t->next = NULL;
 
            beg = end = t;
        }
    }
 
    pow_--; //уменьшение степени
    
 
    if (pow_ >= 0 && !(prim && (p == NULL)))
    //степень >= 0, и указатель на след. элемент исходн. списка не 0 (при вычисл. первообразной)
        add_numbs(beg, end, pow_, p, prim);
    return;
}
 
//печатаем все элементы 
void print(numb* p, bool flag = 0) 
{
 
    if (!flag || p->a < 0) //первый вызов, не пишем "+" перед коэфф-том
    
    {
        cout << p->a;
        if (p->pow) //степень не 0
            cout << "x^" << p->pow; 
    }
    else
    {
        cout << "+" << p->a;
        if (p->pow) //степень не 0
            cout << "x^" << p->pow;
    }
    p = p->next;
 
    if (p != NULL)
        print(p,1);
    else
        cout << "\n";
}
 
//вычисление первообразной, создание списка с первообразной
void pervoobraznaja(numb* beg1, numb*& beg2, numb*& end2, int stepen)
{
    add_numbs(beg2,end2,stepen,beg1,1);
}
 
//удаление списка (рекурсивно)
numb* delete_chain(numb* beg)
{
    numb* p = beg;
 
    if (p != NULL)
    {
        numb* k = p->next;
        delete p;
        p = k;
        delete_chain(p);
    }
 
    return p;
}
 
//-------------------------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    int stepen_c, stepen; //степень многочлена (первая переменная не изменяется)
 
    numb *beg, *end, *beg2, *end2; //указатели на нач. и конец исходного и конечного списков
    beg = end = beg2 = end2 = NULL;
 
    cout << "vvedite n:\n";
    cin >> stepen_c;
    stepen = stepen_c;
 
    add_numbs(beg, end, stepen);
 
    stepen = stepen_c;
 
    pervoobraznaja(beg, beg2, end2, stepen); //формирование списка с производной т.к. элементы списка целые округляем результат в меньшую сторону
 
    print(beg); //печать исходного многочлена
    printf("\n");
    print(beg2); //печать полученного многочлена
 
    end = beg = delete_chain(beg); //освобождение памяти
    end2 = beg2 = delete_chain(beg2); //освобождение памяти
    getch();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 23:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос рекурсивная обработка списков (C++):

Рекурсивная обработка списков - C++
Помогите пожалуйста!!! Очень надо! Дано задание, я весь интернет излазил 2 час думаю, ничего в голову не приходит! Как писать данную...

Обработка списков - C++
Программа работы со списками написана, для малых списков (малых по объему занимаемой памяти) она работает адекватно: список строится,...

Обработка списков - C++
Помогите защитить учебную практику. Заранее спасибо

Создание и обработка списков - C++
Даны натуральное число n, действительные числа а1,…, a2n. Получить: a1*a2n+a2*a2n-1+an*an+1. Написать программу на С++

Обработка списков: функции удаления и поиска элемента - C++
Надо написать функцию Void del (int value) , которая удаляет элемент в списке и Elem *searth (int value) , что в списке ищет первый элемент...

«Хранение и обработка данных с использованием линейных списков». - C++
Вот мне к курсовой работе дали задание.Я не могу его понять, что от меня требуется. Что за система n на прямой? Чем координата от точки...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 23:25
Привет! Вот еще темы с ответами:

Хранение и обработка данных с использованием линейных списков - C++
Люди, помогите пожалуйста!!! Дали задание к курсовой работе. Сделать надо любое из двух (какое легче) но сделать не могу ни 1, ни 2 ...

рекурсивная(( - C++
Proc67. Описать рекурсивную функцию MinRec(A,N)1|MaxRec(A,N)2 вещественного типа, которая находит минимальный1|максимальный2 элемент...

Рекурсивная функция C++ - C++
Сосчитать f(y)=3y+5, yk - входное данное.

Рекурсивная функция - C++
Задание: Составить программу для счисления сумы К членов строки, где К определяется ||Uk| -|Um||&lt; е и е - наперед задана точность...


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

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

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