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

Программа не всегда работает правильно - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Область комнаты (рекурсия) http://www.cyberforum.ru/cpp-beginners/thread826880.html
Здраствуйте. помогите решить задачу площадь комнаты Ваша задача написать программу, которая найдет площадь комнаты в данном квадратный лабиринт Ввод: Первая строка содержит только одно число...
C++ Адрес объекта, адрес указателя. Где что находится? #include <iostream> void Foo(int* val) { std::cout << val << " " << *val << " " << &val << '\n'; } void Bar(int* &val) { std::cout << val << " " << *val << " " << &val << '\n'; http://www.cyberforum.ru/cpp-beginners/thread826862.html
Задача на подсчет и вычисление в одномерном массиве с++ C++
Ребята помогите с заданием по с++: "Подсчитать количество простых чисел в одномерном массиве, которые больше своих соседних элементов справа и слева. В этом же массиве найти сумму таких элементов,...
вместо цикла рекурсию сделать C++
#include "stdafx.h" #include <iostream> #include "locale.h" #include "conio.h" #include <vector> #include <string> #include <algorithm> #include <iterator> #include <functional>...
C++ Нужно исправит код http://www.cyberforum.ru/cpp-beginners/thread826837.html
Использование функций, получающих и возвращающих более одного значения. Даны вещественные массивы A, B. Для каждого массива определить среднее арифметическое отрицательных элементов, среднее...
C++ Как обращаться к Union Создал указатель на структуру Person в 19 строчке. Как обратиться к полю Union'a? Некорректное обращение к union в 30, 34, 38, 49, 56, 63. Помогите как правильно, заранее спасибо? #include... подробнее

Показать сообщение отдельно
ru_LAN
11 / 11 / 0
Регистрация: 13.11.2011
Сообщений: 278

Программа не всегда работает правильно - C++

03.04.2013, 14:42. Просмотров 351. Ответов 4
Метки (Все метки)

Всем добрый вечер. Реализовал программу, подсчитывающую корень уравнения методом касательных(Ньютона).
В качестве примера использовал трансцендентное уравнение вида:
f(x)=e^x*(a[0]x^3+(a[1])*x^2-(a[2])).
на на последнем скрине подсчет не верен. Подскажите пожалуйста как исправить? и еще вопрос менее важен. При нажатии на кнопку 1 происходит подсчет программы. На кнопку 2 выход. При нажатии на другую цифру выдает ошибку о неправильно нажатой клавиши и просьба повторить попытку. При нажатии на любую букву происходит зацикливание. Я понимаю что дело в этом, нужно сделать переменную s не целочисленной. Но если я объявляю
C++
1
string s
, то он выдает ошибку что нужно сделать либо целочилсенный тип либо еще какой-то.
код:
C++
1
2
3
4
5
6
int s;
cin>>s;
        
switch(s)
{
}
Код самой программы:
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <math.h>
#include <iostream>
 
using namespace std;
 
double a[4]={0}, b[3]={0}, c[2]={0};
double Dmin,Dmax,E;
void input();
void derivative();
void kasat();
 
double fun(double x)
{
    return exp(x)*(a[0]*(x*x*x)+a[1]*(x*x)-a[2]);  // функция f(x)
}
 
double first(double x)
{
    return exp(x)*(b[0]*x*x+b[1]*x)+exp(x)*(a[0]*x*x*x+a[1]*x*x-a[2]);
}
 
double second(double x)
{
    return 2*exp(x)*(b[0]*x*x+b[1]*x)+exp(x)*(a[0]*x*x*x+a[1]*x*x-a[2])+exp(x)*(c[0]*x+c[1]);
}
 
void input()//ввод всех значений
{
    
    cout<<"\n\nПрограмма для решение трансцендентных уравнений методом касательных.\n\n"
        <<"уравнение имеет вид:\n"
        <<"e^x*(a1*x^3+a2*x^2-a3)\n";
    for(int i=0; i<3;i++)
    {
        cout<<"ВВедите значение коэффицента a["<<i+1<<"] :";
        cin>>a[i];
    }
    cout<<"ВВедите нижнюю границу поиска: ";
            cin>>Dmin; // Начальная координата
            cout<<"ВВедите верхнюю границу поиска: ";
            cin>>Dmax; // конечная координата
            cout<<"ВВедите E ";
            cin>>E; // Эпсила(точность) 
}
 
void derivative()//ввывод 1) f(x), 2) f'(x), 3) f''(x)
{
    b[0]=a[0]*3;
    b[1]=a[1]*2;
    b[2]=a[2];
    c[0]=b[0]*2;
    c[1]=b[1];
 
    cout<<"Исходное уравнение имеет вид : \n\n"
        <<"e^x*("<<a[0]<<"x^3+("<<a[1]<<")*x^2-("<<a[2]<<"))\n\n"//f(x)
        <<"Первая производная имеет вид : \n\n"
        <<"f'(x)=e^x*("<<b[0]<<"*x^2+("<<b[1]<<")*x)+e^x*("<<a[0]<<"x^3+("<<a[1]<<")*x^2-("<<a[2]<<"))\n\n"//f'(x)
        <<"Вторая производная имеет вид :\n\n"
        <<"f''(x)= 2*e^x*("<<b[0]<<"*x^2+("<<b[1]<<")*x)+e^x*("<<a[0]<<"x^3+("<<a[1]<<")*x^2-("<<a[2]<<"))+e^x*(("<<c[0]<<")*x+("<<c[1]<<"))\n\n";//f''(x)
}
 
void kasat()//метод касательных
{
    double x1,x2,c;
    cout<<"-------------------------------------------------"<<endl
        <<"|      xn       |     f(xn)     |       E       |"<<endl
         <<"-------------------------------------------------"<<endl;
 
    if(fun(Dmin)*second(Dmin)>0)
    {
        x1=Dmin;
        c=Dmin;
    }
    else 
        {
            x1=Dmax;
            c=Dmax;
        }
    cout<<"|";
    cout.width(15);cout.precision(10);
    cout<<x1;
    cout<<"|";
    cout.width(15);cout.precision(10);
    cout<<fun(x1);
    cout<<"|";
    cout.width(15);cout.precision(10);
    cout<<"0";
    cout<<"|\n";
 
 
        while (abs(fun(x1)>E))
        {
            double e;
            x2=x1-(fun(x1)/first(x1));
            e=abs(x2-x1);
            x1=x2;
            cout<<"|";
            cout.width(15);cout.precision(10);
            cout<<x1;
            cout<<"|";
            cout.width(15);cout.precision(10);
            cout<<fun(x1);
            cout<<"|";
            cout.width(15);cout.precision(10);
            cout<<e;
            cout<<"|\n";
        }
        cout<<"-------------------------------------------------\n";
 
}
 
void main(void)
{
    setlocale( LC_ALL,"Russian" );
    cout<<"Меню программы:\n"
                <<"1 - Метод касательных, 2 - Выход.\n";
    while(true)
    {
        int s;
        cin>>s;
        
        switch(s)
        {           
        case 1:
            input();
            derivative();
            kasat();//алгоритм решения 
            cout<<"\n\nМеню программы:\n"
                <<"1 - Метод касательных, 2 - Выход.\n";
            break;
        case 2: return;
            break;
        default: cout<<"\nВведите нужную клавишу!\n";
            break;
        };
    }
    system("pause");
}
0
Миниатюры
Программа не всегда работает правильно   Программа не всегда работает правильно   Программа не всегда работает правильно  

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