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!



#

[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) 

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()
  {
    //…
   }
 

[Tự học lập trình Java] Bài 5: Lớp (class) và đối tượng (object) trong Java

[Tự học lập trình Java] Bài 5: Lớp (class) và đối tượng (object) trong Java

1. Đối tượng và lớp
1.1. Lớp (class)
a. Khái niệm
    Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp. Các đối tượng được xây dựng bởi các lớp nên được gọi là các thể hiện của lớp (class instance).


b. Khai báo/định nghĩa lớp
 [access rights(tiền tố)] class <ClassName>
 {
      <kiểu dữ liệu> <field_1>;
      <kiểu dữ liệu> <field_2>;
     constructor
     method_1
     method_2
     ...
}

Trong đó:
  - class: là từ khóa của java
  - ClassName: là tên chúng ta đặt cho lớp
  - field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp.
  - constructor: là sự xây dựng, khởi tạo đối tượng lớp.
  - method_1, method_2: là các phương thức/hàm thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.
  - access rights: Quyền truy xuất (public, private, protected)

Ví dụ: Khái báo lớp SinhVien

public class SinhVien{
  // khai báo các phương thức và thuộc tính
  …
}

1.2. Đối tượng (object)
  Đối tượng là sự cụ thể hóa của lớp. Đối tượng được khai báo tường mình bằng từ khóa new theo cú pháp:

   ClassName objectName = new ClassName();

Ví dụ: Khái báo đối tượng sinh vien A (A là một sinh viên cụ thể thuộc lớp SinhVien)
          SinhVien A=new SinhVien( );

2. Biến lớp và phương thức lớp
2.1. Thuộc tính - biến lớp (attribute)
   Vùng dữ liệu (fields) hay thuộc tính (properties) của lớp được khai báo bên trong lớp như sau:

class <ClassName>
 {
   // khai báo những thuộc tính của lớp
  <tiền tố> <kiểu dữ liệu> < thuộc tính>;
  //…
 }

Để xác định quyền truy xuất của các đối tượng khác đối với vùng dữ liệu của lớp người ta thường dùng 3 tiền tố sau:
- public: có thể truy xuất từ tất cả các đối tượng khác
- private: một lớp không thể truy xuất vùng private của 1 lớp khác.
- protected: vùng protected của 1 lớp chỉ cho phép bản thân lớp đó và những lớp dẫn xuất từ lớp đó truy cập đến.

Ví dụ: khai báo lớp xemay

public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // sobanhxe là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
}

Chú giải:
  - Thuộc tính “nhasx”, “model”có thể được truy cập đến từ tất cả các đối tượng khác.
  - Thuộc tính “chiphisx” chỉ có thể truy cập được từ các đối tượng có kiểu “xemay”
  - Thuộc tính “thoigiansx”, so có thể truy cập được từ các đối tượng có kiểu “xemay” và các đối tượng của các lớp con dẫn xuất từ lớp “xemay”

Lưu ý: Thông thường để an toàn cho vùng dữ liệu của các đối tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một lớp từ các phương thức bên ngoài lớp đó.

2.2. Phương thức (method)
    Hàm hay phương thức (method) trong Java là khối lệnh thực hiện các chức năng, các hành vi xử lý của lớp lên vùng dữ liệu.

a. Khai báo phương thức:

<Tiền tố> <kiểu trả về> <Tên phương thức> (<danh sách đối số>)
{
  <khối lệnh>;
  [return];
}

Để xác định quyền truy xuất của các đối tượng khác đối với các phương thức của lớp người ta thường dùng các tiền tố sau:

- public: phương thức có thể truy cập được từ bên ngoài lớp khai báo.
- protected: có thể truy cập được từ lớp khai báo và những lớp dẫn xuất từ nó.
- private: chỉ được truy cập bên trong bản thân lớp khai báo.
- static: phương thức lớp dùng chung cho tất cả các thể hiện của lớp, có nghĩa là phương thức đó có thể được thực hiện kể cả khi không có đối tượng của lớp chứa phương thức đó.
- final: phương thức có tiền tố này không được khai báo chồng ớ các lớp dẫn xuất.
- abstract: phương thức không cần cài đặt (không có phần source code), sẽ được hiện thực trong các lớp dẫn xuất từ lớp này.
- synchoronized: dùng để ngăn các tác động của các đối tượng khác lên đối tượng đang xét trong khi đang đồng bộ hóa. Dùng trong lập trình miltithreads.

<kiểu trả về>: có thể là kiểu void, kiểu cơ sở hay một lớp.
<Tên phương thức>: đặt theo qui ước giống tên biến.
<danh sách thông số>: có thể rỗng

