Projekt 3

/* ========================================================================== */
/*                                                                            */
/*                                                                            */
/*   proj3.c                                                                  */
/*   (c) 2001 xmunkf00 Filip Munk                                             */
/*   xmunkf00@stud.fit.vutbr.cz                                               */
/*                                                                            */
/*============================================================================*/
/*                                                                            */
/*   Vypocty s maticemi.                                                      */
/*   Program dokaze vypocist soucet matice, sedlovy bod                       */
/*                                                                            */
/* ========================================================================== */
 
//////////////////////////////////
//Pripojeni hlavickovych souboru//
//////////////////////////////////
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
////////////////////////////////
//Konstanty a jine datove cosi//
////////////////////////////////
const char *FILEREAD="r";
/////////////////
//Text napovedy//
/////////////////
const char *HELP= "\nProgram pro vypocet matic (projekt 3).\n"
                  "Autor: Filip Munk (c) 2008\n\n"
                  "\t-h\tvytiskne tutu napovedu\n"
                  "\t-add   [soubor1][soubor2]\tscitani dvou matic\n"
                  "\t-mult  [soubor1][soubor2]\tnasobeni dvou matic\n"
                  "\t-expr  [soubor1][soubor2]\tvyraz s dvemi maticemi"
                  "\t-peaks [soubor] vypise pocet spicek v matici"
                  ;
 
////////////////////////////////////
//Texty Error hlasek a jejich kody//
////////////////////////////////////
 
#define TRUE 0
#define FALSE 1
enum errorCodes
{
    ERR_NO_ERROR
    ,ERR_HEAD
    ,ERR_NO_FILE
    ,ERR_BAD_MATRIX
    ,ERR_NO_FILE_NAME
    ,ERR_EMPTY_FILE
    ,ERR_MEMORY
    ,ERR_BAD_MATRIX_SIZE
    ,ERR_BAD_ARG
    ,ERR_BAD_SIZE_FOR_MULT
    ,ERR_BAD_MATRIX_INPUT_SIZE
    ,ERR_NO_MORE_NUM
};
enum anyTextCodes
{
    TXT_TRUE
    ,TXT_FALSE
};
//------------------------------//
const char * ANY_TEXT[] =
{
    "True"
    ,"False"
    ,""
};
const char * ERROR_TEXT[] =
{
    ""
    ,"\nERROR:\n"
    ,"Zadany soubor neexistuje."
    ,"Neplatna velikost matice."
    ,"Nebyl zadan nazev souboru."
    ,"Soubor je zrejme prazdny."
    ,"Chya pri alokaci pametu."
    ,"Matice musi byt stejne velke."
    ,"Chyba v argumentech programu."
    ,"Tyto dve matice neni mozne nasobit kvuli nevhodne velikosti."
    ,"Neplatne zadani velikosti matice!"
    ,"V souboru s matici neni spravny pocet clenu pro zadanou velikost"
 
};
///////////////////////////////////////
//Moznosti pouziti funkci any_print()//
///////////////////////////////////////
#define NN 0
enum anyPrintCodes
{
    PRINT_ERROR
    ,PRINT_TEXT
    ,PUT_CHAR
    ,PRINT_HELP
    ,PRINT_INT
    ,WRITE_LINE
 
};
////////////////////////////////////
//Definice vlastnich datovych typu//
////////////////////////////////////
typedef struct mat
{
    int rows;
    int cols;
    int **matrix;
    int error_code;
} Tmatrix;
/////////////////////////////////////////
//Fukce pro ruzne druhy tisku na vystup//
/////////////////////////////////////////
void any_print(int how, int what)
{
    switch (how)
 
    {
    case PRINT_ERROR:  //tiskne ERROR  na stderr z konstanty ERROR_TEXT
        fprintf(stderr,"%s",ERROR_TEXT[ERR_HEAD]);
        fprintf(stderr,"%s",ERROR_TEXT[what]);
        any_print(WRITE_LINE,NN);
        break;
    case PUT_CHAR:  //tiskne znak zadaneho ASCII kodu
        putchar(what);
        break;
    case PRINT_HELP: //tiskne napovedu
        printf("%s",HELP);
        break;
    case PRINT_INT: //tiskne cislo
        printf("%d", what);
        break;
    case WRITE_LINE: //vlozi dalsi radku
        putchar('\n');
        break;
    case PRINT_TEXT:  //tiskne text na stdout z konstanty ANY_TEXT
        printf("%s",ANY_TEXT[what]);
        any_print(WRITE_LINE,NN);
        break;
    }
}
int check_error(int error)
{
    if (error== ERR_NO_ERROR) return TRUE;
    return FALSE;
}
 
