[問題] swith_case 用法

看板C_and_CPP作者 (totem)時間9年前 (2015/06/02 15:36), 9年前編輯推噓4(4012)
留言16則, 5人參與, 最新討論串1/4 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code::Block 寫C 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) matlab的fdatool 問題(Question): 因為我接下來要做的是有45個case 自己用2個case來做是成功的 我想知道該何做能更簡潔 餵入的資料(Input): input是相同的512筆data 經由case去選擇不同的處理方式 預期的正確結果(Expected Output): 目前測試是正確的 沒有錯誤 只是想要知道有沒有更好的方法 錯誤結果(Wrong Output): 目前測試是正確的 沒有錯誤 只是想要知道有沒有更好的方法 程式碼(Code):(請善用置底文網頁, 記得排版) void A (void); void D (void); char c; printf("enter A=120_480 or D=180_480 = "); scanf ("%c", &c); switch (c) { case 'A': break; case 'D': break; defult break; } 補充說明(Supplement): 因為我是要做濾波器(fir filter - bandpass) 我希望能給使用者自己選擇頻率(0~540hz,每60hz為一單位) 所以我總共要做C10取2 有45個case要做 這裡再補充一下: 因為選擇的範圍可以是 0~60, 0~120, 0~180, .... ,0~540 60~120, 60~180, 60~240, ... ,60~540 ... ... 420~480, 420~540 480~540 而每一個範圍經由matlab的fdatool都會產生一個fdacoefs.h 而每一個.h檔裡面會有一個陣列 我目前作法就是把 matlab的fdatool所產生的45個fdacoefs.h合併為一個.h檔 然後在使用者介面直接寫死 ex: printf("enter A=120_480 or D=180_480 = "); 就是直接給使用者看著指令選擇 但是我想做到的是給使用者自動輸入想要的頻寬 只是覺得這樣對使用者比較方便,不用把我45個代號看完就可以自動輸入這樣 這樣的作法會比較省時間和空間嗎? 另外對於我上述想做的方式,我該找甚麼資料參考呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.28.223 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433230610.A.D55.html

06/02 16:21, , 1F
C or C++ ?. 不過其實應該好好想想真的有 45 cases 嗎
06/02 16:21, 1F
用C,後來改成60為一單位,取0~540 這樣既是45個case 原本所說的應該是55個才對 ※ 編輯: totemist (140.114.87.231), 06/02/2015 16:22:17

06/02 16:26, , 2F
先退一萬步來想, 你 fdacoefs.h 裡面是只有陣列嗎?
06/02 16:26, 2F

06/02 16:26, , 3F
如果是的話, 你怎麼將 45 個陣列合併?
06/02 16:26, 3F
只有陣列,fdacoefs.h 會有 頻率100~500 const int BL = 82; const real64_T B[82] = { ... } 因為不同頻率的coef不一樣,只要將這矩陣的變數改一下即可 頻率200~600 const int CL = 82; const real64_T C[82] = { ... } 當然我目前的做法就會讓 .h和主程式就會變得很冗長

06/02 16:28, , 4F
然後最後再想想你可以把這個選擇問題變成一個索引對照問題嗎
06/02 16:28, 4F

06/02 18:36, , 5F
所以輸入會轉變兩個頻率,A=100,200、D=500,600
06/02 18:36, 5F

06/02 18:36, , 6F
我有理解錯嗎?@@
06/02 18:36, 6F
那個意思是 選擇A的話 bandpassfilter 只會留下100~500hz範圍內的頻率 選擇B的話 bandpassfilter 只會留下200~600hz範圍內的頻率 所以我目前的設計 就是讓使用者 按 A or B 這樣 ※ 編輯: totemist (140.114.28.223), 06/02/2015 19:59:31 我算是有想法了 就是在另一個變數level讓Fpass1和Fpass2合併起來,這樣應該能避免重複問題 int Fpass1 = 0; int Fpass2 = 0; int level =0; printf("enter Fpass1 = "); scanf ("%d", &Fpass1); printf("enter Fpass2 = "); scanf ("%d", &Fpass2); if (Fpass1==0) level = Fpass2*10000; else level = Fpass2*1000+Fpass1; switch(level) 看還有沒有甚麼可以討論囉~ ※ 編輯: totemist (140.114.28.223), 06/02/2015 21:46:59

06/02 21:54, , 7F
我的意思是要你把它變成一個類似二維陣列, 用頻率去索引
06/02 21:54, 7F

06/02 21:55, , 8F
更實際的做法其實應該是自己算 coef, 不過我想就算了
06/02 21:55, 8F
※ 編輯: totemist (36.228.225.58), 06/03/2015 00:09:06 ※ 編輯: totemist (36.228.225.58), 06/03/2015 00:12:03

06/03 01:03, , 9F
這個問,聽起來建一個表就可以了
06/03 01:03, 9F

06/03 08:06, , 10F
所以跟我之前想的應該差不多,只是我沒表達清楚 Orz
06/03 08:06, 10F

06/03 08:07, , 11F
你可以考慮把coefs弄成三維表格,概念上以兩個頻率為
06/03 08:07, 11F

06/03 08:07, , 12F
前兩個維度,第三維就是係數
06/03 08:07, 12F

06/03 08:07, , 13F
輸入也讓使用者直接給頻率就好,非60倍數再處理
06/03 08:07, 13F

06/03 08:09, , 14F
啊,其實就是tropical72大說的方法…XD
06/03 08:09, 14F

06/03 09:50, , 15F
現在我遇到這種的都會想搞個xml檔案 有人跟我一樣嗎 xD
06/03 09:50, 15F

06/03 11:10, , 16F
並不會
06/03 11:10, 16F
文章代碼(AID): #1LRLqIrL (C_and_CPP)
文章代碼(AID): #1LRLqIrL (C_and_CPP)