Giải thuật tiến hóa - thuật toán di truyền

Giải thuật tiến hóa - thuật toán di truyền

Giải thuật tiến hóa - thuật toán di truyền
Giải thuật tiến hóa - thuật toán di truyền

Nội dung:
1. Giải thuật tiến hóa
2. Thuật toán di truyền
3. Các quá trình cơ bản trong thuật toán di truyền
4. Các tham số của thuật toán di truyền
5. Cài đặt giải thuật di truyền
--------------------------------

1. Giải thuật tiến hóa

Giải thuật tiến hóa (Evolutionary Computations - EC) bao gồm: thuật toán di truyền (Genetic Algorithm - GA), thuật toán tiến hóa vi phân (Differential Evolution- DE), qui hoạch tiến hóa (Evolutionary programming - EP) và chiến lược tiến hóa (Evolution Strategies - ES) dựa trên nền tảng tiến hóa tự nhiên đó cũng là các phương pháp tự nhiên nhằm giải quyết bài toán tối ưu và tìm kiếm. Mục tiêu cơ bản của EC là cơ cấu tính toán nhằm tạo ra sự tiến hóa của quần thể gồm nhiều cá thể với mục đích quần thể sau “tốt hơn” quần thể trước. Các toán tử sử dụng trong EC bao gồm: lai ghép (crossover), đột biến (mutation) và chọn lọc (selection). Các toán tử này kết hợp với nhau trong một mô hình tiến hóa và được điều khiển bởi một vài tham số như kích cỡ quần thể, xác suất lai ghép, xác suất đột biến... Hình thức sử dụng rộng rãi EC là thuật toán di truyền (GA).

2. Thuật toán di truyền

Giống như giải thuật tiến hóa nói chung, thuật toán di truyền (GA) hình thành dựa trên quan niệm cho rằng quá trình tiến hóa tự nhiên là quá trình hoàn hảo và hợp lý nhất và tự nó đã mang tính tối ưu. Đây là một tiên đề đúng, không thể chứng minh được nhưng phù hợp với thực tế khách quan. Tính tối ưu trong tự nhiên thể hiện ở chỗ thế hệ sau bao giờ cũng tốt hơn thế hệ trước nhờ hai quá trình cơ bản là sinh sản và chọn lọc tự nhiên. Những cá thể nào phát triển thích nghi với môi trường sẽ tồn tại và ngược lại, những cá thể nào không thích nghi với môi trường sẽ bị đào thải. Sự thay đổi của môi trường sẽ tác động đến quá trình tiến hóa và bản thân quá trình tiến hóa cũng có tác động và làm thay đổi môi trường. Cá thể mới sinh ra trong quá trình tiến hóa nhờ vào sự lai ghép ở thế hệ cha mẹ. Một cá thể mới có thể mang những đặc tính của cha mẹ ở thế hệ trước (di truyền) hoặc mang những đặc tính mới hoàn toàn (đột biến). Di truyền và đột biến là hai cơ chế quan trọng như nhau trong quá trình tiến hóa mặc dù xác suất để xảy ra hiện tượng đột biến nhỏ nhiều (hàng chục đến
hàng trăm lần tùy từng quá trình) so với hiện tượng di truyền. Mặc dù cơ chế là ngẫu nhiên nhưng thuật toán di truyền không phải là một thuật toán ngẫu nhiên. Thuật toán khai thác và tận dụng được một cách hiệu quả thông tin quá khứ để có được những kết quả mới đạt kết quả như mong muốn. Các cải tiến trong việc sử dụng thuật toán
di truyền đã làm tăng thêm hiệu quả của việc sử dụng thuật toán trong các bài toán phức tạp. Điều này thể hiện ở việc giảm thời gian tính toán ngày càng hiệu quả mà ta sẽ tìm hiểu cụ thể hơn ở dưới đây.

3. Các quá trình cơ bản trong thuật toán di truyền

a) Mã hóa dữ liệu: hay còn gọi là biểu diễn di truyền cho lời giải của bài toán: Đây là bước đầu tiên và rất quan trọng đối với việc tìm ra lời giải của bài toán. Mỗi lời giải của bài toán được biểu diễn dưới dạng một chuỗi ký tự hữu hạn hay còn được gọi là một nhiễm sắc thể. Các ký tự có thể là số nhị phân, số thập phân, … tùy vào từng bài toán cụ thể. Trong quá trình này, việc mã hóa cái gì, mã hóa như thế nào, trật tự các thành phần trong nhiễm sắc thể ra sao,… luôn là những thách thức cho những người giải bài toán.

b) Khởi tạo quần thể (xây dựng tập hợp nghiệm ban đầu): có thể ngẫu nhiên hoặc không ngẫu nhiên: Có nhiều cách để khởi tạo giá trị quần thể nghiệm ban đầu, tùy từng bài toán mà ta lựa chọn phương pháp phù hợp. Thông thường, hệ nghiệm ban đầu được chọn ngẫu nhiên trong không gian tìm kiếm. Tuy vậy, việc chọn này cũng cần phải xem xét về tương quan giữa độ thích nghi của các nhiễm sắc thể để tránh tình trạng nghiệm tìm ra là nghiệm tối ưu cục bộ hay còn gọi là cực trị địa phương. Còn vấn đề số lượng nghiệm của tập nghiệm hay qui mô của quần thể cũng cần được xem xét kỹ dựa vào độ phức tạp của bài toán, độ chính xác yêu cầu (cao hay thấp) và thời gian tính toán yêu cầu (nhanh hay chậm)

c) Xác định hàm thích nghi: hay hàm lượng giá cho mỗi nhiễm sắc thể hay chính là cho các phương án nghiệm trong tập nghiệm. Hàm này dùng để đánh giá độ thích nghi của các nhiễm sắc thể. Hàm thích nghi cần phải đánh giá được mức độ thích nghi cho tất cả các nghiệm khả thi và luôn được giả định là không âm, để thể hiện độ thích nghi của các cá thể. Công thức biểu diễn hàm cần phải thể hiện được tất cả các đặc tính mong muốn của nhiễm sắc thể, thông qua đó có thể chọn lọc được các quần thể nghiệm tốt nhất cho bài toán.

d) Quá trình lai ghép: đây là quá trình nhiễm sắc thể mới được hình thành dựa trên nhiễm sắc thể cha mẹ bằng cách lai ghép một hay nhiều đoạn nhiễm sắc thể cha mẹ với nhau. Phép lai ghép xảy ra với xác suất là p1 có thể được mô phỏng như sau:
- Chọn hai (hay nhiều) cá thể bất kỳ trong quần thể. Quần thể ở đây bao gồm các nhiễm sắc thể (cha mẹ) có độ dài bằng nhau.
- Chọn điểm lai là một điểm có vị trí bất kỳ (như nhau) trên nhiễm sắc thể chamẹ và thực hiện hoán đổi các đoạn gen của nhiễm sắc thể cha mẹ tại điểm lai này.
- Đưa hai cá thể này vào quần thể để thực hiện vào các quá trình tiến hóa tiếp theo.


Hình 1.  Lai ghép hai cá thể


Tuy nhiên trong quá trình tồn tại và phát triển, thuật toán di truyền đã được bổ sung rất nhiều các phương pháp lai ghép để nhằm thích ứng với nhiều kiểu bài toán và cũng là để tăng hiệu quả của thuật toán. Có thể kể một số phép lai cải tiến như sau:
- Lai ghép có xét tới các đặc tính trội và lặn trong tự nhiên: Các đặc tính này được quy định trước trong khi biểu diễn cấu trúc nhiễm sắc thể. Bằng việc xem xét tới các đặc tính trội lặn, quá trình sản sinh ra các "quần thể chất lượng tốt" sẽ nhanh hơn và do đó thời gian tính toán cũng được rút ngắn.
- Lai ghép từng phần: Việc giữ lại những đoạn mã đã "tối ưu" trong nhiễm sắc thể cũng là một cách để quá trình lai ghép trở nên hiệu quả hơn
- Lai ghép có trật tự
- Lai ghép dựa trên vị trí
- Lai ghép chu trình
- Lai ghép thứ tự tuyến tính
- Lai ghép đa điểm: Với phương pháp này, chúng ta có thể cho 2 cá thể lai ghép ở 2 hay nhiều điểm lai ghép. Phương thức này làm cho thuật toán trở nên linh hoạt hơn, nhờ đó các thế hệ cá thể con cũng sẽ có chất lượng tốt hơn.

e) Quá trình đột biến: là quá trình cá thể con mang một hay một số tính trạng không có trong mã di truyền của cha mẹ. Quá trình này xảy ra với xác suất p2 (nhỏ hơn nhiều so với p1) có thể được mô tả như sau:
- Chọn ngẫu nhiên một cá thể bất kỳ trong quần thể
- Chọn một gen bất kỳ của cá thể vừa chọn
- Thay đổi giá trị gen đó (đối với cách mã hóa gen theo số nhị phân thì quá trình thay đổi giá trị là đổi giá trị từ 0 thành 1 hoặc từ 1 thành 0) rồi trả về quần thể để thực hiện các quá trình tiếp theo

Hình 2. Đột biến một nhiễm sắc thể

Tương tự như quá trình lai ghép, trong quá trình phát triển của thuật toán di truyền cũng đã được bổ sung rất nhiều cách thức để thực hiện quá trình gây đột biến ngày càng hiệu quả hơn:
- Đột biến đảo ngược (Inversion Mutation)
- Đột biến chèn (Insertion Mutation)
- Đột biến thay thế (Raplacement Mutation)
- Đột biến tương hỗ (Reciprocal Exchange Mutation)
- Đột biến dịch chuyển (Shift Mutation)

