[Tự học lập trình Java] Bài 1: Chương trình JAVA đầu tiên

Chương trình sau đây cho phép hiển thị một thông điệp “My first program in Java”.

Để soạn thảo chương trình bạn có thể sử dụng 1 trong các công cụ lập trình phổ biến sau: Netbean, Eclipse, Jcreator. Đây là những công cụ hoàn toàn miễn phí.


Tiến hành soạn thảo (Ví dụ sau đây sử dụng công cụ Netbean7.4 để soạn thảo chương trình, các công cụ khác tiến hành tương tự)

Bước 1 - Tạo Project mới: File / New project

Bước 2 - Chọn: Java – Applications


Bước 3 - Đặt tên Project và class

Bước 4 - Soạn thảo chương trình dưới đây
// This is a simple program called “First.java”

package first;

public class First
{
public static void main(String args[])
 {
    System.out.println(“My first program in Java”);
 }
}

Lưu ý: Các bạn có thể xóa hết nội dung trong của sổ đi và gõ lại.

Bước 5 - Chạy chương trình: click RUN

Lưu ý:
Tên file đóng vai trò rất quan trọng trong Java. Chương trình biên dịch Java chấp nhận phần mở rộng .java. Trong Java, mã lệnh phải nằm trong các lớp. Bởi vậy tên lớp và tên file phải trùng nhau. Java phân biệt chữ hoa và chữ thường (case-sensitive).

Phân tích chương trình đầu tiên

// This is a simple program called “First.java”

Ký hiệu “// ” dùng để thuyết minh dòng lệnh. Trình biên dịch sẽ bỏ qua dòng thuyết minh này. Java còn hỗ trợ thuyết minh nhiều dòng. Loại thuyết minh này có thể bắt đầu với /* và kết thúc với */

/*This is a comment that

extends to two lines*/
/ *This is
a multi line

comment */

Dòng kế tiếp khai báo lớp có tên ‘First’. Để tạo một lớp thêm ta bắt đầu với từ khoá ‘class’, kế đến là tên lớp (và cũng chính là tên file).

class First: Tên lớp nói chung nên bắt đầu bằng chữ in hoa. Từ khoá ‘class’ khai báo định nghĩa lớp. ‘First’ là tên của lớp. Một định nghĩa lớp nằm trọn vẹn nằm giữa hai ngoặc móc mở ({) và đóng (}). Các ngoặc này đánh dấu bắt đầu và kết thúc một khối lệnh.

public static void main(String args[ ]): Đây là phương thức chính, từ đây chương trình bắt đầu việc thực thi của mình. Tất cả các ứng dụng java đều sử dụng một phương thức “main” này. Chúng ta sẽ tìm hiểu từng từ trong lệnh này.

Từ khoá ‘public’ là một chỉ định truy xuất. Nó cho biết thành viên của lớp có thể được truy xuất từ bất cứ đâu trong chương trình. Trong trường hợp này, phương thức “main” được khai báo ‘public’, bởi vậy JVM có thể truy xuất phương thức này.

Từ khoá ‘static’ cho phép main được gọi tới mà không cần tạo ra một thể hiện (instance) của lớp. Nhưng trong trường hợp này, bản copy của phương thức main được phép tồn tại trên bộ nhớ, thậm chí không có một thể hiện của lớp đó được tạo ra. Điều này rất quan trọng vì JVM trước tiên gọi phương thức main để thực thi chương trình. Vì lý do này phương thức main cần phải là tĩnh (static). Nó không phụ thuộc vào các thể hiện của lớp được tạo ra.

Từ khoá ‘void’ thông báo cho máy tính biết rằng phương thức sẽ không trả lại bất cứ giá trị nào khi thực thi chương trình.

Phương thức ‘main()’ sẽ thực hiện một số tác vụ nào đó, nó là điểm mốc mà từ đó tất cả các ứng dụng Java được khởi động.

‘String args[]’ là tham số dùng trong phương thức ‘main’. Các biến số trong dấu ngoặc đơn nhận từng thông tin được chuyển vào ‘main’. Những biến này là các tham số của phương thức. Thậm chí ngay khi không có một thông tin nào được chuyển vào ‘main’, phương thức vẫn được thực hiện với các dữ liệu rỗng – không có gì trong dấu ngoặc đơn.

‘args[]’ là một mảng kiểu “String”. Các đối số (arguments) từ các dòng lệnh được lưu vào mảng. Mã nằm giữa dấu ngoặc móc ({ }) của ‘main’ được gọi là ‘method block’. Các lệnh được thực thi trong ‘main’ cần được viết trong khối này.

System.out.println(“My first program in Java”);

Dòng lệnh này hiển thị chuỗi “My first program in Java” trên màn hình. Phát biểu ‘println()’ tạo ra một cổng xuất (output). Phương thức này cho phép hiển thị chuỗi được truyền vào ra ‘System.out’. Ở đây ‘System’ là một lớp đã định trước, nó cho phép truy nhập vào hệ thống và ‘out’ là một chuỗi xuất được kết nối với dấu nhắc (console).

*Phụ lục* Nhập, xuất trong Java 

Có nhiều phương thức nhập, xuất khác nhau trong Java, trong phần này mình giới thiệu phương thức nhập, xuất đơn giản nhất để các bạn tiện làm bài tập. Còn các phương thức khác các bạn sẽ xem tìm hiểu kỹ hơn ở phần sau.

- Xuất - In kết quả ra màn hình sử dụng câu lệnh:
  System.out.print("Xâu, ký tự, biến, biểu thức mà bạn cần in ra"); // in xong không xuống dòng
hoặc
  System.out.println("Xâu, ký tự, biến, biểu thức mà bạn cần in ra"); // in xong xuống dòng

