/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 1 - Output

NỘI DUNG:
1. Cài đặt DEV-C++
2. Xây dựng chương trình đầu tiên - Output


THỰC HIỆN:

1. Cài đặt DEV-C++

1.1 Tải phần mềm tại đây

1.2 Hướng dẫn cài đặt và cách debug chương trình
  • Cài đặt

  • Chạy chương trình lần đầu tiên


  • Cách tạo soạn thảo code và lưu file: File -> New -> Source File (Ctrl + N); File -> Save (Ctrl + S)


  • Cách dịch và thực thi file code hiện hành: Execute -> Complile  & Run (F11)

  • Cài đặt hỗ trợ debug chương trình: Tools -> Compiler Options.. -> chọn TDM-GCC 492 64-bit Debug -> General -> chọn Add the following commands when calling the complier và thêm -g ->  chọn Add the following commands when calling the linker thêm -static-libgcc -> OK

  • Các bước debug chương trình:
- Mở chương trình cần debug lên chạy
- Chạy chương lần đầu tiên Complile & Run hay nhấn F11
- Chọn vị trí cần debug - breakpoints
- Chọn biến cần hiển thị trong quá trình debug -> Add watch (kết quả tạm thời của debug sẽ hiển thị chổ này)
- Thực hiện debug hay nhấn phím F5
- Nhấn phím F7 để thực hiện bước tiếp theo.

Có thể tham khảo video cách debug Dev-C++ tại đây

2. Xây dựng chương trình đầu tiên - Output
  • Cấu trúc cơ bản chương trình C++


  • Tìm hiểu hàm/ký hiệu
printf: hàm để xuất/in ra màn hình
\n: Ký tự xuống hàng/dòng mới
//: Ghi chú một dòng (những gì sau dấu // chương trình sẽ không thực thi)
/* Ghi chú khối lệnh*/: Nội dung trong cặp /**/ máy tính sẽ không thực thi

  • Chương trình đầu tiên - Hello world: Yêu cầu viết chương trình xuất ra màn hình theo yêu cầu:
- Dòng chữ "Hello World!"
- Xuống dòng
- Dòng "Toi hoc nhap mon lap trinh - COM108!"

 Code:

#include<stdio.h>
int main()
{
	printf("Hello World!\n");
	printf("Toi hoc nhap mon lap trinh - COM108!");
}

Kết quả: Lưu file ->  thực thi chương trình -> Execute -> Complile  & Run (F11)





Xong!

[Tin Học Văn Phòng] COM1071 - Bài 4 - Ms Excel & Các Hàm Căn Bản

MỤC TIÊU: 

Biết cách định dạng bảng tính căn bản và biết cách sử dụng các hàm: 
  • Phân tách chuỗi: Left, Right, Mid, Len,...
  • Cách viết chuỗi: Upper, Lower, Proper, Trim,...
  • Tìm kiếm, thay thế, lặp lại ký tự: Find, Search, Replace, Substitute, Rept, ...
  • Các thành phần trong Ngày-Tháng-Năm: Day, Month, Year, Date, Today,...
  • Giờ phút giây: Hour, Minute, Second, Time, Now, ...
  • Biết cách tính khoảng cách giữa 2 mốc thời gian
  • Thống kê, xếp hạng: Max, Min, Average, Rank, Sum, ...
  • Địa chỉ tuyệt đối


NỘI DUNG:

1. Định dạng bảng tính
2. Các hàm căn bản và địa chỉ tuyệt đối
  • Tìm hiểu các hàm xử lý chuỗi căn bản
  • Tìm hiểu các hàm xử lý date căn bản
  • Tìm hiểu các hàm thống kê, sắp xếp và địa chỉ tuyệt đối


THỰC HIỆN:

1. Định dạng bảng tính
updating

2. Các hàm căn bản và địa chỉ tuyệt đối
  • Tìm hiểu các hàm xử lý chuỗi căn bản
- Phân tách chuỗi: Left, Right, Mid, Len,...
- Cách viết chuỗi: Upper, Lower, Proper, Trim,...

 

- Tìm kiếm, thay thế, lặp lại ký tự: Find, Search, Replace, Substitute, Rept, ...

 

  • Tìm hiểu các hàm xử lý date căn bản
