|
|
FaL wrote:
Mà giờ tui mới đọc rõ code của VaT,
Code:
For x = j to (i-1) TempStr = TempStr + String[x];
If TempStr in Bien
{
Thay GiaTriBien tương ứng với TempStr vào.
(Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
}
Kiểu này thì khi đọc TempStr được "a" thì bạn thay luôn à? Mặc dù biến đó thực sự là ab?
Làm gì có chuyện đó hả bác.
Ở điều kiện khi duyệt tới vị trí i trong chuỗi String nếu gặp các token là các toán tử thì mới bắt đầu lấy tên của các biến. Sau đó kiểm tra tên biến đó có tồn tại trong các định danh tên biến mà mình đã lưu trữ không, nếu có thì thay thế
|
|
|
Các bác cứ hỡ một tí là đem VN ra so sánh với nước ngoài...Bạn là bạn, bạn có học ở nước ngoài đi chăng nữa thì cũng chưa chắc hơn một người học ở VN đâu...Vì thề mình thấy khi nói đến chuyện học hay đi làm...thì đừng nên đem VN ra để so sánh với nước ngoài vì trình độ của bạn. Bạn có điều kiện học tới đâu thì cố gắng phát huy cái điều kiện mà bạn đang có thì thành công sẽ đến với bạn thôi...chứ đừng mơ mộng phù phiếm kiểu như trình độ thì bình thường nhưng cứ bảo nếu mình học ở MIT thay vì học ở trường A ở VN thì mình chắc chắn sẽ ghê gớm hơn nhiều thì chẳng biết nói gì hơn nữa!!!
|
|
|
Vì vậy mình mới đề nghị cách duyệt chuỗi đơn giản hơn và phù hợp hơn cho bạn ấy . Chứ mấy bài này thì trên 4rum mình đã có hỏi nhiều rồi.
|
|
|
Bạn publicIT nói đã làm thử với stack và tách dựa trên các token rồi và bảo không hiệu quả thì anh FaL hướng dẫn bạn ấy như vậy thì sao làm được. Bạn publicIT nên tập với các thuật toán duyệt chuỗi đơn giản hơn đã đi.
|
|
|
Ý của bạn publicIT hỏi là thay thế các giá trị của các biến vào chuỗi à:
Code:
VD : a = 1,b=2,ab =13, c=14, ca=15;
Chuỗi : (a-b*ca+ab)*b ---> (1-2*15+13)*2 đúng không?
Vậy bạn làm thử thế này :
Code:
- Tạo một table định danh cho các biến : có thể là struct, array để lưu các định danh cho biến
- Tạo một table lưu các toán tử (+,-,*,/,...)
- Duyệt chuỗi :
+ Từ String[0] -> String[Length(String)]
+ Khai báo Array Bien =['a','b','ab',...] // Tùy theo bài của bạn
+ Khai báo Array GiaTriBien = [,..,..,..] // Cái này bạn lưu tương ứng với từng định danh biến
+ Khai báo i,j (kiểu int chẳng hạn)
+ Khai báo TempStr (kiểu String )
+ i = 0 ; Được dùng để duyệt chuỗi
+ j = 0; vị trí của định danh biến trong chuỗi
+ TempStr=''; // Lưu tạm của định danh biến mà ta tìm thấy
Bắt đầu duyệt :
+ If String[i] in [+,/,-,...]
{
For x = j to (i-1) TempStr = TempStr + String[x];
If TempStr in Bien
{
Thay GiaTriBien tương ứng với TempStr vào.
(Cái này có nhiều cách, bạn có thể trực tiếp sửa trong chuỗi nguồn cũng được, nhưng xử lý cẩn thận tí)
}
}
Đây là một cách cơ bản. Bạn có thể cải tiến thêm để chương trình chạy tốt hơn.
|
|
|
Ok. Mình đã coi lại. Do nick tranhuuphuoc bị chuyển qua thành Locked...nên có một số nhầm lẫn...Nhưng có lẽ locked còn hơn cả hạ xuống member. Ah, tiện đây em có một thắc mắc luôn, sao anh Jaguar lại có tước hiệu là Member nhỉ?
|
|
|
Mình mà không để ý sao? Hôm qua chính mình còn mới reply về chuyện không nên cãi vả ở topic đó mà ... nick a tranhuuphuoc lúc đó vẫn là HVA Friend, nhưng giờ thì chuyển thành subnetwork (Member) rồi...Bạn có thể kiểm tra lại ...Nhưng mình thấy việc có hạ xuống member thì cũng là chuyện bình thường thôi. Vì khi bạn làm Mod bạn có quyền ban nick hoặc warning một member vì vi phạm hay nói năng bậy bạ thì khi đến lượt bạn vi phạm thì chuyện xử phạt bạn cũng là lẽ thường tình... Đúng không bác gà mờ (hồi xưa mình gọi là chị gamma ). Còn anh quanta thì sau này mình mới thấy nhưng cách làm việc của anh trên vai trò Mod thì khá chuẩn đấy ...Thôi, không bàn chuyện này nữa...Mọi người cũng bão nào....
|
|
|
quanta wrote:
VaT wrote:
Hình như cả nick cũng bị đổi và một số topic của bác đó cũng bị xóa. Một hình thức kỷ luật rất nặng mà em thấy từ trước tới nay ở HVA
Không phải đâu, bạn có chút nhầm lẫn.
Về vấn đề một số topic bị xóa thì có thể mình nhầm...nhưng vấn đề change nick và hạ xuống member như mình thì chắc là có rồi. Nhưng điều đó đáng hoan nghênh...thể hiện chính sách "Admin vi phạm cũng bị xử lý như Member"
|
|
|
Hình như cả nick cũng bị đổi và một số topic của bác đó cũng bị xóa. Một hình thức kỷ luật rất nặng mà em thấy từ trước tới nay ở HVA
|
|
|
Nếu em không nhầm thì 1500$ ở đây là đôla Singapore thì phải. Theo như anh nói, ngoài mức lương $S 1500/ month thì Cty còn hỗ trợ thêm chổ ở và hỗ trợ ngày 3 bữa ăn. Nếu ở 2 người một phòng, với giá cả nhà ở tại Singapore bây giờ thì 1 người phải trả khoảng 400$S/ month. Tiền ăn uống khoảng 20$S/ 1 ngày, vậy khoảng 600$/ tháng. Vị chi, tiền lương là khoảng 2500$S/ month đúng không anh mrro?. Nếu vậy thì cũng chấp nhận được, nhưng theo em được biết thì với những yêu cầu đó thì có thể kiếm trên 3000 $S/ month. Vì những người học NTU hay NUS về CS hay CE khi mới ra trường lương tối thiểu đã là >2500$S/month rồi.
P/S: Chú ý, những ai có ý định đi làm ở Singapore nên biết các thông tin sau :
- Hút thuốc là cần phải cẩn thận (Có thể bị phạt từ 500$S - 10.000$S trở lên hoặc bị bỏ tù, đánh đòn và trục xuất về nước). Ví dụ : Thuốc lá Singapore bây giờ có ký hiệu riêng, khác với thuốc là mua ở các nước khác nên đừng dại dột hút thuốc lá lậu ở nơi công cộng mặc dù thuốc lá lậu được bán rất nhiều ở Singapore ( vì tụi police thường mặc thường phục đi tuần đấy).
- Ở nơi ở đừng la hét ầm ỹ để khỏi bị tụi hàng xóm complain với police. Nếu không bạn sẽ mệt đấy. Ăn ở đừng để bốc mùi, tụi hàng xóm cũng có quyền complain.
- Khi mới ở, nếu thấy hóa đơn tiền điện khá rẻ trong 1,2 tháng đầu, nhưng đến tháng thứ 3 đột nhiên tăng cao mặc dù mình vẫn tiêu thụ điện như vậy thì cũng đừng ngạc nhiên. Lý do tại sao thì khi bạn ở sẽ thấy rõ.
- Đừng uống rượu hay nhậu nhẹt quá nhiều để khỏi phải đi bệnh viện. Vì chi phí cho một ngày nằm lại bênh viện là 1000$S/1 ngày... Hãy cố gắng giữ gìn sức khỏe khi đi làm.
- Khi đi ăn uống ở khu Geylang, JoeChat (còn được gọi là Sài Gòn thu nhỏ),ChinaTown... đừng có chọc gái quá đáng...nếu không bạn sẽ chuốc lấy phiền phức.
|
|
|
Cái này dạng như một plugin, để bạn có thể sử dụng các hàm của nó để check syntax của một câu lệnh sql xem có bị lỗi không? Ngoài ra còn nhiều chức năng khác nữa. Bạn chịu khó đọc và dịch tiếng Anh đi.
Đây là link help online của nó :
http://www.wangz.net/gsqlparser/doc/webhelp/frames.html?frmname=topic&frmfile=index.html
Còn về phần biểu thức thì mình thật sự không biết có source code hay plugin nào hỗ trợ không? Nên tốt nhất bạn có thể tự viết với giới hạn cho phép của mình
|
|
|
Dùng thử thằng này :
http://www.sqlparser.com/
|
|
|
Nếu chỉ dùng Try Catch để bắt lỗi không thì cũng chưa giải quyết được yêu cầu của bạn đâu.Theo mình nghĩ, bạn nên viết một hàm CheckSqlCmd , dùng để kiểm tra xem đó có phải là câu truy vấn SQL đúng không , nếu đúng thì thực thi. Còn sai thì chuyển qua một hàm Check khác để kiểm tra xem đó có phải là một biểu thức toán học đúng không? Nếu đúng thì thực hiện.
Việc viết hàm CheckSqlCmd là do bạn, có thể bạn dùng các hàm xử lý String trong VB để kiểm tra xem có các câu lệnh như "SELECT","INSERT","UPDATE" không, rồi kiểm tra xem cấu trúc của câu lệnh SQL đó có đúng không?... Cái này bạn phải tự làm.
|
|
|
Oh, mình đã biết mình bị lỗi ở đâu. Té ra trong đống code tạo table và field
Code:
qlCreateTable.CreateField(_T("IDUSER"),dbInteger,2,dbAutoIncrField);
qlCreateTable.CreateField(_T("HOTEN"),dbText,255,dbVariableField);
qlCreateTable.CreateField(_T("NGAYSINH"),dbDate,8,dbUpdatableField);
thì đoạn code :
Code:
qlCreateTable.CreateField(_T("IDUSER"),dbInteger,2,dbAutoIncrField);
gây ra lỗi, nên không thể tạo được table name và các field còn lại. Mình sẽ tìm hiểu xem tại sao bị lỗi đó. Nhưng theo phỏng đoán chắc là do tham số dbAutoIncreField gây ra, vì nó có liên quan đến Primary Key trong Access thì phải.
---------------------------------------
P/S : Nếu các bạn làm về vấn đề này thì có thể tham khảo thêm CDaoFieldInfo.
Thư viện cần thêm : "afxdao.h"
Cảm ơn các bạn đã đọc.
|
|
|
Vấn đề này có vẻ ít bạn quan tâm đến. Đến giờ mình vẫn chưa biết làm cách nào để khắc phục được lỗi của Cách 2. Nếu có bạn nào đã làm qua vấn đề này thì có thể chỉ điểm dùm mình được không?
|
|
|
Bình thường chúng ta có thể truy xuất CSDL từ một file Access (đã được tạo sẵn bằng Microsoft Acess) từ ứng dụng C++ MFC bằng các Class CDatabase và CRecordset. Nhưng giờ nếu chúng ta muốn tạo một file Access từ ứng dụng của chúng ta thì như thế nào. Qua tìm hiểu, em có biết 2 cách sau để tạo ra 1 file Access từ ứng dụng C++ MFC như sau:
Cách 1 :
Code:
- Khai báo : CDaoDatabase newAccessFile;
- Khởi tạo : newAccessFile.Create("Test.mdb");
- Xây dựng CSDL trong file Test.mdb: Bằng cách dùng hàm Execute(Sqlcommand)
Trong đó : Sqlcommand là các câu lệnh của Sql như : Creat table, Insert field,...
Cách 2 :
Code:
- Cũng khai báo : CDaoDatabase newAccessFile;
- Khởi tạo : newAccessFile.Create("Test.mdb");
- Xây dựng CSDL trong file Test.mdb: Bằng cách sử dụng thêm Class CDaoTableDef. Cụ thể:
+ Khởi tạo Table : CDaoTableDef newAccessTable(&newAccessFile);
+ Tạo table : newAccessTable.Create(_("TestTable"); // Có một số thông số khác nếu cần thiết//
+ Tạo field trong table : newAccessTable.CreateField(_("TestField1"),dblong,dbAutoIncrField)
+ Xác nhận tạo table xong : newAccessTable.Append();
+ Tạo nội dung cho field: newAcessTable.Excute(SqlCmd);
Khi em dùng Cách 1 thì mọi việc đều suôn sẽ, có nghĩa là em tạo file Access đó từ ứng dụng của em xong, em mở nó bằng Microsoft Acess thì nó hiện ra đầy đủ những gì em đã tạo.
Nhưng khi em dùng Cách 2 thì nó chỉ tạo ra file Access, còn những nội dung trong file Access đó như table name, field, content ,.. thì lại không có.
Có điều, em thấy nếu dùng Cách 2 thì rất thuận tiện cho việc coding, chỉnh sủa và nâng cấp vì các bước rất rõ ràng nhưng em không thể hiểu tại sao Cách 2 lại không thể cho ra kết quá như Cách 1 được. Phải chăng có sự sai sót nào trong Cách 2 này của em. Nếu có anh chị nào đã từng làm qua điều này và có kinh nghiệm thì mong được thảo luận ở đây để em và những ai đang tìm hiểu về vấn đề này được rõ.
P/S : Còn một vấn đề nữa, mà có thể em sẽ đề cập ở bài Thảo luận sau khi đã tìm hiểu là : Truy cập vào file Access 2007.
|
|
|
Trong C++ MFC thì tham khảo các class CFileFind, CFile trong MSDN hoặc Google để làm. Có hướng dẫn rõ ràng. Còn với ngôn ngữ khác như Java thì thừ tìm kiếm trong các Reference hoặc Documentation của nó.
|
|
|
Thuật giải đơn giản nhất cho bài này là dùng : stack. Bạn có thể đọc trong cuốn cẩm nang thuật toán để biết thêm chi tiết và tham khảo thêm các thuật toán khác.
|
|
|
Sau khi lên mạng Google vài chục vòng. Em thấy có một số bài nói về việc hạn chế dùng Global Variable và hạn chế declare variable trong file header. Các bạn có thể giải thích lý do tại sao lại làm như vậy không, mình thật sự chưa rõ lắm về vấn đề này. Nhưng có những trường hợp( 1 file .h nhưng được dùng cho nhiều .cpp) thì mình cần phải làm thế nào? Em đã thử dùng extern nhưng vẫn bị lỗi LNK2001 và LNK1120. Mong được các bạn chỉ điểm thông suốt vấn đề này.
|
|
|
Hình như trong file MyResource.h của em. Các biến hay các lớp của em phải có thêm từ khóa extern .
Nhưng khi em thêm từ khóa extern vào:
MyResource.h
Code:
thì khi biên dịch lại xuất hiện lỗi
Code:
error LNK2001: unresolved external symbol....
fatal error LNK1120: 1 unresolved externals
Em thật sự không hiểu tại sao như vậy? Làm thế nào để sử dụng biến, hàm, class toàn cục trong C++
|
|
|
Trong ứng dụng của em có tạo một file header MyResource.h để chứa các Biến, các Lớp sẽ được dùng chung cho toàn bộ chương trình.
Giả sử bây giờ ứng dụng của em có 3 Dialog : MyAppDlg (Main Dlg), MyAppLoginDlg , MyAppEditDlg.
Trong MyAppDlg của em có một button gọi là Login. Khi em nhấn Login sẽ xuất hiện MyAppLoginDlg để nhập user và password. Nếu đúng user và pass thì sẽ hiện ra MyAppEditDlg.
Bây giờ, nếu em chỉ include MyResource.h của em vào MyAppDlg.cpp thì biên dịch ngon lành. Nhưng nếu em tiếp tục include MyResource.h vào MyAppLoginDlg để có thể sử dụng các biến và Lớp mà em đã khai báo trong đó thì khi biên dịch lập tức sẽ xảy ra lỗi LNK 2005 và không thể chạy được ứng dụng.
Và em đã có tham khảo lỗi LNK 2005 trong MSDN và được chỉ cách khắc phục là thêm vào Linker chỉ lệnh biên dịch /FORCE . Sau khi làm xong hướng dẫn, em biên dịch lại, chuơng trình vẫn chạy được nhưng trong Output của phần biên dịch nó vẫn xuất hiện thông báo Warning.
Vậy em muốn hỏi là làm sao để có thể một file header chứa các biến và các lớp mà ta khởi tạo sẽ được dùng chung cho toạn bộ ứng dụng mà không bị lỗi LNK 2005.
P/S : LNK 2005 : symbol already defined in object
|
|
|
Code = Google. Giải pháp đã đưa ra cho bạn, mà bạn còn không chịu tìm hiểu để làm thi đúng là bó tay thật.
|
|
|
Nếu sử dụng các hàm của lớp CString để tách string kiểu 29/11/2008 ra theo token "/" rồi convert qua kiểu int rồi chuyển qua lớp CTime thì em biết rồi.
Nhưng điều em cần tìm hiểu xem, là có lớp nào về DateTime trong C++ MFC hỗ trợ việc này không, khi trong dotNet thì có.
Và hôm nay em tìm ra một lớp có thể giúp mình làm công việc ở trên dễ dàng là : COleDataTime với hàm ParseDateTime .
Cảm ơn mọi người đã đọc và trả lời.
|
|
|
Em viết một ứng dụng bằng Visual C++ MFC và trong ứng dụng của em có sử dụng dữ liệu về ngày tháng để tính toán. Và dữ liệu đó được lưu trong file Access.
Khi em truy xuất dữ liệu ngày tháng từ file Access đó thì nó ở dươi dạng CString (vì em thấy trong class CDBVariant không hỗ trợ việc lấy giá trị theo ngày tháng nên em để mặc định là kiểu CString) thì có dạng như sau: 29/11/2008
Vậy làm thế nào để convert 29/11/2008 (CString) thành CTime trong C++ để em có thể truy xuất dễ dàng đến ngày, tháng, năm một cách nhanh chóng.
Trong C++.Net em có thấy có class DateTime, và có hàm ParseExact để làm điều này nhưng CString ở dạng 29112008 chẳng hạn thì mới làm được. Còn ở C++ MFC thì em chỉ mới biết có lớp CTime để làm việc với Date Time nhưng chỉ có hàm Format của lớp CTime dùng để chuyển Date Time qua CString thôi.
|
|
|
Làm việc ở Singapore mà lương có từ 700$-1000$ . Anh mrro giỡn hay thiệt vậy?
|
|
|
Chắc do anh Z0rr0 phải lập trình trên các phiên bản có license thì phải? Anh có thể ra mua một đĩa cài VS 2008 Pro về đê test thử. Em đã thử rồi nhưng để hiện thị tiếng việt trên caption đúng là hơi khó khăn, vẫn được nhưng mất công một tí nên em muốn tìm hiểu xem có cách nào đơn giản hơn mà VS 2008 đã hỗ trợ không?
|
|
|
Các bạn có thể tham khảo các Connection Strings ở đây:
http://www.codeproject.com/KB/database/connectionstrings.aspx
|
|