f) Quá trình chọn lọc: Quá trình mà các cá thể mới sinh ra được giữ lại hay bị loại bỏ khỏi quần thể dựa vào độ thích nghi của chúng. Độ thích nghi ở đây thường là một hàm gán một giá trị thực cho các cá thể trong quần thể. Đối với quá trình này có rất nhiều cách để xác định trình tự tính toán và thực hiện tùy vào cách lựa chọn độ thích nghi của cá thể nói riêng và của cả quần thể nói chung.

4. Các tham số của thuật toán di truyền

Kích cỡ hệ nghiệm (pop-size): số lượng cá thể phù hợp trong mỗi thế hệ Xác suất lai tạo (pc): xác suất để mỗi cá thể trong quần thể được tham gia quá trình lai ghép.

Xác suất đột biến (pm): xác suất để mỗi bit trong nhiễm sắc thể bị đột biến Thông thường, kích cỡ của quần thể phụ thuộc vào độ phức tạp của bài toán.

Bài toán càng phức tạp, nhiều ràng buộc - đơn hoặc đa mục tiêu - thì số lượng cá thể trong mỗi thế hệ càng phải lớn. Hai thông số xác suất trong quá trình di truyền có khoảng giá trị rất khác nhau. Đối với xác suất lai tạo, giá trị thường rơi trong khoảng 0,5 - 0,95 nhưng giá trị thông thường của xác suất đột biến thấp hơn nhiều, chỉ ở khoảng 0,001 - 0,05. Điều này cũng phản ánh đúng xác suất xảy ra hai quá trình trong thực tế.

Ưu điểm của thuật toán di truyền là một phương pháp tìm kiếm từ một quần thể các điểm chứ không phải một điểm. Điều này làm cho việc giải các bài toán đa mục tiêu hay việc tìm một tập hợp các phương án lân cận nghiệm trở nên dễ dàng. Thêm vào đó, việc đánh giá thông tin bằng hàm mục tiêu chứ không dùng đạo hàm hay các tri thức bổ sung cũng là một ưu điểm của thuật toán.


Hình 3. Sơ đồ quá trình tính toán của thuật toán di truyền 

Nhận xét cụ thể các bước trong lưu đồ trên:

- Bước 1: Khởi tạo/lựa chọn các thông số cho quá trình tính toán: Bước này người lập trình tính toán phải lựa chọn các thông số như: số lượng cá thể trong quần thể, cách thức hóa bài toán cần tính toán dưới dạng các nhiễm sắc thể (độ dài của nhiễm sắc thể, kiểu số biểu diễn dữ liệu,…), số thế hệ tính toán, xác suất lai ghép, xác suất đột biến, hàm thích nghi,…

- Bước 2: Khởi tạo quần thể ban đầu: xác định bằng phương pháp tạo số ngẫu nhiên để tạo giá trị cho các nhiễm sắc thể cho quần thể ban đầu. Tùy vào cách biểu diễn của các nhiễm sắc thể mà ta chọn phương pháp tạo số ngẫu nhiên phù hợp

- Bước 3: Đánh giá các nhiễm sắc thể bằng hàm thích nghi đã xác định ở bước
1. Trong bước này, ngoài việc đánh giá các nhiễm sắc thể riêng rẽ, chúng ta còn có thể đánh giá độ thích nghi của một nhiễm sắc thể hay cả quần thể. Nếu một nhóm hay cả quần thể có độ thích nghi "trung bình" (theo tiêu chí của từng trường hợp của người lập trình) thấp thì có thể loại nhóm nhiễm sắc thể hay quần thể đó ra khỏi quá trình di truyền.

- Bước 4: Thực hiện quá trình di truyền thông qua các cơ chế lai ghép và đột biến. Có thể thực hiện lần lượt hai quá trình này hoặc thực hiện đồng thời theo các phương pháp đã đề cập bên trên. Trong quá trình thực hiện thuật toán di truyền, giai đoạn này là giai đoạn mà mỗi người có thể thực hiện theo những phương pháp rất khác nhau. Giai đoạn này cũng là giai đoạn quyết định tới sự thành công của thuật toán. Người thực hiện cũng có thể đưa ra những phương thức tiến hành lai ghép hay đột biến mới trong giai đoạn này. Trong quá trình thực hiện, để có được một bộ các thông số lai ghép hay đột biến hiệu quả, người lập trình thường phải trải qua nhiều bước tính toán thử. Khâu này phụ thuộc nhiều vào kinh nghiệm và kỹ năng tính toán của người lập trình.

- Bước 5: Tạo quần thể mới bằng quá trình chọn lọc. Quá trình này cũng dựa vào đánh giá các nhiễm sắc thể thông qua hàm thích nghi. Cá thể nào có độ thích nghi cao sẽ được giữ lại cho thế hệ kế tiếp. Cũng giống như ở bước 3, chúng ta có thể sử dụng những hàm thích nghi phù hợp để đánh giá từng cá thể đơn lẻ hoặc cả một nhóm các cá thể. Sau quá trình này, nhóm cá thể nào thỏa mã tiêu chuẩn đánh giá với mức độ từ cao xuống thấp sẽ được dưa vào quần thể mới.

- Bước 6: Đánh giá quần thể vừa có được trong bước 5. Thông thường có hai tiêu chí để dừng quá trình di truyền tại bước này. Thứ nhất, độ thích nghi của từng cá thể và cả quần thể thỏa mãn một điều kiện hội tụ đã được đặt ra ban đầu. Các điều kiện hội tụ thể hiện mức độ chấp nhận được của kết quả tìm được. Thứ hai, quần thể mới tạo thành là quần thể ở thế hệ thứ (N+1) với N là số thế hệ dự định tính toán đã giả thiết ban đầu. Trong khi thực hiện các quá trình di truyền, những người tính toán có thể đưa ra những tiêu chí riêng để dừng quá trình di truyền. Các tiêu chí đưa ra góp phần quyết định tới thành công của thuật toán.

5. Cài đặt giải thuật di truyền [Tham khảo tại đây]

 >> Xem thêm phần cài đặt và ứng dụng thuật toán di truyển Tại đây

#

Tự học JavaScript qua các ví dụ

Hướng dẫn tự học lập trình JavaScript

*****

Hướng dẫn lập trình JavaScript cho người mới bắt đầu

Tự học JavaScript qua các ví dụ
Tự học JavaScript qua các ví dụ

Javascript là một ngôn ngữ lập trình kịch bản dựa vào các đối tượng có sẵn hoặc do người dùng (lập trình viên) tự định nghĩa, Javascript được sử dụng rất phổ biến (có tới trên 99% các website hiện nay đang sử dụng Javacript). Tất cả các trình duyệt phổ biến đều hỗ trợ ngôn ngữ này.

Javascript hỗ trợ được đa nền tảng, các bạn cũng có thể xây dựng app, web, game hay thậm chí là phần mềm.

Với sự hỗ trợ của nhiều ông lớn như: google, facebook, Microsoft, Amazon... thì Javascript đã mạnh và phổ biến lại càng mạnh và phổ biến thêm.

Mục lục:

Hướng Dẫn Đăng Ký Tên Miền và Host Trên Hostgator

HostGator là hãng cung cấp dịch vụ tên miền (domain) và Host hàng đầu thế giới. 



* Với mã giảm giá TailieuCNTT.Org, khi đăng ký hosting bạn sẽ được GIẢM NGAY 60%GIẢM TỚI 55% khi đăng ký dịch vụ phát triển website.



HostGator là thượng được nhiều Blogger và các lập trình viên chuyên nghiệp tin dùng vì các lý do:
  • Giá thành
  • Tốc độ, ổn định
  • Khả năng mở rộng
ngoài ra người dùng có thể kiếm được tiền từ chương trình giới thiệu sản phẩm (affiliate) của HostGator. 

Bạn muốn sở hữu một tên miền hay thiết lập một trang web cá nhận ? 
Bạn có một ý tưởng kinh doanh trên Internet ?

Bài viết này sẽ hướng dẫn bạn các đăng ký, mua, cài đặt một tên miền và host với HostGator.

BƯỚC 1: ĐĂNG KÝ GÓI HOSTING BẠN MUỐN SỬ DỤNG

Bạn tới địa chỉ: http://www.hostgator.com/ , chọn mục Web Hosting trên thanh Menu để đăng ký một gói Hosting phù hợp với yêu cầu của bạn. 
Có 3 gói bạn có thể chọn: Hatchling Plan, Baby Plan và Business Plan. 


Giá sẽ thay đổi phụ thuộc vào các gói và thời hạn sử dụng các gói đó.



Như trên hình, bạn có thể thấy với gói Baby Plan, Starting at $6,36/mo. Trong trường hợp bạn thuê 3 năm, bạn sẽ được hưởng mức giá ưu đãi đó. Nếu bạn thuê Hosting dưới 1 năm, bạn sẽ phải trả 7,96$/ tháng.

Nhập thông tin đơn hàng

 - PLEASE ENTER A DOMAIN: tên miền bạn muốn mua

Chọn Register a new domain (mặc định), sau đó nhấn tên miền vào phần Enter your domain here và chọn đuôi .com (.net, .org, .info, .biz, .org, .edu,...)



Bạn có thể gặp phải 3 trường hợp:

 TRƯỜNG HỢP 1: Tên miền đã được đăng ký



Bạn cần chọn tên miền khác

TRƯỜNG HỢP 2: Tên miền chưa được đăng ký


Bạn đã chọn thành công tên miền.

TRƯỜNG HỢP 3: Bạn đã có tên miền rồi

Nếu bạn đã có một tên miền rồi, bạn có thể chọn phần I already this domain và chuyển sang bước tiếp theo.


PLEASE CONFIRM YOUR HOSTING PACKAGE INFORMATION: CHỌN MỘT GÓI HOSTING



Bạn chọn gói Hosting trong phần Package Type và chọn thời hạn sử dụng trong phần Billing Cycle. Trong trường hợp này, tôi đăng ký gói Baby, thời hạn sử dụng 12 tháng với giá 7,97$/ tháng và hưởng ưu đãi giảm giá 20% từ Hostgator.

PLEASE CHOOSE YOUR ACCOUNT INFORMATION - ĐĂNG KÝ MỚI MỘT TÀI KHOẢN VÀ MÃ PIN



Nhập Username và mã PIN để tạo mới một tài khoản Hostgator.

PLEASE ENTER YOUR BILLING INFORMATION - NHẬP THÔNG TIN CÁ NHÂN VÀ PHƯƠNG THỨC THANH TOÁN

Trong phần này, bạn cần điền chi tiết các thông tin và phương pháp thanh toán. Bạn điền thông tin thanh toán trong phần Billing Information. Sau đó, chọn một phương thức thanh toán bằng Paypal hoặc thẻ tín dụng

   TRƯỜNG HỢP 1: BẠN CHỌN THANH TOÁN BẰNG THẺ TÍN DỤNG


Bạn điền các thông tin liên quan tới thẻ:

Name on Card: Tên chủ tài khoản nằm ở mặt trước của thẻ

Credit Card Number: Số thẻ (nằm ở mặt trước thẻ và bên dưới tên chủ tài khoản)

Expiration Date: Nằm dưới số thẻ

CVV Code : 3 số (hoặc 4 số) cuối nằm ở mặt sau của thẻ.

Nếu bạn chọn phương thức thanh toán bằng thẻ tín dụng, sau khi bạn điền đầy đủ thông tin và nhấn Create Account để tạo tài khoản mới, bạn đã đặt hàng xong.



TRƯỜNG HỢP 2: BẠN CHỌN THANH TOÁN QUA PAYPAL

Trong trường hợp này, sau khi tạo tài khoản bằng cách nhấn vào nút Create Account bên dưới, bạn sẽ được chuyển sang tới trang đăng nhập của Paypal để tiến hành thanh toán cho Hostgator.

HOSTING ADDONS - CHỌN GÓI DỊCH VỤ ĐI KÈM


Trong hình, bạn đang chọn mua thêm 2 dịch vụ đi kèm (Add SiteLock và Add CodeGuard)
Đánh dấu vào các dịch vụ đi kèm bạn muốn sử dụng (giá các dịch vụ đi kèm tính riêng và không được hưởng chính sách giảm giá 20%):
Add SiteLock: giúp bảo mật và tăng tốc Website của bạn (nên dùng).
Add CodeGuard: dịch vụ sao lưu Website hàng ngày. Bạn có thể bỏ chọn dịch vụ này để tiết kiệm 19.95$.
Add Search Engine Visibility: gói SEO cơ bản của SEO Gear cung cấp cho bạn một số các thông tin trên Website của bạn như: Thống kê số trang hiện có trên Website, chấm điểm Website, thông báo chỉ số Pagerank, số từ khóa được lên top Google (trong gói cơ bản, bạn chỉ có thể đăng ký tối đa 3 từ khóa), số backlink, và các hoạt động mạng xã hội ( trang web của bạn được bao nhiêu like trên Facebook, bao nhiêu Twist trên Twitter, bao nhiêu +1 trên G+,…). Bên cạnh đó, họ tiến hành đồng bộ Website của bạn để quét các lỗi trên trang Web của bạn.



HAVE A COUPON CODE? - ĐIỀN MỘT MÃ GIẢM GIÁ

Tại thời điểm mình viết bài hướng dẫn này, Hostgator vẫn đang áp dụng chính sách giảm giá 20% tên miền và các dịch vụ lưu trữ. Mã giảm giá mà Hostgator cung cấp là "SNAPPY" giúp bạn tiết kiệm được 20%.



Bạn có thể được giảm giá 25% nếu bạn nhập mã giảm giá “VANDONSALEOFF25”, sau đó nhấn Validate để xác nhận mã giảm giá. Bạn sẽ thấy số tiền phải trả sẽ giảm xuống 5% nữa trong phần thông tin thanh toán.


BƯỚC 2: PHẢN HỒI TỪ HOSTGATOR VỀ ĐƠN HÀNG CỦA BẠN


Ngay sau khi bạn đăng ký xong, bạn vào Email mà bạn đăng ký ở trên để nhận thư của Hostgator. Email này được gửi từ Paypal thông báo rằng bạn đã thanh toán 152.39$ cho Paypal (trong trường hợp bạn đã sử dụng Paypal để thanh toán cho Hostgator).



Tiếp tục kiểm tra hộp thư, bạn sẽ nhận được Email từ Hostgator.com. Họ gửi cho bạn thông tin tài khoản.



Vị trí số 1. http://gbclient.hostgator.com/login: trang đăng nhập vào hệ thống thanh toán, hỗ trợ khách hàng của Hostgator.



Email: Bạn nhập Email mà bạn đăng ký lúc thuê Hosting ở trên

Mật khẩu: PaSsWord18kl (Là các ký tự nằm ở vị trí thứ 2)

Lưu ý: Bạn chỉ có thể đăng nhập vào trang này sau khi Hostgator xác nhận thành công tài khoản của bạn.

Vị trí số 3. https://gatorxxxx.hostgator.com:xxxx là trang đăng nhập vào phần quản trị Hosting của Hostgator.



Username: yourusername (ở vị trí số 4)

Password: P7gKlorlqP1j ( ở vị trí số 5)

Nhấn Log in để đăng nhập vào trang quản trị Hosting.

Lưu ý: Trong một số trường hợp, Hostgator sẽ yêu cầu bạn xác minh thông tin cá nhân và thẻ Visa. Nếu đăng ký thành công ở bước này, bạn sẽ có thể đăng nhập vào địa chỉ http://gbclient.hostgator.com/login. Nếu đăng nhập vào trang đó mà báo lỗi, dù bạn đã nhập chính xác Email và mật khẩu, nghĩa là bạn sẽ cần phải trải qua bước xác minh tài khoản của Hostgator.

BƯỚC 3: XÁC MINH TÀI KHOẢN HOSTGATOR

Trong một số trường hợp, bạn sẽ nhận được thư của Hostgator với yêu cầu xác minh như hình dưới:



Bạn cần chụp ảnh chứng minh thư (hoặc bằng lái xe, hoặc hộ chiếu) và mặt trước của thẻ Visa mà bạn đã dùng để thanh toán với Hostgator ( có chứa tên chủ tài khoản, số thẻ, ngày hết hạn). 
Bạn có thể ẩn các số đầu trong số thẻ, chỉ giữ lại 4 số cuối thôi. Ví dụ, số thẻ của bạn là 1234 5678 9876 5432 thì bạn che các số đầu đi, chỉ chụp 4 số cuối (5432). 
Bạn gửi những ảnh này cho họ và yêu cầu họ xác minh sớm.

Sau khi nhận được email của bạn, Hostgator sẽ gửi lại email trả lời bạn:




Hostgator thông báo cho bạn biết rằng họ đã nhận được yêu cầu của bạn. Và một mã yêu cầu được tạo ra cho bạn trong trường hợp bạn muốn gửi một yêu cầu mới tới họ. Trên hình, bạn nhập vào địa chỉ trình duyệt đường dẫn: https://tickets.hostgator.com/view/GGG-12345678 và sử dụng thông tin đăng nhập giống thông tin đăng nhập ở trang http://gbclient.hostgator.com/login (trang đăng nhập vào hệ thống thanh toán, hỗ trợ khách hàng của Hostgator ở vị trí số 1).

Sau 1 – 2 ngày (bạn có thể chat trực tiếp với bộ phận hỗ trợ của họ để không phải chờ đợi), bạn sẽ nhận được thư của Paypal (nếu bạn sử dụng Paypal để thanh toán cho Hostgator) với nội dung:


Hostgator trả lại tiền cho bạn vào tài khoản Paypal của bạn. Điều này có nghĩa rằng trong vài ngày tới, tiền sẽ về tài khoản Paypal của bạn. Đó là một trong các bước xác thực của Hostgator. Sau đó, bạn sẽ nhận được Email thông báo của Hostgator với nội dung:


Trong Email này, Hostgator thông báo rằng tài khoản khách hàng của bạn đã được kích hoạt. Bạn có thể đăng nhập theo đường dẫn: https://gbclient.hostgator.com và thực hiện thanh toán lại số tiền $152.39 cho họ (trong ví dụ, mình phải thanh toán cho họ $152.39).

Nhưng, tài khoản Paypal của bạn chưa nhận được tiền của họ trả về cho bạn ở bước trước. Có thể mất khoảng vài ngày để tiền về tài khoản Paypal của bạn.

Sau khi đăng nhập vào https://gbclient.hostgator.com, bạn vào phần Make a payment và thực hiện thanh toán số tiền $152.39 đó cho Hostgator:



Sau khi thanh toán xong, bạn sẽ nhận được Email của Paypal thông báo bạn đã thanh toán cho Hostgator số tiền $152.39 thành công. Lúc này bạn sở hữu thành công tên miền và dịch vụ Hosting.

