質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2184閲覧

csv出力 小数になるはずが0になる

dws

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/07/21 11:35

csvに出力する際に、小数表示されるはずが0になってしまいます。
最初csvファイルに整数が出力されたので間違いを探した結果、fprintf文の"%d,%d,%d,%d\n"が間違っていると気づくことができました。
そのため、この部分を"%f,%f,%f,%f\n"としたところ、今度はcsvに出力された数値が全て0になってしまいました。
どこが間違っているのでしょうか?
(下記のソースコードは "%d,%d,%d,%d\n" のまま載せています。整数が表示された時の物です。)

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <math.h> // pow(), log(), sin(), cos() 5 6/* #define N 180 */ 7#define NUMBER 100 8 9#define RAND() ((double)rand()/((double)RAND_MAX+1.0)) 10/* #define RANDx() (int)((double)rand()/((double)RAND_MAX+1.0)*360+1) */ 11 12int p,q;//グローバル変数 13 14void Box_Muller(int *n1, int *n2); 15int action1(int *N1, int *N2); 16int action2(int *N1, int *N2); 17/* void action_unit(int *N1, int *N2); */ 18 19double sum(int data[], int q); 20double ave(int data[], int q); 21double dev(int data[], int q); 22 23int main(void){ 24 FILE *fout; 25 int i,j,k, N1[NUMBER], N2[NUMBER]; 26 27 scanf("%d,%d", &p, &q); 28 29 int cost_display[100][2][q], cost_average[100][2]={0}, cost_deviation[100][2]={0}; 30 31 srand((unsigned int)time(NULL)); // 乱数の種の初期化 32 33 for(i=0;i<100;i++){ 34 for(j=0;j<q;j++){ 35 cost_display[i][0][j] = action1(N1,N2); 36 cost_display[i][1][j] = action2(N1,N2); 37 } 38 for(k=0;k<2;k++){ 39 cost_average[i][k] = ave(cost_display[i][k], q); 40 cost_deviation[i][k] = dev(cost_display[i][k], q); 41 } 42 } 43 44 if( (fout = fopen("ExData4-4.csv","w")) == NULL ){ 45 printf("ファイルが作成できません : ExData4-4.csv \n"); 46 exit(1); 47 } 48 49 for(i=0;i<100;i++){ 50 fprintf(fout,"%d,%d,%d,%d\n",cost_average[i][0], cost_deviation[i][0], cost_average[i][1], cost_deviation[i][1]); 51 } 52 53 fclose(fout); 54 55 return 0; 56} 57 58void Box_Muller(int *N1, int *N2){ 59 double U1=RAND(), U2=RAND(); 60 61 *N1 = (pow(-2.0 * log(U1), 0.5) * cos(2.0 * M_PI * U2)) * 14 + 180; 62 *N2 = (pow(-2.0 * log(U1), 0.5) * sin(2.0 * M_PI * U2)) * 14 + 180; 63} 64 65int action1(int *N1, int *N2){ 66 int i,NextDeadline,day = 0, cost = 0; 67 int x[NUMBER]; 68 double judge; 69 70 for(i=0; i<NUMBER; i++){ // Box_Muller 法で標準正規乱数発生 71 Box_Muller(N1+i,N2+i); 72 x[i] = N1[i]; 73 } 74 75 while(day < p){ 76 day++; 77 for(i=0;i<NUMBER;i++){ 78 if(x[i] == day){ 79 judge = RAND(); 80 if(judge >= 0 && judge < 0.7){ 81 cost += 5500; 82 }else if(judge >= 0.7 && judge < 1.0){ 83 cost += 10500; 84 } 85 Box_Muller(N1+i,N2+i); 86 NextDeadline = N1[i]; 87 x[i] += NextDeadline; 88 } 89 } 90 } 91 return cost; 92} 93 94int action2(int *N1, int *N2){ 95 int i,NextDeadline,day = 0, cost = 0; 96 int x[NUMBER]; 97 double judge; 98 99 for(i=0; i<NUMBER; i++){ // Box_Muller 法で標準正規乱数発生 100 Box_Muller(N1+i,N2+i); 101 x[i] = N1[i]; 102 } 103 104 while(day < p){ 105 day++; 106 for(i=0;i<NUMBER;i++){ 107 if(x[i] == day){ 108 judge = RAND(); 109 if(judge >= 0 && judge < 0.7){ 110 cost += 5500; 111 }else if(judge >= 0.7 && judge < 1.0){ 112 cost += 10500; 113 } 114 Box_Muller(N1+i,N2+i); 115 NextDeadline = N1[i]; 116 x[i] += NextDeadline; 117 } 118 } 119 if((day%150) == 0){ 120 for(i=0;i<NUMBER;i++){ 121 Box_Muller(N1+i,N2+i); 122 NextDeadline = N1[i]; 123 x[i] = day + NextDeadline; 124 } 125 cost += 20000; 126 } 127 } 128 return cost; 129} 130 131/* void action_unit(int *N1, int *N2){ 132 action1(N1,N2); 133 action2(N1,N2); 134 printf("%d",cost); 135 136} */ 137 138double sum(int data[], int q){ 139 int i; // 変数の宣言 140 double total = 0.0; 141 142 for(i=0; i<q; i++){ 143 total += (double)data[i]; // 合計を計算 144 } 145 146 return total; // 合計を返す 147} 148 149// 平均の計算 150double ave(int data[], int q){ 151 double total = sum(data, q); // 合計 152 return total/q; // 平均=合計/データ数 153} 154 155// 標準偏差の計算 156double dev(int data[], int q){ 157 int i; 158 double a = ave(data, q); // 平均値 159 double v = 0.0; // 分散 160 // 標準偏差を計算 161 for (i=0; i<q; i++) 162 v += pow((data[i] - a)*(data[i] - a),0.5); 163 return v/q; // 標準偏差の平均 164}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/21 11:43 編集

"%d,%d,%d,%d\n" のときは、0じゃない値は表示されていましたか?
dws

2019/07/21 11:44

はい。0じゃなかったです。 目的の数(小数)に近い整数でした。
guest

回答1

0

ベストアンサー

%fは浮動小数を出力するためのフォーマットでint型の出力では正しい値が出力されません.

実行例

C

1int a = 150; 2printf("%d\n", a); // 150 3printf("%f\n", a); // 0.00000

cost_averageの型を変更してください.

質問のコードが長いので問題が再現する短いコードを書いていただけると助かります.

投稿2019/07/21 11:46

rcftdbeu

総合スコア167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dws

2019/07/21 12:08

ありがとうございます。すごく簡単な間違いに気づけませんでした。 無事、プログラムが動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問