Допомагаємо ЗСУ!

Помогите с отладкой функции обработки. С+

🔴 11:32 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 28.03.2009
Повідом.: 67
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #1
Помогите с отладкой функции обработки. С++

Код:
/* Используя Схему Эйткена реализовать вычисления приближенных значений функции, заданой таблично.
Значения x[i] y[i] ввводим сами.*/


#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
class eit
{
	int n;
	float *va;
public:
	eit();
	eit(int _n){n=_n; va=new float [n];} //конструктор, выделяем память для массива
	~eit(){delete [] va;} //деструктор
	float&operator[](int index) //перегруженый оператор, для доступа к элементам массива
	{return va[index];}
	friend void obr(eit o1, eit o2);//обработка, выполняет нахождение приближенного значения функции по схеме эйткена
	void show(); //функция просмотра
	};
void eit::show()
{
	int i=0;
	for(; i<n; i++)  //вывод матрицы
		cout<<va[i]<<' ';
	cout<<endl;
}
void obr(eit o1,eit o2)
{
	int i=0; //счетчик элементов массива
	float x; //значение аргумента для которого будет находиться значение функции
	float *P; //массив промежуточных значений P[i]
	float Pz=0;  //результирующее значение функции при заданом х.
	P=new float [n];//выделение динамической памяти для массива промежуточных значений
	cout<<"vvedite x, dlya kotorogo budet nahoditcya znachenie function y(x):  ";
	cin>>x;
	cout<<endl;

	for(i=0; i<o1.n; i++) //так как массивы x[i] y[i] имеют одинаковый размер n, то открываем один цыкл
      {
		  P[i]=P[i]=(1/(o1[i+1]-o1[i]))*(o2[i]*(o1[i+1]-x)-o2[i+1]*(o1[i]-x)); //расчет промежуточных значений Р[i] по формуле:P[i]=(1/(x[i+1]-x[i]))*((y[i]*(x[i+1]-x))-(y[i+1]*(x[i+1]-x)))
			cout<<P[i]<<' ';
	}
		for(i=0; i<o1.n-1; i++)
	        Pz=(1/(o1[o1.n-1]-o1[0]))*(P[i]*(o1[o1.n-1]-x)-P[i+1]*(o1[0]-x)); //считаем результат Pz=(1/(x[n-1]-x[0]))*((P[i]*(x[n-1]-x))-(P[i+1]*(x[0]-x)))

	   cout<<"Pz= "<<Pz;
}

int main()
{
	int i;
	int _n;
	float *x;
	cout<<"vvedite kol-vo znacheni' x[i] i y[i]:  ";
	cin>>_n;
	cout<<endl;
	eit o1(_n); //создаем объект типа класса eit для хранения значений x[i]
	eit o2(_n); //создаем объект типа класса eit для хранения значений у[i]
	x=new float [_n]; //выделяем динамическую память
	cout<<"vvedite "<<_n<<" znachenii x[i]: ";
	for(i=0; i<_n; i++)
		cin>>x[i];
	for(i=0; i<_n; i++)
		o1[i]=x[i]; //передаем массив x[i] в объект
	cout<<"vvedite "<<_n<<" znachenii y[i]: ";
	for(i=0; i<_n; i++)
		cin>>x[i];
	for(i=0; i<_n; i++)
		o2[i]=x[i]; //передаем массив в объект у[i]
	cout<<endl;
	cout<<"x[i]: ";
	o1.show(); //вывод массива x[i]
	cout<<"y[i]: ";
	o2.show(); //вывод массива у[i]
	obr(o1,o2);
	return 0;
}


к коду прилогается скрин на котором виден пример вычисления методом эйткена.
архив проэкта на визуал студио 2010

и ссылка на метод эйткена
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 

Вкладення

  • эйткен.jpg
    эйткен.jpg
    53.2 КБ · Перегляди: 62
Останнє редагування:
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #2
в чем помогать то?
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #3
обработка не идет.
точнее идет, но считает не правильно
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #4
P=(1/(o1[i+1]-o1))*(o2*((o1[i+1]-x)-(o2[i+1]*(o1-x))))
P=(1/(o1[i+1]-o1))*(o2*(o1[i+1]-x)-o2[i+1]*(o1-x))
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #5
при компиляции выдает ошибку, мол n не инициализирована.

