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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2010, 10:01   #1
Petruha-nsk
Пользователь
 
Аватар для Petruha-nsk
 
Регистрация: 10.04.2009
Сообщений: 69
По умолчанию в массиве последнее значение само меняется при использовании оператор printf

Здравствуйте!
передо мною стояла задача написать сложную программу,но меня интересует всего лишь часть работы моей программы. есть Ах=b. дано А и b,но матрицу А нужно представить в виде разложения A=L(L^T), L^T - L транспонированное. я даже написал программу и она даже вероятно работает(если по watch'у отслеживать значения),одна в подпрграмме printed на самом первом операторе printf значение A->al[9] меняется с 1.000000 на 0.000000. спрашивается: ПОЧЕМУ?????
Жду Ваших мыслей на этот счет. заранее спасибо.
P.S. матрица А представлена в профильном формате

Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<iostream>
#define type float

struct matrix//структура матрицы
			{
				int *ia, N;//матрица А
				type *al,*di;
			};

struct vector//структура вектора
			{
				type *mass;//массив для хранения элементов
				int size;	//флаг,хранящий размер вектора
			};

int input(matrix *A, vector *b)
{
	FILE *in;
	fopen_s(&in,"input.txt","r");
	if(in != NULL)
	{
		int i,t;//счетчик цикла
				//переменные для считаываеия данных из файла

		fscanf(in, "%d", &A->N);
		fscanf(in, "%d", &t);
		fscanf(in, "%d", &b->size);

		A->di = new type(A->N);
		A->ia = new int(A->N+1);
		A->al = new type(t);
		b->mass = new type(b->size);

		for(i=0; i<A->N+1; i++)//вводим ia матрицы А
		{
			fscanf(in, "%d", &A->ia[i]);
		}

		for(i=0; i<t; i++)//вводим al матрицы А
		{
			fscanf(in, "%f", &A->al[i]);
		}

		for(i=0; i<A->N; i++)//считываем di матрицы А
		{
			fscanf(in, "%f", &A->di[i]);
		}

		for(i=0; i<b->size; i++)//ввод вектора b
		{
			fscanf(in, "%f", &b->mass[i]);
		}

		return 1;
	}
	else
		{
			return 0;
		}
}

type SumDiag(matrix **A, int i, int kol)//SumDiag - сумма для вычисления диагонального элемента
{
	int t = (*A)->ia[i]-1;
	type sum = 0.0;
	while(kol>0)
	{
		sum = sum + ((*A)->al[t])*((*A)->al[t]); 
		t++;
		kol--;
	}
	return sum;
}

type SumOther(matrix **A, int i,int j,int kol)//SumOther - сумма для вычисления смешанного элемента
{
	int t,t_j,kol_j;
	type sum = 0.0;
	kol_j = (*A)->ia[j+1] - (*A)->ia[j];//нашли кол-во элементов в j-строке
	if(kol>(i-j) && kol_j>0)//если в i-строке больше одного элемента и в j-й строке есть хотя бы один ненулевой не диагональный элемент
	{
		t_j = (*A)->ia[j+1]-2;//нашли позицию последнего элемента массива al в j-строке
		if(t_j < 0)return sum;//если указатель на элемент в массиве al по строке j отрицателен,то сумма равна нулю
		else
			{
				t = (*A)->ia[i]-1;
				t = t+kol-1;//нашли позицию последнего элемента в i-строке
				t = t - (i-j);//нашли позицию,с которой элементы строк i и j находятся в одном столбце и не нулевые
				kol = kol - (i-j);//кол-во элементов i-строки с учетом лишь "перекрестных"
				while(kol>0 && kol_j>0)//пока в строке есть элементы,производим "собирание" суммы
				{
					sum = sum + ((*A)->al[t])*((*A)->al[t_j]);
					t--;
					t_j--;
					kol--;
					kol_j--;
				}
				return sum;
			}
	}
	else return sum;
}

void CreateLMatrix(matrix *A)
{
	int i,j,kol,t;	//прототипы индексов i,j
					//kol - кол-во элементов в строке
							
	i=0;
	while(i<A->N)//пока не просмотрели всю матрицу
	{
		kol = A->ia[i+1] - A->ia[i];//узнаем кол-во элементов в строке

		if(kol==0)//если в строке нет элементов,кроме диагонального
		{
			/*находим диагональный элемент на i-й строке*/
			A->di[i] = sqrt(A->di[i]);
		}
		else 
			{
				/*находим внедиагональные элементы на i-й строке и диагональный*/

				t = A->ia[i]-1;//номер позиции элемента в массиве al,с которого нужно начать
				j = i - kol;//i-kol - позиция t-элемента по j,иначе говоря идентифицируем позицию в массие di
				while(j<i)
				{
					A->al[t] = (1.0/A->di[j])*(A->al[t] - SumOther(&A,i,j,kol));//находим Lij элемент
					j++;
					t++;
				}
				A->di[i] = sqrt(A->di[i] - SumDiag(&A,i,kol));//находим Lii элемент
			}

		i++;
	}
}


void printed(matrix *A, vector *x, vector *y, vector *b)
{
	int i;

	printf("\nal = ");
	for(i=0; i<15; i++){
		printf(" \n%d %f ",i,A->al[i]);
	}

	printf("\n ia = ");
	for(i=0; i<A->N+1; i++){
		printf(" %d ",A->ia[i]);
	}

	printf("\n di = ");
	for(i=0; i<A->N; i++){
		printf(" %f ",A->di[i]);
	}

	getch();
}

int main()
{
	matrix A;//матрица А
	vector x;//вектор x
	vector y;//вектор y
	vector b;//вектор b

	if(input(&A, &b))//ввод данных
	{
		y.size = b.size;//размер вектора у сделали такой же как и размер вектора b
		CreateLMatrix(&A);//создание L-матриц
		printed(&A,&x,&y,&b);
		return 0;
	}
	else
		{
			return 1;
			printf("Error in entering data!");
			getch();
		}
}
входные данные:
5
10
4
1 1 2 4 7 11
1 1 2 1 2 3 1 2 3 4
1 2 3 4 5
1 1 1 1
Petruha-nsk вне форума Ответить с цитированием
Старый 19.09.2010, 11:18   #2
Petruha-nsk
Пользователь
 
Аватар для Petruha-nsk
 
Регистрация: 10.04.2009
Сообщений: 69
По умолчанию

эх... помощи не дождался,сам разобрался...
но все равно спасибо тем,кто прочитал мою проблему
Petruha-nsk вне форума Ответить с цитированием
Старый 19.09.2010, 12:45   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сам разобрался...
Респект.
А уважуха будет после того как поделишься правильным решением
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последнее значение в списке Maruff Microsoft Office Excel 13 16.02.2017 12:43
Последнее значение в столбце списка ALev Microsoft Office Excel 2 02.07.2009 16:29
Меняется значение текстовой ячейки при удалении пробелов. symix Microsoft Office Excel 4 26.06.2009 11:03
Как получить последнее значение при работе программы voron29 Общие вопросы Delphi 1 27.02.2009 12:22
Отобразить последнее введенное значение RUBEY Microsoft Office Excel 5 21.03.2007 11:01