Ví dụ: In ra tổng hai số a, b cho trước
   int a=4,b=5;
   System.out.print(" Tong cua "+ a +" cong "+b+" bang "+ (a+b)); // Trong đó "+" là toán tử nối xâu.
   //Kết quả: Tong cua 4 cong 5 bang 9

 - Nhập - Nhập dữ liệu từ bàn phím sử dụng phương thức Scanner.
  + Để sử dụng phương thức Scanner cần khai báo thư viện:
    import java.util.Scanner; // sau khai bao backage
  + Trước khi nhập bạn cần khai báo đối tượng Scanner
    Ví dụ: Scanner inp = new Scanner(System.in); // inp là đối tượng Scanner
  + Nhập dữ liệu cho biến:
    Ví dụ: Nhập dữ liệu cho một số nguyên
               int a;
               Scanner inp =new Scanner(System.in);
               a= inp.nextInt(); // bạn muốn nhập kiểu dữ liệu nào bạn cần chọn next_Kiểu dữ liệu tương ứng.

Ví dụ: Viết chương trình nhập vào 2 số nguyên, tính tổng 2 số đó.

package tinhtong;
import java.util.Scanner;
public class TinhTong
{

   public static void main(String[] arg) {
   int a,b;

   // nhap a, b
   Scanner inp=new Scanner(System.in);
   System.out.print("\n a= ");  
   a=inp.nextInt();
   System.out.print("\n b= ");
   b=inp.nextInt();

   // tinh tong
   int tong=a+b;
   System.out.print("\n Tong = "+tong);  
  }
}

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

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]


Đọ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 

[Tự học lập trình Java] Bài 3: Các cấu trúc điều khiển trong Java

1. Câu lệnh if-else
Câu lệnh if-else kiểm tra kết quả của một điều kiện và thực thi một thao tác phù hợp trên cơ sở kết quả đó. Dạng của câu lệnh if-elsse rất đơn giản

Cú pháp:
if (biểu thức điều kiện)
   Khối lệnh 1; 
}
else
{
  Khối lệnh 2; 
}
Trong đó:
- (biều thức điều kiện): Biểu thức logic, trả về giá trị True hoặc False
- Khối lệnh 1: Các dòng lệnh được thực thi khi giá trị trả về là True
- else: Từ khoá xác định các câu lệnh tiếp sau được thực hiện nếu điều kiện trả về giá trị False
- Khối lệnh 2: Các câu lệnh được thực thi nếu điều kiện trả về giá trị False

Ví dụ 1: 
 - Yêu cầu:  Viết chương trình kiểm tra xem các số là chẵn hay lẻ và hiển thị thông báo phù hợp.

 - Code:

public class CheckNumber
{
 public static void main(String args[])
 {
    int num =10;
    if(num %2 == 0)
      System.out.println (num+ “is an even number”);
    else
      System.out.println (num +”is an odd number”);
  }
}

Kết quả:
  10 is an even number

Ví dụ 2:
- Yêu cầu: Viết chương trình giải phương trình bậc nhất một ẩn ax+b=0, với a,b cho trước.

- Code:

public class GiaiPTBac1
{
 public static void main(String args[])
 {
    float a,b;
    a=4; b=6;
    if(a == 0)
      if(b==0)
        System.out.println ("Phuong trinh co vo so nghiem");
      else
       System.out.println ("Phuong trinh vo nghiem");
   else
       System.out.println ("Phuong trinh co nghiem: "+(-b/a));
  }
}

Kết quả:
 Phuong trinh co nghiem: -1.5


2. Câu lệnh switch-case

Phát biểu switch-case có thể được sử dụng tại câu lệnh if-else. Nó được sử dụng trong tình huống một biểu thức cho ra nhiều kết quả. Việc sử dụng câu lệnh switch-case cho phép việc lập trình dễ dàng và đơn giản hơn.

Cú pháp:

swich (Biểu thức)
{
  case 'giá trị 1': Khối lệnh 1;
  break; // có thể có hoặc không
  case 'giá trị 2': Khối lệnh 2;
  break;
  :
  :
  case 'giá trị n': Khối lệnh n;
  break;
  default: Khối lệnh mặc định; // có thể có hoặc không
}

Trong đó:
- (Biểu thức) - Cho một giá trị xác định
- giá trị 1, giá trị 2, ... giá trị n: Các giá trị hằng số phù hợp với giá trị Biểu thức.
- Khối lệnh 1, Khối lệnh 2, ... Khối lệnh n: Các khối lệnh được thực thi khi một trường hợp tương ứng có giá trị True
- break: Từ khoá được sử dụng để bỏ qua tất cả các câu lệnh sau đó và giành quyền điều khiển cho cấu trúc bên ngoài switch
- default: Từ khóa tuỳ chọn được sử dụng để chỉ rõ các câu lệnh nào được thực hiện chỉ khi tất cả các trường hợp nhận giá trị False
- Khối lệnh mặc định: Các câu lệnh được thực hiện chỉ khi tất cả các trường hợp nhận giá trị False

Ví dụ 1:
- Yêu cầu: Viết chương trình xác định giá trị trong một biến nguyên và hiển thị ngày trong tuần được thể hiện dưới dạng chuỗi. Để kiểm tra các giá trị nằm trong khoảng 0 đến 6


- Code:

public class SwitchDemo
{
 public static void main(String agrs[])
 {
    int day =4;
    switch(day)
    {
      case 0 : System.out.println(“Sunday”);
      break;
      case 1 : System.out.println(“Monday”);
      break;
      case 2 : System.out.println(“Tuesday”);
      break;
      case 3 : System.out.println(“Wednesday”);
      break;
      case 4 : System.out.println(“Thursday”);
      break;
      case 5: System.out.println(“Friday”);
      break;
      case 6 : System.out.println(“Satuday”);
      break;
      default: System.out.println(“Invalid day of week”);
   }
  }
}

Kết quả:
 Thursday