Tmatrix clean_matrix(Tmatrix matrix)
{
    int col=0;
    int row=0;
    while (col<matrix.cols)
    {
        while (row<matrix.rows)
        {
            matrix.matrix[row][col]=0;
            row++;
        }
        col++;
        row=0;
    }
    return matrix;
}
Tmatrix alloc_matrix(Tmatrix matrix)
{
 
    matrix.matrix = (int **) malloc(matrix.rows*sizeof(int*));
    if (matrix.matrix == NULL)
    {
 
        matrix.error_code=ERR_MEMORY;
        }
    for (int i = 0; i < matrix.rows; i++)
    {
        matrix.matrix[i] =(int *) malloc(matrix.cols*sizeof(int));
        if (matrix.matrix[i] == NULL)
    {
        i=matrix.rows;
        matrix.error_code=ERR_MEMORY;
        ;}
    }
    if(check_error(matrix.error_code)==TRUE) matrix=clean_matrix(matrix);
    return matrix;
}
void print_matrix(Tmatrix matrix)
{
    int col=0;
    int row=0;
    while (col<matrix.cols)
    {
        while (row<matrix.rows)
        {
            any_print(PRINT_INT, matrix.matrix[row][col]);
            any_print(PUT_CHAR,'\t');
            row++;
        }
        col++;
        row=0;
        any_print(WRITE_LINE,NN);
 
    }
 
}
///////////////////////////////////////////////////////
//Nacteni matice ze souboru. parametr - nazev souboru//
///////////////////////////////////////////////////////
Tmatrix read_matrix(char *fileName)
{
    FILE * fofr;
    Tmatrix matrix = {.matrix= NULL};
    int row=0;
    int col=0;
    fofr=fopen(fileName, FILEREAD);
    if (fofr!=NULL)
    {
        fscanf(fofr,"%d %d",&matrix.rows, &matrix.cols);
        matrix=alloc_matrix(matrix);
 
        while (col<matrix.cols)
        {
            while (row<matrix.rows)
            {
                fscanf(fofr,"%d", &matrix.matrix[row][col]);
                row++;
            }
            col++;
            row=0;
 
        }
    }
    else
    {
        matrix.error_code=ERR_NO_FILE;
    }
//free(matrix.matrix);
    return matrix;
}
//////////////////
//Nasobeni matic//
//////////////////
Tmatrix mult_matrix(Tmatrix matrixA, Tmatrix matrixB)
{
    int rowA=0;
    int colA=0;
    int rowB=0;
    int colB=0;
    int rowC=0;
    int colC=0;
 
    Tmatrix matrixC={.error_code=0};
    if (matrixA.cols==matrixB.rows)
 
    {
        matrixC.cols=matrixA.cols;
        matrixC.rows=matrixB.rows;
        matrixC=alloc_matrix(matrixC);
        while (colC<matrixC.cols)
        {
            while (rowC<matrixC.rows)
            {
                while (rowA<matrixB.cols)
                {
                    matrixC.matrix[rowC][colC]+=matrixB.matrix[rowB][colB]*matrixA.matrix[rowA][colA];
                    colB++;
                    rowA++;
                }
                colB=0;
                rowA=0;
                rowB++;
                rowC++;
            }
            rowB=0;
            rowC=0;
            colC++;
            colA++;
        }
    }
    else matrixC.error_code=ERR_BAD_SIZE_FOR_MULT;
    return matrixC;
}
/////////////////
//Scitani matic//
/////////////////
Tmatrix add_matrix(Tmatrix matrixA, Tmatrix matrixB)
{
    Tmatrix matrixC = {.matrix=NULL};
    int col=0;
    int row=0;
    if (matrixA.rows== matrixB.rows && matrixA.cols==matrixB.cols)
    {
        matrixC.rows=matrixB.rows;
        matrixC.cols=matrixA.cols;
        matrixC=alloc_matrix(matrixC);
        while (col<matrixC.cols)
        {
            while (row<matrixC.rows)
            {
                matrixC.matrix[row][col]=matrixA.matrix[row][col]+matrixB.matrix[row][col];
                row++;
            }
            col++;
            row=0;
        }
    }
    else
    {
        matrixC.error_code=ERR_BAD_MATRIX_SIZE;
        matrixC.matrix =NULL;
    }
    return matrixC;
}
////////////////////
//Dealokace matice//
////////////////////
void dealloc_matrix(Tmatrix matrix)
{
    if (matrix.matrix == NULL) matrix.error_code=ERR_MEMORY;
    for (int i = 0; i < matrix.rows; i++)
    {
        free(matrix.matrix[i]);
    }
    free(matrix.matrix);
}
///////////////
//Sedlovy bod//
///////////////
 
