こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語 ファイル出力について

このようなプログラムを作成しました。
エクセルでファイルを出力したいのですが…
ファイルは作成できたものの、内容が書かれていません。
とても困っています↓
自分の力不足なのでしょうがどなたかお願いします。

#include <stdio.h>
#include <process.h>
#define S 256
#define I 100
#define J 100
#define K 3 //グループの数

void sum(int u[][J],int N,int n);
void sort(int y[],int N,int u[][J],int n);
void group(int num[],int u[][J],int N,int n);
void passege(int groupm[][J],int groupn,int u[][J],int n,int N);


void main (void)
{
FILE *fp;
int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数
static int u[I][J];
char buf[S];

//ファイルオープン

if ((fp=fopen("data_i2_3.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);

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;
}

group(num,u,N,n);
}

void group(int num[],int u[][J],int N,int n)
{
int groupn,i,j,k=1; //groupn:グループの人数
static int groupm[K][I]; //groupm:グループのメンバー



groupn=N/K;

for(i=0;i<K;i++){
for(j=0;j<groupn;j++){
groupm[i][j]=num[k];
k+=1;
}
}

passege(groupm,groupn,u,n,N);
}

void passege(int groupm[][J],int groupn,int u[][J],int n,int N)
{
FILE *f;
int i,j,k=0,l,tt;
static int t[I]; //各グループの正解率
double p[K][J],pp=0.0;


//初期化
for(i=0;i<K;i++){
for(j=0;j<J;j++){
p[i][j]=0;
t[i]=0;
}
}

for(i=0;i<K;i++){
for(j=0;j<groupn;j++){
t[k]=groupm[i][j];
k+=1;
}
}

k=0;
for(i=0;i<K;i++){
for(j=1;j<=n;j++){
for(l=0;l<groupn;l++){
tt=t[k];
pp=pp+u[tt][j];

k+=1;
}

p[i][j]=pp/groupn;
pp=0.0;

if(i==0)
k=0;
else
k=groupn*i;
}
k=groupn*(i+1);
}

//ファイル出力

f=fopen("test1.csv","w");

//確認
putchar('\n');
for(i=0;i<K;i++){
for(j=1;j<=n;j++){
printf("%d群の項目%dの正解率は%fです\n",i,j,p[i][j]);

}
}
//ファイルを閉じる
fclose(f);

}

投稿日時 - 2009-01-17 19:02:01

QNo.4637971

すぐに回答ほしいです

質問者が選んだベストアンサー

>「j=j++;」の結果は未定義でも処理系依存でもありません。「明確に定義されている」ので勘違いしないように。

未定義ですよ。
「副作用完了点」の前に、代入とインクリメントという2つの副作用がありますので、未定義です。

副作用というのは、副作用完了点の前なら、どんなタイミングで行われても構いません。この場合、代入とインクリメントはどっちが先でもいいんです。演算子の優先順位と副作用とは関係がないんです。

C FAQ
http://www.kouno.jp/home/c_faq/c3.html

投稿日時 - 2009-01-19 14:57:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

>これは j++; と同義。
>必ずしもそうとばかりは言えません。
>j = j++;
>は未定義です。ある処理系では j++; と同じかもしれませんが、

嘘は書かないように。

「後置インクリメント式は、インクリメントする前の値を式の値とする」と決まっています。

そして「代入の=と、インクリメントの++では、インクリメントの++の方が優先順位が高い」と決まっています。

従って「j++が先に演算され、その後、インクリメントする前の値がjに代入される」と言うのは、どの処理系でも同じ筈です(つまり、何もしないのと同じな訳だが)

もし「そうではない」なら、そのコンパイラは「規格外」です。

「j=j++;」の結果は未定義でも処理系依存でもありません。「明確に定義されている」ので勘違いしないように。

投稿日時 - 2009-01-19 10:22:16

ANo.4

>> j=j++;
>> これは何をしたいのでしょうか。

>これは j++; と同義。

必ずしもそうとばかりは言えません。
j = j++;
は未定義です。ある処理系では j++; と同じかもしれませんが、
別の処理系では j = j; (つまり何もしない)と同じだったりします。
つまり、
j = j++;
と書くのはよろしくない、ということです。

投稿日時 - 2009-01-18 10:51:01

ANo.3

>printf("%d群の項目%dの正解率は%fです\n",i,j,p[i][j]);
>この部分を内容としてファイルに出力したいのですが…

fprintf(f,"%d群の項目%dの正解率は%fです\n",i,j,p[i][j]);

> j=j++;
> これは何をしたいのでしょうか。

これは j++; と同義。
jに代入する意味が無いという指摘ですよ。

投稿日時 - 2009-01-18 03:18:58

ANo.2

本題の原因は#1さんのおっしゃるとおりです。
ところで、

>j=j++;

これは何をしたいのでしょうか。

投稿日時 - 2009-01-17 19:15:46

補足

回答ありがとうございます。
正解率は、二次元配列で作成したので、
jを回しています。

投稿日時 - 2009-01-18 00:54:15

ANo.1

>エクセルでファイルを出力したいのですが…
>ファイルは作成できたものの、内容が書かれていません。
//ファイル出力
f=fopen("test1.csv","w");

//ファイルを閉じる
fclose(f);
の間に、肝心の「内容を書き出す」処理が一切ありませんが。

投稿日時 - 2009-01-17 19:09:24

補足

回答ありがとうございます。

printf("%d群の項目%dの正解率は%fです\n",i,j,p[i][j]);
この部分を内容としてファイルに出力したいのですが…
すみません。初心者で「内容を書き出す処理」というのがわかりません。
お願いします。

投稿日時 - 2009-01-18 00:51:08