input.txt

2  4  4  42
1  2  7  46
2  2  0  14
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
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.";
}
 
soustava2019.txt · Last modified: 2019/10/22 12:55 by 147.32.8.110
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki