[Giải thuật] Các phương pháp biểu diễn giải thuật

Như các bạn đã biết, trước khi bắt tay vào viết chương trình (coding) chúng ta cần phải xác định được các bước thực hiện hay giải thuật (Algorithms). Ngày nay, với sự phát triển nhanh chóng của phần cứng cũng như các công cụ lập trình làm cho việc học lập trình và lập trình ngày càng đơn giản. Thậm chí lập trình viên không cần xây dựng thuật toán trước. Cách lập trình không thiết kế thuật toán (lập trình chay) chỉ có thể áp dụng cho các chương trình đơn giản, cách lập trình này tiềm ẩn rất nhiều nguy cơ, ngây ra những phức tạp không đáng có trong quá trình tester và sửa lỗi.

Các bạn đang học lập trình hoặc mới bắt tay vào nghề lập trình không nên bỏ qua bước xây dựng giải thuật trước khi coding. Để xây dựng giải thuật chúng ta cũng cần có bộ quy tắc nhất quán để biểu diễn giải thuật. Trong thực tế, cũng như trong các tài liệu về giải thuật người ta hay sử dụng một trong ba phương pháp biểu diễn khác nhau, đó là: Sử dụng ngôn ngữ tự nhiên (xây dựng giải thuật theo từng bước), sử dụng lưu đồ, sử dụng mã giả.

Để hiểu rõ các phương pháp biểu diễn giải thuật, chúng ta cùng xét ví dụ: 
    Xây dựng giải thuật giải phương trình bậc nhất một ẩn ax+b=0, với a,b là số thực nhập từ bàn phím.

- Biều diễn giải thuật bằng các sử dụng ngôn ngữ tự nhiên (liệt kê từng bước) - List each step 

Input: a,b ;
Output: kết quả nghiệm ;

Begin
 Bước 1: Nhập a, b =>Bước 2;
 Bước 2: Xét a = 0
  - Nếu đúng (true) => Bước 3 ;
  - Nếu sai (false) => Bước 4 ;
 Bước 3: Xét b=0 
  - Nếu đúng => Bước 5;
  - Nếu sai => Bước 6;
 Bước 4: x = -b/a => Bước 7;
 Bước 5: In thông báo: Phương trình có vô số nghiệm => Bước 8;
 Bước 6: In thông báo: Phương trình có vô nghiệm => Bước 8;
 Bước 7: In thông báo: Phương trình có nghiệm: x => Bước 8;
 Bước 8: Kết thúc
End.

- Biểu diễn giải thuật sử dụng lưu đồ (flowchart)


- Biểu diễn giải thuật sử dụng mã giả (pseudo code)
Giả mã ngôn ngôn ngữ lập trình Pascal

{Khai báo biến}

BEGIN
 
{Nhập a, b; } 
 
if(a=0) then
  if(b=0) then
       { In ra thông báo: Phương trình có vô số nghiệm ;}
  else 
       { In ra thông báo: Phương trình có vô nghiệm ;}
else
  begin
      x:= -b/a;
      { In ra thông báo: Phương trình có nghiệm: x ;}
  end;

END.


TxT




[Java] Xử lý mảng đối tượng trong Java

Mảng đối tượng trong Java 

Xây dựng chương trình Java gồm các lớp đối tượng sau:

1. Lớp NhanVien có các thuộc tính: họ và tên, ngày tháng năm sinh và địa chỉ. Để phục vụ cho bài toán quản lý lớp NhanVien, ngoài công việc tính lương (thu nhập) thì cần có các hàm thành phần sau: Nhập, hiển thị các thông tin về các nhân viên.

2. Lớp CanBo thừa kế lớp NhanVien, ngoài những thuộc tính nêu trên còn có các thuộc tính: Chức vụ và hệ số lương được che dấu. Lương của CanBo được tính bằng tích hệ số lương với mức lương tối thiểu.

3. Lớp CoQuan có danh sách cán bộ quản lý các hàm:

- Nhập vào một danh sách n cán bộ, n nhập từ bàn phím

- Hiển thị danh sách cán bộ của cơ quan theo bảng, thông tin về cán bộ được hiển thị từng cột trên một dòng

- Sắp xếp danh sách đó theo thứ tự tăng của thu nhập

- Tìm những cán bộ có thu nhập nhỏ hơn d, d nhập vào từ bàn phím

