Sunday, September 10, 2017

Bài 2 - Mảng, chuỗi


Nháy chuột phải vào src, new, class, đặt tên là second. Copy lệnh in vào
public static void main(String args[])
Mảng là tập hợp nhiều giá trị có cùng kiểu dữ liệu
Đây là mảng số
int ar[]={1,3,5,6,78,85,23};
Mảng các chữ
String ar[ ]= {"Thứ hai","Thba", "Thtư", "Thnăm", "Thsáu", "Thbảy", "Chủ nhật"  };
int mang[]=new int[10];
Khai báo mảng có 10 phần tử. Phần tử đầu tiên sẽ là mang[0]
Số phần từ trong mảng gọi là kích thước mảng
int sophantu=mang.length;
Bây giờ ta thử in ra tất cả các phần tử trong mảng ar.
for(int i=0;i<ar.length;i++){            
      System.out.println(ar[i]);
                       
      } 
   
Hãy xem kỹ lệnh for này, ta bắt đầu từ i=0, kết thúc bằng i nhỏ hơn kích thước mảng, ở đây i=6 vì mảng có 7 phần tử. Vòng lặp for với mảng rất hay bị nhầm chỉ số kích thước. Để đơn giản luôn nhớ i sẽ nhỏ hơn kích thước mảng, nếu mảng có 10 phần tử, thì i nhỏ hơn 10.
Để in ra các số chẵn trong mảng, ta thêm vào lệnh if
if(ar[i]%2==0)
Chạy thử xem kết quả.
Tạo mảng ar2 với các số từ 1-10
int ar2[]={1,2,3,4,5,6,7,8,9,10};
Bây giờ nhập lệnh sau để in ra tổng các số chẵn.
for(int i=0;i<ar2.length;i++){           
            if(ar2[i]%2==0){
            tong=tong+ar2[i];
            }             
            }     

   
Nếu bạn sửa chỗ %2==0 thành %2==1, nó sẽ in ra tổng các số lẻ
Dòng tong=tong+ar2[i]; có nghĩa là ta cộng dồn các giá trị tong, các giá trị sau được cộng luôn vào giá trị trước. Giả sử sau lần chạy đầu tiên, i=0 ta được giá trị 1, tiếp theo được giá trị 3, thì nó sẽ cộng luôn vào 1 thành 4, cứ như vậy đến cuối cùng ta có tổng của toàn bộ các số thỏa mãn yêu cầu của lệnh if.
Dòng tong=tong +ar2[i] có khi được viết như sau tong+=ar2[i];
Cách viết này rất phổ biến nhưng nhìn hơi khó hiểu, bạn cứ nên viết rõ ra có 2 chữ tong hai bên sẽ dễ nhìn hơn.
Nếu muốn biết vị trí của số 85 trong mảng ar ở trên, ta dùng lệnh for duyệt tất cả các phần tử
for(int i=0;i<ar.length;i++){
            if(ar[i]==85){
            vitri=i+1;
            }                
            }    
Giá trị in ra sẽ là 6, cộng thêm 1 vào i vì trong mảng, i=0 là số thứ nhất.


Giả sử ta muốn đếm xem có bao nhiêu số chia hết cho 3 trong mảng ar2.
int dem=0;    
for(int i=0;i<ar2.length;i++){           
            if(ar2[i]%3==0){
            dem=dem+1;
            }                
            }      
Khi chạy for, cứ mỗi khi có một phần tử chia hết cho 3 thi biến dem lại tăng lên 1 đơn vị.

Khai báo thêm một mảng nữa
int ar3[]={18,34,150,6,78,85,23};
Ta thử in ra số lớn nhất trong mảng này, copy đoạn code sau vào
   int max=ar3[0];
      for(int i=0;i<ar3.length;i++){           
            if(ar3[i]>max){
            max=ar3[i];
            }                
            }    
Sửa lệnh in để trong ngoặc là max, kết quả là 150

Hãy xem lệnh for, ban đầu ta khai báo max là một số nguyên, gán luôn giá trị là phần tử đầu tiên của mảng. Sau đó chạy for để so sánh từng giá trị của mảng với max, nếu có giá trị lớn hơn, gán giá trị đó cho max.
Với mảng 2 chiều, ta khai báo nó như sau
int mang2[][]=new int [2][3];
mang2[0][0]=4;
mang2[0][1]=8;
mang2[0][2]=6;
mang2[1][0]=5;
mang2[1][1]=9;
mang2[1][2]=3;
Lúc này mảng sẽ có 2 dòng, 3 cột, các phần tử trông sẽ như sau
4 8 6
5 9 3
Phần tử ở dòng đầu tiên, cột thứ 3 sẽ được viết là mang2[0][2], đó là số 6
Để khai báo kèm luôn dữ liệu, bạn có thể làm như sau
int mang3[][]={{4,8,6},{5,9,3}};
Khi đó, những số trong ngoặc kép đầu tiên sẽ là dòng đầu tiên, trong ngoặc thứ hai sẽ là dòng thứ hai.
Phần tử ở dòng thứ 2, cột thứ 3 sẽ được viết là mang3[1][2], đó là số 3
Để in ra các giá trị trong mảng 2 chiều, ta dùng vòng lặp for kép.
for(int i=0;i<2;i++){
      for(int j=0;j<3;j++){
      System.out.println(mang2[i][j]);
      }                
      } 
   