Lưu ý:
Thông thường trong một lớp các phương thức nên được khai báo dùng từ khóa public, khác với vùng dữ liệu thường là dùng tiền tố private vì mục đích an toàn. Những biến nằm trong một phương thức của lớp là các biến cục bộ (local) và nên được khởia tạo sau khi khai báo.

Ví dụ:
public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
  public float tinhgiaban()
  {
    return 1.5 * chiphisx;
  }
}

b. Khởi tạo một đối tượng (Constructor)
     Contructor thật ra là một loại phương thức đặc biệt của lớp. Constructor dùng gọi tự động khi khởi tạo một thể hiện của lớp, có thể dùng để khởi gán những giá trị măc định. Các constructor không có giá trị trả về, và có thể có tham số hoặc không có tham số. Constructor phải có cùng tên với lớp và được gọi đến dùng từ khóa new.

    Nếu một lớp không có constructor thì java sẽ cung cấp cho lớp một constructor mặc định (default constructor). Những thuộc tính, biến của lớp sẽ được khởi tạo bởi các giá trị mặc định (số: thường là giá trị 0, kiểu luận lý là giá trị false, kiểu đối tượng giá trị null, …)

    Lưu ý: thông thường để an toàn, dễ kiểm soát và làm chủ mã nguồn chương trình chúng ta nên khai báo một constructor cho lớp.

Ví dụ:
public class xemay
{
   //…
   public xemay()
 }

public xemay(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx, int i_so);
 {
   nhasx = s_nhasx;
   model = s_model;
   chiphisx = f_chiphisx;
   thoigiansx = i_thoigiansx;
   so = i_so;
   // hoặc
   // this.nhasx = s_nhasx;
   // this.model = s_model;
   // this.chiphisx = f_chiphisx;
   // this.thoigiansx = i_thoigiansx;
   // this.so = i_so;
}

}

c. Biến this
    Biến this là một biến ẩn tồn tại trong tất cả các lớp trong ngông ngữ java. Một class trong Java luôn tồn tại một biến this, biến this được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa nó.

Ví dụ:
<tiền tố> class A
{
   <tiền tố> int <field_1>;
   <tiền tố> String <field_2>;
   // Contructor của lớp A
  public A(int par_1, String par_2)
  {
   this.field_1 = par_1;
   this.field_2 = par_2;
  }

<tiền tố> <kiểu trả về> <method_1>()
{
  // …
}

<tiền tố> <kiểu trả về> <method_2>()
 {
   this.method_1()
   // …
  }
}

d. Khai báo chồng phương thức (overloading method)
    Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác số lượng tham số) gọi là khai báo chồng phương thức (overloading method).

Ví dụ:
 public class xemay
 {
   // khai báo fields…
   public float tinhgiaban()
   return 2 * chiphisx;
 }

public float tinhgiaban(float huehong)
{
   return (2 * chiphisx + huehong);
 }
}

e. Đặc điểm hướng đối tượng trong java
    Hỗ trợ những nguyên tắc cơ bản của lập trình hướng đối tượng, tất cả các ngôn ngữ lập trình kể cả java đều có ba đặc điểm chung: tính đóng gói (encapsulation), tính đa hình (polymorphism), và tính kế thừa (inheritance).

3. Phương thức finalize()
    Trong java không có kiểu dữ liệu con trỏ như trong C, người lập trình không cần phải quá bận tâm về việc cấp phát và giải phóng vùng nhớ, sẽ có một trình dọn dẹp hệ thống đảm trách việc này. Trình dọn dẹp hệ thống sẽ dọn dẹp vùng nhớ cấp phát cho các đối tượng trước khi hủy một đối tượng.

    Phương thức finalize() là một phương thức đặc biệt được cài đặt sẵn cho các lớp. Trình dọn dẹp hệ thống sẽ gọi phương thức này trước khi hủy một đối tượng. Vì vậy việc cài đặt một số thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động. Đồng thời việc cài đặt trong phương thức finalize() sẽ giúp cho bộ nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình.

Ví dụ:
class A
 {
   // Khai báo các thuộc tính
   public void method_1()
  {
     //…
   }
   protected void finalize()
  {
    // Có thể dùng để đóng tất cả các kết nối
    // vào cơ sở dữ liệu trước khi hủy đối tượng.
    //…
   }
}

4.Gói (packages)
   Việc đóng gói các lớp lại tạo thành một thư viện dùng chung gọi là package. Một package có thể chứa một hay nhiều lớp bên trong, đồng thời cũng có thể chứa một package khác bên trong.

   Để khai báo một lớp thuộc một gói nào đấy ta phải dùng từ khóa package. Dòng khai báo gói phải là dòng đầu tiên trong tập tin khai báo lớp. Các tập tin khai báo lớp trong cùng một gói phải được lưu trong cùng một thư mục.

