Có lẽ mảng và con trỏ là những nỗi ám ảnh đối với một người mới học lập trình. Thực ra, cái khó khăn nhất của việc dùng mảng chính là bản năng con người.
Con người sợ ma hay sợ mấy con thú kỳ dị, họ sợ những gì lạ lẫm với họ.
Một số người sợ những ký tự như ngoặc nhọn "(", ngoặc vuông "[", dấu sao "*", dấu mũ "^" ...
Hậu quả cuối cùng là họ cảm thấy những thứ như a, hoặc *p thật là bí hiểm bởi vì học chỉ quen thuộc với các ký tự thông thường (a, b, c...) mà họ vẫn hay đọc, viết.
Thực ra, đối với người lập trình viên, thì viết
m = 6; hay hom_nay_anh_nho______em = 6;
a = 19; hay cuop_Ngan_Hang____dua_Nang_di_Chat[motdem_khuya]=19;
chẳng có gì là khác nhau cả.



Thực sự thì chúng cũng chẳng có j khác nhau cả, bên trái là 1 biến số, cụ thể là 1 ô nhớ trong máy tính, bên phải là 1 giá trị (hoặc biểu thức), ở giữa là dấu gán (chứ không phải dấu bằng). Theo bản năng, con người ta thường coi biến viết dài khác biến viết ngắn (ví họ bị ấn tượng bởi độ dài ngắn), coi biến viết có ký tự lạ khác với biến chỉ gồm các chữ trong bảng cái (ví họ bị ấn tượng bởi sự lạ lẫm (cuop_Ngan_Hang____dua_Nang_di_Chat)), họ đã chưa có cái khả năng coi tất cả chúng, chỉ đơn giản là 1 ô nhớ trong bộ nhớ mà thôi.
Và, cũng những học sinh đó, cái mà họ không hiểu, thực ra không phải là mảng, mà chính là bản chất của biến, và chính là vòng lặp.
Khi viết: a = 5; họ tưởng là cái đó đơn giản, họ tưởng là họ hiểu, thực tế chưa chắc họ đã hiểu thực sự về nó, có thể đang đưa cách nghĩ của Toán Học sang lập trình. Lúc đó họ có thể cho rằng a = 5 và 5 = a là giống nhau.
1. Đem tư duy trong Toán Học sang Lập Trình.
Lập trình, từ này không còn lạ lẫm với mọi người trong thời buổi hiện nay. Để lập trình được thì lập trình viên phải vận dụng kiến thức từ những môn khoa học khác, điều này là không thể chối cãi. Nhưng cũng có những người hiểu sai những bản chất của việc vận dụng những kiến thức đó. Cụ thế:
- Trong Toán học thì :
a = b;
hay
b = a;
là tương đương, chúng đều là những CHÂN LÝ (hay GIẢ THIẾT) LOGIC.
Nhưng trong Lập Trình không như thế
a = b là đem giá trị của b gán vào vùng nhớ của a, sau khi gán thì giá trị của a bằng với giá trị của b.
b = a thì NGƯỢC LẠI
Còn a == b mới là một phép toán logic trả về 1 nếu giá trị của a = b, trả về 0 nếu a != b
Trong Toán Học người ta viết
f(x) = biểu thức
Trong Lập Trình thì công việc không đơn giản như thế
Đầu tiên là phải khai báo f(x), ví du
int f(x)
{
return value;
}
Sau đó thì SỬ DỤNG f(x), ví dụ
a = f(x) + 2.54;
hoặc
printf(.... f(x) ....)
Chứ tuyệt đối không thể viết
f(x) = biểu thức
kiểu Toán Học được
Tư duy trong Lập Trình là tư duy về Kế Hoạch và Sử Dụng Tài Nguyên, còn tư duy trong Toán Học là tư duy về Chân Lý
Cả 2 chỉ có điểm chung là Logic thôi.
Về bản chất, hàm và thủ tục (trong pascal) hoặc hàm (trong C và một phần lớn ngôn ngữ lập trình khác) cũng là 1 biến (nó gồm 1 phần lưu trữ bản thân giá trị của nó và 1 phần trỏ đến bộ nhớ lưu trữ đoạn code).
Thủ tục là 1 dạng hàm không định kiểu (Hàm có kiểu void trong C)
Tuy nhiên, hàm chỉ có thể lấy giá trị qua thân hàm (ở C, Java ta dùng lệnh return), nên ta không thể viết như sau:
tenham() = bieuthuc;
ví dụ viết
sqrt(a) = sqrt(b) (Lưu ý: sqrt là hàm trả về kiểu float, 2 bên đều là float nhưng lại không thể gán cho nhau kiểu đó được)
hoặc: sin(x) = 1656;
là SAI.
vế trái chỉ có thể là 1 biến, không thể là 1 hàm, cũng không thể là 1 hằng số.
Tại sao có một số người sinh ra đã lập trình giỏi?
và làm thế nào để trở thành một lập trình viên giỏi?
Đó chắc hẳn là câu hỏi của nhiều bạn trẻ đang đi theo con đường trở thành một lập trình viên (mình cũng vậy
).
Đối với bài tập "Tìm ước chung lớn nhất của 2 số", bạn có suy nghĩ và định hướng gì cho bài này (về cả ngôn ngữ và tư duy).
Thực ra, nếu bạn có tư duy lập trình, thì bạn sẽ giỏi cả C, lẫn Java, lẫn bất kỳ một ngôn ngữ lập trình nào. Và ngược lại, nếu bạn không có tư duy lập trình thì học ngôn ngữ nào cũng kém thôi.
Cũng giống như việc bạn biết tiếng Việt, nhưng không có cách tư duy của một nhà văn, thì sao có thể viết Văn được.
Vậy, cái gì là tư duy lập trình? Trước tiên phải hiểu công việc của lập trình viên là Lập_Ra_Một_Chương_Trình. Chương Trình, bản chất là 1 Kế Hoạch. Từ đó có thể suy ra ai giỏi lập kế hoạch thì cũng giỏi lập chương trình.
Lập Kế Hoạch tức là quy trình hoá. Ví dụ, bình thường bạn nấu cơm, hay bạn kua gái chẳng hạn
, có bao giờ bạn nghĩ đến việc quy trình hoá nó chưa? Nấu cơm gồm những bước nào? Mỗi bước cần làm gì, nếu làm sai cần xử lý ra sao. Rõ ràng nếu bạn muốn tạo ra một con robot biết nấu cơm, thì bạn không thể không chỉ rõ các bước.
Trở lại với việc tìm ước số chung, trước tiên bạn ấy phải biết tìm ước số chung đã (không phải trên máy tính), chỉ cần đến giấy bút, sau đó, bạn ấy phải mô tả các bước mà bạn ấy làm, rồi mới có thể nói đến chuyện lập trình được.
Chú ý: Nếu bạn nào không biết tìm ước số chung bằng giấy và bút, thì cũng không phải là bạn kém. Và nếu bạn ấy không biết cách lập trình C cho bài đó, thì cũng không phải bạn ấy không có tư duy lập trình.
Trường hợp đó, bạn ấy nên hỏi mọi người quanh bạn: "làm thế nào để tìm ước số chung lớn nhất của 2 số?". Và họ sẽ chỉ ra cách. Đương nhiên sau đó bạn ấy sẽ tự nghĩ cách chuyển kiến thức đó sang ngôn ngữ lập trình, ví dụ ngôn ngữ C, ngôn ngữ PHP, Javascript,...hoặc bất kỳ ngôn ngữ nào bạn ấy biết.
Còn nếu bạn ấy biết cách dùng giấy và bút làm được, mà không lập trình được, thì rõ ràng con đường trở thành lập trình viên vẫn còn dài lắm và bạn cần cố gắng rèn luyện nhiều hơn nữa.
Nêu đọc đến đây, bạn thấy mình không làm được bài toán trên, bạn nghĩ mình không có tư duy lập trình. không có năng khiếu về lập trình, bạn chán nản và từ bỏ ước mơ trở thành lập trình viên thì có lẽ bạn sẽ chẳng bao giờ trở thành lập trình viên được. Bạn nên nhớ rằng tất cả moị thứ mới chỉ bắt đầu. Vấn đề quan trọng là bạn có niềm đam mê thực sự hay không. Còn về tư duy và khả năng (bẩm sinh) thì có lẽ ai cũng có nhưng do chúng ta chưa khai quật ra thôi
.
Chúc tất cả moịn người thực hiện được ước mơ của mình.
Con người sợ ma hay sợ mấy con thú kỳ dị, họ sợ những gì lạ lẫm với họ.
Một số người sợ những ký tự như ngoặc nhọn "(", ngoặc vuông "[", dấu sao "*", dấu mũ "^" ...
Hậu quả cuối cùng là họ cảm thấy những thứ như a, hoặc *p thật là bí hiểm bởi vì học chỉ quen thuộc với các ký tự thông thường (a, b, c...) mà họ vẫn hay đọc, viết.
Thực ra, đối với người lập trình viên, thì viết
m = 6; hay hom_nay_anh_nho______em = 6;
a = 19; hay cuop_Ngan_Hang____dua_Nang_di_Chat[motdem_khuya]=19;
chẳng có gì là khác nhau cả.




