23/7/15

Kiểu dữ liệu trong C

Trong C có 5 kiểu dữ liệu cơ bản: int, float, double, char, void. Ngoài ra khi kết hợp với các từ khóa signed, unsigned, long, short ta còn có thêm các kiểu dẫn xuất. Kiểu cấu trúc struct trong C cho phép ta định nghĩa các kiểu dữ liệu mới dựa trên các kiểu dữ liệu cơ bản. Kiểu con trỏ là kiểu dữ liệu đặc biệt dùng lưu địa chỉ của biến khác.

Kiểu số nguyên
Kiểu số nguyên trong C là int, được dùng để lưu trữ số nguyên. Đây là kiểu dữ liệu cơ bản nhất trong các ngôn ngữ lập trình. Giá trị của kiểu int không cố định mà phụ thuộc vào trình biên dịch, thông thường là 4 bytes.

Ví dụ:
int a;
int a = 5;
int a, b;

Kiểu số thực
Trong C có 2 kiểu số thực là floatdouble, cho phép lưu trữ cả phần thập phân của một số.
Kiểu float có giá trị 4 bytes và có độ chính xác tới 6 chữ số thập phân. Kiểu double có giá trị 8 bytes và chính xác tới 10 chữ số. Tuy nhiên độ chính xác này là tương đối và còn phụ thuộc vào hệ điều hành.

Tùy nhu cầu mà người ta sử dụng float hay double, nếu tính toán không yêu cầu độ chính xác cao nên dùng kiểu float để tiết kiệm bộ nhớ.
Lưu ý: tính toán với các kiểu dữ liệu thực luôn có sai số.

Ví dụ:
float a = 5.7;
double b = 6; //=> 6.0

13/7/15

Các phạm vi truy xuất trong một lớp đối tượng C++

Khi xây dựng một class, chắc chắn bạn sẽ phải xác định phạm vi truy cập cho các thuộc tính và phương thức trong class đó. Mục đích của việc này nhằm quy định các thành phần nào có thể được truy cập, thay đổi từ bên ngoài, thành phần nào là riêng tư.

Có thể hiểu phạm vi truy xuất này cũng giống như biến toàn cục và biến cục bộ. Biến toàn cục có thể được truy cập từ tất cả các hàm sau khai báo nó, còn biến cục bộ chỉ có thể được truy cập nội bộ trong hàm.

Trong C++, phạm vi truy cập được xác định qua 3 từ khóa: public, privateprotected.

  • public: Các thành phần mang thuộc tinh này đều có thể được truy cập từ bất kỳ hàm nào, dù ở trong hay ngoài lớp.
  • private: Các thành phần mang thuộc tinh này chỉ có thể được truy cập bên trong phạm vi lớp. Vì trong C++ cho phép định nghĩa phương thức ngoài khai báo lớp nên phạm vi lớp được hiểu là bên trong khai báo lớp và bên trong các định nghĩa thuộc lớp. 
  • protected: Các thành phần mang thuộc tinh này chỉ có thể được truy cập bên trong phạm vi lớp và các lớp con kế thừa nó. Như vậy, nếu một lớp không có lớp con kế thừa nó thì phạm vi protected cũng giống như private.
Một ngoại lệ chỉ có trong C++ đó là định nghĩa friend. Một hàm hoặc lớp friend có thể truy cập vào các thành phần privateprotected của lớp với hàm đó (hàm friend) hoặc với các đối tượng khác (lớp friend) với điều kiện phải được khai báo trước trong lớp.

Một số lưu ý về phạm vi truy xuất trong C++:
  • Phạm vi truy xuất trong C++ được xác định trong qua các nhãn trong khai báo lớp. Nhãn bao gồm từ khóa và dấu hai chấm.
  • Mỗi nhãn có phạm vi ảnh hưởng từ lúc khai báo đến khi gặp nhãn khác hoặc hết khai báo lớp.
  • Nếu không chỉ rõ nhãn đầu tiên thì ngầm định nó có phạm vi truy cập là private.

9/7/15

Từ vựng về lập trình tiếng Nhật

