Witam.
Napisałem program w javie obliczający równania Cramera (metoda Gaussa), podajemy macierz współczynników i kolumnę wyrazów wolnych.
Program w java:
import java.io.*;
import java.lang.Double;
public class Macierz2 {
int roz;
int wier;
int kolu;
private double [][] tab;
private double [] tabB;
BufferedReader wej= new BufferedReader( new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(wej); // argument typu Reader
PrintWriter wyj= new PrintWriter( new BufferedWriter(new OutputStreamWriter(System.out)),true);
double tabX [];
public void doTroj() {
for (int k=0; k<roz; k++) {
for (int i=k; i<wier;i++) {
double a=tab[i][k];
for (int j=k; j<kolu; j++) {
if (i==k) {
tab[k][j] = (tab[k][j] / a);
}
else {
tab[i][j] = tab[i][j] - (a * tab[k][j]); // wiersz nowy = wiersz - element * wiersz 1
}
}
}
}
}
//jednostkowa
public void doJednostkowej() {
for (int i=wier-2;i>=0;i--) {
for (int j=i+1;j<kolu-1;j++) odejmowanieWierszy(i,tab[i][j],j);
}
}
public void odejmowanieWierszy(int nrWiersza, double czynnik, int innyNrWiersza) {
for (int j=0;j<kolu;j++) {
tab[nrWiersza][j] = tab[nrWiersza][j] - czynnik*tab[innyNrWiersza][j];
}
}
public void wyswietl() {
for (int i=0; i<wier;i++) {
for (int j=0; j<kolu; j++) {
System.out.print(tab[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
public void wyswietl2() {
for (int i=0; i<wier;i++) {
for (int j=0; j<kolu; j++) {
Double a=tab[i][j];
System.out.print(Math.round(a)+" ");
}
System.out.println();
}
System.out.println();
}
public Macierz2() {
wyj.println("Podaj rozmiar:"); wyj.flush();
try {
st.nextToken();
roz=wier=(int)st.nval;
kolu=wier+1;
tab=new double [roz][roz+1];
tabB = new double [roz];
wyj.println("Podaj elementy macierzy wspolczynnikow: "); wyj.flush();
for (int i=0;i<roz;i++)
for (int j=0;j<roz;j++) {
st.nextToken();
tab[i][j]=st.nval;
}
wyj.println("Podaj elementy kolumny wyrazo wolnych:"); wyj.flush();
for (int j=0;j<roz;j++) {
st.nextToken();
double a=st.nval;
tabB[j]=a;
tab[j][kolu-1]=a;
}
} catch(IOException e){System.out.println("Blad wczytania");}
}
}
no i wszystkie metody działają dobrze :)
Po przetworzeniu do C/C++ mam:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int roz=30;
int wier;
int kolu;
double tab [30][30];
int main() {
int liczba;
cout << "Podaj rozmiar tablicy wspolczynnikow: ";
scanf ("%i", &roz);
wier=roz;
kolu=wier+1;
cout << "Podaj elementy macierzy wspolczynnikow: ";
for (int i=0;i<roz;i++) {
for (int j=0;j<roz;j++) {
scanf ("%d", &tab[i][j]);
}
}
cout << "Podaj elementy kolumny wyrazow wolnych:";
for (int j=0;j<roz;j++) {
double a;
scanf ("%d", &a);
tab[j][roz]=a;
}
// wyswietl macierz rozszerzona
cout << "\nMacierz wspolczynnikow rozszerzona o kolumne wyrazow wolnych";
cout << "\nLiczba wierszy: ";
cout << wier;
cout << "\nLiczba kolumn: ";
cout << kolu;
cout << "\n\n";
for (int i=0; i<wier;i++) {
for (int j=0; j<kolu; j++) {
printf (" %i ", tab[i][j]);
}
cout << "\n";
}
cout << "\n";
// do trojkatnej
for (int k=0; k<roz; k++) {
for (int i=k; i<wier;i++) {
double a=tab[i][k];
for (int j=k; j<kolu; j++) {
if (i==k) {
tab[k][j] = (tab[k][j] / a);
}
else {
tab[i][j] =- (a * tab[k][j]); // wiersz nowy = wiersz - element * wiersz poprzedni
}
}
}
}
// do jednostkowej
for (int i=wier-2;i>=0;i--) {
for (int j=i+1;j<kolu-1;j++) {
// odejmowanie wierszy
for (int k=0;k<kolu;k++) {
tab[i][k] =- tab[i][j]*tab[j][k];
}
}
}
// wyswietl
for (int i=0; i<wier;i++) {
for (int j=0; j<kolu; j++) {
printf (" %i ", tab[i][j]);
}
cout << "\n";
}
cout << "\n";
// wyswietl wynik (macierz kolumnowa X)
for (int i=0; i<wier; i++) {
printf (" %i \n", tab[kolu][i]);
}
cout << "\n";
cin >> liczba ;
}
I wyniki wychodzą różne ... nie znam przyczyny... nie wiem jak poprawić ... ktoś pomoże?