看板 C_and_CPP 關於我們 聯絡資訊
我認為大致有三個地方有問題的 (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
firejox:http://nopaste.csie.org/eba58 04/09 00:45
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
xatier:http://en.wikipedia.org/wiki/Duff's_device wiki 04/09 12:34