3. Vòng lặp While
  Vòng lặp while được sử dụng khi vòng lặp được thực hiện mãi cho đến khi điều kiện thực thi vẫn là True. Số lượng lần lặp không đựơc xác định trước song nó sẽ phụ thuộc vào từng điều kiện.

Cú pháp:
 while (Biểu thức điều kiện)
 {
   Khối lệnh;
   :
   :
 }

Trong đó:
- (Biểu thức điều kiện): Biểu thức logic, nó trả về giá trị True hoặc False. Vòng lặp sẽ tiếp tục cho đến khi nào giá trị True được trả về.
- Khối lệnh: Các câu lệnh được thực hiện nếu condition nhận giá trị True

Ví dụ 1:
- Yêu cầu: Viết chương trình tính giai thừa của số 5. Giai thừa được tính như tích 5*4*3*2*1.
- Code:

public class WhileDemo
{
  public static void main(String args[])
  {
    int a = 5, fact = 1;
    while (a >= 1) {
       fact *=a;
       a--; // câu lệnh giúp điều kiện a>=1 tiến tới giá trị false
    }
    System.out.println("Giai thua cua 5 : "+fact);
  }
}

Kết quả:
  Giai thừa của 5: 120

  Ở ví dụ trên, vòng lặp được thực thi cho đến khi điều kiện a>=1 là True. Biến a được khai báo bên ngoài vòng lặp và được gán giá trị là 5. Cuối mỗi vòng lặp, giá tri của a giảm đi 1. Sau năm vòng giá trị của a bằng 0. Điều kiện trả về giá trị False và vòng lặp kết thúc. Kết quả sẽ được hiển thị “ The factorial of 5 is 120”

Ví dụ 2:
- Yêu cầu: Viết chương trình tính tổng các số chẵn từ 1 đến 2014
- Code:

public class TongChan
{
  public static void main(String args[])
  {
    int a = 1, s = 0;
    while (a <= 2014) {
      if (a%2==0)
         s +=a;
      a++;
    }
    System.out.println("Tong cac so chan: "+s);
  }
}


Kết quả:
Tong cac so chan: 1015056

4. Vòng lặp for
Vòng lặp for được sử dụng khi vòng lặp có số lần lặp biết trước.

Cú pháp:
 for (Biểu thức 1; Biểu thức 2; Biểu thức 3)
 {
  Khối lệnh;
 }

Trong đó:
 - Biểu thức1: khởi tạo ban đầu
 - Biểu thức 2: điều kiện lặp, vòng lặp còn thực hiện khi bt2 còn đúng
 - Biểu thức 3: thiết lập lại
 - Khối lệnh: Các câu lệnh được thực hiện nếu condition nhận giá trị True


Ví dụ 1:
- Yêu cầu: Viết chương trình hiển thi tổng của 5 số chẵn đầu tiên
- Code:

public class ForDemo
 {
  public static void main(String args[])
  {
   int i=1,sum=0;
   for (i=1;i<=10;i+=2)
     sum+=i;
   System.out.println (“sum of first five old numbers is “+sum);
 }
}

Kết quả:
Sum of first five odd numbers is 25

Ở ví dụ trên, i và sum là hai biến được gán các giá trị đầu là 1 và 0 tương ứng. Điều kiện được kiểm tra và khi nó còn nhận giá trị True, câu lệnh tác động trong vòng lặp được thực hiện. Tiếp theo giá trị của i được tăng lên 2 để tạo ra số chẵn tiếp theo. Một lần nữa, điều kiện lại được kiểm tra và câu lệnh tác động lại được thực hiện. Sau năm vòng, i tăng lên 11, điều kiện trả về giá trị False và vòng lặp kết thúc. Thông báo: Sum of first five odd numbers is 25 được hiển thị.


Ví dụ 2:
- Yêu cầu: Viết chương trình tính tổng các số chẵn từ 1 đến 2014
- Code:

public class TongChan
{
  public static void main(String args[])
  {
    int  s = 0;
    for(int i=2;i<=2014;i=i+2)
      s+=i;
    System.out.println("Tong cac so chan: "+s);
  }
}

Kết quả:
Tong cac so chan: 1015056

5. Vòng lặp do/while
  Vòng lặp do/while được sử dụng khi vòng lặp được thực hiện mãi cho đến khi điều kiện thực thi vẫn là True. Số lượng lần lặp không đựơc xác định trước song nó sẽ phụ thuộc vào từng điều kiện.

Cú pháp:

do{
  Khối lệnh ;
}while (Biểu thức điều kiện) ;

Trong đó:
- (Biểu thức điều kiện): Biểu thức logic, nó trả về giá trị True hoặc False. Vòng lặp sẽ tiếp tục cho đến khi nào giá trị True được trả về.
- Khối lệnh: Các câu lệnh được thực hiện nếu condition nhận giá trị True

Ví dụ 1:
- Yêu cầu: Viết chương trình tính giai thừa của số 5.Giai thừa được tính như tích 5*4*3*2*1.
- Code:

public class WhileDemo
{
  public static void main(String args[])
  {
    int a = 5,fact = 1;
   do {
     fact *=a;
     a--;
   } while (a >= 1);
   System.out.println(The Factorial of 5 is “+fact);
 }
}


 Kết quả:
  The factorial of 5 is 120

Ở ví dụ trên, vòng lặp được thực thi cho đến khi điều kiện a>=1 là True. Biến a được khai báo bên ngoài vòng lặp và được gán giá trị là 5. Cuối mỗi vòng lặp, giá tri của a giảm đi 1. Sau năm vòng giá trị của a bằng 0. Điều kiện trả về giá trị False và vòng lặp kết thúc. Kết quả sẽ được hiển thị “ The factorial of 5 is 120”.