Lưu ý: Việc khai báo import tất cả các lớp trong gói sẽ làm tốn bộ nhớ. Thông thường chúng ta chỉ nên import những lớp cần dùng trong chương trình.

Ví dụ:
package phuongtiengiaothong;
class xemay
{
  // …
 }

class xega extends xemay
{
   //…
}

Khi đó muốn sử dụng lớp xemay vào chương trình ta sẽ khai báo như sau:

import phuongtiengiaothong.xemay;

5. Đóng gói (encapsulation)
     Cơ chế đóng gói trong lập trình hướng đối tượng giúp cho các đối tượng dấu đi một phần các chi tiết cài đặt, cũng như phần dữ liệu cục bộ của nó, và chỉ công bố ra ngoài những gì cần công bố để trao đổi với các đối tượng khác. Hay chúng ta có thể nói đối tượng là một thành tố hỗ trợ tính đóng gói.

    Đơn vị đóng gói cơ bản của ngôn ngữ java là class. Một class định nghĩa hình thức của một đối tượng. Một class định rõ những thành phần dữ liệu và các đoạn mã cài đặt các thao tác xử lý trên các đối tượng dữ liệu đó. Java dùng class để xây dựng những đối tượng. Những đối tượng là những thể hiện (instances) của một class.

    Một lớp bao gồm thành phần dữ liệu và thành phần xử lý. Thành phần dữ liệu của một lớp thường bao gồm các biến thành viên và các biến thể hiện của lớp. Thành phần xử lý là các thao tác trên các thành phần dữ liệu, thường trong java người gọi là phương thức. Phương thức là một thuật ngữ hướng đối tượng trong java, trong C/C++ người ta thường dùng thuật ngữ là hàm.

Xem thêm các ví dụ về Class và Object tại đây

 Lập trình Java - ĐH FPT

--------------------------------------------------- 
Đoc thêm các bài khác

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android 

[Tự học lập trình Java] Bài 4: Mảng và chuỗi trong Java

[Tự học lập trình Java] Bài 4: Mảng và chuỗi trong Java

1. Mảng 1 chiều

1.1. Khai báo và tạo mảng
  Mảng được dùng để lưu trữ các khoản mục (items) cùng kiểu dữ liệu liền kề nhau trong bộ nhớ. Mỗi lần ta khai báo kích thước của một mảng, nó sẽ không thể thay đổi. Dữ liệu trên mảng có thể là kiểu dữ liệu nguyên thuỷ hoặc đối tượng. Cũng như các biến, ta có thể gán các giá trị vào mảng tại các phần tử được tạo ra trong mảng. Nếu không, Java sẽ gán giá trị mặc định vào tất cả các phần tử của mảng, giá trị mặc định phụ thuộc vào kiểu dữ liệu. Ví dụ : nếu kiểu dữ liệu là nguyên (int) thì giá trị mặc định ban đầu sẽ là 0.


Mảng có thể được khai báo bằng 3 cách :


Cách khai báo
Mô tả
Cú pháp
Ví dụ
Chỉ đơn thuần khai báo
Chỉ đơn thuần khai báo mảng
Datatype  identifier[]
char ch[ ];
//khai báo mảng ký tự có tên ch
Khai báo và tạo mảng
Khai báo và cấp phát bộ nhớ cho các phần tử mảng sử dụng toán tử  “new”
Datatype  identifier[]
= new datatype [size ]
char ch[] = new
char [10 ];
//Khai báo một mảng ch và lưu trữ 10 ký tự
Khai báo, kiến tạo và khởi tạo
Khai báo mảng, cấp phát bộ nhớ cho nó và gán các giá trị ban đầu cho các phần tử của mảng
Datatype  identifier[]
= {value1,value2…};
char ch []
= {‘A’,’B’,’C’,’D’ };
//khai báo mảng ch và lưu 4 chữ cái kiểu  ký tự

Để xác định tên và số phần tử của mảng ta cần xem xét các phần tử mảng.Số phần tử bắt đầu với 0 cho phần tử đầu,1 cho phần tử thứ hai và cứ tiếp như vậy.

1.2. Sắp xếp mảng
     Sử dụng các thuật toán sắp xếp như: Thuật toán đổi chỗ trực tiếp, thuật toán nổi bọt, thuật toán chèn trực tiếp, thuật toán vun đống, …
    Ứng dụng các thuật toán trên để sắp xếp dãy số (mảng số) theo chiều tăng dần, hoặc giảm dần với dãy số nhập vào từ bàn phím.

1.3. Mảng đối tượng

   Tương tự như mảng dữ liệu thông thường. Chúng ta có thể khai báo các mảng đối tượng từ các lớp đã được định nghĩa.

Ví dụ:
 // khai bao lớp
class A{
   // khai báo thuộc tính
   // phương thức
   …
}
// khai báo mảng đối tượng m có kích thước là 10.
A[] m=new A[10];