Bài viết nhằm giúp các bạn yêu thích tiếng Nhật có thể tiếp cận được các tài liệu CNTT tiếng Nhật dễ dàng hơn. Dưới đây là danh sách các thuật ngữ, từ vựng về lập trình trong tiếng Nhật. Để đọc được, các bạn cần phải nắm thật vững 2 bảng chữ cái tiếng Nhật là Hiragana và Katakana. Các từ bằng Kanji sẽ được phiên âm ra Hiragana.

Tổng quan về đối tượng fstream trong C++

Đối tượng fstream cung cấp nhiều phương thức để đọc ghi file nhưng tiện lợi và an toàn hơn con trỏ FILE nhiều. Để sử dụng được fstream bạn cần khai báo #include<fstream>. Ngoài ra, C++ còn cung cấp thêm 2 đối tượng khác là ifstreamofstream chỉ chuyên biệt cho việc đọc file và ghi file trong khi fstream có thể thực hiện được cả 2 việc này. Chính vì vậy, bài viết này sẽ hướng dẫn các bạn một cách vắn tắt các thao tác cơ bản với fstream trong C++.

1. Tạo đối tượng fstream để đọc/ghi file. Việc đọc/ghi file sẽ được thực hiện thông qua đối tượng này.
Khai báo: fstream <tênbiến>;

2. Dùng phương thức open() để mở một file.
Cú pháp:
<tênbiến>.open(<đường dẫn>,<chế độ mở>);
Hoặc có thể vừa khai báo biến vừa mở file luôn.
fstream <tênbiến>(<đường dẫn>,<chế độ mở>);

Đường dẫn có thể là tương đối (tính từ file exe khi được build ra) hoặc tuyệt đối (tính từ ổ đĩa gốc).
Chế độ mở có nhiều loại:

Chế độ mởÝ nghĩa
ios::inMở file ở chế độ đọc
ios::outMở file ở chế độ ghi
ios::appMở file chế độ ghi thêm vào
ios::ateMở file để đọc/ghi từ cuối file
ios::truncTạo đè file mới hoàn toàn
ios::nocreateMở một file phải tồn tại
ios::noreplaceTạo file mới chưa tồn tại
ios::binaryMở file chế độ nhị phân
ios::textMở file chế độ văn bản

Có thể kết hợp nhiều chế độ bằng toán tử |.
Ví dụ:
fstream file("data/text.txt", ios::in | ios::out);

8/7/15

Danh sách liên kết đơn và các thao tác cơ bản

Danh sách liên kết là một cấu trúc dữ liệu mà mỗi phần tử cần phải lưu thông tin của nó và địa chỉ của phần tử kế tiếp hoặc trước nó. Danh sách liên kết linh động hơn mảng rất nhiều do có thể thêm, xóa phần tử. Có nhiều dạng danh sách liên kết khác nhau và ở phần này mình sẽ nói về danh sách liên kết đơn cùng các thao tác với nó (minh họa bằng C++).

Tổ chức dữ liệu
Mỗi phần tử trong DSLK đơn (gọi là node hay nút) sẽ gồm một biến lưu dữ liệu của bạn và một biến con trỏ lưu địa chỉ của phần tử kế tiếp. Các phần tử được liên kết với nhau dựa vào con trỏ này.
struct Node
{
   <kiểu dữ liệu> info;
   Node *next;
};
Như vậy, khi biết được phần tử đầu danh sách thì dựa vào con trỏ next, ta có thể truy cập được tất cả các phần tử trong danh sách. Vậy một danh sách chỉ gồm 1 con trỏ trỏ đến phần tử đầu danh sách. Tuy nhiên, để một vài thao tác trở nên dễ dàng, ta có thể thêm một con trỏ đến cuối danh sách.
struct List
{
   Node *head, *tail;
};
Nếu chưa hiểu cấu trúc của nó, bạn có thể xem hình minh họa sau.
Các thao tác cơ bản
Tạo danh sách rỗng
Tại sao đây lại là một thao tác quan trọng. Một danh sách được tạo ra chứa 2 con trỏ rỗng chưa trỏ đến đâu cả. Vì vậy sẽ rất nguy hiểm nếu thao tác với 2 con trỏ này. Cần thiết phải gán cho nó giá trị NULL trước khi thao tác trên nó. Nếu bạn cài đặt danh sách theo phương pháp hướng đối tượng thì có thể khai báo phần này trong constructor nên không cần gọi hàm này bên ngoài.
void CreateList(List &list)
{
   list.head = list.tail = NULL;
}