6. Cấu trúc lệnh nhảy (jump)
 - Lệnh break: trong cấu trúc switch chúng ta dùng câu lệnh break để thoát thỏi cấu trúc switch trong cùng chứa nó. Tương tự như vậy, trong cấu trúc lặp, câu lệnh break dùng để thóat khỏi cấu trúc lặp trong cùng chứa nó.
- Lệnh continue: dùng để tiếp tục vòng lặp trong cùng chứa nó (ngược với break).
- Nhãn (label): Không giống như C/C++, Java không hỗ trợ lệnh goto để nhảy đến 1 vị trí nào đó của chương trình. Java dùng kết hợp nhãn (label) với từ khóa break và continue để thay thế cho lệnh goto.


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]

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

Đọ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 

5 ngôn ngữ lập trình tốt nhất cho lập trình viên AI

Với nhu cầu về kỹ năng AI ngày càng tăng, nghề nghiệp trong lĩnh vực này thành lựa chọn hấp dẫn với những người quan tâm đến phần mềm.

Theo báo cáo gần đây của hãng kiểm toán PwC, GDP toàn cầu được dự báo tăng thêm 14% (tương đương 15,7 nghìn tỷ USD) vào năm 2030 nhờ AI. Điều này làm cho AI trở thành cơ hội thương mại quan trọng nhất trong nền kinh tế ngày nay.

Nếu muốn tận dụng cơ hội này, bạn có thể tự hỏi nên bắt đầu từ đâu. Con đường nhanh nhất cho nghề nghiệp trong lĩnh vực AI, hoặc ngôn ngữ lập trình tốt nhất cho AI là gì? Không có câu trả lời đích xác nào, tuy nhiên, nhiều trang công nghệ đưa ra gợi ý về 5 ngôn ngữ lập trình dưới đây:

1. Python

Python đứng đầu trong việc phát triển AI vì những lý do dưới đây:

Yêu cầu code ít hơn. AI có rất nhiều thuật toán. Kiểm tra tất cả chúng có thể trở thành một công việc khó khăn. Vì thế Python thường có ích. Ngôn ngữ có phương pháp "kiểm tra khi bạn code" giúp giảm bớt quá trình thử nghiệm.

Thư viện tích hợp. Các thư viện Python thuận tiện cho các nhà phát triển AI. Ví dụ, Pybrain cho máy học, Numpy cho tính toán khoa học và Scipy cho tính toán nâng cao.

Tính linh hoạt và độc lập. Một điều tốt về ngôn ngữ này là có thể chạy trên hệ điều hành khác nhau với một vài thay đổi trong mã. Điều đó tiết kiệm thời gian vì bạn không phải kiểm tra thuật toán trên mọi hệ điều hành riêng biệt.

Cộng đồng. Cộng đồng người dùng Python rất tích cực - bạn có thể tìm thấy một nhà phát triển có kinh nghiệm hơn để giúp bạn giải quyết vấn đề.

Phổ biến. Sự phổ biến của Python ngày càng tăng. Có rất nhiều khóa học, dự án mã nguồn mở và bài viết toàn diện sẽ giúp bạn nắm vững ngôn ngữ này ngay lập tức.

2. C++

C++ là lựa chọn vững chắc cho một nhà phát triển AI. Để bắt đầu, Google đã sử dụng ngôn ngữ để tạo thư viện TensorFlow. Mặc dù hầu hết nhà phát triển đã chuyển sang sử dụng các ngôn ngữ lập trình "dễ dàng hơn" như Python, vẫn còn rất nhiều chức năng cơ bản của AI được xây dựng với C++. Ngoài ra, nó là sự lựa chọn cho các chẩn đoán AI mức cao.

Để sử dụng C++ phát triển các thuật toán AI, bạn phải là một nhà phát triển thực sự có kinh nghiệm.


Python đứng đầu trong việc phát triển AI.


3. Lisp

Lisp là một trong những ngôn ngữ lâu đời và phù hợp nhất cho sự phát triển trong AI. Nó được phát minh bởi John McCarthy, cha đẻ của Trí tuệ nhân tạo vào năm 1958.

Lisp có các tính năng mạnh mẽ của riêng nó. Ví dụ, Lisp cho phép bạn viết mã tự sửa đổi khá dễ dàng. Hoặc bạn có thể mở rộng ngôn ngữ theo cách phù hợp hơn với một miền cụ thể, do đó tạo ngôn ngữ cụ thể cho miền.

4. Java

Là một trong những ngôn ngữ lập trình phổ biến nhất trong phát triển tổng thể, và cũng là một ngôn ngữ phù hợp để phát triển AI.

Tính linh hoạt cho bảo mật dữ liệu. Với quy định GDPR và các mối quan tâm chung về bảo vệ dữ liệu, có thể đảm bảo an ninh dữ liệu của khách hàng là rất quan trọng. Java cung cấp sự linh hoạt trong việc tạo ra các môi trường khách hàng khác nhau, do đó bảo vệ thông tin cá nhân của một người.

Hệ sinh thái mạnh mẽ. Rất nhiều dự án nguồn mở được viết bằng Java. Ngôn ngữ tăng tốc phát triển rất nhiều so với các lựa chọn thay thế của nó.

Cộng đồng ấn tượng. Có rất nhiều nhà phát triển và chuyên gia có kinh nghiệm trong Java, những người cởi mở để chia sẻ kiến thức và chuyên môn của họ. Ngoài ra, có nhiều dự án nguồn mở và thư viện mà bạn có thể sử dụng để tìm hiểu sự phát triển AI.

5. Prolog

Prolog là một sự lựa chọn ít phổ biến hơn 4 lựa chọn trên. Tuy nhiên, Prolog vẫn có ích cho các nhà phát triển AI. Hầu hết người bắt đầu sử dụng thừa nhận rằng đây là ngôn ngữ thuận tiện để thể hiện mối quan hệ và mục tiêu:

Bạn có thể khai báo các sự kiện và tạo ra các quy tắc dựa trên những sự kiện đó. Điều này cho phép nhà phát triển trả lời và giải thích các truy vấn khác nhau.

Prolog là một ngôn ngữ đơn giản cho một loại phát triển giải pháp vấn đề. Một tin tốt nữa là Prolog hỗ trợ backtracking để quản lý thuật toán tổng thể sẽ dễ dàng hơn.

Theo: Nguyên Chương - VnExpress

#

* 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Ả*

[Assembly] Code Assebmbly: In ra màn hình dãy Fibonacci

Ví dụ Assembly: In ra màn hình dãy Fibonacci



; fibo.asm
; assemble using nasm: 
; nasm -o fibo.com -f bin fibo.asm
;
;****************************
; Alterable Constant
;****************************
; You can adjust this upward but the upper limit is around 150000 terms.
; the limitation is due to the fact that we can only address 64K of memory
; in a DOS com file, and the program is about 211 bytes long and the
; address space starts at 100h.  So that leaves roughly 65000 bytes to
; be shared by the two terms (num1 and num2 at the end of this file).  Since
; they're of equal size, that's about 32500 bytes each, and the 150000th
; term of the Fibonacci sequence is 31349 digits long.
;
maxTerms    equ 15000 ; number of terms of the series to calculate

;****************************
; Number digits to use.  This is based on a little bit of tricky math.
; One way to calculate F(n) (i.e. the nth term of the Fibonacci seeries)
; is to use the equation int(phi^n/sqrt(5)) where ^ means exponentiation
; and phi = (1 + sqrt(5))/2, the "golden number" which is a constant about
; equal to 1.618.  To get the number of decimal digits, we just take the
; base ten log of this number.  We can very easily see how to get the
; base phi log of F(n) -- it's just n*lp(phi)+lp(sqrt(5)), where lp means
; a base phi log.  To get the base ten log of this we just divide by the
; base ten log of phi.  If we work through all that math, we get:
;
; digits = terms * log(phi) + log(sqrt(5))/log(phi)
;
; the constants below are slightly high to assure that we always have
; enough room.  As mentioned above the 150000th term has 31349 digits,
; but this formula gives 31351.  Not too much waste there, but I'd be
; a little concerned about the stack!
;
        digits     equ (maxTerms*209+1673)/1000

; this is just the number of digits for the term counter
cntDigits   equ 6 ; number of digits for counter

        org     100h            ; this is a DOS com file
;****************************
main:
; initializes the two numbers and the counter.  Note that this assumes
; that the counter and num1 and num2 areas are contiguous!
;
mov ax,'00' ; initialize to all ASCII zeroes
mov di,counter ; including the counter
mov cx,digits+cntDigits/2 ; two bytes at a time
cld ; initialize from low to high memory
rep stosw ; write the data
inc ax ; make sure ASCII zero is in al
mov [num1 + digits - 1],al ; last digit is one
mov [num2 + digits - 1],al ;
mov [counter + cntDigits - 1],al

jmp .bottom ; done with initialization, so begin

.top
; add num1 to num2
mov di,num1+digits-1
mov si,num2+digits-1
mov cx,digits ;
call AddNumbers ; num2 += num1
mov bp,num2 ;
call PrintLine ;
dec dword [term] ; decrement loop counter
jz .done ;

; add num2 to num1
mov di,num2+digits-1
mov si,num1+digits-1
mov cx,digits ;
call AddNumbers ; num1 += num2
.bottom
mov bp,num1 ;
call PrintLine ;
dec dword [term] ; decrement loop counter
jnz .top ;
.done
call CRLF ; finish off with CRLF
mov ax,4c00h ; terminate
int 21h ;

;****************************
;
; PrintLine
; prints a single line of output containing one term of the
; Fibonacci sequence.  The first few lines look like this:
;
; Fibonacci(1): 1
; Fibonacci(2): 1
; Fibonacci(3): 2
; Fibonacci(4): 3
;
; INPUT:     ds:bp ==> number string, cx = max string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx, di
;
;****************************
PrintLine:
mov dx,eol ; print combined CRLF and msg1
mov cx,msg1len+eollen   ;
call PrintString ;

mov di,counter ; print counter
mov cx,cntDigits ;
call PrintNumericString

call IncrementCount ; also increment the counter

mov dx,msg2 ; print msg2
mov cx,msg2len ;
call PrintString ;

mov di,bp ; recall address of number
mov cx,digits ;
; deliberately fall through to PrintNumericString

;****************************
;
; PrintNumericString
; prints the numeric string at DS:DI, suppressing leading zeroes
; max length is CX
;
; INPUT:     ds:di ==> number string, cx = max string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx, di
;
;****************************
PrintNumericString:
; first scan for the first non-zero byte
mov al,'0' ; look for ASCII zero
cld ; scan from MSD to LSD
repe scasb ;
mov dx,di ; points to one byte after
dec dx ; back up one character
inc cx ;
; deliberately fall through to PrintString

;****************************
;
; PrintString
; prints the string at DS:DX with length CX to stdout
;
; INPUT:     ds:dx ==> string, cx = string length
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx
;
;****************************
PrintString:
mov bx, 1 ; write to stdout
mov     ah, 040h        ; write to file handle
int 21h ; ignore return value
ret ;

;****************************
;
; AddNumbers
; add number 2 at ds:si to number 1 at es:di of width cx
;
;
; INPUT:     es:di ==> number1, ds:si ==> number2, cx= max width
; OUTPUT:    CF set on overflow
; DESTROYED: ax, si, di
;
;****************************
AddNumbers:
std ; go from LSB to MSB
clc ;
pushf ; save carry flag
.top
mov ax,0f0fh ; convert from ASCII BCD to BCD
and  al,[si] ; get next digit of number2 in al
and ah,[di] ; get next digit of number1 in ah
popf ; recall carry flag
adc al,ah ; add these digits
aaa ; convert to BCD
pushf ;
add al,'0' ; convert back to ASCII BCD digit
stosb ; save it and increment both counters
dec si ;
loop .top ; keep going until we've got them all
popf ; recall carry flag
ret ;

