KHÁI NIỆM VỀ MẢNGa/ Khái niệm mảng : là một tập hợp nhiều biến có cùng kiểu dữ liệu và cùng tên, khi đó mỗi phần tử của mảng được truy xuất thông qua chỉ số... CÁC VẤN ĐỀ LIÊN QUAN ĐẾN M
Trang 1TIN HỌC ĐẠI CƯƠNG
Lý thuyết: 6 buổi Thực hành: 8 buổi
GVHD: Dương Khai PhongEmail: khaiphong@gmail.com
Ngôn ngữ lập trình: C
Trang 2NỘI DUNG CÁC BUỔI HỌC
Trang 3CHƯƠNG 5: MẢNG, CHUỔI VÀ CON TRỎ
Trang 51 KHÁI NIỆM VỀ MẢNG
a/ Khái niệm mảng : là một tập hợp nhiều biến có cùng kiểu dữ liệu
và cùng tên, khi đó mỗi phần tử của mảng được truy xuất thông qua chỉ số.
Trang 61 KHÁI NIỆM VỀ MẢNG
c/ Chỉ số của mảng : phải là 1 giá trị kiểu int không vượt quá kích
thước của mảng và bắt đầu từ 0.
a[0] = 5; // gán giá trị 5 cho phần tử thứ 0 của mảng.
a[3] = 8; // gán giá trị 8 cho phần tử thứ 3 của mảng.
so = a[3]; // lấy giá trị của phần tử thứ 3 gán cho biến so.
Trang 72 CÁC BÀI TOÁN LIÊN QUAN ĐẾN MẢNG
Trang 8// Nhap gia tri cho cac ptu
for (int i=0;i<5;i++)
}
(mảng 1 chiều)
Trang 9// Nhap gia tri cho cac ptu
for (int i=0;i<3;i++)
(mảng 2 chiều – ma trận)
Lưu ý: nếu là mảng 2 chiều số thực thì ta bắt buộc phải nhập thông qua một biến phụ khác rồi mới gán cho a[i][j] (xem trang 114)
Trang 102 CÁC VẤN ĐỀ LIÊN QUAN ĐẾN MẢNG
b/ Tìm kiếm giá trị trong mảng:
Có 2 thuật toán dùng để tìm kiếm:
Tìm kiếm tuyến tính
Tìm kiếm nhị phân (học ở môn CTDL1)
* Tìm kiếm tuyến tính:
Ý tưởng: bắt đầu từ phần tử đầu tiên (phần tử thứ 0) và duyệt
qua tất cả các phần tử, nếu tìm thấy phần tử bằng khóa x thì báo tìm thấy và dừng, ngược lại báo không tìm thấy.
Thuật toán:
• B1: i=0; // bắt đầu từ phần tử đầu tiên
• B2: so sánh a[i] với x, có 2 khả năng
a[i] = x : tìm thấy và dừng
a[i] <> x : sang B3
• B3: i=i=+1 // xét phần tử kế tiếp trong mảng
Nếu i>n: hết mảng, không tìm thấy và dừng
Ngược lại : lặp lại B2
Trang 11i
x=6
Dừng
Trang 122 CÁC VẤN ĐỀ LIÊN QUAN ĐẾN MẢNG
b/ Thuật toán tìm kiếm tuyến tính:
void main()
{ int a[5], so;
// Da nhap xong mang a
printf (“Nhap gia tri can tim: ”);
Trang 132 CÁC VẤN ĐỀ LIÊN QUAN ĐẾN MẢNG
c/ Sắp xếp mảng tăng dần / giảm dần:
Có rất nhiều thuật toán dùng để sắp xếp:
Đổi chỗ trực tiếp (Interchange Sort)
Nổi bọt (Bubble Sort)
Chọn trực tiếp (Selection Sort)
Chèn trực tiếp (Insert Sort)
=> xem từ trang 162 – 167
(hoặc giáo trình môn Cấu trúc dữ liệu 1)
Trang 142 CÁC VẤN ĐỀ LIÊN QUAN ĐẾN MẢNG
c/ Sắp xếp mảng tăng dần:
Đổi chỗ trực tiếp - Interchange Sort
Ý tưởng:
• B1: bắt đầu từ phần tử đầu tiên của mảng, tìm
phần tử có giá trị nhỏ hơn để đổi chỗ (hoán vị) vớinhau, thực hiện tiếp tục cho các phần tử còn lạicho đến khi phần tử đầu tiên là phần tử nhỏ nhất
• B2: lặp lại bước 1 nhưng bắt đầu bằng phần tử kế
tiếp…
=> Nhận xét: từ ý tưởng trên cho thấy ta cần 2 vòng
lặp for lồng nhau để thực hiện việc sắp xếp
Trang 172 CÁC VẤN ĐỀ LIÊN QUAN ĐẾN MẢNG
void hoanvi(int &a,int &b);
void main()
{ int a[5], so;
// Da nhap xong mang a
for (int i=0;i<4;i++)
for (int j=i+1;j<5;j++)
Trang 18• B2: thực hiện cập nhật lại giá trị mới.
Ví dụ: thay thế phần tử có giá trị 3 trong mảng
(2,3,7,6,5) bằng giá trị 5
Chỉ số mảng
x=3
i
5
Trang 19i
Bước 1: xác định chỉ số k của phần tử có giá trị = 7.
Bước 2: di chuyển các phần tử bên phải của chỉ số k về
một chỉ số.
Bước 3: cập nhật lại kích thước của mảng n=n-1.
n=5
Trang 20char s1=“HELLO”, khi đó trong bộ nhớ sẽ lưu như sau:
char s2=“”, chuỗi rỗng khi đó trong bộ nhớ sẽ lưu như sau:
\0
Trang 213 CHUỖI KÝ TỰ
b/ Các vấn đề liên quan đến chuỗi:
• Nhập / xuất chuỗi (xem trang 44,125)
• Các phép toán không tồn tại đối với chuỗi:
So sánh: == , != , …
Gán nội dung chuỗi: s1=s2;
=> Để giải quyết các vấn đề này, ta cần sử dụng
các hàm chuẩn trong thư viện “string.h” (xem
trang 123)
Trang 22strcpy(s1, s2); // sao chép nội dung từ s2 sang s1
chieudai=strlen(s1); // lấy chiều dài trong chuỗi , kq: 8 ký tự
strcat(s1, “ cac ban”); // nối thêm cho s1 chuỗi “ cac ban”
if (strcmp(s1,s2)==0) // so sánh s1,s2: ( 0 : s1=s2, -1 : s1<s2, 1 :s1>s2)
printf (“s1 bang s2”);
s1[4]=‘C’; // thay thế ký tự c trong chuỗi thành ‘C’
}
Trang 234 CON TRỎ VÀ BỘ NHỚ
a/ Khái niệm con trỏ
b/ Các phép toán trên con trỏ
c/ Con trỏ và cấp phát vùng nhớ
Trang 244 CON TRỎ VÀ BỘ NHỚ
a/ Khái niệm con trỏ:
• Con trỏ là một kiểu biến đặc biệt dùng để lưu địachỉ vùng nhớ
Trang 254 CON TRỎ VÀ BỘ NHỚ
b/ Các phép toán trên con trỏ:
• Các phép toán 1 ngôi (xem trang 128)
Toán tử & : lấy địa chỉ của đối tượng.
Toán tử * : truy nhập đến nội dung đối tượng.
• Các phép toán khác trên con trỏ (xem trang 130)
Phép gán = : ta có thể thực hiện phép gán cho 2 con trỏ có cùng kiểu (nếu khác kiểu thì phải ép kiểu).
Phép truy nhập bộ nhớ
Phép so sánh
Trang 264 CON TRỎ VÀ BỘ NHỚ
c/ Con trỏ và cấp phát vùng nhớ : (xem trang 155)
* Xét ví dụ: viết CT quản lí điểm của 1000 sinh viên
có kích thước 1000 phần tửfloat => lãng phí bộ nhớ
Khi CT cần gia tăng sốlượng học viên lên 5000 sinhviên thì người lập trình phảichỉnh sửa lại code
Trang 274 CON TRỎ VÀ BỘ NHỚ
c/ Con trỏ và cấp phát vùng nhớ : (xem trang 155)
=> Để giải quyết bài toán này ta dùng cấp phát vùng nhớđộng khi thực hiện chương trình
Lệnh free giải phóng vùng
nhớ Lệnh malloc cấp phát vùng nhớ để lưu giữ n số thực