Vòng for kép không dễ hiểu, hãy nghĩ như sau:
Đầu tiên cho i=0, chạy for đơn bên dưới với j từ 0 đến 2
Tiếp theo cho i=1, chạy for đơn bên dưới với j từ 0 đến 2
Vậy nó là 2 lần, hoăc tổng quát là i lần chạy for đơn. Ở đây i biểu thị số dòng, với i=0 nó in ra dòng 1, i=1 nó in ra dòng 2 của mảng.
Bạn luôn nên đặt i ở ngoài, j ở trong để dễ hình dung khi khi gán i, j để hiểu nó.
For kép chỉ dùng được khi bạn đã dùng quen for đơn, bạn hiểu lặp lại for đơn chính là for kép, khi đó tự bạn biết khi nào buộc phải dùng nó.
Mảng 2 chiều hơi khó hình dung, dễ lẫn dòng, cột. Nhưng nó tiện để gán dữ liệu vào. Khi làm ứng dụng, có những lúc bạn chỉ có thể dùng mảng 2 chiều vì mảng 1 chiều là không đủ. Lúc đó tự bạn sẽ hình dung trong đầu ra cách để dùng nó. Vậy ban đầu, cứ hiểu về mảng 1 chiều là được rồi.
Bạn rào dòng System.out.println(mang2[i][j]); thành comment.
Tiếp theo ta xét tới mảng động. Khai báo như sau
ArrayList  mang4=new ArrayList();
Hoặc:
ArrayList<String> mang4 = new ArrayList<String>();
Dòng khai báo dưới bạn xác định luôn kiểu dữ liệu cho mảng là chuỗi
Để thêm các giá trị vào mảng, bạn dùng lệnh add().
mang4.add("Th hai");
mang4.add("Th ba");
mang4.add("Th tư");
Mảng động khác mảng tĩnh ở chỗ nó không có kích thước cố định. Ở mảng tĩnh, nếu bạn khai báo nó có 10 phần tử, sau đó thêm vào phần tử thứ 11, sẽ có lỗi xảy ra.
Với mảng động bạn thêm vào bao nhiêu phần tử cũng được.
Để lấy kích thước mảng động, ta dùng int kichthuoc=mang4.size();
Để lấy phần tử ta dùng get, ví dụ lấy phần từ đầu tiên
Mang4.get(0);

Để xóa một phần tử, ta dùng lệnh mang4.remove(sophantu);
Ví dụ để xóa phần từ thứ 2 ta dùng mang4.remove(1);
Để xóa tất cả các phần tử, ta dùng mang4.clear();
Ta sẽ xem thêm về chuỗi, tức các ký tự string
Đối với chuỗi, lệnh cần biết nhất là chặt chuỗi, tức chia nhỏ ký tự ra
Giả sử ta có chuỗi
String a="Đay la vi du, phan chia chuoi, theo dau phay";
Ta có thể tạo một mảng bằng cách chặt chuỗi như sau
String a1[] = a.split(",");
System.out.println(a1[1]);
Lúc này mảng a1 tạo thành có 3 phần tử “Đay la vi du”, “ phan chia chuoi”,” theo dau phay”

Ta cũng hay dùng lệnh cắt chuỗi.
String cat = a1[0].substring(0, 6);
Lệnh này cắt lấy 6 ký tự từ phần tử đầu tiên trong mảng a1, tức là chuỗi “Đay la vi du”
In ra màn hình ta có chuỗi “Đay la”

Chú ý ký tự trắng cũng được tính là một ký tự.
Dùng chuỗi để cắt thành mảng rất hay dùng trong thực tế lập trình.
Bài tập
Tạo một mảng các số bất kỳ, in ra tổng các số chia hết cho 3, 6, 9
Đếm xem có bao nhiêu số chia hết cho 5.
Tìm xem số 8 ở vị trí nào, nếu trong mảng không có số 8 thì sao.
In ra giá trị nhỏ nhất của mảng.
Sắp xếp tăng giảm dần, phải có mẫu tăng trước mới dc.
Can năm gồm có Giáp, Ất, Bính, Đinh, Mậu, Kỷ Canh, Tân, Nhâm, Quý.
12 địa chi gồm Tý, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ, Mùi, Thân, Dậu, Tuất, Hợi
Lấy năm dương chia cho 10, số dư đổi thành can. Dư 1 là Tân, 2 Nhâm, 3 Quý, 4 Giáp, 5 Ất, 6 Bính, 7 Đinh, 8 Mậu, 9 Kỷ, 0 Canh.
Lấy năm dương chia cho 12, số dư đổi thành chi. Dư 1 là Dậu, 2 Tuất, 3 Hợi, 4 Tý, 5 Sửu, 6 Dần, 7 Mão, 8 Thìn, 9 Tỵ, 10 Ngọ, 11 Mùi, 0 Thân.
Tính để biết năm âm lịch từ năm dương.

Tôi làm giúp bạn phần đổi ra can, bạn tự làm nốt phần đổi ra chi.

No comments:

Post a Comment