• 締切済み

c言語についての質問です

#include<stdio.h> #define N 3 void inputAns(int *row,int *col,int data[][N]); void printAns(int ID,int data[][N]); int main(){ int row[N]={2,3,6},col[N]={8,5,3},answer[N][N]; int i,ID; printf("Input your ID number :\n"); scanf("%d",&ID);inputAns(row,col,answer); printAns(ID,answer); return(1); } void inputAns(int *row,int *col,int data[][N]){ int i,j; printf(" Input Answers of matrxi Q :\n"); for(i=0;i<N;i++){ for(j=0; j<N; j++){ printf("%2d+%2d=",row[i],col[j]); scanf("%d",&data[i][j]); } } } void printAns(int ID, int data[][N]){ FILE *fp; int i,j; fp=fopen("ans.dat","a+t"); fprintf(fp,"%d\n",ID); for(i=0; i<N; i++){ for(j=0; j<N; j++) fprintf(fp," %3d",data[i][j]); fprintf(fp,"\n"); } fclose(fp); } この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 >./a.exe ID=50413001 [ 9/9 ] ID=50413002 [ 5/9 ] ID=50413003 [ 7/9 ] ID=50413004 [ 6/9 ] ID=50413005 [ 5/9 ] == correct rate === 4/5 3/5 5/5 5/5 1/5 4/5 4/5 1/5 5/5 =================== > 読み込むファイル(ans.dat)は以下のものです。 50413001 10 7 5 11 8 6 14 11 9 50413002 10 7 5 11 9 5 13 10 9 50413003 10 7 5 11 5 6 14 10 9 50413004 10 11 5 11 5 6 14 10 9 50413005 9 11 5 11 5 6 14 10 9 読み込みから集計がうまくいかず困っています。 どなたか教えてくれませんか?

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 ただただ、「以下のような画面」を出力するだけのプログラムを投稿します。 そのため、 ・百マス計算の答えを入力 ・答えを、ファイルに出力 を省いています。 というか、この2つの機能と今回の「判定」機能は、プログラムとして分けた方が楽かと思います。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define N 3 // 百マス = 正方行列 #define NUM 5 // 回答数 void MakeKai( int *row, int *col, int iSeikai[][ N ] ); void Hantei( FILE *fp, int iSeikai[][ N ], int iData[][ N ][ N ] ); void CorrectRate( int iSeikai[][ N ], int iData[][ N ][ N ] ); int main() {  int row[ N ] = { 2, 3, 6 }, col[ N ] = { 8, 5, 3 };  int iData[ NUM ][ N ][ N ], iSeikai[ N ][ N ];  FILE *fp;  MakeKai( row, col, iSeikai );  fp = fopen( "ans5.dat", "r" );  if( NULL == fp ) return( 9 );  Hantei( fp, iSeikai, iData );  fclose( fp );  CorrectRate( iSeikai, iData );  return( 1 ); } void MakeKai( int *row, int *col, int iSeikai[][ N ] ) {  int m, n;  for( m = 0; m < N; m++){   for( n = 0; n < N; n++ ){    iSeikai[ m ][ n ] = row[ m ] + col[ n ];   }  } } void Hantei( FILE *fp, int iSeikai[][ N ], int iData[][ N ][ N ] ) {  int i, kk, m, n, iD, iOk, iAns;  char cBuf[ 64 ];  for( i = 0; i < NUM; i++ ){   fgets( cBuf, 64, fp );   iD = atoi( cBuf );   printf( "ID=%d", iD );   iOk = 0;   for( m = 0; m < N; m++ ){    fgets( cBuf, 64, fp );    kk = 0;    for( n = 0; n < N; n++ ){     iAns = atoi( &cBuf[ kk ] );     iData[ i ][ m ][ n ] = iAns;     if( iAns == iSeikai[ m ][ n ] ) iOk++; // 判定     while( isdigit( cBuf[ kk ] ) ) kk++;     kk++; // デリミタ    }   }   printf( " [ %d/%d ]\n", iOk, ( N * N ) );  } } void CorrectRate( int iSeikai[][ N ], int iData[][ N ][ N ] ) {  int i, m, n, iOk;  printf( "== correct rate ===\n" );  for( m = 0; m < N; m++ ){   for( n = 0; n < N; n++ ){    iOk = 0;    for( i = 0; i < NUM; i++ ){     if( iData[ i ][ m ][ n ] == iSeikai[ m ][ n ] ) iOk++; // 判定    }    printf( "%d/%d ", iOk, NUM );   }   printf( "\n" );  }  printf( "===================\n" ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

私についていえば, 「どううまくいかないのか」が分からないとコメントのしようもないなぁと思って放置しただけです>#1. そもそもこの「画面出力」とやらをどう導けばいいのかすら書かれてないし.

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>この百マス計算のプログラム どこが百マス計算なのかわからないのが、まず一つ。 >28行目からを書き換えて ということは、 >fp=fopen("ans.dat","a+t"); この行は書き換え対象外ですね。にもかかわらず >読み込むファイル(ans.dat) と書いてあるのは、ファイルのオープンモードと矛盾していませんか? 投稿から何時間もたっているのに回答が付かなかったのは、つまるところ 「質問者さんが何をしたいのか、ここを見ている人たちにはよくわからない」ということではないか、と。 というわけで、 >読み込みから集計がうまくいかず その、うまくいかない、というコードをさらしてみてはどうでしょう。