- Hàm main() thực hiện các hàm nêu trên





[Code Java]

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

/***** class NhanVen ********/

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

package coquan;
import java.util.Scanner;

public abstract class NhanVien {

    public String hoTen, diaChi, ngaySinh;

    public NhanVien(String hoTen, String diaChi, String ngaySinh){
      this.hoTen=hoTen;
      this.diaChi=diaChi;
      this.ngaySinh=ngaySinh;
}

// Nhap thong tin

public void NhapTT(){
   Scanner inp=new Scanner(System.in);
   System.out.print("- Ho va ten: ");
   hoTen=inp.nextLine();
   System.out.print("- Ngay sinh: ");
   ngaySinh=inp.nextLine();
   System.out.print("- Dia chi: ");
   diaChi=inp.nextLine();
}

// Tinh thu nhap

public abstract float TinhLuong();

// In thong tin nhan vien

  public void InTT(){
     System.out.print("|"+hoTen + "\t \t| " + ngaySinh + "\t\t | "+diaChi+"\t \t| " + TinhLuong() +" | \n");
   }
}





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

/***** class CanBo **********/

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

package coquan;

import java.util.Scanner;

public class CanBo extends NhanVien {
    private String chucVu;
    private float heSoLuong;
    final float LCB=1500000.0f;

    public CanBo(String hoTen, String diaChi, String ngaySinh, String chucVu, float heSoLuong){
      super(hoTen, diaChi, ngaySinh);
      this.chucVu=chucVu;
      this.heSoLuong=heSoLuong;
   }

// Nhap thong tin

public void NhapTT(){
   super.NhapTT();
   Scanner inp=new Scanner(System.in);
   System.out.print("- Chuc vu: ");
   chucVu=inp.nextLine();
   System.out.print("- He so luong: ");
   heSoLuong=inp.nextFloat();
}

// Tinh thu nhap

  public float TinhLuong(){
     return heSoLuong*LCB;
  }
}



/***************************/
/***** class CoQuan *****/
/**************************/

package coquan;
import java.util.Scanner;

public class CoQuan {
    public static int n;
    static CanBo[] ds = new CanBo[100];
   
    // Nhap danh sach
    public CoQuan(){
        // khoi tao danh sach CanBo
        for(int i=0;i<100;i++)
            ds[i]=new CanBo("","","","",0.0f);
       
        Scanner inp=new Scanner(System.in);
        System.out.print("- Nhap so luong can bo: \n");
        n=inp.nextInt();
    }
   
    // Nhap danh sach
   void NhapDS(){
      
        System.out.print("NHAP THONG TIN \n");
       
        for(int i=0;i<n;i++){
            System.out.print("+ Nhap thong tin cho can bo thu "+(i+1)+": \n");
            ds[i].NhapTT(); 
        }
    }
   
    // In danh sach CanBo
    void InDS(){
        System.out.print("* IN THONG TIN \n");
        System.out.print("| Ho va ten\t | Nam sinh \t | Dia chi \t | Thu nhap   |\n");
         for(int i=0;i<n;i++)
            ds[i].InTT();
    }
   
    // Sap xep danh sach sinh vien theo chieu tang dan cua thu nhap
    void SapXep(){
        System.out.print("* SAP XEP DANH SACH CAN BO: \n");
        CanBo cb= new CanBo("","","","",0.0f);
        for(int i=0;i<n-1;i++)
            for(int j=i+1;j<n;j++)
                if(ds[i].TinhLuong()>ds[j].TinhLuong())
                {                  
                    cb=ds[i];
                    ds[i]=ds[j];
                    ds[j]=cb;
                }
               
    }

    // Tim canBo co thu thap nho hon d
    void TimCanBo(){
        float d;
        System.out.print("\n + Nhap muc thu nhap can tim:");
        Scanner inp=new Scanner(System.in);
        d=inp.nextFloat();
        System.out.print("* TIM CAN BO CO THU NHAP < "+d+":\n");
        for(int i=0;i<n;i++)
            if(ds[i].TinhLuong()<d)
                ds[i].InTT();
    }
   
    // ham main
    public static void main(String[] args) {
        CoQuan cq=new CoQuan();
        cq.NhapDS();
        cq.InDS();
        // sap xep
        cq.SapXep();
        cq.InDS();
        // tim can bo
        cq.TimCanBo();       
    }   
}