Lưu ý: Nếu bạn gặp khó khăn trong quá trình đăng ký, bạn có thể chat trực tiếp với chuyên gia hỗ trợ của Hostgator sử dụng Live Chat.

Bạn đã đăng ký thành công tên miền và dịch vụ lưu trữ Hosting. Bạn có thể nhờ các chuyên gia hỗ trợ cài đặt bản WordPress hoặc Joomla ( hoặc các CMS khác) để có thể có một trang Web đơn giản trước khi bạn tiến hành chỉnh sửa trang Web đó theo ý mình.

Nếu bạn gặp khó khăn trong việc cần hỗ trợ từ phía họ, hoặc bạn có trong tay bản Quickstart của Joomla, bạn có thể tự cài đặt Website lên host. Bạn có thể xem chi tiết việc cài đặt ở bài viết Cài đặt nhanh WordPress sử dụng QuickInstall.

Chúc bạn thành công!


Tham khảo vandon .com.vn

* Có thể bản quan tâm: [MMO] Hướng Dẫn *Kiếm Tiền Tự Động* Với Các Ứng Dụng Treo Máy *CỰC KỲ ĐƠN GIẢN VÀ HIỆU QUẢ*

Gợi ý để bắt đầu học lập trình Trí tuệ nhân tạo (AI programming)

6 gợi ý để bắt đầu học lập trình trí tuệ nhân tạo (AI programming)

Trí tuệ nhân tạo hay trí thông minh nhân tạo (Artificial Intelligence hay Machine Intelligence - AI) là một ngành thuộc lĩnh vực khoa học máy tính (Computer Science).

Với xu thế của cuộc cách mạng công nghiệp 4.0 đang bùng nổ, có khá nhiều lập trình mong muốn được học và phát triển năng lực bản thân trong mảng này.

Gợi ý để bắt đầu học lập trình Trí tuệ nhân tạo (AI programming)
Gợi ý để bắt đầu học lập trình Trí tuệ nhân tạo (AI programming)


Vậy nên bắt đầu thế nào? 

Hãy thử tham khảo 6 bước sau xem sao:

Bước 1: Tìm hiểu về Python và Các hệ quản trị cơ sở dữ liệu (SQL, Oracle,...)

Điều cốt yếu mà bạn phải làm là phải học một ngôn ngữ lập trình. Mặc dù trong thực tế có rất nhiều ngôn ngữ mà bạn có thể bắt đầu, nhưng Python là sự lựa chọn tốt nhất vì các thư viện của nó phù hợp hơn với Machine Learning.


Bạn có thể tham khảo các liên kết dưới đây:

 Machine Learning with Text in scikit-learn (PyCon 2016) 

Machine learning in Python with scikit-learn 

Machine learning with Python 

Machine Learning Part 1 | SciPy 2016 Tutorial 


Bước 2: Học trí tuệ nhân tạo từ một số khóa học dưới đây

Artificial Intelligence: Principles and Techniques from Stanford - Một chương trình giáo dục xuất sắc cho những học giả, những người được truyền cảm hứng bằng cách làm quen nhiều hơn về AI. Khóa học tập trung vào các tiêu chuẩn cơ bản của AI.



CS405: ARTIFICIAL INTELLIGENCE: Giới thiệu lĩnh vực trí tuệ nhân tạo (AI). Các tài liệu về lập trình AI, logic, tìm kiếm, chơi trò chơi, nghiên cứu máy móc, hiểu ngôn ngữ tự nhiên và robot giới thiệu với sinh viên về phương pháp AI, công cụ và kỹ thuật, ứng dụng đối với các vấn đề tính toán và vai trò của AI.



edx.org course on AI: Khóa học này cung cấp các nguyên tắc cơ bản của Artificial Intelligence (AI) và cách áp dụng chúng. Thiết kế các intelligent agent để giải quyết các vấn đề trong thế giới thực bao gồm tìm kiếm, trò chơi, nghiên cứu máy móc, logic và sự hạn chế trong các vấn đề.



MIT’s course on AI: Khóa học này giới thiệu cho sinh viên kiến thức cơ bản, giải quyết vấn đề và phương pháp học tập của trí tuệ nhân tạo. Sau khi hoàn thành khóa học này, sinh viên sẽ có thể phát triển các hệ thống thông minh bằng cách ứng dụng các giải pháp cho các vấn đề tính toán cụ thể; hiểu vai trò của lập trình tri thức, giải quyết vấn đề và học tập trong hệ thống kỹ thuật thông minh. Khóa học đánh giá cao vai trò của việc giải quyết vấn đề, tầm nhìn và ngôn ngữ trong việc hiểu trí tuệ thông minh của con người từ góc độ tính toán.



Learn the Fundamentals of AI - Khóa học trực tuyến này, được chia thành 10 bài học, giúp sinh viên hiểu rõ hơn về vũ trụ AI. Để hiểu nó, hãy đảm bảo bạn có một số thông tin cần thiết về toán học dựa trên biến trực tiếp và giả thuyết khả năng. Bạn nên học cách ghi nhớ mục tiêu cuối cùng để chuẩn bị trước.



Berkeley Video Lecturers: Khóa học bao gồm các bài giảng bằng video.

Trên đây là 6 khóa học về trí tuệ nhân tạo hàng đầu cho người mới bắt đầu và nâng cao. Hy vọng chúng sẽ hữu ích cho bạn.


Bước 3: Tìm hiểu kiến thức cơ bản về lý thuyết xác suất, thống kê và Toán học

Bạn có thể tham khảo các liên kết dưới đây:



Đại số tuyến tính
- Linear Algebra
- MIT 18.06 Đại số tuyến tính của Gilbert Strang 

