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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2008, 02:50   #1
Etlau
Пользователь
 
Аватар для Etlau
 
Регистрация: 30.03.2008
Сообщений: 23
Смущение Решить систему линейных уравнений, которая содержит до 200 переменных, методом Гаусса.

Прошу помочь разобратса почему выдает ошибку.
Задача в том, чтоб решить систему линейных уравнений,которая содержит до 200 переменных, методом Гаусса. Вопщем выдает такую ошибку:
Floating point error: Overflow
Abnormal program termination
Я непойму в чем у меня ошибка, очень сильно прошу вас помочь
Код:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int n=100;
float **C,*B,*X;
void diagonal(){
   int i, j, k;
   float temp=0;
   for(i=0; i<n; i++){
       if(C[i][i]==0){
	   for(j=0; j<n; j++){
	       if(j==i) continue;
	       if(C[j][i] !=0 && C[i][j]!=0){
		   for(k=0; k<n; k++){
		       temp = C[j][k];
		       C[j][k] = C[i][k];
		       C[i][k] = temp;
		   }
		   temp = B[j];
		   B[j] = B[i];
		   B[i] = temp;
		   break;
	       }
	   }
       }
   }
}
main()
{
	clrscr();
	int i,j,k,c;
	float h;
	C=new float*[n];
	for(i=0;i<n;i++)
		C[i]=new float[n];
	B=new float[n];
	X=new float[n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			C[i][j]=random(10);
		}
	}
	for(j=0;j<n;j++){
		B[j]=random(10);
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}
	diagonal();
	cout<<endl;
	/*for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}*/
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			C[j][i]=-C[j][i]/C[i][i];
			for(k=i+1;j<n;k++)
				C[j][k]=C[j][k]+C[j][i]*C[i][k];
			B[j]=B[j]+C[j][i]*B[i];
		}
	}
	X[n]=B[n-1]/C[n-1][n-1];
	for(i=n-1;i>0;i++){
		h=B[i];
		for(j=i+1;j<n;j++)
			h=h-X[j]*C[i][j];
		X[i]=h/C[i][i];
	}
	cout<<endl;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}
	for(i=0;i<n;i++)
		delete C[i];
	delete B;
	delete X;
	getch();
}
В сущности, самое распространенное бегство всякого человека - бегство от самого себя.
Etlau вне форума Ответить с цитированием
Старый 04.05.2008, 17:46   #2
Cricket2007
Пользователь
 
Регистрация: 12.02.2008
Сообщений: 14
По умолчанию

Вот вызов 2 необъявленных функций random(10); и вот вызов необъявленной функкции clrscr(); у меня компилятор указал на эти ошибки я пытался запустить в консольном проэкте на Microsoft Visual C++ 6.0
Экспериментатор должен быть достаточно ленив, чтоб не копиться в мелочах
Cricket2007 вне форума Ответить с цитированием
Старый 04.05.2008, 23:12   #3
Etlau
Пользователь
 
Аватар для Etlau
 
Регистрация: 30.03.2008
Сообщений: 23
По умолчанию

clrscr() - для него существует библиотека conio.h,а вто наще рандома нада проверить.
В сущности, самое распространенное бегство всякого человека - бегство от самого себя.
Etlau вне форума Ответить с цитированием
Старый 05.05.2008, 00:33   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Если вам нужно забить массив числами от 0 до 10, то это делается стандартной функцией rand(). Она из библиотеки stdlib.h
Код:
C[i][j]=rand()%10;
или чтобы мутнее
Код:
C[i][j]=0+rand()%10;
Хотя разницы никакой
Вот так будет работать.
MaTBeu вне форума Ответить с цитированием
Старый 05.05.2008, 00:53   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Значит так... про clrscr() забудь... Там другая функция есть для очистки экрана (не помню, какая, но точно есть). А вот прога твоя...
Короче вылетает, что типо у тебя все массивы флоат, а значит, мой предыдущий пост можешь не смотреть Странно, но вот так твоя прога тоже работает, и выдает кучу цифр...
Код:
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

void diagonal();

int n=100;
int **C,*B,*X;
void diagonal(){
   int i, j, k;
   int temp=0;
   for(i=0; i<n; i++){
       if(C[i][i]==0){
	   for(j=0; j<n; j++){
	       if(j==i) continue;
	       if(C[j][i] !=0 && C[i][j]!=0){
		   for(k=0; k<n; k++){
		       temp = C[j][k];
		       C[j][k] = C[i][k];
		       C[i][k] = temp;
		   }
		   temp = B[j];
		   B[j] = B[i];
		   B[i] = temp;
		   break;
	       }
	   }
       }
   }
}
int main()
{
	//clrscr();
	int i,j,k;
	int h;
	C=new int*[n];
	for(i=0;i<n;i++)
		C[i]=new int[n];
	B=new int[n];
	X=new int[n];
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			C[i][j]=rand()%10;
		}
	}
	for(j=0;j<n;j++){
		B[j]=rand()%10;
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}
	diagonal();
	cout<<endl;
	/*for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}*/
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			C[j][i]=-C[j][i]/C[i][i];
			for(k=i+1;j<n;k++)
				C[j][k]=C[j][k]+C[j][i]*C[i][k];
			B[j]=B[j]+C[j][i]*B[i];
		}
	}
	X[n]=B[n-1]/C[n-1][n-1];
	for(i=n-1;i>0;i++){
		h=B[i];
		for(j=i+1;j<n;j++)
			h=h-X[j]*C[i][j];
		X[i]=h/C[i][i];
	}
	cout<<endl;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			cout<<C[i][j]<<"   ";
		cout<<endl;
	}
	for(i=0;i<n;i++)
		delete C[i];
	delete B;
	delete X;
	cin.get();

	return 0;
}
Я заменил все флоат на инт. Но разницы нет, результат тот же. Просто нету варнингов от компилятора, что присваиваешь флоат переменной интеджер значение. Вот и все. Но, еще когда прога запускается, начинают выводится цифры, и компилятор выдает, что типа вылетает твоя прога. Не знаю почему. Компилятор MSVS 2005.
MaTBeu вне форума Ответить с цитированием
Старый 05.05.2008, 07:50   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Строка 62
Код:
for(k=i+1;j<n;k++)
Условие по "чужой" переменной - бесконечный цикл с выходом за пределы массива.

Строка 68
Код:
for(i=n-1;i>0;i++)
Странное условие цикла - "почти" бесконечный цикл с выходом за пределы массива.

Математику не смотрел. float лучше поменять на double.
B_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Система линейных уравнений с тремя неизвестными, решение их матричным способом. svender Помощь студентам 8 30.05.2009 13:32
решить систему методом Зейделя на с++ Юлёк Фриланс 3 28.05.2008 19:59
Решение систем линейных неравенств методом Агмона-Моцкина. ballz Помощь студентам 1 26.04.2007 06:45