Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- using namespace std;
- void mat(double** matice, int N, int M, int res);
- void vypis(double** matice,int N, int n, int m);
- void PocReseni(double** matice, double* r, int N, int M, int res);
- double det(double** matice, int N, int M);
- int main(int argc, char** argv){
- int M, N, res, n, m;
- char vstup,vstup2;
- cout << "Vitejte v programu na vypocet Gausovy eliminace a determinantu." << endl;\
- cout << endl << "Nyni vyberte jednu z moznosti:" << endl;
- cout << endl << "a: Zadani matice z klavesnice" << " b: Zadani matice ze souboru" << endl;
- cin >> vstup;
- if(cin.fail()){
- cout << "Nespravny vstup." << endl;
- return 0;
- }
- switch(vstup){
- case 'a':{
- cout << "Zadejte rozmer matice (pocet radku, poctet sloupcu vcetne prave strany matice):" << endl;
- cin >> N >> M;
- if(cin.fail() || N <= 0 || M <= 0){
- cout << "Nespravny vstup." << endl;
- return 0;
- }
- double **matice = new double*[M];
- for(int i = 0;i < M;i++) {
- matice[i] = new double[N];
- }
- cout << "Zadejte hodnoty matice (po radcich):" << endl;
- for (int i = 0; i < N; i++){
- for (int j = 0; j < M; j++){
- cin >> matice[i][j];
- if(cin.fail()){
- cout << "Nespravny vstup." << endl;
- return 0;
- }
- //if(M == N)
- //matice[i][M+1] = 0;
- }
- }
- if(M == N){ //pokud je matice ctvercova
- M++;
- res = M-2;
- n = N-1;
- m = M-1;
- }
- else{
- res = M;
- n = N;
- m = M;
- }
- cout << endl << "Matice byla uspesne nactena." << endl;
- cout << endl << "Zadana matice:" << endl;
- vypis(matice, N, n, m);
- cout << endl << "Vyberte jakou operaci chcete dal provest:" << endl;
- cout << endl << "a: Gaussovu eliminaci" << " b: Vypocet determinantu" << endl;
- cin >> vstup2;
- if(cin.fail()){
- cout << "Nespravny vstup." << endl;
- cin.clear();
- delete[] matice;
- return 0;
- }
- switch(vstup2){
- case 'a':
- mat(matice, N, M, res);
- cout << endl;
- cout << "Matice v trojuhelnikovem tvaru:" << endl;
- vypis(matice, N, n, m);
- cin.clear();
- /*for(int i = 0; i < N; i++) {
- delete [] matice[i];
- } */
- break;
- case 'b':
- cout << endl << "Determinant = ";
- det(matice, N, M);
- break;
- default:
- cout << "Nespravny vstup." << endl;
- break;
- }
- delete[] matice;
- break;
- }
- case 'b':
- cout << "Hello world" << endl;
- break;
- default:
- cout << "Nespravny vstup." << endl;
- break;
- }
- return 0;
- }
- void mat(double** matice, int N, int M, int res){
- int max = 0,pr = 0;
- double pom;
- for(int i = 0; i < N; i++){
- max = i;
- for(int j = i + 1; j < N; j++)
- if(fabs(matice[j][i])>fabs(matice[i][i]))
- max = j;
- for(int k = i; k < M; k++){
- pom = matice[i][k];
- matice[i][k] = matice[max][k];
- matice[max][k]=pom;
- }
- for(int j = i + 1; j < N; j++)
- for(int k = N; k >= i; k--)
- if(matice[i][i] != 0)
- matice[j][k]= matice[j][k] - matice[i][k] * matice[j][i] / matice[i][i];
- }
- double *r = new double[N]; // reseni soustavy
- for(int i = 0; i < N; i++)
- r[i] = matice[i][res];
- if(pr == 0){
- for(int j = N - 1; j >= 0; j--){
- pom = 0;
- for(int k = j + 1; k <= N; k++)
- pom = pom + matice[j][k]*r[k];
- r[j] = (matice[j][N] - pom) / matice[j][j];
- }
- }
- PocReseni(matice, r, N, M, res);
- }
- void vypis(double** matice, int N, int n, int m)
- {
- for(int i = 0; i < N; i++){
- for(int j = 0; j < m; j++)
- {
- cout.setf(ios::fixed);cout.precision(2);
- cout << matice[i][j] << "\t";
- if(j == n - 1)
- cout << "| ";
- if(j == n)
- cout << endl;
- }
- }
- }
- void PocReseni(double** matice, double* r, int N, int M, int res){
- double *mpr = new double[N];
- for(int i = 0; i < N; i++)
- mpr[i] = matice[i][res]; //prave strany
- int p = 0, pr = 0;
- for(int j = 0; j < res; j++){
- while(p < N){
- if(matice[p][j] == 0){
- if(mpr[p] == 0) //nekonecne reseni
- pr = 1;
- else if(mpr[p] != 0) //zadne reseni
- pr = 2;
- break;
- }
- else{
- pr = 0; //jedno reseni
- p++;
- }
- }
- }
- if(pr == 1)
- cout << endl << "Soustava ma nekonecne mnoho reseni." << endl;
- else if(pr == 2)
- cout << endl << "Soustava nema reseni." << endl;
- else if(pr == 0){
- cout << endl << "Soustava ma jedno reseni:" << endl;
- int k = 1;
- for (int i = 0; i < N; i++){
- cout.setf(ios::fixed);cout.precision(2);
- cout << "k" << k << " = " << r[i] << "\t";
- k++;
- }
- cout << endl;
- }
- }
- double det(double** matice, int N, int M){
- int subi, subj;
- double d = 0;
- double **mat = new double*[M];
- for(int i = 0;i < M;i++) {
- mat[i] = new double[N-1];
- }
- /*if (N-1 == 2){
- return( (matice[0][0] * matice[1][1]) - (matice[1][0] * matice[0][1]));
- } */
- //else{
- for(int c = 0; c < N-1; c++){
- subi = 0;
- for(int i = 1; i < N-1; i++){
- subj = 0;
- for(int j = 0; j < N-1; j++){
- if (j == c){
- continue;
- }
- mat[subi][subj] = matice[i][j];
- subj++;
- }
- subi++;
- }
- d += (pow(-1 ,c) * matice[0][c] * det(mat, N, M));
- }
- //}
- return d;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement