電子書籍の厳選無料作品が豊富!

C言語で、以下のcsvファイルの一列目の値が一致したものどおし第2列目の数字の総和を求めたいのですが、上手くいきません。どう修正すれば良いか教えていただきたく質問させていただきました。

----TEST.csv------
111,141,1
112,412,4
113,528,4
111,378,2
111,282,2
123,564,4
133,95,1
122,190,2
112,376,4
112,658,7
123,124,1
123,412,4
-------------------

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


int main(void){

FILE *fp;
int num[12] ,e[12],p[12];
int i,sum=0;


if((fp = fopen("TEST.csv","r"))==NULL){
printf("not open\n");
exit(1);
}

for(i=0;i<12;i++){
fscanf(fp,"%d,%d,%d",&(num[i]),&(e[i]),&(p[i]));
}
fclose(fp);

for(i=0;i<12;i++){
if(num[i]==num[i+1]){
sum = sum +e[i];
printf("number「%d」の総和は「%d」\n",num[i],sum);
}

}

return 0;
}


--------現在のoutput---------
number「111」の総和は「378」
number「112」の総和は「754」
number「123」の総和は「878」
----------------------------

--------理想のoutput---------
number「111」の総和は「801」
number「112」の総和は「1446」
number「123」の総和は「1100」
----------------------------

よろしくお願い申し上げます。

A 回答 (5件)

以下のようにしてください。


TEST.CSVに負の値は格納されていないことが前提です。
-------------------------------------
include <stdio.h>
#include <stdlib.h>


int main(void){

FILE *fp;
int num[12] ,e[12],p[12];
int i,sum=0;
int j; //この行追加

if((fp = fopen("TEST.csv","r"))==NULL){
printf("not open\n");
exit(1);
}

for(i=0;i<12;i++){
fscanf(fp,"%d,%d,%d",&(num[i]),&(e[i]),&(p[i]));
}
fclose(fp);

//ここから全面的変更開始
for(i=0;i<12;i++){
if (num[i] == -1) continue; //-1の行は1列目の値が他と同じなのでスキップ
for(j=i+1;j<12;j++){
if (num[j] == -1) continue; //-1の行は1列目の値が他と同じなのでスキップ
if (num[i] == num[j]){
e[i] += e[j];
num[j] = -1; //2度と使わないために-1を設定
}
}
}
for(i=0;i<12;i++){
if (num[i] == -1) continue; //-1の行は1列目の値が他と同じなのでスキップ
printf("number「%d」の総和は「%d」\n",num[i],e[i]);
}
//ここまで全面的変更終了
return 0;
}

--------------------------------------
以下、実行結果です。
number「111」の総和は「801」
number「112」の総和は「1446」
number「113」の総和は「528」
number「123」の総和は「1100」
number「133」の総和は「95」
number「122」の総和は「190」
    • good
    • 0
この回答へのお礼

自分でも間違っていることはわかっていましたが、どうやって修正すれば良いか悩んでいました。全体的に丁寧に回答していただき、特に「ここから全面的に変更開始」以下の部分は非常にわかりやすく記述していただき、感謝申し上げます。

お礼日時:2015/07/31 01:23

--------理想のoutput---------に133,95,1  は処理してないんだよなぁーー


