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」
----------------------------
よろしくお願い申し上げます。
No.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」
自分でも間違っていることはわかっていましたが、どうやって修正すれば良いか悩んでいました。全体的に丁寧に回答していただき、特に「ここから全面的に変更開始」以下の部分は非常にわかりやすく記述していただき、感謝申し上げます。
No.4
- 回答日時:
--------理想のoutput---------に133,95,1 は処理してないんだよなぁーー
酔っ払いがわざと応用できないコードを書くとこうなるという見本
( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \
No.3
- 回答日時:
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
No.2
- 回答日時:
>if(num[10]==num[11])printf("number「%d」の総和は「%d」\n",num[10],e[10]+e[11]);
最後の行で、if(num[10]!=num[11]) の時の処理が抜けている...
No.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]);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
10進数からN進数に変換するプロ...
-
getcの改行判定
-
C言語で電卓を作成する。
-
プログラミングで二番目に大き...
-
配列を使って魔方陣
-
C言語プログラムが理解できなくて…
-
計算結果がlong型以上になる場...
-
scanfが実行されません
-
素因数分解のプログラムを作成...
-
プログラム
-
while文を使った問題なのですが...
-
C言語階乗の総和を求める
-
C言語 エラー表示 break の位...
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
-
初心者です。for文、if文を使っ...
おすすめ情報