//Để sử dụng được mảng m ta phải khởi tạo từng đối tượng là thành phần của mảng //(thường sử dụng cấu trúc lặp).

1.4. Mảng đa chiều.
    Các mảng đa chiều trong Java được coi như là các mảng đối tượng chứa các tham chiếu đến các mảng khác
   Số chiều được quy định bởi số cặp ngoặc vuông [].

Ví dụ:
  - Bộ khởi tạo mảng cho mảng hai chiều:
   int[][] mac1 = { { 1, 2, 3, }, { 4, 5, 6, } };
  - Một mảng động được tạo ra.
   int[][] mac2 = new int[n][m];
  - Một mảng với các véc-tơ có kích thước khác nhau. Mảng phụ w xác định độ dài của các véc-tơ này.

Ví dụ:
  public class MultiArr {
   public static void main(String[] arg) {
     int w[] = { 2, 3, 4 };
     int n = 3;
     int[][] m3 = new int[n][]; // sizes of the rows are set dynamically
     for(int i = 0; i < m3.length; i++) {
       m3[i] = new int[w[i]];
       for (int j = 0; j < m3[i].length; j++)
          m3[i][j] = i + j;
      }
     for (int i = 0; i < m3.length; i++) {
       System.out.println("Size of the " + i + "-th row " + m3[i].length);
       String out = " ";
       for(int j = 0; j < m3[i].length; j++) out += " " + m3[i][j];
           System.out.println(out);
     }
  }
}

Kết quả:
 Size of the 0-th row 2
  0 1
Size of the 1-th row 3
  1 2 3
Size of the 2-th row 4
  2 3 4 5


2. Chuỗi (string)
   Chuỗi là tập các kí tự đứng liền nhau được giới hạn trong dấu ngoặc kép như: "hello word", "laptrinhmaytinh.net",...

2.1. Khai báo và khởi tạo Java cung cấp các kiểu khai báo và khởi tạo string như sau:
 - Khai báo một xâu rỗng
 Ví dụ: String str1=new String( ); //khởi tạo str1 là một xâu trống

- Khai báo và khởi tạo một xâu bằng một chuỗi cho trước.
Ví dụ: String str2=new String(“Hello word”); //khởi tạo str2 bằng “Hello word”

- Khai báo và khởi tạo một xâu bằng một mảng kí tự cho trước.
Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’}; String str3=new String[ch];

Kết quả str3 là xâu “abcde”· Khai báo và khởi tạo một xâu bằng cách chọn một vài kí tự trong một mảng kí tự cho trước.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str4=new String[ch,0,2];

Kết quả str4 là xâu ab, vì khởi tạo này sẽ khởi tạo xâu str4 là lấy 2 kí tự từ vị trí thứ 0.

2.2. Thao tác nối chuỗi (cộng 2 chuỗi)
- Cộng 2 chuỗi bằng dấu cộng (+)
Ví dụ: String str1=new String(“Hello word” );
           System.out.printf(“toi muon noi ”+str1);

Kết quả của đoạn mã trên sẽ in ra dong chữ: “toi muon noi Hello word”

Chú ý: Java có khả năng tự chuyển bất cứ dữ liệu kiểu số nào khi cộng vào String.

Ví dụ: int n=100;
           Float m=100.123;
           System.out.printf(“so nguyen la ”+n+”so thuc la “+m);

     Kết quả sẽ in ra chuỗi số: “so nguyen la 100 so thuc la 100.123”có nghĩa là java sẽ chuyển n và m thành kiểu string rồi sau đó sẽ nối vào chuỗi phía trước.
     Khi cộng chuỗi bằng dấu cộng ,kết quả sẽ đưa ra bằng cách nỗi 2 chuỗi vào vị trí cuối cùng của chuỗi đầu tiên. Cách nối chuỗi này thường được sử dụng khi in ra màn hình hoặc chuyển kiểu dữ liệu số sang string.

- Nối 2 chuỗi bằng phương thức concat( )
   Khác với việc nối chuỗi bằng dấu cộng là nối 2 chuỗi tại vị trí cuối cùng của chuỗi đầu tiên.thay vào đó phương thức này sẽ trả về một chuỗi mới.

Ví dụ: String str1,str2,str3;
           str1=”"Welcome”";
           str2=”"laptrinhmaytinh.net";
           str3=str1.concat(str2);

 Kết quả là str3 sẽ bằng “Welcome laptrinhmaytinh.net

2.3. Các hàm xử lí với chuỗi trong java
- substring
 Ví dụ: String str1=new String( “Ha noi” );
            String str2=str1.substring(0,2);

Kết quả là str2 bằng “Ha có nghĩa là phương thức substring sẽ lấy 2 kí tự trong xâu str1 bắt đầu từ kí tự thứ 0.

