Re: [問題] 關於使用SWITCH與檔案讀寫的問題

看板C_and_CPP (C/C++)作者 (藍影)時間15年前 (2011/04/08 23:37), 編輯推噓6(609)
留言15則, 5人參與, 最新討論串2/2 (看更多)
我認為大致有三個地方有問題的 (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)

04/09 00:36, , 1F
老實說我是有看過類似的code
04/09 00:36, 1F

04/09 00:39, , 2F
原來如此,我在試試看
04/09 00:39, 2F

04/09 00:45, , 3F

04/09 00:52, , 4F
樓上的code我還真是第一次看到.
04/09 00:52, 4F

04/09 01:03, , 5F
其實C語言也是很恐怖的....Q_Q~
04/09 01:03, 5F

04/09 01:03, , 6F
可是....我指標不是很懂....
04/09 01:03, 6F

04/09 01:07, , 7F
有那種不是用指標的寫法嗎??
04/09 01:07, 7F

04/09 01:16, , 8F
考慮一下上述第一種或第二種,指標陣列不是什麼高深的學
04/09 01:16, 8F

04/09 01:17, , 9F
問,翻翻實作應可上手
04/09 01:17, 9F

04/09 01:18, , 10F
如果不用switch的話我絕對可以把它執行出來...
04/09 01:18, 10F

04/09 01:18, , 11F
可惜事與願違....
04/09 01:18, 11F

04/09 01:30, , 12F
就原原PO的code而言 會造成只做一次就跳出了
04/09 01:30, 12F

04/09 01:30, , 13F
for 會被 break掉
04/09 01:30, 13F

04/09 01:45, , 14F
話說我那個code是 Duff's device
04/09 01:45, 14F

04/09 12:34, , 15F
文章代碼(AID): #1Ddokl1s (C_and_CPP)
文章代碼(AID): #1Ddokl1s (C_and_CPP)