Sunday, September 10, 2017

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

Mảng là tập hợp nhiều giá trị có cùng kiểu dữ liệu
Đây là mảng số
let data = [1, 2,3, 4,5]
Mảng các chữ.
let data2 = ["Thứ hai","Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy", "Chủ nhật" ]mảng các chữ
var mang = [String](count: 12, repeatedValue: " ")
var mang2 = [Int](count: 12, repeatedValue: 0)

Ta khai báo mảng kèm luôn số phần tử, các dữ liệu đại diện, 0 tức là mảng số, dấu cách trắng là mảng chuỗi.
Để cho phần từ vaò mảng, ta dùng lệnh append
mang.append("Thứ hai");
mang2.append(9);
Để lấy kích thước mảng
let kichthuoc=data.count
Gõ lệnh for để tính tổng các giá trị lẻ trong mảng data
for i in0..<5 {
if(data[i]%2==1){
tong=tong+data[i]
    }
}

Kết qua chạy ra là 9, hãy so sánh với bài 1, cũng là từ 0 đến 4 mà bài 1 ra kết quả tổng lẻ có 4 là sao?
Đó là vì ở bài 1 ta cộng các số lẻ từ 0 đến 4 thì chỉ có 1 và 3. Còn đây ta cộng các vị trí trong mảng, với i=0 là vị trí đầu, giá trị 1, i=4 là vị trí 5, giá trị 5.
Vậy hãy cẩn thận với chỉ số mảng, i luôn nhỏ hơn kích thước mảng 1 đơn vị. Mảng có 10 phần tử, i lớn nhất là 9. Vòng lặp for với mảng rất hay bị nhầm kích thước mảng,cần chú ý.
Nếu bạn sửa chỗ %2==1 thành %2==0, nó sẽ in ra tổng các số chẵn, kết quả là 6
Dòng tong=tong+data[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 +data[i] hay được viết như sau tong+=data[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.
Hãy thêm vào mảng data các số 35,88
Nếu muốn biết vị trí của số 35 trong mảng data, ta dùng lệnh for duyệt tất cả các phần tử
for i in0..<data.count {
if(data[i]==35){
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 5 trong mảng data.
var dem=0
for i in0..<data.count {
if(data[i]%5==0){
dem=dem+1
    }
}
Khi chạy for, cứ mỗi khi có một phần tử chia hết cho 5 thì biến dem lại tăng lên 1 đơn vị, kết quả ra 2.

Ta thử tìm số lớn nhất trong mảng này, copy đoạn code sau vào
var max=data[0]
for i in0..<data.count {
if(data[i]>max){
max=data[i]
    }
}

Hãy xem lệnh for, ban đầu ta khai báo biến max và 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
let mang3  = [[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5] ]
Đó là mảng có 3 dòng, mỗi dòng có 5 phần tử, phần tử ở dòng đầu tiên, cột thứ 3 sẽ được viết là mang3[0][2], đó là số 3
Hoặc ta chỉ khai báo số dòng, cột, kiểu giá trị của mảng
var mang4 = Array(count: 2, repeatedValue:Array(count:3,repeatedValue: " "))

Đó là mảng có 2 dòng, mỗi dòng có 3 phần tử, ta thêm các giá trị vào
mang4[0][0]=4;
mang4[0][1]=8;
mang4[0][2]=6;
mang4[1][0]=5;
mang4[1][1]=9;
mang4[1][2]=3;
Lúc này các phần tử mảng 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à mang4[0][2], đó là số 6.
Để tính tổng các phần tử trong mang4, ta dùng vòng lặp for kép
var tong2=0
for i in0..<2 {
for j in0..<3 {
tong2=tong2+mang4[i][j]
}
}
Kết quả ra 35

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 để cộng dòng 1
Tiếp theo cho i=1, chạy for đơn bên dưới với j từ 0 đến 2 để cộng dòng 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ó cộng dòng 1, i=1 nó cộng 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.
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.
let chuoi="Đ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
let mang5 = a.componentsSeparatedByString(",")
Lúc này mang5 tạo thành có 3 phần tử “Đay la vi du”, “ phan chia chuoi”,” theo dau phay”
Để bỏ dấu cách trắng đầu chữ “ phan chia chuoi”, ta dùng lệnh
let bocach=mang5[1].characters.dropFirst()
let chuoi2=String(bocach)
Lúc đó kết quả là “phan chia chuoi” đã mất dấu cách ở đầu

Để đếm số ký tự của chuỗi, ta dùng lệnh characters.count

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 8.
Tìm xem số 30 ở vị trí nào, nếu trong mảng không có số 30 thì sao.
In ra giá trị nhỏ nhất của mảng.
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