хотя n у меня описана в глобальных переменных
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #6
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #7
точно
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #9
еще вопрос.
У меня все массивы типа float (действительные числа)
но когда ввожу дробные числа программа идет на "аварию".

attachment.jpg


attachment.jpg


еще при отладке выскакивает такое вот окно

attachment.jpg


почему?

а нельзя так? void eit::obr(eit o1,eit o2)

obr- дружественная функция, она описывается просто void obr(eit o1,eit o2)





Когда ввожу целые числа P считает правильно, а вот Pz-нет.


хм.....



Pz может так посчитать???

в обработке при присвоении Pz=L(o1, o2, P, x);
выдает ошибку, L идентификатор не найден!

Код:
void obr(eit o1,eit o2)
{
	int i=0; //счетчик элементов массива
	float x; //значение аргумента для которого будет находиться значение функции
	float *P; //массив промежуточных значений P[i]
	float Pz=0;  //результирующее значение функции при заданом х.
	P=new float [o1.n];//выделение динамической памяти для массива промежуточных значений
	cout<<"vvedite x, dlya kotorogo budet nahoditcya znachenie function y(x):  ";
	cin>>x;
	cout<<endl;

	for(i=0; i<o1.n-1; i++) //так как массивы x[i] y[i] имеют одинаковый размер n, то открываем один цыкл
      {
		  P[i]=P[i]=(1/(o1[i+1]-o1[i]))*(o2[i]*(o1[i+1]-x)-o2[i+1]*(o1[i]-x)); //расчет промежуточных значений Р[i] по формуле:P[i]=(1/(x[i+1]-x[i]))*((y[i]*(x[i+1]-x))-(y[i+1]*(x[i+1]-x)))
			cout<<"P[i]: "<<P[i]<<' ';
	}
		//for(i=0; i<o1.n-; i++)
	    //Pz=(1/(o1[o1.n-1]-o1[0]))*(P[i]*(o1[o1.n-1]-x)-P[i+1]*(o1[0]-x)); //считаем результат Pz=(1/(x[n-1]-x[0]))*((P[i]*(x[n-1]-x))-(P[i+1]*(x[0]-x)))
	Pz=L(o1, o2, P, x);
	   cout<<"Pz= "<<Pz;
}

float eit::L(eit o1, eit o2, float P[], float x)
{
	int i=0;
		if (o2.n==2) 
			return (1/(o1[1]-o1[0]))*(P[0]*(o1[1]-x)-P[1]*(o1[0]-x)));
		else
			if(o2.n>2)
			return (1/(o1[o1.n-1]-o1[0]))*(P[i]*(o1[o1.n-1]-x)-P[i+1]*(o1[0]-x));
	}
 

Вкладення

  • ошибка эйкен.jpg
    ошибка эйкен.jpg
    47.4 КБ · Перегляди: 180
  • Безымянный.jpg
    Безымянный.jpg
    45.1 КБ · Перегляди: 309
Останнє редагування:
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #10
в обработке при присвоении Pz=L(o1, o2, P, x);
выдает ошибку, L идентификатор не найден!

Правильно выдает. L это метод класса, а obr процедура, не входящая в класс. поэтому из obr надо вызывать через экземпляр класса например Pz=o1.L(o1, o2, P, x)

Но должен заметить что все это отдает быдлокодингом
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #11
Но должен заметить что все это отдает быдлокодингом
да лаба это наверное или чтото в этом роде, че придираться то :)

еще вопрос.
У меня все массивы типа float (действительные числа)
но когда ввожу дробные числа программа идет на "аварию".
дробные нужно вводить с точкой, не 0,2 а 0.2
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #12
Правильно выдает. L это метод класса, а obr процедура, не входящая в класс. поэтому из obr надо вызывать через экземпляр класса например Pz=o1.L(o1, o2, P, x)

Но должен заметить что все это отдает быдлокодингом

для студентки, которая узнала про классы неделю назад - нармальный код.


за разъяснения спасибо.



Всем спасибо за помощь.
Программа работает правильно!

