如何解字串 |
答題得分者是:st33chen
|
leeman
一般會員 發表:1 回覆:3 積分:0 註冊:2006-07-06 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
leeman
一般會員 發表:1 回覆:3 積分:0 註冊:2006-07-06 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,看來是玩真的! 你真的了解類比輸出…
可我又有一項不明白,你的問題概念太大,沒把問題精簡到程式碼上的問題。不知你是logical線路的問題,還是軟體上的問題? 或是你應該在單晶片的討論區上問。 雖然沒有正面的回應你答案,但我幫高手們把問題先厘清了,好幫你解決。 所以,若是程式碼上的問題,那就po一點程式上來。若是硬體或firmware的問題,那改到單晶片處理討論,這樣才可能有結果。 ===================引 用 leeman 文 章=================== 類比資料輸出 ??? 不明白 是由機器的磁頭所讀出的資料,經a/d轉換後,由rs232送出。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
leeman
一般會員 發表:1 回覆:3 積分:0 註冊:2006-07-06 發送簡訊給我 |
// 將依照欄位擷取出來
// 0 1 2 3 4 5 // 12345678901234567890123456789012345678901234567890 // C1234567CA123456789A12C123456789C12345B1234567890B //--------------------------------------------------------------------------- int parse_read_str( String read_str, String &check_no, String &bank_no, String &exg_code, String &account_no, String &exp_date, String &amount_money) { int len,i,str_count,spc_cnt; char *p_str; char temp[50]; clear_space(read_str); p_str=&read_str.c_str()[0]; len = read_str.Trim().Length(); str_count=0; if (len ==0)// 沒有磁字 return 1; if (len <7)// 磁字位數<7 return 2; str_count=0; if (len==33&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='C'||*(p_str 32)=='C'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(24, 9); exp_date = ""; amount_money = ""; } else if (len==45&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='C'||*(p_str 32)=='C')&& (*(p_str 33)=='B'||*(p_str 44)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(24, 9); exp_date = ""; amount_money = read_str.SubString(35, 10); } else if (len==32&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 21)=='C'||*(p_str 31)=='C'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(23, 8); exp_date = ""; amount_money = ""; } else if (len==44&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='C'||*(p_str 31)=='C')&& (*(p_str 32)=='B'||*(p_str 43)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(24, 8); exp_date = ""; amount_money = read_str.SubString(34, 10); } else if (len==34&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='B'||*(p_str 33)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = ""; exp_date = ""; amount_money = read_str.SubString(24, 10); return 0; } else if (len==22&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = ""; exp_date = ""; amount_money = ""; } else if (len==39&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 27)=='B'||*(p_str 38)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = ""; exp_date = read_str.SubString(23,5); amount_money = read_str.SubString(28, 10); } else if (len==50||((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='C'||*(p_str 32)=='C')&& (*(p_str 38)=='B'||*(p_str 49)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(24, 9); exp_date = read_str.SubString(34,5); amount_money = read_str.SubString(40, 10); } else if (len==49&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A')&& (*(p_str 22)=='C'||*(p_str 31)=='C')&& (*(p_str 37)=='B'||*(p_str 48)=='B'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = read_str.SubString(21, 2); account_no = read_str.SubString(24, 8); exp_date = read_str.SubString(33,5); amount_money = read_str.SubString(39, 10); } else if (len==20&&((*p_str=='C'||*(p_str 8)=='C')&& (*(p_str 9)=='A'||*(p_str 19)=='A'))) { check_no = read_str.SubString(2, 7); bank_no = read_str.SubString(11, 9); exg_code = ""; account_no = ""; exp_date = ""; amount_money = ""; } else if (len==12&&(*p_str=='B'||*(p_str 11)=='B')) { check_no =""; bank_no = ""; exg_code = ""; account_no = ""; exp_date = ""; amount_money = read_str.SubString(2, 10); } else if (len==9&&(*p_str=='C'||*(p_str 8)=='C')) { check_no = read_str.SubString(2, 7); bank_no = ""; exg_code = ""; account_no = ""; exp_date = ""; amount_money = ""; } else if (len==11&&(*p_str=='C'||*(p_str 10)=='C')) { check_no = ""; bank_no = ""; exg_code = ""; account_no = read_str.SubString(2, 9); exp_date = ""; amount_money = ""; } else if (len==23&&((*p_str=='C'||*(p_str 10)=='C')&& (*(p_str 11)=='B'||*(p_str 22)=='B'))) { check_no = ""; bank_no = ""; exg_code = ""; account_no = read_str.SubString(2, 9); exp_date = ""; amount_money =read_str.SubString(12, 10); } else if (len==11&&(*p_str=='A'||*(p_str 10)=='A')) { check_no = ""; bank_no = read_str.SubString(2, 9); exg_code = ""; account_no = ""; exp_date = ""; amount_money = ""; } else { //當有少字元或關鍵字=﹖時的處理 check_no = ""; bank_no = ""; exg_code = ""; account_no = ""; exp_date = ""; amount_money = ""; } return 0; } 以上為目前我所寫的程式,因為機器讀取上,因為由馬達帶動,所以有時磁頭讀取時,有些是本身磁字有缺陷或雜訊或感磁問題等,sometime會判斷時會有漏字或無法判斷 導致格式會不同,所以想把程式再修正完美一點,針對漏字作判斷處理。 |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
要列舉所有可能性, 程式會寫很長, 而且能否列舉所有可能性我覺得是一疑問 (因為有可能掉字, 有可能出現 ? 號). 您要解出的數字有六段, 各段長為 7, 9, 2, 9, 5, 10 我的想法是 : 1. 讀掉連續的英文字 2. 連續讀入 [ 屬於 1234567890? 的 ] [ 最多9個 ] 的字當成 第一段 ( 第一段 7 字, 加前後可能的 ? 號, 故用 9) 3. 讀掉連續的英文字 4. 連續讀入 [ 屬於 1234567890? 的 ] [ 最多11個 ] 的字當成 第二段 ( 第二段 9 字, 加前後可能的 ? 號, 故用 11) 5. 以此類推..... 取出後再看如何處理 ? 號 ( 因為您沒說 ? 號如何處理, 所以無法在此考慮) 我用 delphi 把邏輯寫成如下, 請參考一下 ( sorry, 我沒有 c 的環境 ) procedure TForm1.Button1Click(Sender: TObject); var ii, jj, kk: integer; astr : string; begin edit1.Text := 'C1234567CA123456789A12C123456789C12345B1234567890B'; edit2.text := '?123?5C?12345?6789A12?123?789C12345B1234567890'; // 各段數字長度 : 7,9,2,9,5,10 astr := trim(edit2.text); ii := 1; jj := length(astr); // 取第一段數字 label1.Caption := ''; kk := 0; while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<9) do begin kk := kk 1; label1.caption := label1.caption astr[ii]; ii := ii 1; end; // 取第二段數字 while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; label2.Caption := ''; kk := 0; while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<11) do begin kk := kk 1; label2.caption := label2.caption astr[ii]; ii := ii 1; end; // 取第三段數字 while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; label3.Caption := ''; kk := 0; while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<3) do begin kk := kk 1; label3.caption := label3.caption astr[ii]; ii := ii 1; end; // 取第四段數字 while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; label4.Caption := ''; kk := 0; while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<11) do begin kk := kk 1; label4.caption := label4.caption astr[ii]; ii := ii 1; end; // 取第五段數字 while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; label5.Caption := ''; kk := 0; while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<7) do begin kk := kk 1; label5.caption := label5.caption astr[ii]; ii := ii 1; end; // 取第六段數字 while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; label6.Caption := ''; kk := 0; while (ii<= jj) do begin if pos(astr[ii], '1234567890?')>0 then begin kk := kk 1; label6.caption := label6.caption astr[ii]; end; ii := ii 1; end; end; 其中, while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; 就是讀掉英文字. pos(astr[ii], '1234567890?')<=0 代表 小字串 沒在 大字串 中. 其他 轉成 c 應該不難.
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-07 01:32:20, 註解 無‧
|
leeman
一般會員 發表:1 回覆:3 積分:0 註冊:2006-07-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |