Обсуждение Программирование на C/C++

не помогло:tears:
надо, чтобы цикл менял значение переменной arth.
код:
Код:
#include<iostream.h>
#include<conio.h>
#include<math.h>
#pragma hdrstop
//---------------------------------------------------------------------------
double answ(double x, int n);
#pragma argsused
double arth;
int main(int argc, char* argv[])
{
//Вывод титульного листа
        cout <<"\tFederal`noe agentstvo po obrazovaniyu Rossiyskoy Federazii\n"
             <<"Gosudarstvenoe Obrazovatelnoe Uchrezdenie Vysshego Professionalnogo Obrazovaniya"
             <<"\t\t\"Yuzno-Uralskiy Gosudarstvennyi Universitet\"\n"
             <<"\t\t   Fakultet: \"Mehaniko - Tehnologicheskiy\"\n"
             <<"\t\tKafedra: \"Informazionno-Izmeritelnoi Tehniki\"\n\n\n\n\n\t"
             <<"\t\tKursovoy proekt\n\t\tpo discipline \" Informatika \"\n"
             <<"\t   tema \"Progamma \'vychisleniye funkzii\'\""
             <<"\n\n\n\n\t\t\tProveril: KTN, dozent InIT\n\t\t\t"
             <<"Bizyaev M. N. \n\n\t\t\t"
             <<"Podgotovil: student gruppy MT-127\n\t\t\t"
             <<"Sharmanov V. V."
             <<"\n\n\n\n\t\tChelyabinsk, 2010 god.";
	getch();
	clrscr();
//Вывод краткой инструкции
        cout <<"\tKratkaya instrukciya: \n"
             <<"Na vvod programma prosit argument 'X' i tochnost' Epsilon (E)."
             <<"\n Znacheniya vvodyatsya v vide desyatichnoi drobi s desyatichnoi tochkoi."
             <<"\n na vihod programma vyvodit znachenie funczii y = Arth(x).";
	getch();
	clrscr();

//Вывод приглашения и объявления некоторых переменных
        cout <<"Vvedite X: ";
        double x, e;

//Ввод переменной
        cin >> x;

//вывод запрса на ввод точности ( числа эпсилон)
        cout << "\nVvedite Epsilon (E): ";
        cin >> e;

//Проверка условия |х| < 1...
        if((x>1)||(x<-1))
        {
// ...и вывод сообшения об ошибке,
//  если условие не выполнено
                cerr <<"ne vypolneno uslovie |X| < 1.\n";
                getch();
        };

        arth = x;
        double* pa = &arth;

//Вычисление функции
//гиперболического арктангенса
//от аргумента 'Х'...
        int n; int* pn; pn = &n;
        for(int i =2; fabs(answ(x, 2*i-1)) < e; i++)
        {
                *pn = 2*i-1;
                *pa += answ(x, *pn);
        }
// ...и вывод результата вычислений.
        cout << "Arth(x) = " << arth;
//Ожидание ввода любого символа для завершения работы программы.
        getch();
        return 0;
}
//---------------------------------------------------------------------------
double answ(double x, int n)
{
        if(n==1)
        {
                return x;
        }
        else
        {
                return (answ(x,n-2)*(n-2)*(n-1)*x*x)/(n*(n-1));
        }
}
 
Вы лучше напишите что именно у вас расчитывает функция answ, а то, например, выражение return (answ(x,n-2)*(n-2)*(n-1)*x*x)/(n*(n-1)) можно заменить на return (answ(x,n-2)*(n-2)*x*x)/n;
И в цикле for условие скорее всего должно быть fabs(answ(x, 2*i-1)) > e, тогда вроде работает.
 

JC Denton

Ословед
собственно из-за answ(x, n - 2) и выпадает переполнение стека - рекурсия "промахивается" мимо условия завершения рекурсии

приблизительно этим можно заменить цикл вычисления - без всяких рекурсивных функций, основываясь на разложении Маклорена функции ареачангенса (условие выхода неверное, я забыл как оценить остаточный член)
Код:
    arth = 0;
    int i = 0;
    double numeratorOfSumElement = x;
    while(fabs(numeratorOfSumElement / (2 * i + 1)) > e)
    {
        std::cout << arth << std::endl;
        arth += numeratorOfSumElement / (2 * i + 1);
        numeratorOfSumElement *= x * x;
        ++i;
    }
 

