CON TRỎ (nâng cao)

Con trỏ chưa bao giờ là dễ dàng với người học, vì sự trừu tượng của nó, và vì có nhiều khái niệm liên quan đến bộ nhớ, địa chỉ… vốn xa lạ với người mới. Lời khuyên trước tiên là bạn hãy đọc qua bài này: https://daohainam.com/2021/08/13/cau-chuyen-ve-con-tro-pointer/

Sau khi đọc xong, ta sẽ điểm thêm vài điều có thể bạn chưa biết:

👉 Trong ngôn ngữ máy không có khái niệm con trỏ:

Đúng vậy, con trỏ là một khái niệm của ngôn ngữ bậc cao. Trong ngôn ngữ máy hoặc assembly, bạn chỉ có khái niệm địa chỉ, vì đối với nó, địa chỉ cũng chỉ là một số nguyên nên chẳng có lý do gì lại phải có thêm một kiểu dữ liệu mới.Trong các ngôn ngữ bậc cao, người ta cần con trỏ để giúp xác định “kiểu của vùng nhớ mà con trỏ trỏ đến”.

Continue reading “CON TRỎ (nâng cao)”

BẠN ĐANG CẦN BÍ KÍP HỌC TIẾNG ANH CHUYÊN NGÀNH?

May be an image of 1 person

Lang thang trên web tìm thấy cuốn “Data Structures and Algorithms” này, xem sơ qua thấy khá hay.https://www.cs.bham.ac.uk/~jxb/DSA/dsa.pdf

Những bạn nào muốn vừa học thuật toán vừa học tiếng Anh chuyên ngành có thể bắt đầu với cuốn này. Các bạn đừng sợ không đọc được, chúng ta nói tiếng Việt nên chẳng ai sinh ra mà đã đọc được cả.Nếu muốn bắt đầu học tiếng Anh chuyên ngành, các bạn nên đặt ra một mục tiêu, như đọc hết toàn bộ sau 2 tháng, từ đó hãy lập mục tiêu một ngày đọc bao nhiêu trang, đọc hết không có nghĩa là bạn hiểu hết những gì nó viết, nếu thấy khó quá thì bạn có thể tham khảo thêm một quyển sách tiếng Việt về cùng nội dung. Điều này cũng tương tự như khi bạn đọc một cuốn sách chuyên ngành bằng tiếng Việt: Bạn đọc được hết nhưng không chắc sẽ làm được tất cả những gì viết trong đó.

Continue reading “BẠN ĐANG CẦN BÍ KÍP HỌC TIẾNG ANH CHUYÊN NGÀNH?”

Hỏi đáp về cài đặt SQL SERVER

Sau một thời gian chinh chiến trên khắp các nẻo đường Facebook, tôi chợt phát hiện ra rằng rất nhiều bạn đang gặp trục trặc khi cài đặt SQL để thực hành. Vậy nên trong bài này tôi sẽ nói qua một số lỗi và cách khắc phục. Bài viết này sẽ trình bày dưới dạng hỏi đáp.

1.Nên chọn phiên bản SQL Server nào?

👉 Trừ khi bạn có một yêu cầu nhất định, còn không thì cứ tải về phiên bản mới nhất mà dùng. Phiên bản hiện tại là 2019.

2. Có thể dùng SQL Server express hay Developer để học không?

👉 Tất nhiên là được! Từ góc độ lập trình cơ bản, cả 2 phiên bản đều đáp ứng được yêu cầu của bạn.

Continue reading “Hỏi đáp về cài đặt SQL SERVER”

TÔI LÀ AI? ĐÂY LÀ ĐÂU?

Mình nhận được rất nhiều câu hỏi như trên? Nên muốn viết bài này để chia sẻ với mọi người.

Tôi là ai ❓

Tôi là một người vô cùng đam mê lập trình, đam mê từ khi mới học cho đến tận bây giờ, thật sự đó là một điều may mắn, vì nhờ niềm đam mê đó mà tôi có thể đọc sách về máy tính, viết code, chạy thử, rồi nhìn thành quả thâu đêm suốt sáng mà không chán.Tôi biết có nhiều người không có may mắn này nên khi học họ cảm thấy rất chán, học trong sự hứng thú chắc chắn sung sướng hơn học trong sự chán nản rồi!Nhờ niềm đam mê này mà tôi đã đọc vô số sách, blog, mã nguồn, đọc cả mã dịch ngược, rồi cũng bắt tay vào làm, cài đặt, có khi đúng, có khi sai, rồi lại nghiền ngẫm vì sao làm thế này mà không thế kia… Tại sao mình hiểu như vậy, nhưng người ta nói thế này, vậy mình sai chỗ nào?

Tôi là một người đam mê máy tính! 😁

Continue reading “TÔI LÀ AI? ĐÂY LÀ ĐÂU?”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP – TÍNH ĐA HÌNH (Polymorphism)