- length trả về độ dài chuỗi
Ví dụ: String str1=new String(“”Ha Noi””);
          int n=str1.length( );

Kết quả là n=6 nghĩa là phương thức length( ) sẽ trả về độ dài xâu kí tự

- charAt
Ví dụ: String str1=new String(“”dantri.vn””);
           char ch=str1.charAt(3);
Kết quả là ch=’'n'’ nghĩa là phương thức charAt( 3) sẽ trả về kí tự thứ 3 tính từ vị trí thứ 0 trong xâu str1

- equals: phương thức này so sánh 2 chuỗi.kết quả trả về có kiểu Boolean
Ví dụ: String str1=new String(“”hello””);
           String str2=new String(“”ITOP””);
           boolean k=str1.equals(str2);

Kết quả trả về là k=false nghĩa là phương thức equals sẽ so sánh từng kí tự trong 2 chuỗi.

Chú ý là trong Java có phân biệt kiểu chữ hoa và chữ thường như:”iTop”#”ITOP”

- compareTo:
So sánh 2 chuỗi lần lượt thứ tự từng kí tự của 2 chuỗi nghĩa là: int
Ví dụ:
a=str1.compareTo(str2);
a=0 nếu s2=s1
a>0 nếu s2>s1
a<0 nếu s2<s1

Ví dụ: String str1=new String(“kc”);
           String str2=new String(“kavcb”);
           int a=str1.compareTo(str2);\\ kết quả là a>0 vì “kc”>”kavcb”

- toCharArray
Là phương thức đổi chuỗi thành mảng kí tự.

Ví dụ: String str1==new String(“itop.vn”);
           char [ ] ch=str1.toCharArray( ); //

//kết quả là mảng ch={‘i’,’t’,’o’,’p’,’.’,’v’,’n’}

- indexOf
Ví dụ:
        String str1=new String( “laptrinhmaytinh.net”);
        String str2=new String("lap");
        String str3=new String("may");
        int n=str1.indexOf(str2);
        int m=str1.indexOf(str3);
        //kết quả là n=0 và m=8 nghĩa là phương thức này sẽ trả về vị trí của chuỗi str2 và str3 trong chuỗi str1, nếu không tìm thấy sẽ trả về giá trị -1

- startsWith( )
Trả về giá trị kiểu Boolean

Ví dụ: String str1=”hoc.itop.vn”;
           String str2=”hoc”;
           boolean k=str1.startsWith(str2);

Kết quả là k=true nghĩa là phương thức này sẽ kiểm tra xem chuỗi một có bắt đầu bằng chuỗi 2 hay không

- endsWith( )
   Cũng như hàm startsWith( ) kết quả trả về là kiểu boolean.
Ví dụ: String str1=”"laptrinhmaytinh.net";
           String str2=”"vn"”;
           boolean k=str1.endsWith(str2);
           // Kết quả là k=false nghĩa là hàm này sẽ kiểm tra xem chuỗi str1 có kết thúc là chuỗi str2 hay không.

- copyValueOf( )
Phương thức này trả về một chuỗi được rút ra từ một mảng kí tự.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str1=String.copyValueOf(2,2);
           //Kết quả là str1=”cd” nghĩa là xâu str1 được rút ra từ mảng ch bằng cách lấy 2 phần tử của mảng và lấy từ vị trí thứ 2.

- toUpperCase( )
 Phương thức này sẽ trả về chữ hoa của chuỗi

Ví dụ: String str1=”"hello”";
           String str2=str1.toUpperCase( );
           //Kết quả là str2 = "”HELLO”";

- toLowerCase( )
   Phương thức này sẽ trả về chữ thường của chuỗi

Ví dụ: String str1=”"Hello”";
           String str2=str1.toLowerCase( );
           //Kết quả là str2="”hello"”;

- Chuyển kiểu dữ liệu từ String sang số các phương thức chuyển kiểu dữ liệu từ String sang số nằm trong gói thư viện java.lang ta có bảng các phương thức như sau:


Ví dụ: String str1=new String(“124”);
           int n=Integer.parseInt(str1);
           //Kết quả là n=124

3. Ví dụ minh hoạ

Ví dụ 1:
- Yêu cầu: Viết chương trình nhập ký tự từ bàn phím
- Code:

import java.io.*;
/* gói này cung cấp thự viện xuất nhập hệ thống thông qua những luồng dữ //liệu và hệ thống file.*/
class InputChar
{
  public static void main(String args[])
  {
    char ch = ' ';
    try
   {
     ch = (char) System.in.read();
   }
   catch(Exception e)
  {
    System.out.println("Nhập lỗi!");
   }
   System.out.println("Ky tu vua nhap:" + ch);
  }
 }