JC Denton

Ословед
виноват, не заметил. Но Вы ведь не будете утверждать, что такая функция имеет право на жизнь? ;)
 

reboot

Ословед
Есть ли в C++ аналог паскалевского type?

В общем, в Delphi можно определить массив как тип

type myType = array[0..2] of integer;

а потом определять этим типом переменные


в некоторых случаях это очень полезно (например в моём;)).
Как провернуть в C++ что то подобное?
 

JC Denton

Ословед
где это удобно? если Вам нужна проверка границ массива, используйте std::vector
 

reboot

Ословед
где это удобно? если Вам нужна проверка границ массива, используйте std::vector

Хорошо. Поясню.
Есть некоторая единица информации из трёх вещественных чисел (массив их трёх элементов = type1). Есть некое множество таких единиц информации, размер которого не известен до момента окончания обработки этого множества. Задача: нужно создать динамический массив из элементов type1, в конец которого нужно будет по ходу программы добавлять элементы из данного множества.
Вопрос: как это реализовать в Visual C++ 2008?

p.s. Прошу прощения если выразился непонятно.
 
Можно сделать класс или структуру с тремя вещественными членами, а в качестве динамического массива использовать вектор.
Код:
struct Element {
  float a, b, c;
}
std::vector<Element> Array;

// затем
Element e;
e.a = 0;
e.b = 1;
e.c = 2;

Array.push_back(s); // добавить в конец
Array[0];           // доступ по индексу
Array.size();       // размер
 
Как сделать так, чтобы действия внутри {} меняли значение переменной за {}?
Надо функции передавать указатель.
И по указателю менять значение.
Но не советую сильно увлекаться, понимание кода в целом ухудшается с каждым переданным указателем=)
объяви переменные глобально, перед main, то есть
А вот этого вообще делать не стоит...
По-хорошему, надо все разбивать на классы, и в конструкторе определять переменные.
А объекты классов создавать через оператор new, в куче.
Что касается переменных, я лично просто выделял память(HeapAlloc), например:
lpBuf = (LPWSTR) HeapAlloc( GetProcessHeap() , HEAP_ZERO_MEMORY , 20 * sizeof(WCHAR) ); - Выделение памяти для строки, длиной в 20 символов.
 

AlexDev

Ословед
Надо функции передавать указатель.
И по указателю менять значение.
Но не советую сильно увлекаться, понимание кода в целом ухудшается с каждым переданным указателем=)

Чуть дополню. Можно передавать не указатель, а ссылку. Глобальных переменных, как было замечено, стоит избегать.
 
Чуть дополню. Можно передавать не указатель, а ссылку. Глобальных переменных, как было замечено, стоит избегать.

Тоже вариант, но ссылки - это тупиковый путь... Я лично вообще отошел от объявления переменных, я выделяю память в куче и расставляю указатели. Производительность увеличивается, да и стек не засоряется=)
Просто часто возникают ситуации, когда надо передавать указатель на указатель, что-бы произвести действия... А вот ссылку на ссылку не передашь, потому что это по сути - это одна и таже переменная=)
Вся технология COM построена на вызове функций с передачей им указателей на указатели... Иначе тебе не дадут доступ к переменной.

З.Ы. О... А че, нашу балтологию вчерашнюю похерили всю? =)))
 
Я тоже больше люблю работать с указателями :)

P.S. Болтологию перенесли в беседку ))

Алекс(Я предположил, что Вас по имени именно так=))) Не спрашивайте почему=)))), а давайте че-нить интересное порешаем?
А то у меня практики именно в С++ в последнее время не было совсем, начинаю терять тонус=)
Че-нить типа снифера под винду, или руткита=)... А то я на работе исключительно на ПХП, а он, как сами знаете, для детей...

З.Ы. Или идейку подкиньте, чего бы такого интересненького-полезного написать...
З.З.Ы. Программу для работы с БД не предлагать...
 
Предложение: нормальный протектор, а то мне вот чет надо, а нигде нет версии, которую бы не вскрыли, практически сразу после ее выхода. А тут мощный и малоизвестный.
 

HD Radio

HDR | LOUNGE & CHILL [AAC-LC 192 kbps]
  • Сверху