int saddle_point(Tmatrix matrix)
{
    int result=FALSE;
    int minrow=0;
    int maxcol=0;
    int row= 0;
    int col=0;
    int maxinrow=0;
    int maxincol=0;
    int mininrow=0;
    int minincol=0;
    int colc=0;
 
    maxcol=matrix.matrix[row][col];
    minrow=matrix.matrix[row][col];
while(colc<matrix.cols)
{
while(row< matrix.cols){
if(minrow>matrix.matrix[row][colc]){
    minrow=matrix.matrix[row][colc];
    mininrow=row;
    minincol=col;
}
 
    row++;
    }
    row=mininrow;
    col=0;
while(col< matrix.cols)
{
if(maxcol<matrix.matrix[row][col]){
    maxcol=matrix.matrix[row][col];
maxinrow=row;
maxincol=col;
 
}
    col++;
    }
    any_print(WRITE_LINE,NN);
    any_print(WRITE_LINE,NN);
    any_print(PRINT_INT, mininrow);
    any_print(PRINT_INT, minincol);
        any_print(WRITE_LINE,NN);
    any_print(PRINT_INT, maxinrow);
    any_print(PRINT_INT, maxincol);
    any_print(WRITE_LINE,NN);
    any_print(WRITE_LINE,NN);
    colc++;
    row=0;
    col=0;
    minrow=matrix.matrix[row][colc];
    maxcol=matrix.matrix[row][colc];
    maxincol=0;
    maxinrow=0;
    mininrow=0;
    minincol=0;
}
result=maxcol;
    return result;
 
 
}
///////////////////
//Spicky v matici//
///////////////////
int peaks_matrix(Tmatrix matrixA)
{
    int count=0;
    int row=0;
    int col=0;
    Tmatrix matrixB= {.matrix=NULL};
    matrixB.rows=matrixA.rows+2;
    matrixB.cols=matrixA.cols+2;
    matrixB=alloc_matrix(matrixB);
 
    row=matrixB.rows-1;
    while (col<matrixB.cols)
    {
        matrixB.matrix[row][col]=-2147483647;
        col++;
    }
    col=0;
    row=0;
    while (col<matrixB.cols)
    {
        matrixB.matrix[row][col]=-2147483647;
        col++;
    }
///////////////////////////////////////////////
    row=0;
 
    col=matrixB.cols-1;
    while (row<matrixB.rows)
    {
        matrixB.matrix[row][col]=-2147483647;
        row++;
    }
    row=0;
    col=0;
    while (row<matrixB.rows)
    {
        matrixB.matrix[row][col]=-2147483647;
        row++;
    }
    col=0;
    row=0;
    while (col<matrixA.cols)
    {
        while (row<matrixA.rows)
        {
            matrixB.matrix[row+1][col+1]=matrixA.matrix[row][col];
            row++;
        }
        row=0;
        col++;
    }
    col=0;
    row=0;
    while (col<matrixA.cols)
    {
        while (row<matrixA.rows)
        {
            if (matrixB.matrix[row][col]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row][col+1]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row+1][col]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row+2][col+1]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row+1][col+2]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row+2][col+2]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row][col+2]<matrixB.matrix[row+1][col+1]
                    && matrixB.matrix[row+2][col]<matrixB.matrix[row+1][col+1])
            {
                count++;
            }
 
            row++;
        }
        row=0;
        col++;
    }
 
 
 