- Các thành phần trong Ngày-Tháng-Năm: Day, Month, Year, Date, Today,...
- Giờ phút giây: Hour, Minute, Second, Time, Now, ...
- Biết cách tính khoảng cách giữa 2 mốc thời gian

    • Tìm hiểu các hàm thống kê, sắp xếp và đại chỉ tuyệt đối
    - Thống kê, xếp hạng: Max, Min, Average, Rank, Sum, ...
    - Địa chỉ tuyệt đối


      Xong!

      [Tự Học Java] MOB1014-Java 1 - Bài 7 - Ghi Đè/Overriding - P2/2

      NỘI DUNG:
      1. Overrding
      2. Bài tập

      THỰC HIỆN:
      1. Overriding 
      • Khi lớp con và lớp cha có cùng phương thức và cùng cú pháp (phương thức có tên giống nhau và có cùng các tham số truyền vào) nên phương thức của lớp con sẽ ghi đè lên phương thức của lớp cha

      • Ghi đè phương thức được sử dụng để thu được tính đa hình tại thời điểm đang chạy/runtime
      Ví dụ đa hình:
      class Shape {
          void draw() {
              System.out.println("drawing...");
          }
      }
      
      class Circle extends Shape {
          void draw() {
              System.out.println("drawing circle...");
          }
      }
       
      class Triangle extends Shape {
          void draw() {
              System.out.println("drawing triangle...");
          }
      }
      class Rectangle extends Shape {
          void draw() {
              System.out.println("drawing rectangle...");
          }
      }
      class ViDu_DaHinh {
          public static void main(String args[]) {
              Shape s;
              s = new Circle();
              s.draw();
              s = new Triangle();
              s.draw();
              s = new Rectangle();
              s.draw();
          }
      }
      


      Các điểm cần chú ý:
      - Lớp con ghi đè phương thức của lớp cha thì sẽ che dấu phương thức của lớp cha
      - Mục đích của ghi đè là để sửa lại phương thức của lớp cha trong lớp con
      - Sử dụng từ khóa super để truy cập đến phương thức đã bị ghi đè của lớp cha.
      - Đặc tả truy xuất của phương thức lớp con phải có độ công khai bằng hoặc hơn đặc tả truy xuất của phương thức lớp cha.


      Ví dụ:
      - Yêu cầu tương tự phần Kế thừa/Inheritance  ở phần 1
      - Bổ sung lớp LaoCong với cách tính lương là tùy theo số giờ làm việc.
      - Thêm phương thức getThuNhap cho các lớp NhanVien
      - Thực hiện ghi đè/overriding cho lớp TruongPhong, LaoCong sao cho phù hợp cách tính lương mỗi lớp tương ứng
      - Viết chương trình để gán dữ liệu cho các lớp nói trên và hiển thị thông dữ liệu hiện tại của các lớp (tính đa hình của phương thức getThuNhap).

      Gợi ý:
      - Bổ sung lớp LaoCong với cách tính lương là tùy theo số giờ làm việc.
      import java.util.Scanner;
      
      public class LaoCong extends NhanVien{
          int soGioLamViec;
      
          // GETTER & SETTER
          public int getSoGioLamViec() {
              return soGioLamViec;
          }
      
          public void setSoGioLamViec(int soGioLamViec) {
              this.soGioLamViec = soGioLamViec;
          }
      
          // CONSTRUCTOR
          public LaoCong(int soGioLamViec, String tenNhanVien, double mucLuong) {
              super(tenNhanVien, mucLuong);
              this.soGioLamViec = soGioLamViec;
          }
      }
      

      - Thêm phương thức getThuNhap cho các lớp NhanVien
      public double getThuNhap(){
              return mucLuong;
          }
      

      - Thực hiện ghi đè/overriding cho lớp TruongPhong, LaoCong sao cho phù hợp cách tính lương mỗi lớp tương ứng

      TruongPhong:
      @Override
          public void hienThi(){
              super.hienThi(); // goi phuong thuc hien thi tu lop cha-NhanVien
              
              System.out.println("- Phu Cap Chuc Vu: " + phuCapChucVu);
          }
            
          @Override
          public void nhapDuLieu(){
              Scanner sc = new Scanner(System.in);
              super.nhapDuLieu(); 
              
              System.out.print("Phu Cap Chuc Vu:");
              phuCapChucVu = sc.nextDouble();
          }
      
          // phan 2
          @Override
          public double getThuNhap() {
              return super.getMucLuong() + getPhuCapChucVu();
          }
      

      LaoCong:
      // GHI DE
          @Override
          public void nhapDuLieu() {
              Scanner sc = new Scanner(System.in);
              System.out.print("Ho ten LC: ");
              tenNhanVien = sc.nextLine();
              System.out.print("So gio lam viec: ");
              soGioLamViec = sc.nextInt();
          }
      
          @Override
          public double getThuNhap() {
              return  getSoGioLamViec() * 50000;
          }
      
          @Override
          void hienThi() {
              System.out.println("- Ho Ten: " + getTenNhanVien());
              System.out.println("- Muc Luong: " + getThuNhap());
          }
      

      Full Code tham khảo:

      NhanVien
      import java.util.Scanner;
      
      public class NhanVien {
          public String tenNhanVien;
          protected  double mucLuong;
      
          // GETTER & SETTER
          public String getTenNhanVien() {
              return tenNhanVien;
          }
      
          public double getMucLuong() {
              return mucLuong;
          }
      
          public void setTenNhanVien(String tenNhanVien) {
              this.tenNhanVien = tenNhanVien;
          }
      
          public void setMucLuong(double mucLuong) {
              this.mucLuong = mucLuong;
          }
      
          // CONSTRUCTOR
          public NhanVien(String tenNhanVien, double mucLuong) {
              this.tenNhanVien = tenNhanVien;
              this.mucLuong = mucLuong;
          }
          
          // NHAP LIEU, PUBLIC
          public void nhapDuLieu(){
              Scanner sc = new Scanner(System.in);
              System.out.print("Ho ten: ");
              tenNhanVien = sc.nextLine();
              System.out.print("Luong: ");
              mucLuong = sc.nextDouble();
          }
          
          // IN/HIEN THI, MAC DINH
          void hienThi(){
              System.out.println("- Ho Ten: " + tenNhanVien);
              System.out.println("- Muc Luong: " + mucLuong);
          }
          
          // PRIVATE, lop con se khong duoc ke thua
          private double thueThuNhap(){
              if(mucLuong < 5000000){
                  return 0;
              }else{
                  return (mucLuong - 5000000)*10/100;
              }
          }
          
          // phan 2 - THU NHAP MAC DINH SE LA MUC LUONG
          public double getThuNhap(){
              return mucLuong;
          }
      }
      

      TruongPhong
      import java.util.Scanner;
      
      public class TruongPhong extends NhanVien{
          public double phuCapChucVu;
      
          // GETTER & SETTER
          public double getPhuCapChucVu() {
              return phuCapChucVu;
          }
      
          public void setPhuCapChucVu(double phuCapChucVu) {
              this.phuCapChucVu = phuCapChucVu;
          }
      
          // CO THE DUNG CONSTRUCTOR TU DONG DE TAO RA
          public TruongPhong( String tenNhanVien, double mucLuong, double phuCapChucVu) {
              super(tenNhanVien, mucLuong);
              this.phuCapChucVu = phuCapChucVu;
          }
          
          @Override
          public void hienThi(){
              super.hienThi(); // goi phuong thuc hien thi tu lop cha-NhanVien
              
              System.out.println("- Phu Cap Chuc Vu: " + phuCapChucVu);
          }
            
          @Override
          public void nhapDuLieu(){
              Scanner sc = new Scanner(System.in);
              super.nhapDuLieu(); 
              
              System.out.print("Phu Cap Chuc Vu:");
              phuCapChucVu = sc.nextDouble();
          }
      
          // phan 2
          @Override
          public double getThuNhap() {
              return super.getMucLuong() + getPhuCapChucVu();
          }
              
      }
      

      LaoCong
      import java.util.Scanner;
      
      public class LaoCong extends NhanVien{
          int soGioLamViec;
      
          // GETTER & SETTER
          public int getSoGioLamViec() {
              return soGioLamViec;
          }
      
          public void setSoGioLamViec(int soGioLamViec) {
              this.soGioLamViec = soGioLamViec;
          }
      
          // CONSTRUCTOR
          public LaoCong(int soGioLamViec, String tenNhanVien, double mucLuong) {
              super(tenNhanVien, mucLuong);
              this.soGioLamViec = soGioLamViec;
          }
          
          // GHI DE
          @Override
          public void nhapDuLieu() {
              Scanner sc = new Scanner(System.in);
              System.out.print("Ho ten LC: ");
              tenNhanVien = sc.nextLine();
              System.out.print("So gio lam viec: ");
              soGioLamViec = sc.nextInt();
          }
      
          @Override
          public double getThuNhap() {
              return  getSoGioLamViec() * 50000;
          }
      
          @Override
          void hienThi() {
              System.out.println("- Ho Ten: " + getTenNhanVien());
              System.out.println("- Muc Luong: " + getThuNhap());
          }
      }
      

      Main_DaHinh 
      public class Main_DaHinh {
          public static void main(String[] args) {
                NhanVien nv1 = new NhanVien("Van Cong Khanh", 1500000);
                nv1.hienThi();    
                
                TruongPhong tp1 = new TruongPhong("Ten ong TRUONG PHONG", 2000000, 500000);
                tp1.hienThi();
                
                LaoCong lc1 = new LaoCong(50, "Tran Van Ku Teo", 50000);
                lc1.hienThi();
                
          }
      }
      

      2. Bài tập:

      7.2.2.1
      Tạo lớp SinhVienPoly gồm 2 thuộc tính họ tên và ngành cùng với phương thức trừu tượng là getDiem(). Thêm phương thức getHocLuc() để xếp loại học lực. Lớp cũng bao gồm một phương thức xuat() để xuất họ tên, ngành, điểm và học lực ra màn hình.

      Hướng dẫn:
      - Xây dựng lớp có mô hình
      - Vì chưa biết sinh viên này học những môn nào nên chưa tính được điểm vì vậy phương thức getDiem() phải là phương thức trừu tượng
      - Chú ý lớp SinhVienPoly phải là lớp trừu tượng vì có phương thức getDiem() là phương thức trừu tượng
      - Phương thức getHocLuc() được viết bình thường vẫn sử dụng phương thức getDiem() để lấy điểm của sinh viên mặc dù hiện tại vẫn chưa biết điểm được tính thế nào. Học lực được tính như sau
      o Yếu: điểm < 5
      o Trung bình: 5 <= điểm < 6.5
      o Khá: 6.5 <= điểm < 7.5
      o Giỏi: 7.5 <= điểm < 9
      o Xuất sắc: điểm >= 9



      Xong!

      Chuyển Đổi Thập Phân Sang Bát Phân và Ngược Lại/Convert Decimal To Octal

      A. Thập phân sang bát phân

      Cũng giống như cách chuyển đổi cơ số từ thập phân sang nhị phân, để chuyển cơ số 10 sang cơ số 8 ta cũng phải thực hiện lưu lại kết quả chia dư số ở hệ thập phân cho 8, sau đó chia số đó cho 8. Cứ lặp lại chừng nào số cần chuyển còn lớn hơn 1. 


      Ví dụ: 

      A.1. Chuyển 1309 từ hệ thập phân sang hệ bác phân


      A.2. Chuyển 20202 từ hệ thập phân sang hệ bác phân



      B. Bát phân sang thập phân


      Ví dụ: Chuyển các số sau đây từ hệ Bát phân sang Thập phân: 37, 473, 1275, 2022
      • 37 = (3 × 8¹) + (7 × 8⁰) = 24 + 7 = 31
      • 473 = (4 × 8²) + (7 × 8¹) + (3 × 8⁰) = 256 + 56 + 3 = 315
      • 1275 = (1 × 8³) + (2 × 8²) + (7 × 8¹) + (5 × 8⁰) = 701
      • 2022 = (2 × 8³) + (0 × 8²) + (2 × 8¹) + (2 × 8⁰) = 1042

      [Tự Học Java] MOB1014-Java 1 - Bài 7 - Kế Thừa/Inheritance - P1/2

      NỘI DUNG:
      1. Kế thừa trong OOP Java: 
      2. Bài Tập

      THỰC HIỆN:

      1. Kế thừa trong OOP Java: 
      • Tính kế thừa thể hiện một lớp con có thể thừa kế các thuộc tính và phương thức của lớp cha
      • Tuy nhiên chỉ truy cập các thành viên publicprotected của lớp cha
      • Truy cập mặc định {default} (không khai báo từ khóa phia trước) của lớp cha nếu lớp con và lớp cha được định nghĩa cùng gói (package)
      • KHÔNG được phép truy cập đến thành viên private của lớp cha
      • Lớp con KHÔNG kế thừa các hàm tạo (constructor) của lớp cha

      Sử dụng từ khóa:
      • extends để kế thừa
      Cú pháp trong Java:
      public class TenLopCon extends TenLopCha{
          // Khai bao..
          // ...
      }
      



      • super để truy cập đến các thành viên của lớp cha. Ví dụsuper(tenNhanVien, mucLuong);
      • super để truy cập đến các constructor của lớp cha. Ví dụsuper.hienThi();

      Ví dụ cụ thể:
      • Tạo một lớp/class có tên NhanVien với các yêu cầu:
      - Các trường/thuộc tính: tenNhanVien, mucLuong
      - Thiết lập phương thức getter, setter;
      - Khởi tạo constructor
      - Khởi tạo hàm public nhapDuLieu , hienThi (mặc định, không khai báo gì), private thueThuNhap
      Code:
      import java.util.Scanner;
      
      public class NhanVien {
          public String tenNhanVien;
          protected  double mucLuong;
      
          // GETTER & SETTER
          public String getTenNhanVien() {
              return tenNhanVien;
          }
      
          public double getMucLuong() {
              return mucLuong;
          }
      
          public void setTenNhanVien(String tenNhanVien) {
              this.tenNhanVien = tenNhanVien;
          }
      
          public void setMucLuong(double mucLuong) {
              this.mucLuong = mucLuong;
          }
      
          // CONSTRUCTOR
          public NhanVien(String tenNhanVien, double mucLuong) {
              this.tenNhanVien = tenNhanVien;
              this.mucLuong = mucLuong;
          }
          
          // NHAP LIEU, PUBLIC
          public void nhapDuLieu(){
              Scanner sc = new Scanner(System.in);
              System.out.print("Ho ten: ");
              tenNhanVien = sc.nextLine();
              System.out.print("Luong: ");
              mucLuong = sc.nextDouble();
          }
          
          // IN/HIEN THI, MAC DINH
          void hienThi(){
              System.out.println("- Ho Ten: " + tenNhanVien);
              System.out.println("- Muc Luong: " + mucLuong);
          }
          
          // PRIVATE, lop con se khong duoc ke thua
          private double thueThuNhap(){
              if(mucLuong < 5000000){
                  return 0;
              }else{
                  return (mucLuong - 5000000)*10/100;
              }
          }
      }
      
      • Tạo TruongPhong kế thừa từ lớp NhanVien:
      - Các thuộc tính hiện có của lớp NhanVien và thêm phương thức phuCapChucVu
      - Khởi tạo constructor cho lớp TruongPhong (kế thừa tenNhanVien, mucLuong)
      - Khởi tạo phương thức hienThi, nhapDuLieu (kế thừa từ lớp NhanVien và bổ sung thuộc tính phuCapChucVu sao cho thích hợp với từng hàm)
      Code:
      import java.util.Scanner;
      
      public class TruongPhong extends NhanVien{
          public double phuCapChucVu;
      
          // GETTER & SETTER
          public double getPhuCapChucVu() {
              return phuCapChucVu;
          }
      
          public void setPhuCapChucVu(double phuCapChucVu) {
              this.phuCapChucVu = phuCapChucVu;
          }
      
          // CO THE DUNG CONSTRUCTOR TU DONG DE TAO RA
          public TruongPhong( String tenNhanVien, double mucLuong, double phuCapChucVu) {
              super(tenNhanVien, mucLuong);
              this.phuCapChucVu = phuCapChucVu;
          }
          
          @Override
          public void hienThi(){
              super.hienThi(); // goi phuong thuc hien thi tu lop cha-NhanVien
              
              System.out.println("- Phu Cap Chuc Vu: " + phuCapChucVu);
          }
            
          @Override
          public void nhapDuLieu(){
              Scanner sc = new Scanner(System.in);
              super.nhapDuLieu(); 
              
              System.out.print("Phu Cap Chuc Vu:");
              phuCapChucVu = sc.nextDouble();
          }
      }
      
      • Từ hàm main truy cập vào class/lớp để tạo mới, nhập liệu và hiển thị thông tin trưởng phòng vừa nhập
      Code:
      public class Main {
          public static void main(String[] args) {
              TruongPhong tp1 = new TruongPhong("Tony Teo", 1200, 300);
              tp1.hienThi();
              
              tp1.nhapDuLieu();
              tp1.hienThi();
          }
      }
      

      2. Bài Tập

      7.1.2.1
      • Xây dựng lớp ChuNhat gồm 2 thuộc tính là chieuRong và chieuDai và các phương thức getChuVi() và getDienTich() để tính chu vi và diện tích. Phương thức hienThi() sẽ xuất ra màn hình chiều rộng, chiều dài, diện tích và chu vi.
      • Xây dựng lớp HinhVuong kế thừa từ lớp ChuNhat và ghi đè phương thức hienThi() để xuất thông tin cạnh, diện tích và chu vi.
      • Viết chương trình nhập 2 hình chữ nhật và một hình vuông sau đó xuất ra màn hình.

      Hướng dẫn:
      Lớp ChuNhat
      public class ChuNhat {
          public int chieuDai;
          public int chieuRong;
      
          // SETTER & GETTER
          public int getChieuDai() {
              return chieuDai;
          }
      
          public int getChieuRong() {
              return chieuRong;
          }
      
          public void setChieuDai(int chieuDai) {
              this.chieuDai = chieuDai;
          }
      
          public void setChieuRong(int chieuRong) {
              this.chieuRong = chieuRong;
          }
      
          // CONSTRUCTOR
          public ChuNhat() {
          }
          
          public ChuNhat(int chieuDai, int chieuRong) {
              this.chieuDai = chieuDai;
              this.chieuRong = chieuRong;
          }
          
          
          // XAY DUNG PHUONG THUC
          public int getDienTich(){
              return getChieuDai() * getChieuRong();
          }
          
          public int getChuVi(){
              return (getChieuDai() + getChieuRong())* 2;
          }
            
          public void hienThi(){
              System.out.printf("Chieu dai\t: %d%n", getChieuDai());
              System.out.printf("Chieu rong\t: %d%n", getChieuRong());
              System.out.printf("Chu vi\t\t: %d%n", getChuVi());
              System.out.printf("Dien tich\t: %d%n", getDienTich());
          }
      }
      

      Lớp HinhVuong (nhớ getter và setter cho biến canh ở lớp kế thừa nhé!)
      public class HinhVuong extends ChuNhat{
          private int canh;
      
          // GETTER & SETTER
          public int getCanh() {
              return canh;
          }
      
          public void setCanh(int canh) {
              this.canh = canh;
          }
          
          // CONSTRUCTOR
          public HinhVuong() {
          }
      
          public HinhVuong(int canh) {
              super(canh, canh);
              this.canh = canh;
          }
      
          @Override
          public void hienThi() {
              System.out.printf("Canh\t\t: %d%n", getCanh());
              System.out.printf("Chu vi\t\t: %d%n", getChuVi());
              System.out.printf("Dien tich\t: %d%n", getDienTich());
          }
          
      }
      

      Hàm main
      public class Main_7121 {
          public static void main(String[] args) {
              ChuNhat cn1 = new ChuNhat(5, 3);
              cn1.hienThi();
              
              HinhVuong hv1 = new HinhVuong(7);
              hv1.hienThi();
          }
      }
      

      Xong!

      [Tự Học Java] MOB1014-Java 1 - Bài 6 - String/Chuỗi & Regular Expression

      NỘI DUNG:
      1. Chuỗi
      • Chuỗi là gì
      • Các phương thức trong String
      • Các ký hiệu đặc biệt
      2. Regular Expression/Biểu thức chính quy
      • Regular Expression là gì
      • Các ví dụ

      THỰC HIỆN:

      1. Chuỗi là gì
      Chuỗi là tập hợp các ký tự sử dụng để lưu trữ văn bản, trong Java khi biểu diễn chúng được bao bọc bỡi cặp dấu nháy kép "", (ký tự/char thì được bao bởi cặp dấu nháy đơn, ví dụ: 'C').

      Ví dụ:
      String str = "Hello"; // khởi tạo biến str có kiểu dữ liệu là string và gán giá trị là chuỗi Hello

      • Các phương thức trong String:
      Phương Thức Giải Thích
      length() Tính độ dài của chuỗi
      toUpperCase() Chuyển chuỗi về kiễu chữ IN HOA
      toLowerCase() Chuyển chuỗi về kiễu chữ thường
      trim() Cắt bỏ các khoảng trắng đầu và cuối của chuỗi
      substring(beginIndex, endIndex) Lấy ra một chuỗi con trong chuỗi khác, từ vị trí beginIndex đến vị trí thứ endIdex trừ 1.
      charAt (index) Lấy ký tại vị trí thứ
      replaceAll(find, replace) Tìm kiếm và thay thế tất cả
      split(separator) Tách chuỗi ban đầu thành mãng chuỗi
      equals() So sánh bằng có phân biệt hoa/thường
      equalsIgnoreCase() So sánh bằng không phân biệt hoa/thường
      contains() Kiểm tra có chứa hay không
      startsWith() Kiểm tra có bắt đầu bởi hay không
      endsWith () Kiểm tra có kết thúc bởi hay không
      matches () So khớp với hay không
      indexOf() Tìm vị trí xuất hiện đầu tiên của chuỗi con
      lastIndexOf() Tìm vị trí xuất hiện cuối cùng của chuỗi con
      concat() Nối chuỗi


      Ví dụ:

      public class Vidu_6_1_String {
          public static void main(String[] args) {
              String chuoiBanDau = "     TOI TEN LA, VAN cOnG Khanh      ";
              String chuThuong = chuoiBanDau.toLowerCase(); // chuyển chữ thường
              String boKhoangTrangDauCuoi = chuThuong.trim(); // bỏ khoảng trắng 2 đầu
              String thayDauHaiCham = boKhoangTrangDauCuoi.replace(",", ":"); // thay thế dấu phẩy thành dấu 2 chấm
              String thayKyTuDauTien = thayDauHaiCham.replaceFirst("t", "T"); // thay ký tự t đầu tiên thành chữ T
              
              String[] tachChuoiThanhNhieuCum = thayKyTuDauTien.split(":"); // tách chuỗi ban đầu thành mãng, căn cứ vào dấu hai chấm
              int chieuDaiCuaMang = tachChuoiThanhNhieuCum.length; // tính chiều dài của chuỗi
              
              String hoVaTen = tachChuoiThanhNhieuCum[chieuDaiCuaMang-1]; // truy xuất vào cụm cuối cùng của mãng
              String tenInHoa = hoVaTen.toUpperCase(); // ghi IN HOA toàn chuỗi
              String noiChuoi = tachChuoiThanhNhieuCum[0].concat(": ") + tenInHoa; // nối chuỗi dùng cách cộng chuỗi thông thường và dùng hàm concat
              System.out.println(noiChuoi);
             
          }
      }
      

      • Các ký tự đặc biệt
      Có một số trường hợp chúng ta muốn xuất ra chuỗi có dấu nháy đơn/kép hay các dấu xẹt. Java sẽ hiểu sai. Hướng giải quyết là chúng ta THÊM dấu xẹt ngược (xẹt dấu huyền) trước ký tự cần xuất ra thì một ký tự sau dấu xẹt đó Java hiểu đó là một ký tự bình thường.

      Các ký tự phổ biến thường dùng
      Ký tự Giải Thích Kết Quả
      \' Dấu nháy đơn '
      \" Dấu nháy kép "
      \\ Dấu xẹt ngược (xẹt dấu huyền) \
      \t Ký tự Tab Tab
      \r Về đầu dòng/chuyển con trỏ chuột về đầu dòng
      \n Xuống dòng/Dòng mới
      \b Xóa 1 ký tự trước dấu xẹt ngược (tương đương phím Backspace) Backspace


      2. Regular Expression/Biểu thức chính quy
      Regular Expression hay regex còn gọi là biểu thức chính quy được dùng để tìm kiếm xử lý chuỗi nâng cao thông qua biểu thức được xây dựng theo những nguyên tắc riêng của nó mà bắc buộc chúng ta phải tuân theo. Khi gặp các yêu cầu kiểm tra tính hợp lệ của email, số điện thoại, địa chỉ IP thì điều bạn nghĩ tới đầu tiên chính là regex.

      Sử dụng string.matches() để kiểm tra.
      chuoi.matches(dinh_dang_muon_kiem_tra)

      Ví dụ 2.1:
      Viết chương trình yêu cầu nhập vào số điện thoại di động (di động của Việt Nam là dãy số co1 10 chữ số, số đầu tiền là số 0, và 9 số còn lại là số bất kỳ) nếu không đúng định dạng yêu cầu nhập lại, nếu đúng in ra số vừa nhập

      Code:
      import java.util.Scanner;
      public class regSoDiDong {
      	public static void main(String[] args) {
              String chuoi;
              String dinhDangSoDiDong = "[0][0-9]{9}";// định dạng của số di động Việt nam
              Scanner duLieuNhap = new Scanner(System.in);
              do {
                  System.out.print("Nhap vao so Di Dong: ");
                  chuoi = duLieuNhap.nextLine();
              } while (!chuoi.matches(dinhDangSoDiDong)) ;     
              
              System.out.println(chuoi);
          }
      }
      

      Ví dụ 2.2:
      Viết chương trình nhập và mã số sinh viên, nếu không đúng ghi ra thông báo gợi ý định dạng của mã số sinh viên và yêu cầu nhập lại, đếu đúng chuyển thành chữ IN HOA (các ký tự không phải là số) in ra mà hình.

      Code:
      import java.util.Scanner;
      public class regMaSoSinhVien {
      	public static void main(String[] args) {
              String chuoi;
      //        String dinhDangMSSV = "[\\w]{2}[0-9]{5}"; // ví dụ MSSV 2 ký tự đầu là chữ cái, 5 ký tự tiếp theo là số
              String dinhDangMSSV = "[\\w]{2}[\\d]{5}";
              Scanner duLieuNhap = new Scanner(System.in);
              
              while (true){
                  System.out.print("Nhap vao ma so SV: ");
                  chuoi = duLieuNhap.nextLine();
                  if (chuoi.matches(dinhDangMSSV)){
                      break;
                  } else {
                      System.out.println("Ma so SV co dang 'PS12345' !");    
                  }
              }
              System.out.println(chuoi.toUpperCase());
          }
      }
      

      Ví dụ 2.3:
      Viết chương trình nhập số CCCD (căn cước công dân) nếu không đúng yêu cầu nhập lại, và in ra giới tính và năm sinh của công dân có số CCCD vừa nhập. 

      Ý nghĩa 12 số trong CCCD:
      - 03 chữ số đầu tiên là mã tỉnh, thành phố trực thuộc trung ương hoặc mã quốc gia nơi công dân đăng ký khai sinh,
      - 01 chữ số tiếp theo là mã giới tính của công dân
      - 02 chữ số tiếp theo là mã năm sinh của công dân;
      - 06 chữ số cuối là khoảng số ngẫu nhiên.



      - Mã thế kỷ và mã giới tính được quy ước như sau:
      + Thế kỷ 20 (từ năm 1900 đến hết năm 1999): Nam 0, nữ 1;
      + Thế kỷ 21 (từ năm 2000 đến hết năm 2099): Nam 2, nữ 3;
      + Thế kỷ 22 (từ năm 2100 đến hết năm 2199): Nam 4, nữ 5;
      + Thế kỷ 23 (từ năm 2200 đến hết năm 2299): Nam 6, nữ 7;
      + Thế kỷ 24 (từ năm 2300 đến hết năm 2399): Nam 8, nữ 9.
      - Mã năm sinh: Thể hiện hai số cuối năm sinh của công dân
      ...

      Code:
      import java.util.Scanner;
      public class regMaSoSinhVien {
      	public static void main(String[] args) {
              String chuoi;
              String dinhDangCCCD = "\\d{12}";
              
              char gioiTinh_4; // dùng để chứa ký thứ 4 trong chuỗi
              String namSinh_56; // lấy vị trí thứ 5 và 6
              
              String gioiTinh;
              int namSinh_2SoDau;
              
              Scanner duLieuNhap = new Scanner(System.in);
              
              while (true){
                  System.out.print("Nhap vao so CCCD: ");
                  chuoi = duLieuNhap.nextLine();
                  if (chuoi.matches(dinhDangCCCD)){
                      break;
                  } else {
                      System.out.println("Can cuoc cong dan co 12 chu so!");    
                  }
                             
              } 
              gioiTinh_4 = chuoi.charAt(3);
             
              switch (gioiTinh_4){
                  case '0':
                      gioiTinh = "Nam";
                      namSinh_2SoDau = 19;
                      break;
                  case '2':
                      gioiTinh = "Nam";
                      namSinh_2SoDau = 20;
                      break;
                  case '4':
                      gioiTinh = "Nam";
                      namSinh_2SoDau = 21;
                      break;
                  case '6':
                      gioiTinh = "Nam";
                      namSinh_2SoDau = 22;
                      break;
                  case '8':
                      gioiTinh = "Nam";
                      namSinh_2SoDau = 23;
                      break;
                  case '1':
                      gioiTinh = "Nu";
                      namSinh_2SoDau = 19;
                  case '3':
                      gioiTinh = "Nu";
                      namSinh_2SoDau = 20;
                  case '5':
                      gioiTinh = "Nu";
                      namSinh_2SoDau = 21;
                  case '7':
                      gioiTinh = "Nu";
                      namSinh_2SoDau = 22;
                  case '9':
                      gioiTinh = "Nu";
                      namSinh_2SoDau = 23;
                      break;
                  default:
                      gioiTinh = "CHUA XAC DINH!";
                      namSinh_2SoDau = 99;
                      
              }
              namSinh_56 = chuoi.substring(4, 6);
              
              System.out.printf("Ban la %s, sinh nam %d%s%n", gioiTinh, namSinh_2SoDau, namSinh_56);
          
          }    
      }
      

      P/s: Các bạn có thể viết cách khác code gọn hơn nhiều

      Tham khảo các quy tắc viết Regular Expression  tại đây




      Xong!
      /*header slide*/