;****************************
;
; IncrementCount
; increments a multidigit term counter by one
;
; INPUT:     none
; OUTPUT:    CF set on overflow
; DESTROYED: ax, cx, di
;
;****************************
IncrementCount:
mov cx,cntDigits ;
mov di,counter+cntDigits-1
std ; go from LSB to MSB
stc ; this is our increment
pushf ; save carry flag
.top
mov ax,000fh ; convert from ASCII BCD to BCD
and al,[di] ; get next digit of counter in al
popf ; recall carry flag
adc al,ah ; add these digits
aaa ; convert to BCD
pushf ;
add al,'0' ; convert back to ASCII BCD digit
stosb ; save and increment counter
loop .top ;
popf ; recall carry flag
ret ;

;****************************
;
; CRLF
; prints carriage return, line feed pair to stdout
;
; INPUT:     none
; OUTPUT:    CF set on error, AX = error code if carry set
; DESTROYED: ax, bx, cx, dx
;
;****************************
CRLF: mov dx,eol ;
mov cx,eollen ;
jmp PrintString ;

;****************************
; static data
;****************************
eol db  13,10 ; DOS-style end of line
eollen equ $ - eol

msg1 db  'Fibonacci(' ;
msg1len equ $ - msg1

msg2 db  '): ' ;
msg2len equ $ - msg2
;****************************
; initialized data
;****************************
term dd maxTerms ;
;****************************
; unallocated data
;
; A better way to do this would be to actually ask for a memory
; allocation and use that memory space, but this is a DOS COM file
; and so we are given the entire 64K of space.   Technically, this
; could fail since we *might* be running on a machine which doesn't
; have 64K free.  If you're running on such a memory poor machine,
; my advice would be to not run this program.
;
;****************************
; static data
counter: ;
num1 equ counter+cntDigits ;
num2 equ num1+digits ;

;***********************************************


[Thuật toán Cây quyết định] Chương trình mô phỏng thuật toán ID3 – Cây Quyết Định

[Thuật toán Cây quyết định] Chương trình mô phỏng thuật toán ID3 – Cây Quyết Định

>> Hướng dẫn lập trình C#

1. Giải thuật ID3:

ID3_algorithm(Training_Set, Class_Labels, Attributes)

Tạo nút Root của cây quyết định

   If tất cả các ví dụ của Training_Set thuộc cùng lớp c

   Return Cây quyết định có nút Root được gắn với (có nhãn) lớp c

   If Tập thuộc tính Attributes là rỗng

   Return Cây quyết định có nút Root được gắn với nhãn lớp ≡ Majority_Class_Label(Training Set)

   A ← Thuộc tính trong tập Attributes có khả năng phân loại “tốt nhất” đối với Training_Set

   Thuộc tính kiểm tra cho nút Root ← A

   For each Giá trị có thể v của thuộc tính A

 Bổ sung một nhánh cây mới dưới nút Root, tương ứng với trường hợp: “Giá trị của A là v”

   Xác định Training_Setv = {ví dụ x | x ⊆ Training_Set, xA=v}

  If (Training_Setv là rỗng) Then

  Tạo một nút lá với nhãn lớp ≡ Majority_Class_Label(Training_Set)

Gắn nút lá này vào nhánh cây mới vừa tạo

Else Gắn vào nhánh cây mới vừa tạo một cây con sinh ra bởi ID3_algorithm(Training_Setv, Class_Labels, {Attributes A})

Return Root


2. Giao diện chính của chương trình Demo gồm 4 phần:

o Phần 1: Bảng lưu dữ liệu training (Data Training).

o Phần 2: Ghi ra các bước giải của thuật toán (Solutions).

o Phần 3: Vẽ cây minh họa cho thuật toán (Decision Tree).

o Phần 4: Các chức năng của chương trình (Control).


Có 4 button với các chức năng như sau:

- Load Data: Đưa dữ liệu training vào chương trình.

- ID3 – Alg: Chạy giải thuật ID3.

- Reset: Khởi động, chạy lại chương trình.

- About: Thông tin về chương trình.





3.  Các bước chạy chương trình:

- Đầu tiên, nạp dữ liệu vào chương trình bằng button Load Data.

Dữ liệu được đưa lên bảng Data Training (Phần 1).

- Sau đó, nhấn button ID3 – Alg để chạy giải thuật.

Các bước giải sẽ được hiện ra ở phần 2 (Solutions).

Cây được vẽ ra ở phần 3 (Decision Tree).


4. Giao diện chương trình:



Chương trình gồm những hàm chính sau:

 Hàm tính Entropy:

· Công thức:    Entropy (S) = – p+ log2 p+ – p- log2 p-

