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

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

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

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

23.12.2010, 23:25. Просмотров 472. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 23:25     рекурсивная обработка списков
Посмотрите здесь:

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

Рекурсивная функция - C++
Расскажите пожалуйста про рекурсивную функцию, как она задаётся и всё что с ней связанно. (можно с примерами) от меня +Спасибо

рекурсивная функция - C++
Описать рекурсивную функцию Digits(S) целого типа, находящую количество цифр в строке S без использования оператора цикла. С помощью этой...

Рекурсивная функция - C++
Здравствуйте. Хочу попросить вас о помощи, так как я только начинаю изучать язык программирования с++ Задание таке: Написать...

рекурсивная функция - C++
Описать рекурсивную функцию вычисления значения по указанной формуле. Понимаю, что программа совсем лёгкая, но я никак не могу свыкнуться...


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

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

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