• 締切済み

エラーは出ませんが、実行結果ができません。

このプログラムなんですが、エラーは出ませんが結果が 0群の項目1の正解率は0.000000です 1群の項目1の正解率は0.000000です 2群の項目1の正解率は0.000000です… この様になり、正解率がでません… 初心者で、わからないので困っています。 お願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 //#define M 50//サブコンテンツの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void gunwake(int y[],int start,int N,int gunnum); void passege(int y[],int div[],int N,int num[],int u[][J],int n); static int y[I]; int div[K-1]; int divyouso=0; void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; static int num[I]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_1.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); gunwake(y,0,N,K); passege(y,div,N,num,u,n); fclose(fp); } void sum(int u[][J],int N,int n) { //static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } } void gunwake(int y[],int start,int N,int gunnum){ int tmp; int i,up,down,real; if(gunnum>1){ tmp=N/gunnum+start; //printf("tmp:%d\n",tmp); for(i=tmp;y[tmp]==y[i];i--){ } down = i + 1; //printf("down:%d\n",down); for(i=tmp;y[tmp]==y[i];i++){ } up =i; //printf("up:%d/n",up); if(tmp-down > up-tmp) real=up; else real=down; div[divyouso]=real; divyouso++; printf("%d\n",real); gunwake(y,real,N-real,gunnum-1); } } void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; int pp[I][J]; div2[0]=0; div2[K]=n; for(i=0;i<K-1;i++){ div2[i+1]=div[i]; } for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; for(i=div2[k];i<div2[k+1];i++){ pp[k][j]=pp[k][j]+u[num[i]][j]; } } } //確認 putchar('\n'); for(j=1;j<=n;j++){ for(k=0;k<K;k++){ printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); } } }

みんなの回答

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

#1さんの書かれたとおり、 >int pp[I][J]; >printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); 小数点以下の値を含めて%fで出力したいのであれば、変数がint型ではまずいです。 ところで、 >kou=kou++; >j=j++; これらの文は何を意図しているのでしょうか。 kouやjをインクリメントしたいのであれば、 kou++; j++; でじゅうぶんです。 お書きになったコードは、規格上未定義のはずです。コンパイルエラーは出ませんけれど。

nao0828
質問者

補足

ありがとうございます。 intをdoubleに変えて実行しました。 passegeの部分は void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; double pp[I][J]; int p; div2[0]=0; div2[K]=N;//N:人数 for(i=0;i<K-1;i++){ div2[i+1]=div[i]; printf("div2=%d\n",div2[i+1]); } //pp[k][j]の初期化 for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; } } for(k=0;k<K;k++){//K群の数 for(j=0;j<n;j++){//n問題の数 for(i=div2[k];i<div2[k+1];i++){ p=num[i]; //printf("%d\n",p); pp[k][j]=pp[k][j]+u[p][j]; printf("%f\n",pp[k][j]); } //正答率=正答率/群の人数 } } } にしたのですがまだ実行しても正解率は0.0000のままです… どうすればうまくでるのでしょうか…お願いします!!!

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

printf で表示するデータと書式があってないことってよくあるよね.

nao0828
質問者

補足

そうだったんですか… 今後注意を払って組んでいくようにします。 ありがとうございます!!!