· Code [C#]:

private double GetEntropy(int Positives , int Negatives)
{
if (Positives == 0)
return 0;
if (Negatives == 0)
return 0;
double Entropy;
int total = Negatives + Positives;
double RatePositves = (double)Positives / total;
double RateNegatives = (double)Negatives / total;
Entropy = -RatePositves * Math.Log(RatePositves, 2) – RateNegatives * Math.Log(RateNegatives, 2);
return Entropy;
}


 Hàm tính Gain:

· Công thức:


· Code [C#]:

private double Gain(List<List<string>> Examples, Attribute A, string bestat)
{
double result;
int CountPositives = 0;
int[] CountPositivesA = new int[A.Value.Count];
int[] CountNegativeA = new int[A.Value.Count];
int Col = Attributes.IndexOf(A);
for (int i = 0; i < A.Value.Count; i++)
{
CountPositivesA[i] = 0;
CountNegativeA[i] = 0;
}
for (int i = 0; i < Examples.Count; i++)
{
int j = A.Value.IndexOf(Examples[i][Col].ToString());
if (Examples[i][Examples[0].Count – 1]==”yes”)
{
CountPositives++;
CountPositivesA[j]++;
}
else
{
CountNegativeA[j]++;
}
}
result = GetEntropy(CountPositives, Examples.Count – CountPositives);
for (int i = 0; i < A.Value.Count; i++)
{
double RateValue = (double)(CountPositivesA[i] + CountNegativeA[i]) / Examples.Count;
result = result – RateValue * GetEntropy(CountPositivesA[i], CountNegativeA[i]);
}
Solution = Solution + “n * Gain(” + bestat + “,” + A.Name + “) = ” + result.ToString();
return result;
}



 Hàm chọn đặc tính tốt nhất:

· Phương pháp:
    - Dựa vào giá trị gain của các đặc tính, đặc tính nào có Gain lớn nhất.

    - Chọn đặc tính đó – đặc tính tốt nhất.

· Code [C#]:

private Attribute GetBestAttribute(List<List<string>> Examples, List<Attribute> Attributes, string bestat)
{
double MaxGain = Gain(Examples, Attributes[0], bestat);
int Max = 0;
for (int i = 1; i < Attributes.Count; i++)
{
double GainCurrent = Gain(Examples, Attributes[i], bestat);
if (MaxGain < GainCurrent)
{
MaxGain = GainCurrent;
Max = i;
}
}
return Attributes[Max];
}
 Hàm thực hiện giải thuật ID3:
Code:
private TreeNode ID3(List<List<string>> Examples, List<Attribute> Attribute,string bestat)
{
if (CheckAllPositive(Examples))
{
return new TreeNode(new Attribute(“Yes”));
}
if (CheckAllNegative(Examples))
{
return new TreeNode(new Attribute(“No”));
}
if (Attribute.Count == 0)
{
return new TreeNode(new Attribute(GetMostCommonValue(Examples)));
}
Attribute BestAttribute = GetBestAttribute(Examples, Attribute, bestat);
int LocationBA = Attributes.IndexOf(BestAttribute);
TreeNode Root = new TreeNode(BestAttribute);
for (int i = 0; i < BestAttribute.Value.Count; i++)
{
List<List<string>> Examplesvi = new List<List<string>>();
for (int j = 0; j < Examples.Count; j++)
{
if (Examples[j][LocationBA].ToString() == BestAttribute.Value[i].ToString())
Examplesvi.Add(Examples[j]);
}
if (Examplesvi.Count==0)
{
return new TreeNode(new Attribute(GetMostCommonValue(Examplesvi)));
}
else
{
Attribute.Remove(BestAttribute);
Root.AddNode(ID3(Examplesvi, Attribute,BestAttribute.Value[i]));
}
}
return Root;
}


(theo csshare)

[Tự học lập trình C/C++] Bài 3: Nhập / Xuất trong C/C++

---------------------------------
* TÓM TẮT LÝ THUYẾT
---------------------------------

  1. In dữ liệu ra màn hình: 
 
  cout<<data1<<data1<<...;
 
     Trong đó:     
      - data là biến, biểu thức, xâu ký tự,...     
      - Mỗi khối dữ liệu cách nhau bởi <<
       
  2. Nhập dữ liệu vào từ bàn phím: 

  cin>>var1>>var2>>...;
 
  Trong đó:  
  - var là các biến cần nhập từ bàn phím.  
  - Mỗi biến cách nhau bởi >>
      
---------------------------------
** VÍ DỤ
---------------------------------

Ví dụ 1: 

+ Yêu cầu:  Nhập vào 2 số nguyên a, b. Tính tổng, hiệu, tích, thương 2 số đó.

+ Code:

#include <iostream>
#include <conio.h>

using namespace std;

int main() {

    int a,b;
    // nhap 2 so
    cout<<"\n Nhap 2 so: ";
    cout<<"\n a= ";
    cin>>a;
    cout<<"\n b= ";
    cin>>b;
 
    // Tinh tong, hieu, tich, thuong
    int tong,hieu,tich;
    tong=a+b;
    hieu=a-b;
    tich=a*b;
    float thuong=(float)a/b;
 
    // in ket qua
    cout<<"\n Tong: "<<tong;
    cout<<"\n Hieu: "<<hieu;
    cout<<"\n Tich: "<<tich;
    cout<<"\n Thuong: "<<thuong;
 
   return 0;
}


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

Ví dụ 2: 

+ Yêu cầu:  Nhập vào 3 cạnh tam giác, tính chu vi, diên tích tam giác đó.

+ Code:


#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main() {
    float a,b,c;
    // nhap 3 canh tam giac
    cout<<"\n Nhap 3 canh: ";
    cout<<"\n a= ";
    cin>>a;
    cout<<"\n b= ";
    cin>>b;
    cout<<"\n b= ";
    cin>>b;
 
 
    // Tinh chu vi tam giac
    float cv,dt;
    cv=a+b+c;
    float p=cv/2;
    dt=sqrt(p*(p-a)*(p-b)*(p-c));
 
   // in ket qua
    cout<<"\n Chu vi: "<<cv;
    cout<<"\n Dien tich: "<<dt;
 
   return 0;
}

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

Ví dụ 3: 

+ Yêu cầu: Tính điểm cho sinh viên:

 - Nhập vào điểm: điểm toán rời rạc (3 tín chỉ); điểm lập trình (4 tín chỉ); điểm cơ sở dữ liệu (3 tín chỉ)
 - Tính điểm tổng kết.
 - In kết quả.

 + Code:

#include <iostream>
#include <conio.h>

using namespace std;

int main() {
    float dTRR,dLT,dCSDL;
    // nhap nhap diem    
    cout<<"\n Nhap diem: ";
    cout<<"\n Diem toan roi rac: ";
    cin>>dTRR;
    cout<<"\n Diem lap trinh: ";
    cin>>dLT;
    cout<<"\n Diem co so du lieu: ";
    cin>>dCSDL;
    // Tinh diem
    float dTK;
    dTK=(dTRR*3+dLT*4+dCSDL*3)/10;
    // in ket qua
    cout<<"\n Diem tong ket: "<<dTK;
 
   return 0;
}

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

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]




------------------------
Xem bài khác:

[Tự học C/C++] Bài tập cấu trúc if

Bài tập ví dụ cấu trúc if

Ví dụ 1.  Viết chương trình nhập vào 2 số là tháng và năm của một năm. Xét xem tháng đó
có bao nhiêu ngày? Biết rằng:
·      Nếu tháng là 4, 6, 9, 11 thì số ngày là 30.
·      Nếu tháng là 1, 3, 5, 7, 8, 10, 12 thì số ngày là 31.
·      Nếu tháng là 2 và năm nhuận thì số ngày 29, ngược lại thì số ngày là 28.


#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main() {
    // khai bao
    int thang, nam;
    // nhap thang
    cout<<"\n Thang: "; cin>>thang;
    if(thang<=0||thang>12)
        cout<<"\n Nhap thang khong dung";
    else
        {
            cout<<"\n Nam: "; cin>>nam;
            if(nam<0)
                cout<<"\n Nhan nam sai";
            else
                {
                if(thang==1||thang==3||thang==5||thang==7||thang==8||thang==10||thang==12)
                    cout<<"\n Thang co 31 ngay";
                if(thang==4||thang==6||thang==9||thang==11)
                    cout<<"\n Thang co 30 ngay";
                if(thang==2)
                    if(nam%4==0)
                        cout<<"\n Thang co 29 ngay";
                    else cout<<"\n Thang co 28 ngay";
                }
        }
    
    return 0;
}

