Trong Bài Giảng 03• Các cấu trúc lặp 3 cấu trúc lặp trong C – for: không hoặc nhiều lần lặp • Kiểm tra điều kiện, sai kết thúc, đúng thực hiện câu lệnh và lặp lại • Nên được sử dụng k
Trang 1Tin Học Cơ Sở 4
Mảng
Trang 2Trong Bài Giảng 03
• Các cấu trúc lựa chọn:
– if / if…else:
• Nếu điều kiện đúng thực hiện câu lệnh của if
• Nếu điều kiện sai thực hiện câu lệnh của else (không bắt buộc)
• Sử dụng if…else lồng nhau để kiểm tra nhiều trường hợp
• Lưu ý: Nhầm lẫn giữa gán (=) và so sánh bằng (==)
– switch:
• case: phải là một số hằng số
• default: có thể có hoặc không
• Giá trị kiểm tra ứng với case nào thì thực hiện câu lệnh tương ứng
• Nếu không thực hiện default
Trang 3Trong Bài Giảng 03
• Các cấu trúc lặp (3 cấu trúc lặp trong C)
– for: không hoặc nhiều lần lặp
• Kiểm tra điều kiện, sai kết thúc, đúng thực hiện câu lệnh và lặp lại
• Nên được sử dụng khi xác định được số lần lặp
– while: không hoặc nhiều lần lặp
• Kiểm tra điều kiện, sai kết thúc, đúng thực hiện câu lệnh và lặp lại
• Nên được sử dụng khi không xác định được số lần lặp
– do…while: ít nhất một lần lặp
• Thực hiện câu lệnh, kiểm tra điều kiện, sai kết thúc, đúng lặp lại
• Nên được sử dụng khi không xác định được số lần lặp
– Cấu trúc lặp có thể lồng nhau
– Lỗi thường gặp với cấu trúc lặp:
Trang 5Giới thiệu
• Định nghĩa mảng:
– Tập hợp các dữ liệu có cùng kiểu
• Độ dài của mảng:
– Phải xác định khi khai báo
– Không bao giờ thay đổi
• Sử dụng mảng cho dữ liệu giống nhau
– Tên, Điểm số, Nhiệt độ, Giá tiền (vnd), …
– Tránh không phải khai báo nhiều biến kiểu dữ
Trang 6Khai báo Mảng
– Khai báo mảng với 5 số nguyên tên “diem_so”
– Tương đương với khai báo 5 biến
int diem_so0,diem_so1,diem_so2,diem_so3,diem_so4;
• Cách gọi tên:
– Phần tử của mảng: diem_so[1], diem_so[i], …
– Giá trị trong ngoặc vuông […]
Trang 7Khởi tạo Mảng
• Sử dụng hằng cho độ dài mảng:
const int SO_SINH_VIEN = 5;
int diem_so[SO_SINH_VIEN];
• Khởi tạo mảng ban đầu:
– Khởi tạo ngay khi khai báo:
• int diem_so[5] = {5, 8, 4, 7, 6};
• int diem_so[] = {5, 8, 4, 7, 6};
•Đều khởi tạo mảng diem_so với 5 phần tử
•Mảng diem_so có độ dài là 5
Trang 8Truy cập Mảng
• Truy cập phần tử sử dụng chỉ số
printf(“%i”, diem_so[3]);
• Chú ý cách sử dụng ngoặc vuông []:
– Khi khai báo: độ dài của mảng
– Ngoài ra: chỉ số phần tử của mảng
• Độ dài & chỉ số:
int diem_so[SO_SINH_VIEN];
(n=2)
Trang 9Sử dụng hằng để khai báo độ dài
Trang 13Tìm kiếm trên Mảng
SO_SINH_VIEN phần tử In ra vị trí của X
– Có thể duyệt từ đầu mảng hoặc cuối mảng– Dùng vòng lặp so sánh giá trị của X với giá trị của từng phần tử trong mảng
– Khi tìm được giá trị bằng giá trị của X, kết thúc ngay vòng lặp và in ra vị trí hiện tại
của phần tử trong mảng
Trang 15Tìm kiếm trên Mảng
Sử dụng vòng lặp for không dùng break
for (i=0; i<SO_SINH_VIEN &&
diem_so[i]!=X; i++) {
}
if (0<=i && i<SO_SINH_VIEN)
printf(“vi tri trong mang %i”, i);
Trang 17if (0<=i && i<SO_SINH_VIEN)
printf(“vi tri trong mang %i”, i);
Trang 18Tìm kiếm trên Mảng
SO_SINH_VIEN phần tử In ra vị trí của X
– Nếu X không có trong mảng:
• Câu lệnh printf (trong 4 slides trước) đều không được thực hiện.
• Vòng lặp vẫn kết thúc khi mảng đã được duyệt toàn bộ (i<SO_SINH_VIEN).
• Tuy nhiên vẫn cần phải in ra thông báo:
Trang 19Mảng không đầy
• Nói chung khó biết chính xác độ dài mảng
• Phải khai báo độ dài mảng đủ lớn
– Phải biết mảng thực sự có bao nhiêu phần tử– Thường sử dụng biến phụ
• Cập nhật số phần tử thực của mảng
• int soPhanTu;
– Tăng soPhanTu khi chèn thêm phần tử vào mảng – Giảm soPhanTu khi xóa một phần tử khỏi mảng
Trang 21Chèn vào Mảng
• Chèn giá trị X vào mảng diem_so
– Điều kiện trước khi chèn:
• số phần tử hiện tại nhỏ hơn độ dài mảng
– Phải kiểm tra điều kiện trên trước khi chèn
– Mảng không sắp xếp:
• Chèn vào cuối
• Tăng biến lưu số phần tử của mảng lên 1
if (soSV < SO_SV_MAX) {
diem_so[soSV] = X;
soSV++;
Trang 22soSV = 7
Trang 23• Tăng biến lưu số phần tử của mảng lên
• Lưu ý các trường hợp đặc biệt khi X được chèn vào đầu mảng, cuối mảng, hoặc vào mảng trống (chưa có phần
tử nào)
Trang 24soSV = 7
Trang 25Xóa khỏi Mảng
– Tìm vị trí của giá trị X trong mảng diem_so
– Nếu tìm thấy X thì dồn các phần tử phía sau lên 1 vị trí để lấp đầy (đảm bảo tính liên tục của mảng)
– Giảm biến lưu số phần tử của mảng xuống 1– Chú ý:
• Với mảng chưa sắp xếp chỉ cần đưa phần tử cuối cùng lên lấp vào vị trí của X
Trang 26Xóa khỏi Mảng
• Xóa phần tử X tại vi_tri khỏi mảng diem_so
– Mảng không sắp xếp: Xóa rồi lấp phần tử cuối lên
while (vi_tri<soSV) {
if (diem_so[vi_tri]==X) {
diem_so[vi_tri] = diem_so[soSV-1]; soSV ; break;
}
vi_tri++;
Trang 27soSV = 7
Trang 28Xóa khỏi Mảng
• Xóa phần tử X tại vi_tri khỏi mảng diem_so
– Mảng đã sắp xếp: rời các phần tử phía sau phần tử X lên 1 vị trí
if (0<=vi_tri && vi_tri<soSV) {
int i = vi_tri;
while (i<soSV-1) {
diem_so[i] = diem_so[i+1];
} soSV ;
Trang 29soSV = 7
Trang 30Sắp xếp Mảng
thứ tự tăng dần
• Giải pháp: Loại bỏ hết những vị trí sai trong mảng
– Thuật toán lựa chọn – Selection sort
• Đôi khi được gọi: Thuật toán đổi chỗ - Interchange sort – Thuật toán nổi bọt – Bubble sort
– Thuật toán chèn – Insertion sort
– …
Trang 31Sắp xếp Lựa Chọn
• Thuật toán lựa chọn (3 bước) :
– Tìm phần tử nhỏ nhất của mảng chưa sắp xếp– Đổi chỗ phần tử nhỏ nhất này với phần tử tại ví trị đầu tiên trong mảng chưa sắp xếp
– Lặp lại 2 bước trên khi không còn phần tử nào trong mảng chưa sắp xếp
Trang 32Sắp xếp Lựa Chọn
– Tìm phần tử nhỏ nhất của mảng chưa sắp xếp
– Đổi chỗ phần tử nhỏ nhất này với phần tử tại ví trị
Trang 33Sắp xếp Lựa chọn
int i, j, min, vi_tri, temp;
for (i=0; i<soSV-1; i++) {
min=diem_so[i]; vi_tri =i;
for (j=i; j<soSV; j++) {
Trang 34Mảng đa chiều
• C không hỗ trợ mảng đa chiều Tuy nhiên có thể tiếp cận theo hướng: Mảng 2 chiều là mảng một chiều mà mỗi thành phần của nó là một mảng
một chiều
diem_so[soSV][soMonHoc];
–có thể coi là một mảng 1 chiều, giống như mảng
diem_so[soSV] ở các ví dụ trên Tuy nhiên thay vì chỉ lưu được điểm số của một môn học cho mỗi sinh viên, ta
có thể lưu được điểm số của tất cả các môn học cho một
Trang 36Tổng kết
• Mảng là một tập hợp dữ liệu cùng kiểu
• Phần tử mảng sử dụng như các biến
thông thường có dữ liệu kiểu của mảng
• Dùng vòng lặp for để thao tác mảng
• Tìm kiếm một phần tử trên mảng
• Phần tử mảng có thể được sắp xếp
• Mảng đa chiều