Kết quả:
a
Ky tu vua nhap:a


Ví dụ 2: Nhập dữ liệu số

import java.io.*;
 class inputNum
 {
  public static void main(String[] args)
  {
    int n=0;
    try
    {
     BufferedReader in = new BufferedReader(new InputStreamReader(
     System.in));
     String s;
    s = in.readLine();
    n = Integer.parseInt(s);
  }
  catch(Exception e)
  {
   System.out.println(“Nhập dữ liệu bị lỗi !”);
  }
  System.out.println(“Bạn vừa nhập số:” + n);
 }
}

Ví dụ 3: Nhập và xuất giá trị các phần tử của một mảng các số nguyên.

class ArrayDemo
{
  public static void main(String args[])
  {
   int arrInt[] = new int[10];
   int i;
   for(i = 0; i < 10; i = i+1)
      arrInt[i] = i;
   for(i = 0; i < 10; i = i+1)
      System.out.println("This is arrInt[" + i + "]: " + arrInt[i]);
   }
 }

Ví dụ 4: Tìm phần tử có giá trị nhỏ nhất (Min) và lớn nhất (Max) trong một mảng.

//class tìm max, min - cách 1
public class MinMax
{
  public static void main(String args[])
  {
    int nums[] = new int[10];
    int min, max; nums[0] = 99; nums[1] = -10;
    nums[2] = 100123; nums[3] = 18; nums[4] = -978;
    nums[5] = 5623; nums[6] = 463;
    nums[7] = -9; nums[8] = 287;
    nums[9] = 49; min = max = nums[0];
    for(int i=1; i < 10; i++)
    {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
     }
    System.out.println("min and max: " + min + " " + max);
  }
}

// class tìm max, min - cách 2
public class MinMax2
{
public static void main(String args[])
{
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int min, max;
   min = max = nums[0];
   for(int i=1; i < 10; i++)
   {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
   }
   System.out.println("Min and max: " + min + " " + max);
 }
}

Ví dụ 5: Sắp xếp mảng dùng phương pháp sắp xếp nổi bọt (Bubble Sort)

public class BubbleSort
 {
  public static void main(String args[])
 {
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int a, b, t;
   int size;
   size = 10; // number of elements to sort
   // display original array
   System.out.print("Original array is:");
   for(int i=0; i < size; i++)
      System.out.print(" " + nums[i]);
   System.out.println();
   // This is the Bubble sort.
   for(a=1; a < size; a++)
       for(b=size-1; b >= a; b--)
        {
             if(nums[b-1] > nums[b])
               { // if ou of order
                  // exchange elements
                  t = nums[b-1];
                  nums[b-1] = nums[b];
                  nums[b] = t;
                 }
          }
// display sorted array
 System.out.print("Sorted array is:");
 for(int i=0; i < size; i++)
    System.out.print(" " + nums[i]);
  System.out.println();
 }
}

Ví dụ 6: Nhập và xuất giá trị của các phần tử trong một mảng hai chiều.

public class TwoD_Arr
{
   public static void main(String args[])
   {
      int t, i;
      int table[][] = new int[3][4];
      for(t=0; t < 3; ++t)
      {
           for(i=0; i < 4; ++i)
           {
              table[t][i] = (t*4)+i+1;
              System.out.print(table[t][i] + " ");
            }
            System.out.println();
        }
  }
}

// Xem thêm ví dụ về mảng tại đây 

 Lập trình Java - ĐH FPT

--------------------------------------------------- 

Đọc thêm các bài khác:

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android 

[Java] Bài toán quản lý tiền lương cho Nhân viên [Kế thừa trong Lập trình hướng đối tượng]

Ví dụ về kế thừa trong lập trình hướng đối tượng

Bài toán quản lý tiền lương: Viết project Java theo mô hình kế thừa sau




Trong đó:

+ Nhân viên Văn phòng (NVVP)
    lương = hệ số lương * LCB + phụ cấp
    (phụ cấp = 1*LCB nếu số năm công tác <10; phụ cấp = 1.2*LCB nếu số năm công tác >=10)

+ Nhân viên Kinh doanh (NVKD)
   lương = LCB + thưởng
  (thưởng = doanh thu * phần trăm hoa hồng)

+ Công nhân (CN)
   lương = hệ số lương * LCB + thưởng
   (thưởng = 1*LCB nếu sản lường <1000; thưởng = 1.5*LCB nếu sản lượng >=1000)

[Code Java]

 /* ********** Class NV ****************/
  * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;

public class NV {
    String maNV,ht,dvct;
    int ns,sonct;
    final float LCB=1050000;
 