Thực sự thì chúng cũng chẳng có j khác nhau cả, bên trái là 1 biến số, cụ thể là 1 ô nhớ trong máy tính, bên phải là 1 giá trị (hoặc biểu thức), ở giữa là dấu gán (chứ không phải dấu bằng). Theo bản năng, con người ta thường coi biến viết dài khác biến viết ngắn (ví họ bị ấn tượng bởi độ dài ngắn), coi biến viết có ký tự lạ khác với biến chỉ gồm các chữ trong bảng cái (ví họ bị ấn tượng bởi sự lạ lẫm (cuop_Ngan_Hang____dua_Nang_di_Chat)), họ đã chưa có cái khả năng coi tất cả chúng, chỉ đơn giản là 1 ô nhớ trong bộ nhớ mà thôi.
Và, cũng những học sinh đó, cái mà họ không hiểu, thực ra không phải là mảng, mà chính là bản chất của biến, và chính là vòng lặp.
Khi viết: a = 5; họ tưởng là cái đó đơn giản, họ tưởng là họ hiểu, thực tế chưa chắc họ đã hiểu thực sự về nó, có thể đang đưa cách nghĩ của Toán Học sang lập trình. Lúc đó họ có thể cho rằng a = 5 và 5 = a là giống nhau.
1. Đem tư duy trong Toán Học sang Lập Trình.
Lập trình, từ này không còn lạ lẫm với mọi người trong thời buổi hiện nay. Để lập trình được thì lập trình viên phải vận dụng kiến thức từ những môn khoa học khác, điều này là không thể chối cãi. Nhưng cũng có những người hiểu sai những bản chất của việc vận dụng những kiến thức đó. Cụ thế:
- Trong Toán học thì :
a = b;
hay
b = a;
là tương đương, chúng đều là những CHÂN LÝ (hay GIẢ THIẾT) LOGIC.
Nhưng trong Lập Trình không như thế
a = b là đem giá trị của b gán vào vùng nhớ của a, sau khi gán thì giá trị của a bằng với giá trị của b.
b = a thì NGƯỢC LẠI
Còn a == b mới là một phép toán logic trả về 1 nếu giá trị của a = b, trả về 0 nếu a != b
Trong Toán Học người ta viết
f(x) = biểu thức
Trong Lập Trình thì công việc không đơn giản như thế
Đầu tiên là phải khai báo f(x), ví du
int f(x)
{
return value;
}
Sau đó thì SỬ DỤNG f(x), ví dụ
a = f(x) + 2.54;
hoặc
printf(.... f(x) ....)
Chứ tuyệt đối không thể viết
f(x) = biểu thức
kiểu Toán Học được
Tư duy trong Lập Trình là tư duy về Kế Hoạch và Sử Dụng Tài Nguyên, còn tư duy trong Toán Học là tư duy về Chân Lý
Cả 2 chỉ có điểm chung là Logic thôi.
Về bản chất, hàm và thủ tục (trong pascal) hoặc hàm (trong C và một phần lớn ngôn ngữ lập trình khác) cũng là 1 biến (nó gồm 1 phần lưu trữ bản thân giá trị của nó và 1 phần trỏ đến bộ nhớ lưu trữ đoạn code).
Thủ tục là 1 dạng hàm không định kiểu (Hàm có kiểu void trong C)
Tuy nhiên, hàm chỉ có thể lấy giá trị qua thân hàm (ở C, Java ta dùng lệnh return), nên ta không thể viết như sau:
tenham() = bieuthuc;
ví dụ viết
sqrt(a) = sqrt(b) (Lưu ý: sqrt là hàm trả về kiểu float, 2 bên đều là float nhưng lại không thể gán cho nhau kiểu đó được)
hoặc: sin(x) = 1656;
là SAI.
vế trái chỉ có thể là 1 biến, không thể là 1 hàm, cũng không thể là 1 hằng số.
Tại sao có một số người sinh ra đã lập trình giỏi?
và làm thế nào để trở thành một lập trình viên giỏi?
Đó chắc hẳn là câu hỏi của nhiều bạn trẻ đang đi theo con đường trở thành một lập trình viên (mình cũng vậy

Đối với bài tập "Tìm ước chung lớn nhất của 2 số", bạn có suy nghĩ và định hướng gì cho bài này (về cả ngôn ngữ và tư duy).
Thực ra, nếu bạn có tư duy lập trình, thì bạn sẽ giỏi cả C, lẫn Java, lẫn bất kỳ một ngôn ngữ lập trình nào. Và ngược lại, nếu bạn không có tư duy lập trình thì học ngôn ngữ nào cũng kém thôi.
Cũng giống như việc bạn biết tiếng Việt, nhưng không có cách tư duy của một nhà văn, thì sao có thể viết Văn được.
Vậy, cái gì là tư duy lập trình? Trước tiên phải hiểu công việc của lập trình viên là Lập_Ra_Một_Chương_Trình. Chương Trình, bản chất là 1 Kế Hoạch. Từ đó có thể suy ra ai giỏi lập kế hoạch thì cũng giỏi lập chương trình.
Lập Kế Hoạch tức là quy trình hoá. Ví dụ, bình thường bạn nấu cơm, hay bạn kua gái chẳng hạn

Trở lại với việc tìm ước số chung, trước tiên bạn ấy phải biết tìm ước số chung đã (không phải trên máy tính), chỉ cần đến giấy bút, sau đó, bạn ấy phải mô tả các bước mà bạn ấy làm, rồi mới có thể nói đến chuyện lập trình được.
Chú ý: Nếu bạn nào không biết tìm ước số chung bằng giấy và bút, thì cũng không phải là bạn kém. Và nếu bạn ấy không biết cách lập trình C cho bài đó, thì cũng không phải bạn ấy không có tư duy lập trình.
Trường hợp đó, bạn ấy nên hỏi mọi người quanh bạn: "làm thế nào để tìm ước số chung lớn nhất của 2 số?". Và họ sẽ chỉ ra cách. Đương nhiên sau đó bạn ấy sẽ tự nghĩ cách chuyển kiến thức đó sang ngôn ngữ lập trình, ví dụ ngôn ngữ C, ngôn ngữ PHP, Javascript,...hoặc bất kỳ ngôn ngữ nào bạn ấy biết.
Còn nếu bạn ấy biết cách dùng giấy và bút làm được, mà không lập trình được, thì rõ ràng con đường trở thành lập trình viên vẫn còn dài lắm và bạn cần cố gắng rèn luyện nhiều hơn nữa.
Nêu đọc đến đây, bạn thấy mình không làm được bài toán trên, bạn nghĩ mình không có tư duy lập trình. không có năng khiếu về lập trình, bạn chán nản và từ bỏ ước mơ trở thành lập trình viên thì có lẽ bạn sẽ chẳng bao giờ trở thành lập trình viên được. Bạn nên nhớ rằng tất cả moị thứ mới chỉ bắt đầu. Vấn đề quan trọng là bạn có niềm đam mê thực sự hay không. Còn về tư duy và khả năng (bẩm sinh) thì có lẽ ai cũng có nhưng do chúng ta chưa khai quật ra thôi

Chúc tất cả moịn người thực hiện được ước mơ của mình.
Tổng hợp từ hocmai.vn