#include "stdio.h"
#include "stdlib.h"
//#include "time.h"

// マクロ定数
#define MAX_ROW 9
#define MAX_COL 9


// 関数のプロトタイプ宣言
void   Init( int [][MAX_COL]);
void   Draw( int [][MAX_COL] );
int    GetMaxValue_of_Row( int, int [][MAX_COL] );
int    GetMaxValue_of_Col( int, int [][MAX_COL] );
int    GetMinValue_of_Row( int, int [][MAX_COL] );
int    GetMinValue_of_Col( int, int [][MAX_COL] );
double GetAverageValue_of_Row( int, int [][MAX_COL] );
double GetAverageValue_of_Col( int, int [][MAX_COL] );


// メイン
int main()
{
    int     data1[MAX_ROW][MAX_COL];

    // srand((unsigned)time(NULL));
    Init( data1 );
    Draw( data1 );

    return  0;
}


void Init( int dat[][MAX_COL] )
{
    int     i, j;

    for( i = 0; i < MAX_ROW; i++ ){
        for( j = 0; j < MAX_COL; j++ ){
            dat[i][j] = rand() % 100;
        }
    }
}


void Draw( int dat[][MAX_COL] )
{
    int     i, j;

    // 力技フォーマット…正直どうにかしたい…
    printf("data ");
    for( i = 0; i < MAX_COL; i++ ) printf("     ");
    printf("max  min  ave\n");

    // 横計算出力
    for( i = 0; i < MAX_ROW; i++ ){
        printf( "   " );
        for( j = 0; j < MAX_COL; j++ ){
            printf( "%5d", dat[i][j] );
        }

        printf( "%5d", GetMaxValue_of_Col( i, dat ) );
        printf( "%5d", GetMinValue_of_Col( i, dat ) );
        printf( "%5.1f", GetAverageValue_of_Col( i, dat ) );
        printf( "\n" );
    }

    // 縦計算出力
    printf( "max" );
    for( i = 0; i < MAX_COL; i++ ) printf( "%5d", GetMaxValue_of_Row( i, dat ) );
    printf( "\n" );

    printf( "min" );
    for( i = 0; i < MAX_COL; i++ ) printf( "%5d", GetMinValue_of_Row( i, dat ) );
    printf( "\n" );

    printf( "ave　" );
    for( i = 0; i < MAX_COL; i++ ) printf( "%5.1f", GetAverageValue_of_Row( i, dat ) );
    printf( "\n" );
}


int GetMaxValue_of_Row( int row, int dat[][MAX_COL] )
{
    int     i;
    int     max = 0;

    for ( i = 0; i < MAX_ROW; i++ ){
        if ( dat[i][row] > max ){
            max = dat[i][row];
        }
    }
    return max;
}


int GetMaxValue_of_Col( int col, int dat[][MAX_COL] )
{
    int     i;
    int     max = 0;

    for ( i = 0; i < MAX_COL; i++ ){
        if( dat[col][i] > max ){
            max = dat[col][i];
        }
    }
    return max;
}


int GetMinValue_of_Row( int row, int dat[][MAX_COL] )
{
    int     i;
    int     min = 99;

    for ( i = 0; i < MAX_ROW; i++ ){
        if ( dat[i][row] < min ){
            min = dat[i][row];
        }
    }
    return min;
}


int GetMinValue_of_Col( int col, int dat[][MAX_COL] )
{
    int     i;
    int     min = 99;

    for ( i = 0; i < MAX_COL; i++ ){
        if ( dat[col][i] < min ){
            min = dat[col][i];
        }
    }
    return min;
}


double GetAverageValue_of_Row( int row, int dat[][MAX_COL] )
{
    int     i;
    int     sum = 0;

    for( i = 0; i < MAX_ROW; i++ ){
        sum += dat[i][row];
    }

    return (double)sum/MAX_ROW;
}


double GetAverageValue_of_Col( int col, int dat[][MAX_COL] )
{
    int     i;
    int     sum = 0;

    for( i = 0; i < MAX_COL; i++ ){
        sum += dat[col][i];
    }

    return (double)sum/MAX_COL;
}