    // khoi tao
    public NV(String maNV,String ht, String dvct, int ns, int sonct){
        this.maNV=maNV;
        this.ht=ht;
        this.dvct=dvct;
        this.ns=ns;
        this.sonct=sonct;
    }
    // In thong tin
    void InTT(){
        System.out.print(" ******************** ");
        System.out.print("\n IN THONG TIN NHAN VIEN  ");
        System.out.print("\n - Ma nhan vien: "+maNV);
        System.out.print("\n - Ho ten: "+ht);
        System.out.print("\n - Don vi cong tac: "+dvct);
        System.out.print("\n - Nam sinh: "+ns);
        System.out.print("\n - So nam cong tac: "+sonct);
    }  
}

/*********  Class NVVP*****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;


public class NVVP extends NV{
    float hsl; // he so luong  
    // khoi tao
    public NVVP(String maNV,String ht, String dvct, int ns, int sonct,float hsl){
        super(maNV,ht,dvct,ns,sonct);
        this.hsl=hsl;
    }
    // tinh luong
    float TinhLuong(){
        float luong,pc;
        if (sonct>=10)
            pc=1.2f*LCB;
        else
            pc=LCB;
        luong= hsl*LCB+pc;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/********  Class NVKD *****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;


public class NVKD extends NV {
    float dthu; // doanh thu
    float pthh; // phan tram hoa hong
    // khoi tao
    public NVKD(String maNV,String ht, String dvct, int ns, int sonct,float dthu,float pthh){
        super(maNV,ht,dvct,ns,sonct);
        this.dthu=dthu;
        this.pthh=pthh;
    }
    // tinh luong
    float TinhLuong(){
        float luong;
        luong= LCB+dthu*pthh;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/*********  Class CN *******************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;

public class CN extends NV{
        float hsl; // he so luong
        int sanLuong;// san luong
    // khoi tao
    public CN(String maNV,String ht, String dvct, int ns, int sonct,float hsl,int sanLuong){
        super(maNV,ht,dvct,ns,sonct);
        this.hsl=hsl;
        this.sanLuong=sanLuong;
    }
    // tinh luong
    float TinhLuong(){
        float luong,thuong;
        if (sanLuong>=1000)
            thuong=1.5f*LCB;
        else
            thuong=LCB;
        luong= hsl*LCB+thuong;
        return luong;
    }
    // in thong tin
    void InTT(){
        super.InTT();
        System.out.print("\n - Luong: "+TinhLuong());
    }
}

/*********  Class (main) ****************/
/*
 * http://lap-trinh-may-tinh.blogspot.com/
 */
package quanlyluongnv181113;
import java.util.Scanner;

public class QuanLyLuongNV181113 {
    public static void main(String[] args) {
     
           String maNV,ht,dvct;
           int ns,sonct,sanLuong;
           float hsl,pthh,dthu;
         
           Scanner in1=new Scanner(System.in);
           Scanner in2=new Scanner(System.in);
         
         try{
           // Nhap thong tin cho Nhan vien VP
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN NHAN VIEN VAN PHONG");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + He so luong: ");
           hsl=in2.nextFloat();
         
           NVVP t=new NVVP(maNV,ht,dvct,ns,sonct,hsl);
           t.InTT();
           }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
            // Nhap thong tin cho Nhan vien kinh doanh
        try{
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN NHAN VIEN KINH DOANH");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + Doanh thu: ");
           dthu=in2.nextInt();
           System.out.print("\n + Phan tram (%) hoa hong: ");
           pthh=in2.nextInt();
         
           NVKD t1=new NVKD(maNV,ht,dvct,ns,sonct,dthu,pthh);
           t1.InTT();
           }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
             // Nhap thong tin cho Cong Nhan
         try{
           System.out.print("\n ********************* ");
           System.out.print("\n NHAP THONG TIN CONG NHAN");
           System.out.print("\n + Ma Nhan vien: ");
           maNV=in1.nextLine();
           System.out.print("\n + Ho ten: ");
           ht=in1.nextLine();
           System.out.print("\n + Don vi cong tac: ");
           dvct=in1.nextLine();
           System.out.print("\n + Nam sinh: ");
           ns=in2.nextInt();
           System.out.print("\n + So nam congt tac: ");
           sonct=in2.nextInt();
           System.out.print("\n + He so luong: ");
           hsl=in2.nextFloat();
           System.out.print("\n + San luong: ");
           sanLuong=in2.nextInt();
         
           CN t3=new CN(maNV,ht,dvct,ns,sonct,hsl,sanLuong);
           t3.InTT();
         }
           catch(Exception e){
               System.out.print("\n Xay ra loi khi nhap du lieu! Loi "+e.toString());
           }
         
     
    }
}

https://shorten.asia/3CzUBfaX
 Lập trình Java - ĐH FPT

----------

Quảng cáo

Загрузка...

Categories