酔っ払いがわざと応用できないコードを書くとこうなるという見本
( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \
    • good
    • 0

num(0):111


num(1):112
num(2):113
num(3):111
num(4):111
num(5):123
num(6):133
num(7):122
num(8):112
num(9):112
num(10):123
num(11):123

for(i=0;i<12;i++){
 if(num[i]==num[i+1]){

num(i)とnum(i+1) が等しい時に sum を累計して出力
※i=11の時、i+1=12となり配列テーブルの範囲外を参照してしまう

num(3)= num(4)=111
num(8)= num(9)=112
num(10)= num(11)=123
上記の3箇所で条件が一致

sum=0
i=3;sum=sum+e(3)→378
i=8;sum=sum+e(8)=378+376→754
i=10;sum=sum+e(10)=754+124→878
    • good
    • 0
この回答へのお礼

現在のoutputがなぜあのようになるのか理解できました。ありがとうございます。

お礼日時:2015/07/31 01:24

>if(num[10]==num[11])printf("number「%d」の総和は「%d」\n",num[10],e[10]+e[11]);



最後の行で、if(num[10]!=num[11]) の時の処理が抜けている...
    • good
    • 1

/*for(i=0;i<12;i++){


if(num[i]==num[i+1]){
sum = sum +e[i];
printf("number「%d」の総和は「%d」\n",num[i],sum);
}

}*/
sum=e[0];if(num[0]==num[1]) {sum = sum +e[1];e[1]=0;}if(num[0]==num[2]) {sum = sum +e[2];e[2]=0;}if(num[0]==num[3]) {sum = sum +e[3];e[3]=0;}if(num[0]==num[4]) {sum = sum +e[4];e[4]=0;}if(num[0]==num[5]) {sum = sum +e[5];e[5]=0;}if(num[0]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[0]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[0]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[0]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[0]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[0]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[0])printf("number「%d」の総和は「%d」\n",num[0],sum);sum=e[1];if(num[1]==num[2]) {sum = sum +e[2];e[2]=0;}if(num[1]==num[3]) {sum = sum +e[3];e[3]=0;}if(num[1]==num[4]) {sum = sum +e[4];e[4]=0;}if(num[1]==num[5]) {sum = sum +e[5];e[5]=0;}if(num[1]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[1]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[1]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[1]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[1]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[1]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[1])printf("number「%d」の総和は「%d」\n",num[1],sum);sum=e[2];if(num[2]==num[3]) {sum = sum +e[3];e[3]=0;}if(num[2]==num[4]) {sum = sum +e[4];e[4]=0;}if(num[2]==num[5]) {sum = sum +e[5];e[5]=0;}if(num[2]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[2]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[2]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[2]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[2]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[2]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[2])printf("number「%d」の総和は「%d」\n",num[2],sum);sum=e[3];if(num[3]==num[4]) {sum = sum +e[4];e[4]=0;}if(num[3]==num[5]) {sum = sum +e[5];e[5]=0;}if(num[3]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[3]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[3]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[3]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[3]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[3]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[3])printf("number「%d」の総和は「%d」\n",num[3],sum);sum=e[4];if(num[4]==num[5]) {sum = sum +e[5];e[5]=0;}if(num[4]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[4]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[4]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[4]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[4]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[4]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[4])printf("number「%d」の総和は「%d」\n",num[4],sum);sum=e[5];if(num[5]==num[6]) {sum = sum +e[6];e[6]=0;}if(num[5]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[5]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[5]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[5]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[5]==num[11]) {su= sum +e[11];e[11]=0;}if(sum-e[5])printf("number「%d」の総和は「%d」\n",num[5],sum);sum=e[6];if(num[6]==num[7]) {sum = sum +e[7];e[7]=0;}if(num[6]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[6]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[6]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[6]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[6])printf("number「%d」の総和は「%d」\n",num[6],sum);sum=e[7];if(num[7]==num[8]) {sum = sum +e[8];e[8]=0;}if(num[7]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[7]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[7]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[7])printf("number「%d」の総和は「%d」\n",num[7],sum);sum=e[8];if(num[8]==num[9]) {sum = sum +e[9];e[9]=0;}if(num[8]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[8]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum-e[8)printf("number「%d」の総和は「%d」\n",num[8],sum);sum=e[9];if(num[9]==num[10]) {sum = sum +e[10];e[10]=0;}if(num[9]==num[11]) {sum = sum +e[11];e[11]=0;}if(sum^e[9])printf("number「%d」の総和は「%d」\n",num[9],sum);if(num[10]==num[11])printf("number「%d」の総和は「%d」\n",num[10],e[10]+e[11]);
    • good
    • 0

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