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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 17:13   #11
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

исходники давай. мне тоже интересно стало

а... и проверь сделать как я написал выше.

Последний раз редактировалось lennon; 03.11.2009 в 17:17.
lennon вне форума Ответить с цитированием
Старый 03.11.2009, 17:21   #12
sleevman
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 15
По умолчанию

теперь просто создаю новый массив чисел
...
double* e = new double[n];
...
и тоже ошибка прямо на месте этой записи...ща застрелюсь
sleevman вне форума Ответить с цитированием
Старый 03.11.2009, 17:26   #13
sleevman
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 15
По умолчанию

ох не хотел я этого делать...слишком много вопросов будет..
вот:

#include <iostream>
#include <string>
#include <stdlib>
#include <vector>
#include <malloc>
using namespace std;

double multiply(double* x, int i, int j){
if(i != 0)
return (x[j] - x[i - 1]) * multiply(x, i - 1, j);
else
return 1.0;
}
double* calcb(double* x, double* y, int n){
double* b = new double[n];
for(int k = 1; k < n; k++)
b[k] = 0.0;
b[0] = y[0];
for(int i = 1; i < n; i++)
for(int k = 0; k < i; k++){
double l = (double)i;
b[i] = b[i] + (y[i]/l - b[k] * multiply(x, k, i))/multiply(x, i, i);
}
return b;
}
double fact(int n){
if(n != 1)
return n * fact(n - 1);
else
return 1;
}
void calcpl(double* x, int n, int i, int p, int s, int r){
static int k = -1;
static int m = p - 1;
static double* z = new double[s];
int j;
if(k < p)
k++;
if(k < p){
for(i; i < (n - p + k + 1); i++){
z[k] = x[i] * (-1.0);
calcpl(x, n, i + 1, p, s, r);
}
k--;
}
else{
k--;
m++;
z[m] = 1.0;
for(j = 0; j <= k; j++){
z[m] = z[m] * z[j];
}
x[r] = x[r] + z[m];
}
}
double degree(double a, int i){
if(i == 0)
return 1.0;
if(i != 1)
return a * degree(a, i - 1);
else
return a;
}
double derivative(double* coeffx, int n, double x){
double f;
for(int k = 1; k++; k < n){
f = f + k * coeffx[k] * degree(x, k - 1);
}
return f;
}


int main(){
int n;
n = 7;
// cin >> n;

double* x = new double[n + 1];
x[0] = 0.52360;
x[1] = 0.87267;
x[2] = 1.22173;
x[3] = 1.57080;
x[4] = 1.91986;
x[5] = 2.26893;
x[6] = 2.61799;
// for(int i = 0; i < n; i++)
// cin >> idx[i];

double* y = new double[n];
y[0] = 0.00004;
y[1] = 0.00068;
y[2] = 0.00518;
y[3] = 0.02554;
y[4] = 0.09624;
y[5] = 0.30046;
y[6] = 0.81548;
// for(int i = 0; i < n; i++)
// cin >> idy[i];

double* b = calcb(x, y, n);
for(int k = 0; k < n; k++)
cout << b[k] << endl;

double* st = new double[n*(n + 1)/2];
int k;
st[0] = b[0];
st[1] = b[1];
st[2] = b[1] * x[0] * (-1);
k = 2;

double* coeffx = new double[n];

for(int i = 2; i < n; i++){
k++;
st[k] = b[i];
k++;
st[k] = 0.0;
for(int j = 0; j < i; j++)
st[k] = st[k] + b[i] * x[j] * (-1);
if(i > 2){
for(int p = 2; p < i; p++){
k++;
int s = fact(i)/fact(i - p)/fact(p) + p;
x[n] = 0.0;
calcpl(x, i, 0, p, s, n);
st[k] = b[i] * x[n];
}
}
k++;
st[k] = b[i];
for(int j = 0; j < i; j++)
st[k] = st[k] * x[j] * (-1);
}

for(int l = 0; l < n*(n + 1)/2; l++)
cout << "st[" << l << "] = " << st[l] << endl;

cout << "y = " << endl;

int ds = 1, m = 0, t;
for(int k = 0; k < n; k++){
t = ds + 1;
coeffx[k] = 0.0;
for(int s = m; s < n*(n + 1)/2; s = s + ds){
coeffx[k] = coeffx[k] + st[s];
ds = ds + 1;
}
ds = t;
m = m + ds - 1;
if((k > 0)&&(coeffx[k - 1] != 0)&&(coeffx[k] != 0.0))
cout << " +" << endl;
if(coeffx[k] != 0)
cout << "\t" << "x^" << k << " * " << coeffx[k] << endl;
}

double** a = new double*[n];
for(int i = 0; i < n; i++){
a[i] = new double[4];
for(int j = 0; j < 5; j++){
a[i][j] = 0.0;
}
}

delete []x;
delete []y;
delete []b;
delete []st;
delete []coeffx;

cout << "press any key: ";
cin >> n;
return 0;
}
sleevman вне форума Ответить с цитированием
Старый 03.11.2009, 17:27   #14
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