8051 (1) AI (1) AI programming (1) amazon (1) Android (27) ASP (1) Assembly (17) Bài giảng (2) Bài giảng lập trình C và Cpp (16) bài giảng quản lý dự án CNTT (1) bài tập java (1) bài tập lập trình (1) Bài viết hay (62) Bản đồ tư duy (1) Bidvertiser (1) Biểu diễn thuật toán (1) bitcoin (1) blockchain (1) Blockchain là gì (1) Bubble-Sort (1) C (77) C Plus Plus (103) C sharp (11) C++ (3) cấu trúc dữ liệu giải thuật (1) Cây (tree) (2) Cây quyết định (3) CDSL phân tán (1) Chữa bài tập Java (1) code assembly (1) Công nghệ điện toán đám mây (1) Công nghệ lập trình (1) Cơ sở dữ liệu (10) CSS (2) Cuộc cách mạng công nghiệp 4.0 (1) Danh ngôn lập trình (1) Danh sách liên kết (list) (1) Datamining (4) Đại số gia tử và ứng dụng (1) đăng ký Amazon (1) Đăng ký hosting (2) đặt hàng trên Amazon (1) Đệ quy (2) Đồ họa (4) Độ phức tạp của thuật toán (1) ebook-csdl (1) ebook-giaithuat (1) ebook-laptrinh (1) ebook-phancung-mang (1) ebook-tinhocungdung (1) ebook-web (1) Exceptions (1) Genetic Algorithm (1) Giải hệ phương trình tuyến tính (5) giải thuật (3) giải thuật Đệ quy (1) Giáo trình (2) Góc học tập (34) Góc suy ngẫm (1) Google App Engine (2) Heap-Sort (1) Hệ quản trị CSDL (1) Học lập trình (125) Học lập trình C và CPP qua ví dụ (15) học lập trình Java (7) HostGator (1) hợp ngữ (1) HPH (25) HTML (1) Hướng Dẫn Đăng Ký Tên Miền và Host Trên Hostgator (1) hướng dẫn mua host (1) hướng dẫn nhận tiền (1) hướng dẫn payoneer (1) Hướng dẫn sử dụng Emu8086 (1) hướng dẫn viết báo (1) hướng đăng ký tên miền (1) Insert-sort (2) iOS (1) Java (50) Java Căn bản (5) java core (3) Java GUI (1) JavaScript (3) Kiếm tiền online (10) Kỹ thuật đồ họa máy tính (9) Kỹ thuật lập trình (16) kỹ thuật SEO (1) Lập trình 8051 với C/C++ (1) Lập trình căn bản (7) Lập trình Cơ sở dữ liệu (2) Lập trình điều khiển thiết bị (1) Lập trình hợp ngữ (1) Lập trình hướng đối tượng (38) Lập trình hướng đối tượng với Java (6) Lập trình mạng (6) Lập trình mobile (3) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (1) lập trình vi xử lý (1) lập trình viên (1) Lập trình viên độc lập (1) Luyện thi IC3 (4) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (11) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Merge-Sort (1) MS Access (1) Mua hàng trên Amazon (1) Nghiên cứu khoa học (1) ngon-ngu-khac (1) Ngôn ngữ lập trình (1) Nhúng code Assembly trong C\C++ (2) Những lỗi thường gặp khi lập trình (1) Oracle (1) Pascal (3) payoneer (1) people-group (1) phần cứng máy tính (1) PHP (1) Quản lý dự án CNTT (1) Queue (hàng đợi) (1) Quick-Sort (1) Seclection-sort (2) SEO (1) SQL (5) Stack (ngăn xếp) (1) Swift (8) tài liệu CNTT miễn phí (2) Tài liệu tham khảo (2) thanh toán quốc tế (1) Thiết kế Web (2) Thủ thuật máy tính (5) thuattoan-khac (1) Thuật toán (41) Thuật toán di truyền (2) Thuật toán Đệ quy (4) Thuật toán K-Mean (1) Thuật toán khác (9) Thuật toán leo đồi (1) Thuật toán ma trận (7) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thương mại điện tử (4) Tiện ích máy tính (3) Tìm hiểu Blockchain (1) Tìm kiếm nhị phân (2) Tìm kiếm tuần tự (Line search) (2) Tin học văn phòng (5) Tin tức công nghệ (7) Tính định thức của ma trận (1) Toán rời rạc (12) Trí tuệ nhân tạo (8) Tự học lập trình Android (14) Tự học lập trình C và CPP (14) tự học lập trình iOS (8) Tự học lập trình java qua các ví dụ (7) Ứng dụng cơ sở dữ liệu (1) VB (2) vẽ ngôi nhà (1) ví dụ Assembly (1) xcode (8) XML (1) Xử lý ma trận (mảng 2 chiều) (7) Xử lý mảng 1 chiều (1) Xử lý ngoại lệ (1)