Witam,
Po pierwsze chciałbym uprościć kod.
Po drugie, dodać menu (wiem, ze menu jest tu bez sensu, ale to program na zajęcia :( ) w którym można się poruszać strzałkami.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
void open(ifstream & file){
file.open("dane.txt");
if (file.good()==false)
cout<<"Nie udalo sie otworzyc pliku"<<endl;
}
void wypisz(double **matrix, int ilo){
cout<<"Macierz: "<<endl;
for (int i=0; i<ilo; i++)
{for (int j=0; j<ilo+1; j++)
cout<<setw(6)<<matrix[i][j];
cout<<endl;}
}
void odczyt(ifstream & file,double **matrix, int ilo){
for (int i=0; i<ilo; i++)
for (int j=0; j<ilo+1; j++)
file>>matrix[i][j];
}
double **tworzenie(int ilo){
double **matrix = new double *[ilo];
for (int i=0; i<ilo; i++)
matrix[i]=new double [ilo+1];
return matrix;
}
int zliczanie(ifstream & file, int &ilo){
open (file);
string znak;
while(!file.eof())
{
getline(file, znak);
++ilo;
}
cout<<"Ilosc wierszy: " << ilo<<endl;
file.close();
cin.ignore();
return ilo;
}
void warunek_brak_zera_na_przekatnej(double **matrix, int ilo){
for (int i=0; i<ilo; i++)
{if (matrix[i][i] ==0)
cout<<"Na przekatnej znajduje sie zero, popraw uklad";}
}
void wyswietl(double **tablica, int ilo)
{
for (int i=0; i<ilo; i++)
{for (int j=0; j<ilo; j++)
cout<<setw(6)<<tablica[i][j];
cout<<endl;
}
cout<<endl;
}
void zerowanie_pod_przatkatna (double **U, int ilo){
for (int i=0; i<ilo; i++)
for (int j =0; j<=i; j++)
{
U[i][j]=0;
}
cout<<"Macierz U:"<<endl;
wyswietl(U, ilo);
}
void zerowanie_nad_przatkatna (double **L, int ilo){
for (int i=0; i<ilo; i++)
for (int j=i; j<ilo; j++)
{
L[i][j]=0;
}
cout<<"Macierz L:"<<endl;
wyswietl(L, ilo);
}
void nie_zerowanie_przekatnej (double **D, int ilo){
for (int i=0; i<ilo; i++)
for (int j=i+1; j<ilo; j++)
{
D[i][j]=0;
}
for (int i=0; i<ilo; i++)
for (int j =0; j<=i-1; j++)
{
D[i][j]=0;
}
cout<<"Macierz D:"<<endl;
wyswietl(D, ilo);
}
void odwrotnoscD (double **D, int ilo)
{
for (int i =0; i<ilo; i++)
D[i][i] = 1/(D[i][i]);
cout<<"Macierz D^(-1)"<<endl;
}
void mnoznik (double **cos, double **D, int ilo){
for (int i =0; i<ilo; i++)
for (int j=0; j<ilo; j++)
{
cos[i][j] = cos[i][j] *D[i][i];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream file;
int ilo=0;
double **matrix=tworzenie(zliczanie(file, ilo));
double **L=tworzenie(ilo);
double **D=tworzenie(ilo);
double **U=tworzenie(ilo);
//////////////////tworzenie i wyswietlanie
open(file);
odczyt( file, matrix, ilo);
wypisz(matrix, ilo);
file.close();
open(file);
odczyt(file, L, ilo);
file.close();
open(file);
odczyt(file, D, ilo);
file.close();
open(file);
odczyt(file, U, ilo);
file.close() ;
warunek_brak_zera_na_przekatnej(matrix, ilo);
cout<<endl;
zerowanie_pod_przatkatna(U, ilo);
nie_zerowanie_przekatnej(D, ilo);
zerowanie_nad_przatkatna(L, ilo);
/////////////////////////////////////////////////////////////
odwrotnoscD(D, ilo);
wyswietl(D, ilo);
mnoznik(L, D, ilo);
cout<<"D-1L"<<endl;
wyswietl(L,ilo);
mnoznik(U, D, ilo);
cout<<"D-1U"<<endl;
wyswietl(U,ilo);
////////wyrazy wolne////////////
for (int i=0; i<ilo; i++)
matrix[i][ilo]=matrix[i][ilo] * D[i][i];
cout<<"Macierz wyniku: "<<endl;
for (int i=0; i<ilo; i++)
cout<<setw(6)<<matrix[i][ilo];
cout<<endl;
double *iksy = new double [ilo];
for (int i=0; i<ilo; i++)
iksy[i] =0;
///// x^(n+1) = D-1b - D-1Lx^(n+1) - D-1Ux^(n) ////
int iter;
cout<<"Ile iteracji algorytmu wykonac?\n";
cin>>iter;
for (int k=0; k<iter; k++)
for (int i=0; i<ilo; i++)
{
iksy[i] = matrix[i][ilo];
for (int j=0; j<i; j++)
iksy[i] -= L[i][j]*iksy[j];
for (int j=i+1; j<ilo; j++)
iksy[i] -= U[i][j]*iksy[j];
}
cout<<"wynik:\n";
for (int i=0; i<ilo; i++)
cout<<setw(10)<<iksy[i];
cout<<endl;
system ("pause");
return 0;
}