да.. . не читабельно, но я разберуся.. мне тоэж интересна
lennon вне форума Ответить с цитированием
Старый 03.11.2009, 17:31   #15
sleevman
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 15
По умолчанию

спасибо...я походу вдвойне ламер - я пишу с табуляцией,а сюда вставил - вон что вышло.
sleevman вне форума Ответить с цитированием
Старый 03.11.2009, 18:46   #16
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

вообщем ошибка возникает из за выхода за пределы массива. Я незнаю что делает у тебя эта программа, но покажу в каком месте нужно исправить.
В функции calcpl, которая вызываеться здесь
Код:
	for(int i = 2; i < n; i++)
	{
		k++;
		st[k] = b[i];
		k++;
		st[k] = 0.0;
		for(int j = 0; j < i; j++)
			st[k] = st[k] + b[i] * x[j] * (-1);
		if(i > 2)
		{
			for(int p = 2; p < i; p++)
			{
				k++;
				int s = fact(i)/fact(i - p)/fact(p) + p;
				x[n] = 0.0;
				calcpl(x, i, 0, p, s, n);
						st[k] = b[i] * x[n];
			}
		}
		k++;
		st[k] = b[i];
		for(int j = 0; j < i; j++)
			st[k] = st[k] * x[j] * (-1);


		double * a = new double[n];
	}
на четвертый такт цикла, тоесть когда i == 6

Код:
void calcpl(double* x, int n, int i, int p, int s, int r)
{
	static int k = -1;
	static int m = p - 1;
	static double* z = new double[s];
	int j;
	if(k < p)
		k++;

	if(k < p)
	{
		int g = (n - p + k + 1);
		for(i; i < (n - p + k + 1); i++)
		{
			z[k] = x[i] * (-1.0);
			calcpl(x, n, i + 1, p, s, r);
		}
	k--;
	}

	else
	{
		k--;
		m++;
		z[m] = 1.0; //здесь происходит выход за переделы массива (m = 15 а массив z состоит из 12) на каком то этапе  рекурсивного вызова этой функции. 
		for(j = 0; j <= k; j++)
		{
			z[m] = z[m] * z[j];
		}
		x[r] = x[r] + z[m];
	}
}
ошибки не возникало на том месте, потому что ты использовал указатели, ты таким образом затер участок памяти, в котором содержалась информация о куче или какието структуры создаваемые stl.

что я тебе предлогаю сделать? в этом месте static double* z = new double[s]; сделать так static double* z = new double[s+200]; это канешно не проффесионально ) но просто у тебя неверный алгоритм. или решай сам где расчеты неверны. ошибкку я указал. и ешо, следующий кусок кода ненужен


Код:
delete []x;
delete []y;
delete []b;
delete []st;
delete []coeffx;
т.к. программа уже завершаеться
Добавь отзыв =)

Последний раз редактировалось lennon; 03.11.2009 в 18:59.
lennon вне форума Ответить с цитированием
Старый 03.11.2009, 20:49   #17
sleevman
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 15
По умолчанию

уау!! спасибо большое, lennon!! к кому не обращался - все не могут понять,да и кому интересно разбираться в чьей-то проге,ногой написанной). оч выручил, спасибо
п.с..добавил)
sleevman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
простой код...почему выдает ошибку access violation at address!?? sleevman Помощь студентам 2 28.10.2009 20:47
Access violation at address при использовании DLL spamer Общие вопросы Delphi 4 27.08.2009 22:19
Access violation at address при выполнении end elsin Общие вопросы Delphi 5 30.01.2009 10:29
access violation при создании обьекта goog Общие вопросы Delphi 12 11.01.2009 20:33
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13