作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 關於使用SWITCH與檔案讀寫的問題
時間Fri Apr 8 23:37:14 2011
我認為大致有三個地方有問題的 (forloop - case; printf; magic number)
※ 引述《wodada (wodada)》之銘言:
: int main(int argc, char* argv[])
: {
: FILE *f1;
: int choice= 0;
: double mm, //mass
: time, //time
: dis_ti, //displacement at time ti
: vel_ti, //velocity at time ti
恕刪
: mm= 1; //題目給質量,彈簧係數和阻尼
: cc= 0.1;
: kk= 1;
: wn= sqrt(kk/mm);
這裡我認為 1, 0.1, 1, 是屬於 magic number, 可以去自定義成 macro 或用 const
: fprintf(f1, "time, distance, velocity, distance2, velocity2, distance3, velocity3, distance4, velocity4,\n");
csv 是這樣寫沒錯
: switch(choice)
: {
: for(time= 0.0;time<= 100.0;time+= 1){
: case 1:
: dis_ti= dis1(u0, v0, wn, zeta1, time);
: vel_ti= vel1(u0, v0, wn, zeta1, time);
: fprintf(f1, "%f, %f, %f,\n", time, dis_ti, vel_ti);
: break;
恕刪, 這裡便是一個可議的問題,也即是推文中的述敘
→ kaomark:然後如果你要做的事情是 選某個case跑101次 04/08 22:31
→ kaomark:那應該要在每一個case中都寫for loop 04/08 22:32
→ kaomark:如果你要的是 跑101次每次都挑一個case來做 04/08 22:32
→ kaomark:那應該要把for放在switch外面 04/08 22:32
我也只有看過這二種做法
for(i=0; i!=N; ++i){
switch(choice) {
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
}
}
不然就是這樣
switch(choice){
case 1: { for(i=0; i!=N; ++i) func1(); } break;
case 2: { for(i=0; i!=N; ++i) func2(); } break;
case 3: { for(i=0; i!=N; ++i) func3(); } break;
}
真的沒看過你寫的這樣
switch(choice){
for(i=0; i!=N; ++i){
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
}
}
這方法還真的是第一次見,至於前二種方法本版記得有篇文章有討論到,
不過忘了標題是什麼,有興趣的話可爬文看看..
-----
另外我認為你要做的是針對不同選單做不同函式,
這裡給另一個例子,隨機產生 10 個 array 元示,
輸入 0~3 分別執行 array[i-1] + - * / array[i] 放到 ans[i-1]
可以考慮這麼做
double Add(double a, double b) {return a+b;}
double Sub(double a, double b) {return a-b;}
double Mul(double a, double b) {return a*b;}
double Div(double a, double b) {return b==0.0 ? b: a/b;}
double array[N]={0};
double ans[N]={0};
int i, chose=0;
/* 宣告函式指標陣列 */
double (*pfunc[])(double, double) = {Add, Sub, Mul, Div};
printf("(0:add 1:sub 2:mul 3:div):");
scanf("%d", &chose);
/* 產生隨機 array */
srand((unsigned)time(NULL));
for(i=0; i!=N; ++i) array[i] = rand();
/* 計算結果 */
for(i=1; i!=N; ++i) ans[i-1] = pfunc[chose](array[i-1], array[i]);
我想用指標陣列可以避開這些麻煩的問題,
何況你那四個函式的引數、傳回也都長得一樣,這種方式供參考。
--------
最後的問題在這
double x=0.0;
fprintf(f1, "%f", x); // ---> 這是錯的
fprintf(f1, "%lf", x); // -----> double 引數要用 %lf, 而非 %f
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.72.67
※ 編輯: tropical72 來自: 180.177.72.67 (04/08 23:38)
→ firejox:老實說我是有看過類似的code 04/09 00:36
推 wodada:原來如此,我在試試看 04/09 00:39
→ tropical72:樓上的code我還真是第一次看到. 04/09 00:52
推 VictorTom:其實C語言也是很恐怖的....Q_Q~ 04/09 01:03
推 wodada:可是....我指標不是很懂.... 04/09 01:03
推 wodada:有那種不是用指標的寫法嗎?? 04/09 01:07
→ tropical72:考慮一下上述第一種或第二種,指標陣列不是什麼高深的學 04/09 01:16
→ tropical72:問,翻翻實作應可上手 04/09 01:17
推 wodada:如果不用switch的話我絕對可以把它執行出來... 04/09 01:18
→ wodada:可惜事與願違.... 04/09 01:18
→ firejox:就原原PO的code而言 會造成只做一次就跳出了 04/09 01:30
→ firejox:for 會被 break掉 04/09 01:30
→ firejox:話說我那個code是 Duff's device 04/09 01:45