(Link tham khảo: https://www.youtube.com/watch?list=PLE7DDD91010BC51F8&v=ZK3O402wf1c)



Lý thuyết xác suất và thống kê
- Probability and Statistics
- MIT 6.041

Phân tích hệ số xác suất và xác suất ứng dụng của John Tsitsiklis 

(Link tham khảo: https://www.youtube.com/watch?list=PLUl4u3cNGP61MdtwGTqZA0MreSaDybji8&v=j9WZyLZCBzs)



Calculus (Link tham khảo: http://kisonecat.com/teaching/2013/calculus-one/)



Multivariate Calculus (Link tham khảo: http://kisonecat.com/teaching/2014/m2o2c2/)

Graph theory (Link tham khảo: https://class.coursera.org/pgm-003)



Optimization methods (Link tham khảo: https://online.stanford.edu/courses)

Bước 4: Đọc sách


http://aima.cs.berkeley.edu/



Artificial Intelligence: A Modern Approach, của Stuart J. Russell và Peter Norvig 

http://wps.aw.com/wps/media/objects/5771/5909832/PDF/Luger_0136070477_1.pdf



The Quest for Artificial Intelligence của Nils J. Nilsson

(Link tham khảo: http://ai.stanford.edu/~nilsson/QAI/qai.pdf)



Practical Artificial Intelligence: Programming in Java của Mark Watson 

(Link tham khảo: https://www.saylor.org/site/wp-content/uploads/2011/11/CS405-1.1-WATSON.pdf)


https://grey.colorado.edu/CompCogNeuro/index.php/CCNBook/

Main

Simply Logical: Intelligent Reasoning by Example của Peter Flach

 (Link tham khảo: https://www.cs.bris.ac.uk/~flach/SL/SL.pdf)



The AI Revolution: Road to Superintelligence 

(Link tham khảo: https://waitbutwhy.com/2015/01/artificial-intelligence-revolution-1.html)


http://psych.colorado.edu/~oreilly/comp_ex_cog_neuro.html

Bước 5: Thực hành 

Khi bạn có một sự hiểu biết đầy đủ về ngôn ngữ lập trình ưa thích của mình và thực hành đủ với các yếu tố cần thiết, bạn nên bắt đầu tìm hiểu thêm về Machine Learning.
Trong Python, bắt đầu học các thư viện Scikit-learning, NLTK, SciPy, PyBrain và Numpy sẽ có giá trị trong khi soạn các thuật toán Machine Learning.



Thực hành vài bài tập về Scikit từ trang web:

http://scikit-learn.org/ và https://www.edx.org/course/artificial-intelligence-ai-columbiax-csmm-101x-0 (dành cho các bài tập thực hành bằng Python).



Ngoài ra ở đây là một bản tóm tắt các tài liệu để để tìm hiểu và trau dồi Machine Learning:



http://www.r2d3.us/visual-intro-to-machine-learning-part-1/



https://www.coursera.org/learn/machine-learning



https://www.cs.cmu.edu/~tom/10701_sp11/lectures.shtml



https://code.tutsplus.com/tutorials/how-to-build-a-python-bot-that-can-play-web-games–active-11117



https://www.udacity.com/course/intro-to-artificial-intelligence–cs271



https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-034-artificial-intelligence-fall-2010/

Bước 6: Thực hành — Học — Tự mình thực hành


Với trình tự này, từng bước một, bạn sẽ từ từ trở thành một lập trình viên AI.



Một khi tất cả 6 bước được thực hiện, bạn đã có thể tự tin để bắt đầu với AI/ML rồi.

Chúc bạn thành công!



#

[Đồ họa trong C\C++] Sử dụng các hàm đồ họa thông dụng trong C\C++ [C\C++]

Đồ hoạ trong C\C++


Tất cả các hàm dùng trong chế độ đồ họa của C\C++ đều được khai trong thư viện <graphics.h>

Chế độ màn hình văn bản (console) đen trắng hay có màu thông thường thì đều được biểu diễn 25 dòng 80 cột.


>> Giáo Trình C++ Và Lập Trình Hướng Đối Tượng


[Đồ họa trong C\C++] Sử dụng các hàm đồ họa thông dụng trong C\C++ [C\C++]

Chế độ đồ hoạ màn hình được chia thành các điểm ảnh (pixel), bằng cách in từng điểm ảnh ta có thể vẽ hình bất kỳ. Màn hình VGA thông thường ở độ phân giải cao có 480 hàng và 640 cột điểm ảnh. Góc trên bên trái màn hình có toạ độ là (x,y)=(0,0), góc dưới bên phải màn hình có toạ độ là (x,y)=(639,479), trục x hướng sang phải, trục y hướng xuống dưới.


Để chạy đồ hoạ ta cần có tệp Egavga.bgi (tệp điều kiển màn hình VGA), các tệp Goth.chr, litt.chr, sans.chr, trip.chr (chứa các font chữ).
Trong màn hình hiển đồ luôn có một con trỏ vẽ, đó là nơi điểm ảnh được in ra nếu dùng lệnh putpixel, con trỏ vẽ không hiện lên màn hình như trong chế độ văn bản.

Thông thường chúng ta sử dụng đồ hoạ ở chế độ 16 màu.

Tài liệu bài giảng miễn phí


Các bước thực hiện:


1. Khởi động chế độ đồ hoạ.

* Khởi động chế độ đồ hoạ ta cần một số hàm sau :

- Hàm void initgraph(int *graphdriver, int *graphmode, char *s) dùng để khởi động chế độ đồ hoạ, trong đó s là đường dẫn tới tệp egavga.bgi, nếu s=””(rỗng) thì máy tự tìm tệp egavga.bgi trên thư mục chủ. 
Giá trị của graphdriver và graphmode được xác định trong bảng sau:
  + Nếu graphdriver=VGA (hay 9) thì giá trị của graphmode có thể là VGALO (hay 0) ứng với độ phân giải màn hình 640 x200 điểm ảnh, graphdriver=VGAHI (hay 2) ứng với độ phân giải 640 x 480 điểm ảnh.
  + Nếu graphdriver=DETECT (hay 0) thì trương trình tự tìm kiểu màn hình đang dùng và gán cho graphdriver, tự động xác định chế độ đồ hoạ có độ phân giải cao nhất gán cho graphmode.

- Hàm int graphresult(void) cho mã lỗi khi khởi động đồ hoạ hay dùng các hàm đồ hoạ. hàm cho giá trị bằng 0 tức là không có lỗi, cho giá trị khác không (mã lỗi) thì có lỗi.

- Hàm char *grapherrormsg(int k) cho lời giải thích bằng tiếng anh của lỗi đồ hoạ, có mã lỗi là k.

- Hàm void closegraph(void) dùng để đóng chế độ đồ hoạ.

* Cấu trúc chung của một chương trình đồ hoạ:
- Khởi động hệ thống đồ hoạ.
- Xác định màu nền (màu màn hình), màu nét vẽ, màu tô và kiểu tô (mẫu tô).
- Vẽ,tô màu các hình mà ta mong muốn.
- Các thao tác đồ hoạ khác như cho hiện chữ....
- Đóng hệ thống đồ hoạ trở về mode văn bản.

Vi dụ: Khởi động đồ hoạ nếu thành công thì vẽ một hình chữ nhật , ngược lại thông báo mã lỗi và tên lỗi bằng tiếng anh.

[Code Turbo C\C++]
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
   int gd=0,gm=0, maloi; // gd : graphdriver, gm: graphmode,
   initgraph(&gd,&gm,"C:/TC/BGI"); // khoi dong do hoa
if ( (maloi=graphresult()) != 0)
{
  printf("khong the khoi dong do hoa \n");
  printf("ma loi : %d \n",maloi);
  printf("nguyen nhan loi : %s",grapherrormsg(maloi));
  printf("\n an phim bat ky de thoat");
  getch();
  exit(1);
}
bar(1,1,100,100);
getch();
closegraph();
}

* Để thuận tiện cho việc lập trình đồ hoạ C\C++ cung cấp một số hàm thường dùng trong đồ hoạ như sau:

- Hàm int getmaxx(void) : cho toạ độ màn hình x lớn nhất của kiểu màn hình đang dùng.
- Hàm int getmaxy(void) : cho toạ độ màn hình y lớn nhất của kiểu màn hình đang dùng.
- Hàm int getmaxcolor(void): cho giá trị màu lớn nhất đang dùng.
- Hàm void setbkcolor(int color) : đặt màu nền, màu nền ngầm định ngay sau khi khởi động đồ hoạ sẽ là màu đen BLACK (0).
- Hàm int getbkcolor(void) : lấy màu nền hiện tại.
- Hàm void setcolor(int color ) : đặt màu nét vẽ. Màu ngầm định ngay khi khởi động là WHITE (15).
- Hàm int getcolor(void) : lấy màu vẽ hiện tại.
- Hàm void cleardevice(void) : xoá toàn bộ màn hình đồ hoạ (chức năng tương tự clrscr() trong chế độ mode văn bản).
- Hàm void restorecrtmode (void) : khôi phục lại chế độ màn hình như trước khi khởi động đồ hoạ.
- Hàm int getgraphmode(void) : lấy kiểu màn hình đồ hoạ hiện tại.
- Hàm void setgraphmode(int mode) : lựa chọn kiểu đồ hoạ khác với kiểu ngầm định đặt bởi initgraph, xoá màn hình.
- Hàm moveto(int x,int y) : di chuyển con trỏ vẽ tới toạ độ (x,y) trên màn hình.
- Hàm int getx(void) : cho toạ độ x của con trỏ vẽ hiện tại.
- Hàm int gety(void) : cho toạ độ y của con trỏ vẽ hiện tại.

Ví dụ: Đặt màu nền, màu vẽ, rồi lưu lại giá trị của màu nền, màu vẽ, lấy toạ độ max của kiểu màn hình đang dùng sau đó đóng đồ hoạ và in giá trị này.

[Code Turbo C\C++]
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi; /* driver để chế độ DETECT tự phát hiện kiểu màn hình đang dùng. */
 initgraph(&driver,&mode,"C:/TC/BGI"); /* khởi động đồ hoạ với tệp egavga.bgi ở thư mục            c:\tc\bgi. Nếu đặt là “” (xâu rỗng) thì tự tìm tệp này ở thư mục chứa tệp .c hay .cpp của chương trình */
if ( (maloi=graphresult()) !=0 ) // nếu không khởi động được đồ hoạ thì báo lỗi
{
   printf("khong the khoi dong do hoa \n");
   printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
   getch();
   exit(1);
}
setbkcolor(WHITE); // đặt màu nền là màu trắng ,có thể là setbkcolor(15)
setcolor(RED); // đặt màu vẽ là màu đỏ, có thể đặt setcolor (4);
line(10,10,100,100); // vẽ một đường thẳng
getch(); // tạm dừng màn hình đợi ấn phím bất kỳ
int bk=getbkcolor() , cl=getcolor(); // lưu giá trị màu nền và màu vẽ
int x=getmaxx(), y=getmaxy(); // lưu toạ độ lớn nhất của kiểu màn hình đang sử dụng
closegraph();
printf("getbkcolor = %d getcolor= %d",bk,cl);
printf("\ngetmaxx = %d getmaxy= %d",x,y);
getch();
}

2. Các hàm dùng vẽ điểm, đường và miền.
- Hàm void putpixel(int x, int y, int color) : tô điểm có toạ độ(x,y) trên màn hình theo màu color.
- Hàm int getpixel(int x, int y) : trả về màu của điểm ảnh tại vị trí có toạ độ (x,y).

Ví dụ: Vẽ bầu trời sao, dừng màn hình lấy giá trị màu tại điểm ảnh có toạ độ (100,100)

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
  {
     printf("khong the khoi dong do hoa \n");
     printf("ma loi : &d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
     getch();
     exit(1);
  }
  randomize(); // khởi tạo hàm radom (cho số ngẫu nhiên)
  int i=0;
  while (i<200)
  {
    putpixel(random(639), random(476), WHITE); /* random(639) tức là cho số ngẫu nhiên trong khoảng 0->639, vẽ một điểm có toạ độ x,y cho ngẫu nhiên với màu trắng */
    i++;
  }
  getch();
  int mau=getpixel(100,100); /* lấy màu của điểm ảnh trên màn hình tại vị trí có toạ độ (100,100) */
  closegraph();
  printf(“mau cua diem anh tai vi tri co toa do (100,100) la : %d”,mau);
  getch();
}

- Hàm void line(int x1,int y1,int x2,int y2) : vẽ đường thằng nối 2 điểm có toạ độ (x1,y1) và (x2,y2), sau khi vẽ xong con trỏ vẽ quay về vị trí cũ (không thay đổi vị trí)

- Hàm void lineto(int x,int y) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại đến điểm có toạ độ (x,y),vẽ xong con trỏ tới điểm có toạ độ (x,y).

- Hàm void linerel(int dx, int dy) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại (giả sử con trỏ vẽ hiện tại có toạ độ (x,y) ) đến điểm có toạ độ (x+dx , y+dy), vẽ xong con trỏ tới điểm mới.

- Hàm void setlinestyle(int kiểu, int mẫu, int độ_lớn) : quy định dạng, mẫu và độ lớn của nét vẽ
 + Kiểu có giá trị từ 0 đến 4 :
 + Độ_lớn xác định độ lớn của đường vẽ nó có hai giá trị : NORM_WIDTH (1) nét bình thường, THICK_WIDTH (2) nét vẽ to.
 + Mẫu sử dụng khi kiểu = 4 để tạo mẫu của đường vẽ theo ý người lập trình. 

Ví dụ: int mau=0x1111 ; setlinestyle(4,mau,1); line(1,0,100,100); giá trị của mau ở hệ 16 là 0x1111, hay trong hệ nhị phân là 0001 0001 0001 0001 (ứng với các bit 0 thì điểm ảnh không sáng, ứng với các bit 1 thì điểm ảnh sáng).

Với mẫu ở trên ta được một đường thằng gồm các chấm cách nhau liên tiếp 3px.
Nếu kiểu <4 thì mẫu phải bằng 0
Ví dụ: Mô phỏng vẽ đường thằng với mẫu tự tạo như ở trên, và mẫu mặc định.
[Code Turbo C\C++]

#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
   int kieu=4, mau=0x1111, do_lon=1;
   int gd=0,gm=0,maloi;
   initgraph(&gd,&gm,"C:/TC/BGI");
   if ( (maloi=graphresult() ) != 0)
  {
     printf("ma loi : %d \nnguyen nhan loi : %s",maloi,grapherrormsg(maloi));
     getch();
     exit(1);
   }
   setlinestyle(3,0,1); // vẽ với mẫu có sẵn
   lineto(100,100);
   setlinestyle(kieu,mau,do_lon); // vẽ với mẫu tự tạo
   line(0,110, 200,200);
   setlinestyle(0,0,1); // vẽ đường thẳng với mẫu có sẵn
   linerel(300,200);
   getch();
   closegraph();
}

Một số hàm sau đây dùng để vẽ một số hình học quen thuộc với góc vẽ được xác định bởi gd và gc tức góc đầu đến góc cuối. Được quay theo chiều ngược chiều kim đồng hồ

- Hàm void arc(int x, int y, int gd, int gc, int r) : vẽ một cung tròn với tâm có toạ độ (x,y) , bán kính r, từ góc đầu tiên là gr đến góc cuối là gc (góc tính bằng độ). Màu của nét vẽ do hàm setcolor() đặt;

- Hàm void circle(int x, int y, int r) : vẽ đường tròn với tâm có toạ độ (x,y), bán kính r.

- Hàm ellipse(int x, int y, int gd, int gc, int rx, int ry) : vẽ một cũng ellipse với tâm là (x,y) từ góc đầu gd đến góc cuối gc, bán kính trục x là rx, bán kính trục y là ry.

- Hàm void rectangle(int x1, int y1, int x2, int y2) : vẽ một đường chữ nhật có đỉnh trên bên trái là (x1,y1) đỉnh dưới bên phải là (x2,y2).

- Hàm void setfillstyle(int mẫu, int màu) : đặt mẫu tô và màu tô cho các hình đặc và miền đóng.  +Màu có giá trị từ 0 đến 15 (xem lại ở bảng màu). 
 + Mẫu có giá trị từ 0 đến 12 được cho ở bảng dưới. Với mẫu có giá trị 12 thì tự thiết kế mẫu tô theo 8byte

- Hàm void pieslice(int x, int y, int gd, int gc, int r) : vẽ và tô màu một hình quạt có tâm là (x,y), bá kính r, từ góc đầu gd đến góc cuối gc.

- Hàm void sector(int x, int y, int gd, int gc, int rx, int ry) : vẽ và tô màu một mảnh ellipse có tâm là (x,y), từ góc đầu đến gd, đến góc cuối gc, có bán kính trục x là rx, bán kính trục y là ry.

- Hàm fillellipse(int x, int y, int rx, int ry) : hàm vẽ và tô màu một elip có tâm (x,y) và bán kính hai trục là rx, ry.

- Hàm void bar(int x1, int y1, int x2, int y2) vẽ và tô màu một hình chữ nhật.

- Hàm void bar3d(int x1, int y1, int x2, int y2, int depth, int top) : vẽ một khối hộp chữ nhật, màu vẽ xác định bởi hàm setcolor. Mặt trước có toạ độ góc trên trái là (x1,y1) góc dưới phải là (x2,y2), được tô màu bởi hàm setfillstyle. Chiều sâu của khối hộp là depth điểm. Nếu top =0 (TOPOFF) thì hộp không có lắp.

Ví dụ: minh hoạ sử dụng các hàm trên.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
  {
    printf("khong the khoi dong do hoa \n");
    printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
    getch();
    exit(1);
}
setcolor(WHITE); // đặt màu cho nét vẽ là màu trắng
arc(320,240,45,135,100); //vẽ một cung tròn với góc từ 450 đến 1350
getch(); // tạm dừng màn hình
cleardevice(); // xoá màn hình đồ hoạ
ellipse(320,240,0,360,150,110); /* vẽ một cung elip với góc vẽ từ 00 đến 3600 (vẽ một elip) */
getch();
cleardevice();
circle(320,240,160); // vẽ đường tròn
getch();
cleardevice();
rectangle(140,60,500,420); // vẽ đường chữ nhật
getch();
cleardevice();
setfillstyle(1,YELLOW); // đặt mẫu tô và màu tô cho những hàm có phần tô miền
pieslice(320,240,45,300,200); /*vẽ và tô màu một hình quạt với màu và mẫu tô được xác định bởi setfillstyle */
getch();
cleardevice();
for (int i=0; i<12; i++) // tô miền đóng với 12 mẫu tô khác nhau
{
   setfillstyle(i,getmaxcolor()); // kiểu tô dược thay lần lượt giá trị từ 0 -> 11
   sector(320,240,45,250,300,200); // vẽ và tô màu một mảnh elip
   getch();
}
cleardevice();
setfillstyle(1,LIGHTMAGENTA);
bar(20,260,300,460); // vẽ và tô màu một hình chữ nhật
bar3d(340,120,520,360,50,1); vẽ và tô màu một hình hộp
getch();
closegraph();
}

- Hàm void drawpoly(int n, int a[]) : vẽ đường gấp khúc qua n điểm
(x1, y1), (x2,y2), ... , (xn,yn). Trong đó a={x1,y1,x2,y2,....xn,yn}. Nếu điểm cuối cùng trùng với điểm đầu ta được đường gấp khúc khép kín.

- Hàm void fillpoly(int n, int a[]) vẽ và tô màu một đa giác có n đỉnh
(x1,y1), ( x2,y2) , ... , (xn,yn). Trong đó a={x1,y1,x2,y2,....xn,yn}.

- Hàm floodfill(int x, int y, int màu_biên) : tô màu một miền kín trên màn hình được bao quanh bởi một đường có màu là màu_biên, (x,y) là một điểm tuỳ ý ở bên trong miền kín. Màu tô và mẫu tô xác định bởi hàm setfillstyle. Nếu (x,y) nằm ngoài miền kín thì vùng ngoài miền kín được tô. Nếu trên màn hình không có miền kín như đã chỉ thì cả màn hình được tô màu.

Ví dụ: vẽ đường gấp khúc , đường gấp khúc khép kín và sử dụng floodfill để tô kín miền kín vừa vẽ, sử dụng fillpoly để vẽ và tô đa giác với 12 mẫu tô khác nhau.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{
  int driver=0, mode = 0, maloi;
  initgraph(&driver,&mode,"C:/TC/BGI");
  if ( (maloi=graphresult()) !=0 )
 {
   printf("khong the khoi dong do hoa \n");
   printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
   getch();
   exit(1);
}
int p1[10]={20,240,620,20,490,460,320,440,70,240};
int p2[8]={20,240,620,20,590,460,320,240};
int p3[10]={20,240,620,20,490,460,320,440,20,240};
setcolor(5); // đặt màu vẽ là 5
drawpoly(5,p1); // vẽ một đường gấp khúc
getch();
cleardevice();
setfillstyle(1,BLUE); // đặt kiểu tô và màu tô
drawpoly(5,p3); // vẽ đường gấp khúc kín
floodfill(22,240,5); // tô kín đường gấp khúc kín vẽ ở trên
getch();
cleardevice();
setcolor(LIGHTCYAN); // đặt lại màu vẽ mới

for(int i=0; i< 12; i++)
{ setfillstyle(i, 3); //đặt lần lượt 12 kiểu tô khác nhau
   fillpoly(4,p2); /*vẽ và tô kín đa giác với kiểu tô và màu tô được xác định bởi setfillstyle */
   getch();
}
closegraph();
}

3. Cửa sổ trong chế độ đồ hoạ.

Thông thường khi khởi động chế độ đồ hoạ với màn hình VGA ta được độ phân giải 640x480, đó gọi là cửa sổ đồ hoạ gốc được tạo đầu tiên. C\C++ cung cấp thêm một số hàm để tạo thêm các cửa số con khác nằm trong cửa số chính này và cửa số con được ưu tiên hơn cửa sổ chính.


Cửa sổ chính 1, còn các cửa sổ con nằm ở trong 

Để xác định một cửa sổ ta sử dụng 2 hàm sau:
- Hàm void setviewport(int x1, int y1, int x2, int y2, int clip) : tạo một cửa sổ có góc trên bên trái(x1,y1), góc dưới bên phải là (x2,y2). Nếu clip =1 thì không cho phép vẽ ra ngoài cửa sổ. Nếu clip =0 thì cho phép vẽ ra ngoài cửa sổ (ta thường dùng để lập hệ toạ độ âm dương của toán học trên màn hình). Sau khi vẽ cửa số con trỏ ở toạ độ (0,0) của cửa số hiện hành. Sau khi khởi động đồ hoạ cửa sổ ngầm định là (0,0,639,479,clip).

- Hàm void clearviewport(void) : xoá tất cả những gì có trong cửa sổ.


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setbkcolor(WHITE); // đặt màu nền cho cửa sổ mặc định
setviewport(50,50,200,200,1); // tạo một cửa sổ mới
setfillstyle(1,BLUE); // đặt kiểu và màu tô
floodfill(51,51,WHITE); // tô kín cửa sổ mới
setcolor(RED); // đặt màu vẽ mới
line(100,100,350,100); // vẽ đường nằm ngang trên cửa sổ mới
getch();
clearviewport(); // xoá toàn bộ những gì có trong cửa sổ hiện hành
line(100,100,350,300); // vẽ một đường thẳng khác trên cửa sổ hiện hành
getch();
closegraph();
}


Yêu cầu thay đổi thông số clip từ 1 sang 0 để thấy rõ việc tạo cửa sổ mới và khi vẽ trên cửa sổ.

- Hàm void getviewsettings( struct viewporttype *p) : lấy thông tin về cửa sổ hiện hành, kiểu viewporttype được định nghĩa trong thư viện graphics như sau:

Struct viewporttype {
   Int left; int top; int right; int bottom; int clip;
} ;

Ví dụ: lấy và in thông tin về cửa sổ hiện tại


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
struct viewporttype p1,p2;
getviewsettings(&p1); // lấy thông tin về cửa sổ mặc định khi khởi động đồ hoạ
setviewport(10,10,300,200,0); // tạo mới một cửa sổ
getviewsettings(&p2); // lấy thông tin của cửa sổ vừa tạo mới
closegraph();
printf("thong tin cua man hinh khi bat dau khoi dong do hoa\n");
printf("(%d,%d) la goc tren ben trai cua so \n",p1.left,p1.top);
printf("(%d,%d) la goc duoi ben phai cua so\n",p1.right,p1.bottom);
printf("thong so clip la %d",p1.clip);
printf("\n\n thong tin cua so moi duoc tao ra \n");
printf("(%d,%d) la goc tren ben trai cua so \n",p2.left,p2.top);
printf("(%d,%d) la goc duoi ben phai cua so\n",p2.right,p2.bottom);
printf("thong so clip la %d",p2.clip);
getch();
}

4. Viết chữ trong đồ hoạ.
Để viết chữ trong chế độ đồ hoạ thì trước tiên ta phải chọn font chữ, cỡ chữ, hướng in, căn chỉnh chiều dọc hay ngang đối với điểm in.

- Hàm void settextstyle(int phông, int hướng, int cỡ) : hàm thiết đặt font chữ, hướng in, cỡ chữ.
 + Tham số phông quy định font chữ, các giá trị sau:
 + Tham số hướng quy định hướng in, nhận các giá trị
HORIZ_DIR (0) : in ngang (giá trị ngầm định).
VERT_DIR (1) : in dọc.
 + Tham số cỡ quy định cỡ chữ, có giá trị từ 1 đến 10 (to nhất).

- Hàm void settextjustify(int ngang, int dọc) : quy định nơi hiển thị văn bản của outtextxy theo quan hệ với toạ độ (x,y), của outtext theo quan hệ với vị trí hiện tại của con trỏ (giả sử (x,y)).
 + Tham số ngang có giá trị
 + Tham số dọc có các giá trị
 Hàm outtextxy(int x, int y, char *s) : in xâu s theo vị trí (x,y).

Ví dụ: settextstyle(0,0,3) ; settextjustify(1,1) ; outtext (230,230, “Bac Ninh Que Toi”);

- Hàm void outtext(char *s) : in xâu s theo vị trí hiện tại của con trỏ vẽ.
- Hàm int texthight(char *s) : trả về chiều cao theo pixel của xâu s.
- Hàm int textwidth(char *s) : trả về bề rộng của xâu s.
- Hàm sprintf(char *s, char *xâu_điều_khiển, danh_sách_các_biến); làm việc giống hàm printf nhưng không in ra màn hình mà cho kết quả vào xâu s. Hàm này được khai trong thư viện stdio.h
Ví dụ int n=5; char s[200];
Sprintf(s,“bien n co gia tri la %d”,n);
Sau khi thực hiện lệnh trên xâu s được kết quả là “bien n co gia tri la 5”

Ví dụ minh hoạ in chữ ra màn hình

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setcolor(GREEN);
for (int i=0; i<=4; i++ )
{settextstyle(i,0,1); // đặt font chữ thay đổi từ 0 đến 4, hướng in là ngang cỡ 1
outtextxy(100,230,"Nguyen Ba Cuong - Cong Nghe Phan Mem"); /* in xâu tại vị trí bắt đầu là (100,230) */
getch();
cleardevice();
}
settextstyle(3,1,1); // thay đổi font và hướng in (hướng dọc)
outtext("Nguyen Ba Cuong - Cong Nghe Phan Mem"); // in tại vị trí con trỏ vẽ hiện hành
getch();
closegraph();
}

5. Tạo hình ảnh chuyển động.

- Hàm unsigned imagesize(int x1,int y1, int x2, int y2) cho số byte cần thiết để lưu ảnh trong phạm vi hình chữ nhật (x1,y1,x2,y2).

- Hàm void getimage(int x1, int y1, int x2, int y2, void *p): chép các điểm ảnh trong vùng chữ nhật (x1,y1,x2,y2) vào vùng nhớ do con trỏ p trỏ tới (vùng nhớ này và con trỏ p cho bởi hàm malloc, độ lớn vùng nhớ cho bởi hàm imagesize).

- Hàm void putimage(int x, int y, void *p, int kiểu_chép): chép ảnh tử vùng nhớ do con trỏ p trỏ tới ra màn hình sao cho góc trên trái vùng ảnh có toạ độ (x,y). Giá trị của kiểu chép được cho trong bảng sau :

a. Tạo ảnh chuyển động không có màn hình nền

B1- Tạo ảnh bằng màu vẽ.
B2- xoá ảnh bằng màu nền.
B3- tạo lại ảnh bằng màu vẽ tại vị trí mới.

Ví dụ : cho quả bóng chuyển động ngang trên màn hình, hết chiều ngang màn hình bóng quay lại.


#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
void bong(int x, int y, int r, int mau)
{ setcolor(mau);
setfillstyle(1,mau);
pieslice(x,y,0,360,r);
}
void main()
{ int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
printf("khong the khoi dong do hoa \n");
printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
getch();
exit(1);
}
setbkcolor(CYAN);
int x=30,y=100;
do
{
if (x>=640-30) x=50;
bong(x,y,30,CYAN);
x+=4;
bong(x,y,30,RED);
delay(200); // tạm dừng 200 mili giây (hàm này trong thư viện dos.h)
}while (!kbhit()); // lặp vô hạn tới khi ấn một phím bất kỳ thì dừng
getch();
closegraph();
}

b. Tạo ảnh chuyển động mà không xoá màn hình nền.

Vẽ ảnh trong vùng chữ nhật (x1,y1,x2,y2), dùng hàm imagesize tính số byte càn thiết để lưu ảnh trong vùng chữ nhật vừa vẽ (giả sử là n byte), dùng hàm malloc để cấp phát vùng nhớ n byte và cho con trỏ p trỏ và vùng nhớ này, dùng hàm getimage chép ảnh từ vùng chữ nhật vào vùng nhớ p, xoá màn hình, tạo màn hình nền, dùng lệnh putimage với kiểu chép XOR_PUT để in ảnh lưu trong P ra màn hình với toạ đọ góc trên bên trái là(x,y),tạm dừng chương trình một lát, dùng putimage với kiểu chép XOR_PUT in lại ảnh lưu trong P ra màn hình cũng tại (x,y) để xoá ảnh cũ (vì 1 xor 1 cho 0), thay đổi các thành phần của toạ độ (x,y) in ảnh tai toạ độ mới...

Ví dụ: Vẽ quả bóng màu đỏ và nhớ vào vùng nhớ p, xoá màn hình, vẽ bầu trời sao, cho quả bóng chuyển động ngẫu nhiên trên màn hình đến khi ấn một phím bất kỳ.

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
void bong(int x, int y, int r, int mau)
{
  setcolor(mau);
  setfillstyle(1,mau);
  pieslice(x,y,0,360,r);
}
void main()
{
int driver=0, mode = 0, maloi;
initgraph(&driver,&mode,"C:/TC/BGI");
if ( (maloi=graphresult()) !=0 )
{
  printf("khong the khoi dong do hoa \n");
  printf("ma loi : %d \nnguyen nhan loi %s ",maloi, grapherrormsg(maloi) );
  getch();
  exit(1);
}
setcolor(RED);
setfillstyle(1,RED);
pieslice(50,50,0,360,50);
char *p;
int n= imagesize(0,0,100,100);
p=(char *)malloc(n);
getimage(0,0,100,100,p);
getch();
cleardevice();
randomize();
for (int i=0;i<=300; i++)
{
  int k=random(16);
  setcolor(k);
  setfillstyle(1,k);
  pieslice(random(640), random(480), 0,360,2);
}
int x=random(640-100), y=random(480-100),x1,y1;
do{
  putimage(x,y,p,1); /* in bóng màu đỏ với phép XOR (vẽ bóng trên màn hình chỗ nào đã có màu lần trước thì màu đó được in đè lên bóng do ta sử dụng xor); */
  delay(100); // tạm dừng
  putimage(x,y,p,1); /* in với phép XOR một lần nữa (xoá bóng vừa in trên màn hình do bóng lần trước in là màu đỏ lại in lại màu đỏ nhưng theo phép xor thì 1 XOR 1 =0 tức là 2 màu đỏ đè lên nhau sẽ ra màu nền cũ trước đó) */
  do{ /* mục đích của vòng do while này nhằm không cho quả bóng hiển thị ngoài vùng màn hình (0,0,540,340) và tạo giá trị toạ độ ngẫu nhiên mới cho bóng */
  x1 =x+random(50) -25;
  y1 =y+random(50) -25;
 } while ( (x1<0) || ( x1> (639-100) ) || (y1<0) || (y1>(439-100) ) ) ;

x=x1;
y=y1;
}while(!kbhit()) ;
getch();
closegraph();
}


[Tự học lập trình Java] Bài 6: Thừa kế (Inheritance) và đa hình (Polymorphism)

[Tự học lập trình Java] Bài 6: Thừa kế (Inheritance) và đa hình (Polymorphism)

1. Thừa kế (inheritance) 

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Tài liệu: Lập trình hướng đối tượng JAVA core dành cho người mới bắt đầu học lập trình [Click để xem]

# Khoá học online: Lập trình Java trong 4 tuần [Click để xem]



1.1. Lớp kế thừa 

     Một lớp con (subclass) có thể kế thừa tất cả những vùng dữ liệu và phương thức của một lớp khác – lớp cha (siêu lớp - superclass). 

   Như vậy việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớp mới là lớp dẫn xuất (derived class) từ lớp cũ (superclass). Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ đó là một lớp siêu lớp trực tiếp (immediate supperclass).

Dùng từ khóa extends để chỉ lớp dẫn xuất.

Ví dụ:
// super class B
class B{
 // …
}
// sub class A
class A extends B
{
 //…
}
1.2. Khái báo phương thức chồng
      Tính kế thừa giúp cho các lớp con nhận được các thuộc tính/phương thức public và protected của lớp cha. Đồng thời cũng có thể thay thế các phương thức của lớp cha bằng cách khai báo chồng. Chẳng hạn phương thức tinhgiaban() áp dụng trong lớp xega sẽ cho kết quả gấp 2.5 lần chi phí sản xuất thay vì gấp 2 chi phí sản xuất giống như trong lớp xemay.

Ví dụ:
public class xega extends xemay
{
public xega()
{ ... }

public xega(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx);
{
  this.nhasx = s_nhasx;
  this.model = s_model;
  this.chiphisx = f_chiphisx;
  this.thoigiansx = i_thoigiansx;
  this.so = 0;
}

public float tinhgiaban()
{
   return 2.5 * chiphisx;
 }
}

Java cung cấp 3 tiền tố/từ khóa để hỗ trợ tính kế thừa của lớp:
- public: lớp có thể truy cập từ các gói, chương trình khác.
- final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể có con), hay đôi khi người ta gọi là lớp “vô sinh”.
- abstract: Lớp trừu tượng (không có khai báo các thành phần và các phương thức trong lớp trừu tượng). Lớp dẫn xuất sẽ khai báo, cài đặt cụ thể các thuộc tính, phương thức của lớp trừu tượng.

Chú ý: Trong Java không cho phép đa kế thừa, nghĩa là 1 lớp con chỉ kế thừa duy nhất từ 1 lớp cha (khác với C++), ngược lại 1 lớp cha có thể cho phép nhiều lớp con kế thừa.

2. Đa hình (polymorphism)
   Tính đa hình cho phép cài đặt các lớp dẫn xuất khác nhau từ một lớp nguồn. Một đối tượng có thể có nhiều kiểu khác nhau gọi là tính đa hình.

Ví dụ:
class A_Object
{
  //…
  void method_1()
  {
   //…
  }
}

class B_Object extends A_Object
{
   //…
   void method_1()
  {
    //…
  }
}

class C
{
  public static void main(String[] args)
  {
     // Tạo một mảng 2 phần tử kiểu A
     A_Object arr_Object = new A_Object[2];
     B_Object var_1 = new B_Object();
    // Phần tử đầu tiên của mảng arr_Object[0]tham
    // chiếu đến 1 đối tượng kiểu B_Object dẫnxuất
    // từ A_Object
   arr_Object[0] = var_1;
   A_Object var_2;
   for (int i=0; i<2; i++) {
     var_2 = arr_Object[i];
     var_2.method_1();
  }
 }
}

Vòng lặp for trong đoạn chương trình trên:
- Với i = 0 thì biến var_2 có kiểu là B_Object, và lệnh var_2.method_1() sẽ gọi thực hiện phương thức method_1 của lớp B_Object.
- Với i = 1 thì biến var_2 có kiểu là A_Object, và lệnh var_2.method_1() sẽ gọi thực hiện phương thức method_1 của lớp A_Object.

Trong ví dụ trên đối tượng var_2 có thể nhận kiểu A_Object hay B_Object. Hay nói các khác, một biến đối tượng kiểu A_Object như var_2 trong ví dụ trên có thể tham chiếu đến bất kỳ đối tượng nào của bất kỳ lớp con nào của lớp A_Object (ví dụ var_2 có thể tham chiếu đến đối tượng var_1, var_1 là đối tượng của lớp B_Object dẫn xuất từ lớp A_Object). Ngược lại

một biến của lớp con không thể tham chiếu đến bất kỳ đối tượng nào của lớp cha.

3. Phương thức từu tượng và lớp trừu tượng
   Lớp trừu tượng (abtract class) là lớp không có khai báo các thuộc tính thành phần và các phương thức. Các lớp dẫn xuất của nó sẽ khai báo thuộc tính, cài đặt cụ thể các phương thức của lớp trừu tượng.

  Phương thức trừu tượng (abstract method) là phương thức không có nội dung, chỉ được khai báo trong lớp trừu tượng.

Ví dụ:
abstract class A
{
   abstract void method_1(); // phương thức trừu tượng
 }
public class B extends A
{
   public void method_1()
  {
     // cài đặt chi tiết cho phương thức method_1
     // trong lớp con B.
     //…
   }
}

public class C extends A
{
public void method_1()
 {
    // cài đặt chi tiết cho phương thức method_1
    // trong lớp con C.
    //…
  }
}

Lưu ý: Các phương thức được khai báo dùng các tiền tố private và static thì không được khai báo là trừu tượng abstract. Tiền tố private thì không thể truy xuất từ các lớp dẫn xuất, còn tiền tố static thì chỉ dùng riêng cho lớp khai báo mà thôi.

4. Giao diện (interface)
 4.1.Khái niệm interface
     Như chúng ta đã biết một lớp trong java chỉ có một siêu lớp trực tiếp hay một cha duy nhất (đơn thừa kế). Để tránh đi tính phức tạp của đa thừa kế (multi-inheritance) trong lập trình hướng đối tượng, Java thay thế bằng giao tiếp (interface). Một lớp có thể có nhiều giao tiếp (interface) với các lớp khác để thừa hưởng thêm vùng dữ liệu và phương thức của các giao tiếp này.

4.2.Khai báo interface
    Interface được khai báo như một lớp. Nhưng các thuộc tính của interface là các hằng (khai báo dùng từ khóa final) và các phương thức của giao tiếp là trừu tượng (mặc dù không có từ khóa abstract).

   Trong các lớp có cài đặt các interface ta phải tiến hành cài đặt cụ thể các phương thức này.

Ví dụ:
 public interface sanpham
{
    static final String nhasx = “Honda VN”;
    static final String dienthoai = “08-8123456”;
    public int gia(String s_model);
 }
// khai báo 1 lớp có cài đặt interface
public class xemay implements sanpham
{
     // cài đặt lại phương thức của giao diện trong lớp
     public int gia(String s_model)
     {
        if (s_model.equals(“2005”))
           return (2000);
        else
     return (1500);
}
public String chobietnhasx()
{
    return (nhasx);
 }
}

Có một vấn đề khác với lớp là một giao diện (interface) không chỉ có một giao diện cha trực tiếp mà có thể dẫn xuất cùng lúc nhiều giao diện khác (hay có nhiều giao diện cha). Khi đó nó sẽ kế thừa tất cả các giá trị hằng và các phương thức của các giao diện cha. Các giao diện cha được liệt kê thành chuỗi và cách nhau bởi dấu phẩy “,”. Khai báo như sau:

public interface InterfaceName extends interface1, interface2, interface3
{
  //…

5. Lớp nội
   Lớp nội là lớp được khai báo bên trong 1 lớp khác. Lớp nội thể hiện tính đóng gói cao và có thể truy xuất trực tiếp biến của lớp cha.

Ví dụ:
public class A
{
   //…
    int <field_1>
    static class B
   {
      //…
      int <field_2>
     public B(int par_1)
     {
       field_2 = par_1 + field_1;
     }
   }
 }

Trong ví dụ trên thì chương trình dịch sẽ tạo ra hai lớp với hai files khác nhau: A.class và B.class

6. Lớp vô sinh
     Lớp không thể có lớp dẫn xuất từ nó (không có lớp con) gọi là lớp “vô sinh”, hay nói cách khác không thể kế thừa được từ một lớp “vô sinh”. Lớp “vô sinh” dùng để hạn chế, ngăn ngừa các lớp khác dẫn xuất từ nó.

     Để khai báo một lớp là lớp “vô sinh”, chúng ta dùng từ khóa final class. Tất cả các phương thức của lớp vô sinh đều vô sinh, nhưng các thuộc tính của lớp vô sinh thì có thể không vô sinh.

Ví dụ:
public final class A
{
    public final int x;
    private int y;
    public final void method_1()
    {
       //…
    }
public final void method_2()
  {
    //…
   }