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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
行列をべき乗させるプログラム
-
for文の中にswitch文はいれられ...
-
C言語 プログラム
-
c言語のプログラムで
-
平均身長のプログラミング
-
getcの改行判定
-
C言語 数字以外を入力させない...
-
十進BASICのプログラムについて
-
円周率 πの値
-
C言語で、条件をつけて総和を求...
-
for文
-
VHDLで、case文とwhen文のどち...
-
c言語のリダイレクトによる円...
-
吸湿性のあるものを天秤で秤量...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
printf で二進表示を行いたい。
-
マイナスからプラスへ転じた時...
-
【C言語教えてください】sin波...
-
O(n log n)について2
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
配列を関数に渡す方法
-
C言語で電卓を作成する。
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
初心者です。for文、if文を使っ...
-
c言語プログラミングで1から100...
おすすめ情報