//**************

Ví dụ 2. Một số nguyên dương chia hết cho 3 nếu tổng các chữ số của nó chia hết cho 3. Viết chương trình nhập vào một số có 3 chữ số, kiểm tra số đó có chia hết cho 3 dùng tính chất trên.



#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main() {
    int a,dv,ch,tr;
    // Nhap so co 3 chu so
    cout<<"\n Nhap so co 3 chu so: ";
    cin>>a;
    if(a<100||a>999)
        cout<<"\n Nhap khong dung \n";
    else
    {
        // tach cac chu so cua a
        dv=a%10;
        ch=(a/10)%10;
        tr=a/100;
        
        if((dv+ch+tr)%3==0)
            cout<<"\n "<<a<<" chia het cho 3 \n";
        else
            cout<<"\n "<<a<<" khong chia het cho 3\n ";
    }
    
    return 0;
}

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

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]



Categories

AI (13) AI programming (1) ASP (1) Android (32) App Honeygain (4) Assembly (17) Biểu diễn thuật toán (1) Bubble-Sort (1) Bài giảng (2) Bài giảng lập trình C và Cpp (21) Bài viết hay (108) Bản đồ tư duy (1) C Plus Plus (103) C/C++ (16) CDSL phân tán (1) CSS (2) Cơ sở dữ liệu (11) Danh ngôn lập trình (1) Datamining (4) Genetic Algorithm (1) Giáo trình (2) Giải thuật tiến hóa - thuật toán di truyền (2) Google App Engine (2) Góc học tập (34) HTML (1) Hướng dẫn kiếm tiền online tại nhà (6) Hướng dẫn sử dụng Emu8086 (1) Học lập trình (131) Học lập trình C và CPP qua ví dụ (17) Java (54) Java Căn bản (6) JavaScript (5) Kỹ năng đọc hiệu quả (1) Kỹ thuật lập trình (16) Kỹ thuật đồ họa máy tính (10) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (11) Lập trình Cơ sở dữ liệu (2) Lập trình Python (2) Lập trình căn bản (8) Lập trình hướng đối tượng với Java (7) Lập trình mobile (9) Lập trình mạng (6) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (2) ML (1) MMO (6) MS Access (1) Machine learning (2) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Nghiên cứu khoa học (3) Ngôn ngữ lập trình (2) Những cuốn sách hay mà bạn nên đọc khi còn trẻ (1) Pascal (3) Phương pháp tính toán tối ưu (2) Phương pháp tối ưu (2) Quản lý dự án CNTT (1) SEO (1) SQL (5) Swift (9) Sách hay (4) Thiết kế Web (2) Thuật toán (51) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thuật toán di truyền (4) Thực hành Android (2) Tin học văn phòng (5) Tiện ích máy tính (3) Toán rời rạc (13) Treo máy kiếm tiền (3) Trí tuệ nhân tạo (18) Tài liệu tham khảo (5) Tìm hiểu Blockchain (2) Tự học Android (3) Tự học Android qua ví dụ (1) Tự học JavaScript (1) Tự học lập trình (9) Tự học lập trình Android (17) Tự học lập trình C và CPP (14) Tự học lập trình java qua các ví dụ (8) XML (1) blockchain (2) bài giảng quản lý dự án CNTT (1) bài tập java (3) bài tập lập trình (4) cấu trúc dữ liệu giải thuật (15) hướng dẫn viết báo (1) học lập trình Java (11) học máy (5) hợp ngữ (8) lập trình viên (3) phưng pháp đơn hình (2) thuật toán AI (2) tài liệu CNTT miễn phí (4) tính toán tối ưu (1) tự học lập trình iOS (8) tự học lập trình python (1) ví dụ Assembly (1) Đại số gia tử và ứng dụng (1) Đồ họa (4)