プロが教える店舗&オフィスのセキュリティ対策術

C言語で、条件をつけて値の合計を求めようと試みているのですが、以下のプログラムの「ここから下」の部分が機能していません。行いたいプログラム自体は間違っていないと思うのですが、機能しない理由がわかりません。修正方法を教えていただければ幸いです。
まず、何が目的なのかを説明します。
「TEST.csv」ファイルを読み込み、1列目の値一致しているもので、日付がt期とt+365期(ここでは2010年4月1日と2011年4月1日のみ該当)が存在すれば、4列目の値を合計します。この部分は上手く値の合計を求めてくれています。
問題なのは、「ここから下」の部分なのですが、ここでは、先ほどの計算で使われたt期の4列目の値の合計と、t+360期の4列目の値の合計を求めたいのですが、上手くいっていません。

「TEST.csv」の内容と、現状および目標のoutputは以下のとおりです。
------TEST.csv---------
100,2010/04/01,141,1
150,2010/04/01,412,4
200,2010/04/01,528,4
250,2010/04/01,378,2
525,2010/04/01,376,4
100,2010/04/11,282,2
150,2010/04/12,564,4
635,2010/04/14,658,7
200,2010/04/21,95,1
250,2010/04/24,190,2
745,2010/08/15,124,1
855,2010/09/23,412,4
100,2011/04/01,141,1
150,2011/04/01,412,4
200,2011/04/01,312,4
250,2011/04/01,378,2
555,2011/04/01,376,4
100,2011/05/01,282,2
150,2011/05/11,378,2
200,2011/05/25,95,1
666,2011/05/25,124,1
250,2011/06/01,190,2
777,2011/06/03,309,3
888,2011/09/09,412,4
-----------------------
-----------------現状--------------------
2010/4/1における「100」の値の合計は「282」
2010/4/1における「150」の値の合計は「824」
2010/4/1における「200」の値の合計は「840」
2010/4/1における「250」の値の合計は「756」
合計:「0」
合計:「0」
Program ended with exit code: 0
------------------------------------------
-----------------目標---------------------
2010/4/1における「100」の値の合計は「282」
2010/4/1における「150」の値の合計は「824」
2010/4/1における「200」の値の合計は「840」
2010/4/1における「250」の値の合計は「756」
合計:「1459」/*141+412+528+378の合計を表している*/
合計:「1243」/*141+412+312+378の合計を表している*/
------------------------------------------

#include <stdio.h>
#include <stdlib.h>


int main(void){

FILE *fp;

int gn[24],year[24],month[24],day[24],e[24],q[24];
int p;
int i,j,k;
int sum1,sum2;

if((fp = fopen("TEST.csv","r"))==NULL){
printf("not open\n");
exit(1);
}
for(p=0;p<24;p++){
fscanf(fp,"%d,%d/%d/%d,%d,%d",&(gn[p]),&(year[p]),&(month[p]),&(day[p]),&(e[p]),&(q[p]));
}
fclose(fp);

for(i=0;i<24;i++){
if(gn[i]==-1&&year[i]==-1&&month[i]==-1&&day[i]==-1) continue;
for(j=i+1;j<24;j++){
if(gn[j]==-1&&year[j]==-1&&month[j]==-1&&day[j]==-1) continue;
if(gn[i]==gn[j]&&year[j]==year[i]+1&&month[i]==month[j]&&day[i]==day[j]){
e[i] += e[j];
gn[j] = -1;

printf("%d/%d/%dにおける「%d」の値の合計は「%d」\n",year[i],month[i],day[i],gn[i],e[i]);
}
}
}

/*ここから下*/
sum1 = 0;
sum2 = 0;

for(i=0;i<24;i++){
if(gn[i]==-1&&year[i]==-1&&month[i]==-1&&day[i]==-1) continue;
for(k=i+1;k<24;k++){
if(gn[k]==-1&&year[k]==-1&&month[k]==-1&&day[k]==-1) continue;
if(gn[i]==gn[k]&&year[k]==year[i]+1&&month[i]==month[k]&&day[i]==day[k]){
sum1=sum1+e[i];
sum2=sum2+e[k];
gn[k] = -1;
}
}
}

printf("合計:「%d」\n",sum1);
printf("合計:「%d」\n",sum2);

}

A 回答 (2件)

そもそもなんでループを 2つに分けてるのかが分からない.

    • good
    • 0

前半のforの中でgn[j]の値を書き換えている(-1を代入)ので、


後半のforの中のsum1,sum2を計算するif文の条件が満たされていないのではないでしょか?


こういう場合は、以下の確認をしてみると良いと思います。
1. sum1の計算の前にprintf("sum計算\n")を追加して、if文の条件が満たされているか("sum計算"が表示されるか)を確認
2.満たされていない場合は、ifの条件で使用している変数をifの前でprintfして、どの値が変なのか確認。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!