итоговый код.
Код:
/* Используя Схему Эйткена реализовать вычисления приближенных значений функции, заданой таблично.
Значения x[i] y[i] ввводим сами.*/


#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
class eit
{
	int n;
	float *va;
public:
	eit();
	eit(int _n){n=_n; va=new float [n];} //конструктор, выделяем память для массива
	~eit(){delete [] va;} //деструктор
	float&operator[](int index) //перегруженый оператор, для доступа к элементам массива
	{return va[index];}
	friend void obr(eit o1, eit o2);//обработка, выполняет нахождение приближенного значения функции по схеме эйткена
	float L(eit o1, eit o2, float P[], float x);
	void show(); //функция просмотра
	};
void eit::show()
{
	int i=0;
	for(; i<n; i++)  //вывод матрицы
		cout<<va[i]<<' ';
	cout<<endl;
}
void obr(eit o1,eit o2)
{
	int i=0; //счетчик элементов массива
	float x; //значение аргумента для которого будет находиться значение функции
	float *P; //массив промежуточных значений P[i]
	float Pz=0;  //результирующее значение функции при заданом х.
	P=new float [o1.n];//выделение динамической памяти для массива промежуточных значений
	cout<<"vvedite x, dlya kotorogo budet nahoditcya znachenie function y(x):  ";
	cin>>x;
	cout<<endl;

	for(i=0; i<o1.n-1; i++) //так как массивы x[i] y[i] имеют одинаковый размер n, то открываем один цыкл
      {
		  P[i]=(1/(o1[i+1]-o1[i]))*(o2[i]*(o1[i+1]-x)-o2[i+1]*(o1[i]-x)); //расчет промежуточных значений Р[i] по формуле:P[i]=(1/(x[i+1]-x[i]))*((y[i]*(x[i+1]-x))-(y[i+1]*(x[i+1]-x)))
			
		  cout<<"P[i]: "<<P[i]<<' ';
	}
	Pz=o1.L(o1, o2, P, x);
	   cout<<"Pz= "<<Pz;
}

float eit::L(eit o1, eit o2, float P[], float x)
{
	int i=0;
		if (o2.n==2) //количество узлов ==2, значит в P[i] будет всего одно значение
			return  P[i];//=(1/(o1[1]-o1[0]))*(o2[0]*(o1[1]-x)-o2[1]*(o1[0]-x));
		else
			if(o2.n>2)//для большего количества узлов результат считаем по формуле.
			return (1/(o1[n-1]-o1[0]))*(P[i]*(o1[n-1]-x)-P[i+1]*(o1[0]-x));
	}
int main()
{
	int i;
	int _n;
	float *x;
	cout<<"vvedite kol-vo znacheni' x[i] i y[i]:  ";
	cin>>_n;
	if(_n<2) //проверка
	{
		cout<<"Nevozmojno vicheslit znachenie function dlya n= "<<_n<<". Vvedite n>=2";
		exit(1);
	}
	cout<<endl;
	eit o1(_n); //создаем объект типа класса eit для хранения значений x[i]
	eit o2(_n); //создаем объект типа класса eit для хранения значений у[i]
	x=new float [_n]; //выделяем динамическую память
	cout<<"vvedite "<<_n<<" znachenii x[i]: ";
	for(i=0; i<_n; i++)
		cin>>x[i];
	for(i=0; i<_n; i++)
		o1[i]=x[i]; //передаем массив x[i] в объект
	cout<<"vvedite "<<_n<<" znachenii y[i]: ";
	for(i=0; i<_n; i++)
		cin>>x[i];
	for(i=0; i<_n; i++)
		o2[i]=x[i]; //передаем массив в объект у[i]
	cout<<endl;
	cout<<"x[i]: ";
	o1.show(); //вывод массива x[i]
	cout<<"y[i]: ";
	o2.show(); //вывод массива у[i]
	obr(o1,o2);
	return 0;
}
 
Останнє редагування:
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #13
Если бы я был преподом, то такую прогу не принял :-)
Тут явно нужен рефакторинг.
 
  • 🔴 11:32 Повітряна тривога в Харків.обл.
  • #14
но ты же не препод.
 
Назад
Зверху Знизу