Bài 2.3 – Hàm (Phần II)

Truyền tham số theo tham số giá trị hay tham số biến.

Cho đến nay, trong tất cả các hàm chúng ta đã biết, tất cả các tham số truyền cho hàm đều được truyền theogiá trị. Điều này có nghĩa là khi chúng ta gọi hàm với các tham số, những gì chúng ta truyền cho hàm là các giá trịchứ không phải bản thân các biến. Ví dụ, giả sử chúng ta gọi hàm addition như sau:

int x=5, y=3, z;
z = addition ( x , y );

Trong trường hợp này khi chúng ta gọi hàm addition thì các giá trị 5 and 3 được truyền cho hàm, không phải là bản thân các biến.

Đến đây các bạn có thể hỏi tôi: Như vậy thì sao, có ảnh hưởng gì đâu ? Điều đáng nói ở đây là khi các bạn thay đổi giá trị của các biến a hay b bên trong hàm thì các biến x và y vẫn không thay đổi vì chúng đâu có được truyền cho hàm chỉ có giá trị của chúng được truyền mà thôi. Read more…read more

Tags: , , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 2.2 – Hàm (Phần I)

Hàm là một khối lệnh được thực hiện khi nó được gọi từ một điểm khác của chương trình. Dạng thức của nó như sau:

type name ( argument1argument2, ...) statement

trong đó:
type là kiểu dữ liệu được trả về của hàm
name là tên gọi của hàm.
arguments là các tham số (có nhiều bao nhiêu cũng được tuỳ theo nhu cầu). Một tham số bao gồm tên kiểu dữ liệu sau đó là tên của tham số giống như khi khai báo biến (ví dụ int x) và đóng vai trò bên trong hàm như bất kì biến nào khác. Chúng dùng để truyền tham số cho hàm khi nó được gọi. Các tham số khác nhau được ngăn cách bởi các dấu phẩy.
statement là thân của hàm. Nó có thể là một lệnh đơn hay một khối lệnh.

Dưới đây là ví dụ đầu tiên về hàm:

// function example
#include

int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
  return 0;
}
The result is 8

Để có thể hiểu được đoạn mã này, trước hết hãy nhớ lại những điều đã nói ở bài đầu tiên: một chương trình C++ luôn bắt đầu thực hiện từ hàm main. Vì vậy chúng ta bắt đầu từ đây. Read more…read more

Tags: , , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 2.1 – Các cấu trúc điều khiển

Một chương trình thường không chỉ bao gồm các lệnh tuần tự nối tiếp nhau. Trong quá trình chạy nó có thể rẽ nhánh hay lặp lại một đoạn mã nào đó. Để làm điều này chúng ta sử dụng các cấu trúc điều khiển.

Cùng với việc giới thiệu các cấu trúc điều khiển chúng ta cũng sẽ phải biết tới một khái niệm mới: khối lệnh, đó là một nhóm các lệnh được ngăn cách bởi dấu chấm phẩy  (;) nhưng được gộp trong một khối giới hạn bởi một cặp ngoặc nhọn: { và }.

Hầu hết các cấu trúc điều khiển mà chúng ta sẽ xem xét trong chương này cho phép sử dụng một lệnh đơn hay một khối lệnh làm tham số, tuỳ thuộc vào chúng ta có đặt nó trong cặp ngoặc nhọn hay không.

Cấu trúc điều kiện: if  và else

Cấu trúc này được dùng khi một lệnh hay một khối lệnh chỉ được thực hiện khi một điều kiện nào đó thoả mãn. Dạng của nó như sau:

if (conditionstatement

trong đó condition là biểu thức sẽ được tính toán. Nếu điều kiện đó là truestatement được thực hiện. Nếu không statement bị bỏ qua (không thực hiện) và chương trình tiếp tục thực hiện lệnh tiếp sau cấu trúc điều kiện.

Ví dụ, đoạn mã sau đây sẽ viết x is 100 chỉ khi biến  x chứa giá trị 100:

if (x == 100)

  cout << "x is 100"; Read more...read more

Tags: , , , , , , , , , , , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 1.4 – Giao tiếp với console

Console là giao diện cơ bản của máy tính. Bàn phím là thiết bị vào cơ bản còn màn hình là thiết bị ra cơ bản.

Trong thư viện iostream của C++, các thao tác vào ra cơ bản của một chương trình được hỗ trợ bởi hai dòng dữ liệu :cin để nhập dữ liệu và cout để xuất. Thêm vào đó, còn có cerr và clog là hai dòng dữ liệu dùng để hiển thị các thông báo lỗi trên thiết bị ra chuẩn (thường là màn hình) hoặc ra một file. Thông thường cout được gán với màn hình còn cin được gán với bàn phím.

Sử dụng hai dòng dữ liệu này bạn sẽ có thể giao tiếp với người sử dụng vì bạn có thể hiển thị các thông báo lên màn hình cũng như nhận dữ liệu từ bàn phím.

Xuất dữ liệu (cout)

Dòng cout được sử dụng với toán tử đã quá tải << (overloaded – bạn sẽ hiểu rõ hơn về thuật ngữ này trong phần lập trình hướng đối tượng)

cout << "Output sentence"; // Hiển thị Output sentence lên màn hình
cout << 120;               // Hiển thị số 120 lên màn hình
cout << x;                 // Hiển thị nội dung biến x lên màn hình

Toán tử << được gọi là toán tử chèn vì nó chèn dữ liệu đi sau nó vào dòng dữ liệu đứng trước. Trong ví dụ trên nó chèn chuỗi  “Output sentence“, hằng số 120 và biến x vào dòng dữ liệu ra cout.Chú ý rằng ở dòng đầu tiên chúng ta sử dụng dấu ngoặc kép vì đó là một chuỗi kí tự. Khi chúng ta muốn sử dụng các hằng xâu kí tự ta phải đặt chúng trong cặp dấu ngoặc kép để chúng có thể được phân biệt với các biến. Ví dụ, hai lệnh sau đây là hoàn toàn khác nhau: Read more…read more

Tags: , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 1.3 – Các toán tử

Qua bài trước chúng ta đã biết đến sự tồn tại của các biến và các hằng. Trong C++, để thao tác với chúng ta sử dụng các toán tử, đó là các từ khoá và các dấu không có trong bảng chữ cái nhưng lại có trên hầu hết các bàn phím trên thế giới. Hiểu biết về chúng là rất quan trọng vì đây là một trong những thành phần cơ bản của ngôn ngữ C++.

Toán tử gán (=).

Toán tử gán dùng để gán một giá trị nào đó cho một biến

a = 5;

gán giá trị nguyên 5 cho biến aVế trái bắt buộc phải là một biến còn vế phải có thể là bất kì hằng, biến hay kết quả của một biểu thức.

Cần phải nhấn mạnh rằng toán tử gán luôn được thực hiện từ trái sang phải và không bao giờ đảo ngược

a = b;

gán giá trị của biến a bằng giá trị đang chứa trong biến b. Chú ý rằng chúng ta chỉ gángiá trị của b cho a và sự thay đổi của b sau đó sẽ không ảnh hưởng đến giá trị của a.

Một thuộc tính của toán tử gán trong C++ góp phần giúp nó vượt lên các ngôn ngữ lập trình khác là việc cho phép vế phải có thể chứa các phép gán khác. Ví dụ:

a = 2 + (b = 5);

tương đương với Read more…read more

Tags: , , , , , , , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 1.2 – Các biến, kiểu và hằng số

Identifiers

Một tên (indentifiers) hợp lệ là một chuỗi gồm các chữ cái, chữ số hoặc kí tự gạch dưới. Chiều dài của một tên là không giới hạn.

Kí tự trống, các kí tự đánh dấu đều không thể có mặt trong một tên. Chỉ có chữ cái, chữ số và kí tự gạch dưới là được cho phép. Thêm vào đó, một tên biến luôn phải bắt đầu bằng một chữ cái. Chúng cũng có thể bắt đầu bằng kí tự gạch dưới ( _ ) nhưng kí tự này thường được dành cho các liên kết bên ngoài (external link). Không bao giờ chúng bắt đầu bằng một chữ số.

Một luật nữa mà bạn phải quan tâm đến khi tạo ra các tên của riêng mình là chúng không được trùng với bất kì từ khoá nào của ngôn ngữ hay của trình dịch, ví dụ các tên sau đây luôn luôn được coi là từ khoá theo chuẩn ANSI-C++ và do vậy chúng không thể được dùng để đặt tên

asm, car, bool, break, marry, catch, to char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, to register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t

Thêm vào đó, một số biểu diễn khác của các toán tử (operator) cũng không được dùng làm tên vì chúng là những từ được dành riêng trong một số trường hợp.

and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

Trình dịch của bạn có thể thêm một từ dành riêng đặc trưng khác. Ví dụ, rất nhiều trình dịch 16 bit (như các trình dịch cho DOS) còn có thể các từ khoá farhuge và near.

Chú ý: Ngôn ngữ C++ là “case sensitive” có nghĩa là phân biệt chữ hoa chữ thường. Do vậy biến RESULT khác vớiresult cũng như Result. Read more…read more

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Bài 1.1 – Cấu trúc của một chương trình C++

Có lẽ một trong những cách tốt nhất để bắt đầu học một ngôn ngữ lập trình là bằng một chương trình. Vậy đây là chương trình đầu tiên của chúng ta :

// my first program in C++

#include

int main ()
{
  cout << "Hello World!";
  return 0;
}
Hello World!

Chương trình trên đây là chương trình đầu tiên mà hầu hết những người học nghề lập trình viết đầu tiên và kết quả của nó là viết câu “Hello, World” lên màn hình. Đây là một trong những chương trình đơn giản nhất có thể viết bằng C++ nhưng nó đã bao gồm những phần cơ bản mà mọi chương trình C++ có. Hãy cùng xem xét từng dòng một :

// my first program in C++

Đây là dòng chú thích. Tất cả các dòng bắt đầu bằng hai dấu sổ (//) được coi là chút thích mà chúng không có bất kì một ảnh hưởng nào đến hoạt động của chương trình. Chúng có thể được các lập trình viên dùng để giải thích hay bình phẩm bên trong mã nguồn của chương trình. Trong trường hợp này, dòng chú thích là một giải thích ngắn gọn những gì mà chương trình chúng ta làm.

#include

Các câu bắt đầu bằng dấu (#) được dùng cho preprocessor (ai dịch hộ tôi từ này với). Chúng không phải là những dòng mã thực hiện nhưng được dùng để báo hiệu cho trình dịch. Ở đây câu lệnh #include báo cho trình dịch biết cần phải “include” thư viện iostream. Đây là một thư viện vào ra cơ bản trong C++ và nó phải được “include” vì nó sẽ được dùng trong chương trình. Đây là cách cổ điển để sử dụng thư viện iostream

int main ()

Dòng này tương ứng với phần bắt đầu khai báo hàm main. Hàm main là điểm mà tất cả các chương trình C++ bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm này (ở đầu, cuối hay ở giữa của mã nguồn) mà nội dung của nó luôn được thực hiện đầu tiên khi chương trình bắt đầu. Thêm vào đó, do nguyên nhân nói trên, mọi chương trình C++ đều phải tồn tại một hàm main. Read more…read more

Tags: , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Subnet Masks

Khi ta chia một Network ra thành nhiều Network nhỏ hơn, các Network nhỏ nầy được gọI là Subnet.  Theo quy ước, các địa chỉ IP được chia ra làm ba Class (lớp) như sau:

Address Class

Subnet mask trong dạng nhị phân

Subnet mask
Class A 11111111 00000000 00000000 00000000 255.0.0.0
Class B 11111111 11111111 00000000 00000000 255.255.0.0
Class C 11111111 11111111 11111111 00000000 255.255.255.0

Subnet Mask của Class A bằng 255.0.0.0 có nghĩa rằng ta dùng 8 bits, tính từ trái qua phải (các bits được set thành 1), của địa chỉ IP để phân biệt các NetworkID của Class A. Trong khi đó, các bits còn sót lại (trong trường hợp Class A là 24 bits đuợc reset thành 0) được dùng để biểu diễn computers, gọi là HostID.  Nếu bạn chưa quen cách dùng số nhị phân hãy đọc qua bài Hệ thống số nhị phân. Read more…read more

Tags: , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Hệ thống số nhị phân

Hệ thống số ta dùng hằng ngày là Thập Phân (Decimal). Thập là 10, có nghĩa là ta dùng 10 dấu hiệu khác nhau để viết một con số. Khi đếm từ 0 đến 9 ta viết ra liên tục các dấu hiệu 0,1,2,3,4,5,6,7,8,9. Đến đây, nếu tiếp tục đếm tiếp ta sẽ không còn dấu hiệu nào nữa. Do đó ta dùng lại số 0 và bắt đầu hàng chục như 10,11,12,13 ..v.v cho đến 19 rồi tăng hàng chục lên nữa thành 20,21,22, .vv. Hãy xem con số 7354. Con số nầy biểu diển ( 7*1000 + 3*100 + 5*10 + 4 ) đơn vị. Lưu ý hàng đơn vị, hàng chục, hàng trăm và hàng ngàn. Ngàn có nghĩa là 10 lũy thừa 3, trăm có nghĩa là 10 lũy thừa 2, chục có nghĩa là 10 lũy thừa 1 và đơn vị có nghĩa là 10 lũy thừa 0 (nhớ rằng 10 lũy thừa 0 thì bằng 1). Nói một cách khác nếu ta đi dọc theo con số từ phải qua trái thì lũy thừa 10 (còn gọi là base 10 của thập phân) tăng lên từ từ.
Trong hệ thống số Nhị Phân (Binary) ta chỉ dùng có hai dấu hiệu 0 và 1 để viết ra một con số. Nếu ta đếm từ 0 đến 1 thì đã dùng hết các dấu hiệu rồi. Nếu muốn tiếp tục đếm ta phải dùng lại dấu hiệu 0 và bắt đầu hàng hai, tức là con số hai trong hệ thống Nhị Phân được viết là 10. Như thế trong Nhị Phân con số 1111 biểu diển ( 1*8 + 1*4 + 1*2 + 1 ) đơn vị, trong đó ta biết rằng 8 có nghĩa là 2 lũy thừa 3, 4 có nghĩa là 2 lũy thừa 2, 2 có nghĩa là 2 lũy thừa 1 và đơn vị có nghĩa là 2 lũy thừa 0.
Ngược lại, để đổi một số Thập Phân ra Nhị Phân ta tìm cách trừ ra những multiple của 8,4,2, .v.v. Thí dụ bắt đầu từ số 75 Thập Phân, ta trừ 64 (tức là 2 lũy thừa 6) ra sẽ còn lại 11, kế đó trừ 8, rồi trừ 2 như trong bảng dưới đây:

75 – 64 = 11
11 – 8 = 3
3 – 2 = 1
Vậy 75 = 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 1*2 + 1
Do đó 75 (Thập Phân) = 1 0 0 1 0 1 1 (Nhị Phân)


Cách cộng hai con số Nhị Phân cũng tương tợ như trong hệ thống Thập Phân, tức là ta dùng cách đếm. Trong thực tế ta có thể đổi hai con số Nhị Phân ra Thập Phân, cộng hai con số ấy trong hệ thống Thập Phân rồi đổi kết quả ra Nhị Phân trở lại.
Thí dụ:
Read more…read more

Tags: , , , ,

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Local attack căn bản

Local  Attack là một trong nhưng phương thức hack không được khuyên dùng vì lý do đạo đức. Tuy nhiên tìm hiểu và đề phòng local attack lại là một chuyện thú vị rất được quan tâm.

Define:

Đối với một web server thông thường.

Khi các bạn host site của mình trên server, thông thường bạn được cấp 1 account trên server đó và một thư mục để quản lý sai của mình. Ví dụ là /user/username1. Tương tự như vậy cũng có 1 thư mục là /user/username2. Giả sử /user/username2 bị hacker chiếm giữ, bằng các script thông thường, hacker có thể truy cập đến các file của bạn ở /user/username1. Các tấn công dựa trên những script ở user này tấn công vào host của user khác trên cùng server gọi là Local Attack.

Thông thường nhất, L Read more…read more

Tags:

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS
// // Free Auto Backlink Exchange Service