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}
回答1件
あなたの回答
tips
プレビュー