dealloc_matrix(matrixB);
    return count;
}
//////////////
//expr_matic//
//////////////
Tmatrix expr_matrix(Tmatrix matrixA, Tmatrix matrixB)
{
    Tmatrix matrixC;
    matrixC.rows=matrixA.rows;
    matrixC.cols=matrixA.cols;
    //matrixC=alloc_matrix(matrixC);
    matrixC=mult_matrix(matrixA,matrixB);
 
    return add_matrix(matrixC,matrixC);
}
//////////////////////////////////////
//Prepinani podle zadanych argumentu//
//////////////////////////////////////
int main(int argc, char *argv[])
{
    Tmatrix matrixA ={.matrix=NULL};
    Tmatrix matrixB ={.matrix=NULL};
    Tmatrix matrixC ={.matrix=NULL};
    int count;
    if (argc==4 && (strcmp(argv[1],"-add")==TRUE || strcmp(argv[1],"-mult")==TRUE|| strcmp(argv[1],"-expr")==TRUE))
    {
        if (strcmp(argv[1],"-add")==TRUE)
        {
 
            matrixA=read_matrix(argv[2]);
            matrixB=read_matrix(argv[3]);
            if (matrixA.matrix!=NULL && matrixB.matrix !=NULL)
            {
                matrixC=add_matrix(matrixA,matrixB);
                if (check_error(matrixC.error_code)==TRUE)
                {
                    print_matrix(matrixC);
 
 
                }
                else
                {
                    any_print(PRINT_ERROR,matrixC.error_code);
                }
            }
        }
        if (strcmp(argv[1],"-mult")==TRUE)
        {
 
            matrixA=read_matrix(argv[2]);
            matrixB=read_matrix(argv[3]);
            if (matrixA.matrix!=NULL && matrixB.matrix !=NULL)
            {
                matrixC=mult_matrix(matrixA, matrixB);
                if (check_error(matrixC.error_code)==TRUE)
                {
                    print_matrix(matrixC);
 
 
                }
                else
                {
                    any_print(PRINT_ERROR,matrixC.error_code);
                }
            }
        }
        if (strcmp(argv[1],"-expr")==TRUE)
        {
 
            matrixA=read_matrix(argv[2]);
            matrixB=read_matrix(argv[3]);
            if (matrixA.matrix!=NULL && matrixB.matrix !=NULL)
            {
                matrixC=expr_matrix(matrixA, matrixB);
                if (check_error(matrixC.error_code)==TRUE)
                {
                    print_matrix(matrixC);
 
 
                }
                else
                {
                    any_print(PRINT_ERROR,matrixC.error_code);
                }
            }
        }
    }
    else if (argc==3 && (strcmp(argv[1],"-peaks")==TRUE
                         || strcmp(argv[1],"-saddle")==TRUE
                         ))
    {
        if (strcmp(argv[1], "-peaks")==TRUE)
        {
            matrixA=read_matrix(argv[2]);
            if (matrixA.matrix!=NULL && check_error(matrixA.error_code==TRUE))
                count=peaks_matrix(matrixA);
            any_print(PRINT_INT,count);
            any_print(WRITE_LINE,NN);
        }
        else
        {
            any_print(PRINT_ERROR,matrixC.error_code);
 
        }
 
        if (strcmp(argv[1], "-saddle")==TRUE)
            {
                matrixA=read_matrix(argv[2]);
                count=saddle_point(matrixA);
                //any_print(PRINT_INT,count);
                }
        if (strcmp(argv[1], "-drot")==TRUE)
            {}
        if (strcmp(argv[1], "-plought")==TRUE)
            {}
    }
    else if (argc < 3)
    {
        if (strcmp(argv[1], "-h")==TRUE)
        {
            any_print(PRINT_HELP,NN);
        }
        else
        {
            any_print(PRINT_ERROR,ERR_BAD_ARG);
        }
    }
    dealloc_matrix(matrixA);
    dealloc_matrix(matrixB);
    dealloc_matrix(matrixC);
    return EXIT_SUCCESS;
 
}
/////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//#############################################################//
//##################!! konec proj3.c  !!#######################//
//#############################################################//
/////////////////////////////////////////////////////////////////