Đa hình là tính chất quan trọng nhưng khó hiểu nhất của OOP – nắm bắt được tính chất này, bạn sẽ dễ dàng hiểu được tất cả những gì còn lại, kể cả tính trừu tượng sau này. Trong bài này tôi sẽ giải thích nó theo cách đơn giản nhất, sau đó trong phần 2 ta sẽ đào sâu vào, xem những gì thực sự xảy ra ở bên dưới.

👉 Giải thích đơn giản thì đa hình cho phép tự động gọi một phương thức dựa trên các tham số truyền vào (1) hoặc kiểu thực sự của đối tượng bạn đang có (2). (1) Nếu bạn có 2 phương thức:

function Add(x, y : Integer) : Integer;
begin
    Add := x + y
end;
function Add(s, t : String) : String;
begin
    Add := Concat(s, t)
end;
Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP – TÍNH ĐA HÌNH (Polymorphism)”

HÀM main TRẢ VỀ GÌ?

int main(int argc, char *argv[])

int main (void)

public static void main(String [] args)

static void Main(string[] args)

def main():

Có lẽ bạn không lạ gì hàm main, hàm đầu tiên bạn viết khi học lập trình C, ngay cả khi chuyển sang một ngôn ngữ khác, nhất là các ngôn ngữ thừa kế từ C như C++, Java và C#, bạn cũng sẽ thấy một hàm tương tự. Đặc trưng của main là nó sẽ nhận vào các tham số (các tham số này được truyền cho chương trình đang chạy từ trên dòng lệnh) và trả về dữ liệu kiểu int hoặc void.

👉 Khi gọi một hàm (sqrt, rand, malloc…), bạn sẽ nhận được kết quả trả về của hàm đó, vậy giá trị trả về của hàm main sẽ trả về cho ai? Và để làm gì?👉 Vì khi main kết thúc cũng đồng nghĩa với chương trình kết thúc, nên bên trong chương trình bạn không có cách nào lấy giá trị đó (trừ khi bạn cố ý gọi main), mà giá trị này sẽ trả về cho hệ điều hành, hệ điều hành sẽ lưu lại và cho phép chương trình kế tiếp thực thi có thể đọc được. Nhờ khả năng chuyển kết quả thực thi của một chương trình cho một chương trình khác mà ta có thể viết được các chuỗi lệnh (hay các batch scripts, bash scripts…).

Continue reading “HÀM main TRẢ VỀ GÌ?”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 2)

Thừa kế cho phép ta tạo một lớp mới mở rộng từ một lớp khác, lớp mới được gọi là lớp con, lớp thừa kế hay lớp dẫn xuất (derived class), mình hay gọi là lớp con cho nhanh.

Lớp cha còn gọi là lớp cơ sở.Ưu điểm dễ thấy nhất là ta có thể tạo ra một lớp con mới tận dụng các tính năng có sẵn được cung cấp từ lớp cha, hay còn gọi là khả năng sử dụng lại.

Ấy nhưng đó lại chẳng phải là nguyên nhân người ta cho ra đời tính chất này, bởi nếu bạn đã có sẵn những tính năng đó thì dù có hay không khả năng thừa kế, bạn vẫn có thể tạo ra những lớp mới gọi lại các tính năng đó.Ưu điểm chính của thừa kế là nhờ có nó ta mới có được đa hình (polymorphism), và nhờ đa hình mà ta có trừu tượng (abstract).

❗️Trừu tượng là thứ mà tất cả những nhà thiết kế phần mềm đều muốn sử dụng càng nhiều càng tốt: các driver cho phép phần mềm giao tiếp với các thiết bị khác nhau khi dùng chung một phương thức, các file system driver giúp tương tác với các file trên đĩa mà không cần quan tâm chúng được định dạng với NTFS, HTFS, FAT hay Ext3, ngôn ngữ SQL cho phép làm việc với các cơ sở dữ liệu mà không cần biết chúng được lưu trữ thế nào, HTTP cho phép xem các trang web mà không cần quan tâm máy chủ của nó hoạt động ra sao… Có vô số các ví dụ như vậy. Vì thực sự thừa kế rất dễ hiểu nên tôi sẽ chỉ giải thích một số khái niệm liên quan:

Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 2)”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)

Tiếp theo các bài viết về tầm quan trọng của OOP trong lập trình, tôi sẽ tiếp tục giải thích kỹ hơn về các khái niệm có trong OOP. Tôi sẽ chỉ nói về ý tưởng, và cách thiết kế một cách hợp lý, tức là vì sao có nó và nên sử dụng nó như thế nào. Việc giới thiệu và cách viết trong từng ngôn ngữ cụ thể bạn có thể đọc được từ rất nhiều tài liệu khác có trong trường học và Internet.

OOP sẽ rất dễ hiểu nếu bạn nhìn từ góc độ cuộc sống, bạn đọc một khái niệm, tìm một ví dụ trong đời thực mô tả khái niệm đó, khi đã tìm được ví dụ bạn sẽ dễ dàng hiểu được nó.

