資料格式比對 |
|
aconxu
一般會員 發表:18 回覆:41 積分:11 註冊:2006-12-19 發送簡訊給我 |
|
stellos
中階會員 發表:24 回覆:84 積分:51 註冊:2004-06-08 發送簡訊給我 |
===================引 用 文 章=================== 我現在想讓使用者輸入一些資料~ 這些資料有一定的格式 如: NAME:aconxu AGE:22 //NAME: 及 AGE: 是規定的要 當使用者輸入錯了~如 NAMEE //多了一個'E'時就會發出錯誤訊息~ 這我看不懂, 名字可能會輸入中英文頂多判斷不能輸入符號或數字 我會在OnKeyPress這個Event寫判斷式 若不符合就Key=0; 是否發出錯誤訊息看你自己囉 所以我想請問大家~ 如何在使用者key資料的同時馬上比對格式正確與否 謝謝~ |
kenlee1109
初階會員 發表:20 回覆:40 積分:27 註冊:2006-08-17 發送簡訊給我 |
在你定義的 TEdit 或 Form .....,只要原件的 Method 支援 OnKeyPress 者,即可用它來 check.
當輸入的字元 Key 不合你的意時,可將 Key 設成 0, 則 editor 上就沒有這個字顯示. //--------------------------------------------------------------------------- void __fastcall TBasicRequestForm::OnKeyPress(TObject *Sender, char &Key){ if((Key < '0')||(Key > '9')){ if((Key != 0x08)&&(Key != '/')) Key = 0; } } |
kenlee1109
初階會員 發表:20 回覆:40 積分:27 註冊:2006-08-17 發送簡訊給我 |
|
aconxu
一般會員 發表:18 回覆:41 積分:11 註冊:2006-12-19 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
如果是這樣,那為什麼不把它們全作成Label,
只要限制使用者必填的區塊,這樣也不用擔心他們會Key錯 也只須要檢核資料是否輸入正確就好 如果你還是覺得有必要,那就弄個String,找個不會用到的符號當separator 像這樣CONST_DISC="USERNAME,AGE,PASSWORD" 每次User輸入時,去scan你的keyword作Pos(input, CONST_DISC)>0就好了 未輸入完的一定會在裡面,輸入過長或不在裡面的就會找不到(完)
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
aconxu
一般會員 發表:18 回覆:41 積分:11 註冊:2006-12-19 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
如果有順序那更好辦,弄個StringList,每次的輸入都檢查是不是在當前索引的字串就好
並限制檢查只會從第一個字串開始,如果不在當前的字串就是違法的 當輸入完keyword時再開放給User輸入其它字元 但與其這樣,還不如乾脆幫User輸入,省的他們也打錯? 或者弄個 Label : Edit Label : Edit . . . . . 這樣,每次只要前面的Edit被清空或未填就自動Focus回前面的欄位就好了不是?
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
要parse語法的話,請先參考一下我發表的計算機,
用後敘的作法是最簡單的, 當然,你的運算式可能會比想像中的複雜,就應該要考慮建parser tree 這樣的話,我會建議你去翻書比較快,parser tree在Programming Language的書裡面有不少, 原理也是跟Postfix一樣,除了原本的運算子以外,if, &, |也都將變成運算子 建成樹之後,利用對樹的Travel(Travel的過程實際上就是後序,只要針對產生出來的運算子運算元算完往上丟就是了)來完成整個流程
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
aconxu
一般會員 發表:18 回覆:41 積分:11 註冊:2006-12-19 發送簡訊給我 |
謝謝~Coffee
其實我有個想法~不知道對不對及好不好 IF (a=1) && (b=2) 我用TStringList 可以切出 IF //MyList1->Strings(0) a=1 //MyList1->Strings(1) && //MyList1->Strings(2) b=2 //MyList1->Strings(3) TStringList* MyList 1= new TStringList(); 先比對"IF"來比對~如果true再比對是否有"&&" or "||" 假設IF 後面又有&& 就表示 MyList 1->Strings(1) MyList 1->Strings(3) 一定都要是EXP --至於如何判斷EXP TStringList* MyList 2= new TStringList(); TStringList* MyList 3= new TStringList(); 再把MyList 1->Strings(1) MyList1 ->Strings(3) 再切成 a //MyList2->Strings(0) = //MyList2->Strings(1) 1 //MyList2->Strings(2) b //MyList3->Strings(0) = //MyList3->Strings(1) 2 //MyList3->Strings(2) 再比對 MyList 2->Strings(1) 跟 MyList 3->Strings(1) 是否為 " = , != , < ,> ......." 之後再判斷 MyList2->Strings(0)、 MyList2->Strings(2)、MyList3->Strings(0)、MyList3->Strings(2)的內容~ 不知道我這樣說~你們看的懂嗎?? 會不會很復雜 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
不是不好,只是這樣對於運算子的優先權比較難掌握,
在你的例子裡面,因為你用了人腦Parser(:P),所以你知道要先算兩側再算中央 而且由你提供的例子來看,你的if expression並沒有被括在括號裡面(如果我沒記錯C 應該是要吧?) 我會建議你抄C 的方式,因為這樣你可以確保if後面的括號必須得是 expression,對你處理文字上會比較好作 而且你這樣的想法已經很接近tree的建法了..我會建議你去看一下parser tree 或者先看一下我丟的計算機裡面產生出來的後敘運算式
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
aconxu
一般會員 發表:18 回覆:41 積分:11 註冊:2006-12-19 發送簡訊給我 |
===================引 用 文 章=================== 不是不好,只是這樣對於運算子的優先權比較難掌握, 關於這一點~ 我的運算子~ 我的應該比較像組語 ADD A,B,C //C=A B SUB A,B,C //C=A-B IF (A==1) && (B==2) 我並沒有像計算機那樣 A B*C這種運算式出現 這樣應該就沒有"運算子的優先權"了 在你的例子裡面,因為你用了人腦Parser(:P),所以你知道要先算兩側再算中央 而且由你提供的例子來看,你的if expression並沒有被括在括號裡面(如果我沒記錯C 應該是要吧?) 我會建議你抄C 的方式,因為這樣你可以確保if後面的括號必須得是 expression,對你處理文字上會比較好作 而且你這樣的想法已經很接近tree的建法了..我會建議你去看一下parser tree 或者先看一下我丟的計算機裡面產生出來的後敘運算式 我會Parser Tree 也知道Pirfix 及 Postfix 只是我只會理論 至於要怎麼實作就真的不行了~ |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
如果你只用ADD, SUB,那是沒問題的,但問題就在你要引進If,且是有算式的,
如果你像ASM一樣用jez, jnz(不好意思,有點久沒用了,打錯請見諒XD)那當然沒問題 但是if A==2 && B ==1, 在你(人腦)看來就是先處理A, B兩條件,再作&&運算,(實際上這時候&&的運算就已經後於==) 如果條件換成A || B && C跟A || (B && C)那就是兩回事了,前者由左向右算,A, B任一成立與C成立,後者A成立或B與C同時成立 諸然此類的例子很多,除非你可以確保,或者是限制輸入不會有額外的運算優先權問題 我想postfix的轉換與使用,用算的你應該會算, 如何程式化,就要多想一下,我的建議是你的每一個運算,每一步都畫在紙上,比較容易知道程式流程該怎麼 走 比如說如何判斷現在讀進的運算子是否可以直接使用相鄰的運算元(ex 3 4*9, 號不可以直接把4這個值讀進來), 你可以畫畫看,會得到一個結果,就是偷看下一個運算子,再稍微想一下你就會發現這跟轉後序的方法就連起來了..:P 先想如何拆token,然後轉成後序, token的大原則就是運算子跟運算元是兩回事,你可以先切開來,只要不屬於算運子跟運算元就拋出語法錯誤, 括號也必須成對,部份運算子可以重覆(如括號可以是((3 9)*2) ),先用最直接想得到的方法作 轉後序的動作,你可以先自己畫在紙上,每一步都寫出來,就一定可以轉成程式 再來後序的計算方式,假設a = 3, b = 4, c =9,且算式為a b c, 那麼先轉成a, b, , c, ,//這部份你可以想一下怎麼轉成程式 再來就是將a, b, 算出來,放回去,就會得到7, c, 再將這個算出來就可以了,其實沒有那麼難 parser tree會稍微麻煩一點,因為我不確定你到底要作到什麼程度..比較難給你方向 不過剛隨手翻了一下google,發現這方面其實還有不少人有寫,wiki也有..
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |