Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 21:38   #1
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию C++ Тест программы. Исправление ошибок.

Всем добрый вечер. Реализовал программу, подсчитывающую корень уравнения методом касательных(Ньютона).
В качестве примера использовал трансцендентное уравнение вида:
f(x)=e^x*(a[0]x^3+(a[1])*x^2-(a[2])).
на на последнем скрине подсчет не верен. Подскажите пожалуйста как исправить? Просьба протестить программу на правильность и работоспособность. Подсказать как исправить ошибки.

И еще вопрос, менее важен. При нажатии на кнопку 1 происходит подсчет программы. На кнопку 2 выход. При нажатии на другую цифру выдает ошибку о неправильно нажатой клавиши и просьба повторить попытку. При нажатии на любую букву происходит зацикливание. Я понимаю что дело в этом, нужно сделать переменную s не целочисленной. Но если я объявляю
Код:
string s
, то он выдает ошибку что нужно сделать либо целочилсенный тип либо еще какой-то.
Код:
int s;
cin>>s;
		
switch(s)
{
}

Код самой программы:
Код:
#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");
}
Спасибо.
Изображения
Тип файла: jpg 1_1jpg.jpg (96.5 Кб, 41 просмотров)
Тип файла: jpg 1_2.jpg (57.0 Кб, 37 просмотров)
Тип файла: jpg 2.jpg (72.3 Кб, 131 просмотров)
Тип файла: jpg 3.jpg (64.4 Кб, 126 просмотров)

Последний раз редактировалось PROkaZZZniK; 03.04.2013 в 18:11.
PROkaZZZniK вне форума Ответить с цитированием
Старый 03.04.2013, 17:48   #2
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

актуально!hepl

Последний раз редактировалось PROkaZZZniK; 03.04.2013 в 18:11.
PROkaZZZniK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильно ли работает программа на C++ hirano Помощь студентам 0 13.03.2012 11:46
правильно ли работает программа? ITdocer Паскаль, Turbo Pascal, PascalABC.NET 2 04.11.2011 09:37
Не правильно работает программа sergik-2504 Помощь студентам 1 22.12.2010 09:17
программа работает. правильно ли? getUp Общие вопросы C/C++ 10 26.03.2010 07:07
Не правильно работает программа Virus_L Помощь студентам 0 28.12.2009 22:52