/* mkmat.c created in 2007.01.16 by DEGUCHI Hiroshi */ #include #define BUFSIZE 255 /* バッファサイズ */ #define NUM 30 /* 最大人数 */ /* メンバーファイル */ char memfile[BUFSIZE] = "members.txt"; FILE *mfp = NULL; /* 勝敗ログファイル */ char cfile[BUFSIZE] = "clog.txt"; FILE *cfp = NULL; /* 勝敗行列CSVファイル */ char hmfile[BUFSIZE] = "hexmat.csv"; FILE *hmfp = NULL; int num; /* 人数 */ char names[NUM][BUFSIZE]; /* 名簿 */ int cmat[NUM][NUM]; /* 勝敗行列 */ int wnum[NUM]; /* 勝ち数合計 */ int sortf = 0; /* ソートフラグ */ int order[NUM]; /* 勝ち数順 */ void swap( int *x, int *y ) { int t; t = *x, *x = *y, *y = t; } int getnum( char *name ) { int i; for( i = 0; i < num; i++ ) { if( strcmp( names[i], name ) == 0 ) return( i ); } printf("%sは名簿(%s)にありません。\n", name, memfile ); exit(1); } int main( int argc, char *argv[] ) { int i, j, k; char mem1[BUFSIZE], mem2[BUFSIZE]; char line[BUFSIZE]; if( argc > 1 ) sortf = 1; if( (mfp = fopen(memfile,"r") ) == NULL ) { printf("メンバーファイル(%s)が開けませんでした。\n", memfile ); exit(1); } for( i = 0; i < NUM; i++ ) { if( fscanf( mfp, "%s", names[i] ) < 1 ) break; } num = i; fclose( mfp ); if( (cfp = fopen(cfile,"r") ) == NULL ) { printf("勝敗ログファイル(%s)が開けませんでした。\n", cfile ); exit(1); } while( fgets( line, BUFSIZE, cfp ) > 0 ) { if( sscanf( line, "%s %s", mem1, mem2 ) < 2 ) break; cmat[getnum(mem1)][getnum(mem2)]++; } fclose( cfp ); for( i = 0; i < num; i++ ) { for( j = 0; j < num; j++ ) wnum[i] += cmat[i][j]; order[i] = i; } if( sortf ) { for( i = num-1; i >= 1; i-- ) for( j = 0; j < i; j++ ) if( wnum[order[j]] < wnum[order[j+1]] ) swap(&order[j], &order[j+1]); } if( (hmfp = fopen(hmfile,"w") ) == NULL ) { printf("勝敗行列CSVファイル(%s)が作られませんでした。\n", hmfile ); exit(1); } fprintf( hmfp, ","); for( j = 0; j < num; j++ ) fprintf( hmfp, "%s,", names[order[j]]); fprintf( hmfp, "win\n"); for( i = 0; i < num; i++ ) { fprintf( hmfp, "%s,", names[order[i]]); for( j = 0; j < num; j++ ) fprintf( hmfp, "%d,", cmat[order[i]][order[j]]); fprintf( hmfp, "%d\n", wnum[order[i]]); } fclose( hmfp ); } /* end of mkmat.c */