Nhớ là các khái niệm trong OOP có sự liên hệ lẫn nhau, nên sẽ rất khó nếu bạn cố gắng học và hiểu toàn bộ từng-cái-một, cách tốt nhất là đọc toàn bộ, phần nào chưa hiểu hết cứ bỏ qua, rồi lại đọc lại toàn bộ một lần nữa, lần này bạn chỉ đọc những chỗ đã bỏ qua ở lần trước. Cứ lặp đi lặp lại như vậy, lúc nào đó bạn sẽ nghiệm ra và hiểu tất cả.

Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)”

BẠN HỌC GÌ ĐỂ ĐI LÀM?

Em mới học xong C++ giờ em học gì tiếp để đi làm?

Đây là câu hỏi khá phổ biến, vì ai chẳng muốn học để đi làm? Còn gì đau đớn tâm can hơn là học 4-5 năm đại học xong ra phải chạy Grab, mất toi một nửa tuổi thanh xuân.Để trả lời câu hỏi này, bạn cần biết tại các công ty phần mềm người ta làm gì (Ở công ty phần mềm, người ta làm ra phần mềm, ôi dĩ nhiên rồi 😃) và người ta cần người như thế nào.

Phần mềm có rất nhiều loại, có thể nói con người cần làm gì, thì sẽ có phần mềm hỗ trợ họ làm việc đó. Vậy nên trong bài viết này sẽ chủ yếu nhắc đến những công nghệ phổ biến nhất, sau khi làm vài năm, tùy khả năng và hoàn cảnh đưa đẩy, mỗi người sẽ có con đường đi riêng của mình.

👉 Trước tiên, đã là lập trình thì bạn phải thành thạo một ngôn ngữ lập trình nào đó, có thể là Java, C++, ASM, PHP, Python… thành thạo nghĩa là phải kể vanh vách được các kiểu dữ liệu như thế nào, các vòng lặp được thực hiện ra sao, các bộ thư viện chính là gì, các từ khóa static, interface, import, export, synchronized, await, async… hoạt động thế nào. Các biến được lưu trữ thế nào, kiểu float khi lưu trữ khác gì int, kiểu string khác gì mảng char… Các input/output stream hoạt động như thế nào, dùng thư viện gì để kết nối cơ sở dữ liệu… Để biết một ngôn ngữ nào đó rất dễ, nhưng thành thạo thì rất lâu đấy nhé.👉 Cấu trúc dữ liệu và giải thuật: đây là một môn học vô cùng thú vị nhưng cũng khá hại não. Nhưng thực sự vô cùng cần thiết, nó dạy cho bạn cách người ta suy nghĩ thế nào, để từ đó bạn biết mình cần suy nghĩ thế nào. Sau này bạn sẽ thấy rất nhiều thứ có trong máy tính đã được xây dựng từ những thứ bạn được học: linked list, tree, graph…

Continue reading “BẠN HỌC GÌ ĐỂ ĐI LÀM?”

64 bit? 32 bit?

Mỗi khi cài đặt Windows, Linux, các phần mềm, ta lại nghe đến khái niệm 32bit hoặc 64bit, vậy chúng là gì? Ta cùng tìm hiểu xem nhé.

👉 Bộ nhớ máy tính:Bộ nhớ máy tính là một dãy byte liên tiếp được sắp xếp từ vị trí 0, sau đó tăng dần, byte kế tiếp nằm ở vị trí 1, rồi 2, 3, 4…, mỗi byte có thể được truy xuất thông qua vị trí, hay còn gọi là địa chỉ. Như vậy byte đầu tiên sẽ có địa chỉ 0, byte thứ 1000 có địa chỉ 999. Để truy xuất vào 1 byte nào đó ta cần biết địa chỉ của nó.

👉 Thanh ghi trong máy tính:Thanh ghi là các vùng bộ nhớ nhỏ trong CPU, được dùng lưu trữ dữ liệu để làm việc, ta có thể coi nó giống như các tờ giấy note nhỏ CPU sử dụng trong lúc làm việc. Có nhiều thanh ghi khác nhau, mỗi thanh sẽ có tên và nhiệm vụ riêng, một số thanh ghi bạn có thể dùng lưu trữ chung như AL, AH, AX, EAX, EBX, ECX… một số khác được sử dụng cho một mục đích cụ thể: IP lưu địa chỉ lệnh kế tiếp sẽ được thực hiện, SP chỉ đến stack, CS, DS, ES… chỉ đến các phân đoạn (segment) bộ nhớ… Các thanh ghi có đuôi L (low) và H (high) là các thanh ghi 8 bit, vốn là 2 nửa của các thanh ghi đuôi X, AL và AH chính là 2 phần của AX, tương tự cho BX, CX… Vì là hai nửa cao và thấp nên thay đổi giá trị của AL hoặc AH cũng làm thay đổi AX. Tưởng tượng AL có giá trị là 0x20, AH là 0xFF, thì AX sẽ có giá trị là 0xFF20.

Các thanh ghi AX, BX,CX, DX, IP, SP… là các thanh ghi 16 bit, tức giá trị tối đa nó có thể chứa là 65535.

Continue reading “64 bit? 32 bit?”