input.txt
2 4 4 42
1 2 7 46
2 2 0 14
#include
#include
#include
#include
using namespace std;
const int M = 3; // pocet radku
const int N = 4; // pocet sloupcu
typedef double T; // typ T = double
void clear(T p[M][N])
{
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
p[i][j] = 0;
}
string name[] = { "x", "y", "z", "" };
string separator[] = { "", "", "", " = " };
bool znam[] = { false, true, true, false};
int width = 4;
void print(ostream& f, T p[M][N])
{
for (int i = 0; i < M; i++) // cyklus pro radky
{
for (int j = 0; j < N; j++) // cyklus pro sloupce
{
f << separator[j];
if (znam[j])
{
if (p[i][j] >= 0)
f << "+";
else
f << "-";
f << setw(width) << abs (p[i][j]) << setw(1);
}
else
{
f << setw(width) << p[i][j] << setw(1);
}
f << name[j] << " "; // vytiskni jedno cislo
}
f << endl; // konec radky
}
f << endl; // a jedna prazdna radka
}
void read(T p[M][N], string fileName)
{
ifstream h(fileName);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
h >> p[i][j];
if (! h.good() )
{
cerr << "Chyba pri cteni souboru " << fileName << endl;
exit (1);
}
h.close();
}
void pricti(T p[M][N], int target, int src, T koef = 1)
// pricti koef * radku s indexem src k radce s indexem target
{
for (int j = 0; j < N; j++)
p[target][j] = p[target][j] + koef * p[src][j];
// p[target][j] += koef * p[src][j];
}
void vydel(T p[M][N], int target, T koef)
// vydel radku s indexem target cislem koef
{
for (int j = 0; j < N; j++)
p[target][j] = p[target][j] / koef;
// p[target][j] /= koef ;
}
const T eps = 1e-9;
void prohod(T p[M][N], int start)
{
T nej = 0; // nejvetsi hodnota ( v absolutni hodnote )
int inx = -1; // nejvetsi hodnota byla na radku inx
for (int k = start + 1; k < M; k++) // pro radky "pod" radkou start
{
if (abs(p[k][start]) > nej)
{
nej = abs(p[k][start]); // zapamatovat hodnotu
inx = k; // zapamatovat index
}
}
if (abs(nej) < eps)
{
cerr << "Same nuly" << endl;
exit (0);
}
else
{
cout << "prohazuji radky " << start << " a " << inx << endl;
// prohodit radky s indexy start a inx
for (int j = 0; j < N; j++)
{
T tmp = p[start][j];
p[start][j] = p[inx][j];
p[inx][j] = tmp;
}
}
}
void uprav(T p[M][N])
{
for (int i = 0; i < M; i++)
{
if ( abs(p[i][i]) < eps )
{
prohod (p, i);
}
vydel(p, i, p[i][i]); // doufam, ze a[i][i] != 0
for (int k = 0; k < M; k++)
{
if (k != i) // pro radky jine nez radka i
{
pricti(p, k, i, -p[k][i]);
}
}
print(cout, p);
}
}
void priprav(T p[M][N], T r[N - 1])
// priprav pravou stranu matice p, aby resenim byla cisla z pole r
{
for (int i = 0; i < M; i++)
{
T v = 0;
for (int j = 0; j < N - 1; j++) // vynecham pravou stranu
{
v = v + p[i][j] * r[j];
}
p[i][N - 1] = v; // ulozim pravou stranu
}
}
T a[M][N];
int main()
{
clear(a);
read(a, "input.txt");
print(cout, a);
T reseni [N - 1] = { 3, 4, 5 };
priprav(a, reseni);
print(cout, a);
uprav(a);
ofstream f("abc.txt");
print(f, a);
f.close();
cout << "Data ze souboru abc.txt" << endl;
ifstream g("abc.txt");
while (g.good())
{
string t;
getline(g, t);
if (g.good())
{
cout << t << endl;
}
}
g.close();
cout << "O.K.";
}