Đang tải... (xem toàn văn)
– Dữ liệu phải được đóng gói: Người lập trình chỉ biết kiểu dữ liệu qua tên gọi và ngữ nghĩa của nó mà. không quan đến tổ chức vật lý[r]
(1)1
(2)2
Chương 1:
(3)3
Định nghĩa phép toán danh sách đặc
• Định nghĩa
• Cách biểu diễn phép toán danh sách đặc
- Khởi tạo danh sách
(4)4 1 Mảng (Array) – Định nghĩa
• Định nghĩa: Mảng cấu trúc bao gồm thành phần kiểu liệu, thành phần
gọi phần tử xác định qua số
Trong C/C++ khai báo:
elem a[spt];
Trong elem kiểu phần tử (element type); spt số phần tử
Ví dụ:
int a[10]; //mảng a gồm 10 phần tử kiểu int
(5)5 Tổ chức lưu trữ
• Mảng quản lý địa nhớ máy tính phần tử bố trí liên số
• Chính dãy liệu lưu trữ mảng gọi danh sách đặc
0
(6)6 Truy xuất
• Truy xuất mảng: Truy xuất qua phần tử mảng theo số i
Trong C/C++:
<tên mảng>[i] Bằng cách tính địa chỉ:
@a + i * sizeof(elem)
Ví dụ: a[3] truy xuất đến địa chỉ: 1000+3*21000 1006
0
a
(7)7
Ví dụ
• Viết đoạn chương trình cộng dồn n giá trị mảng vào a[0]
for (i=1; i<n; i++) a[0] = a[0]+a[i]; Viết lại
t = a[0];
for (i=1; i<n; i++) t = t+a[i];
(8)8 Mảng nhiều chiều
• Là mảng bao gồm phần tử có kiểu mảng
vd: int a[3][4];
Vd: viết hàm tìm max mảng số nguyên
0
a
3
(9)9
int max( int a[ ], int n) {
int m = a[0];
for (int i=1; i<n; i++) if (a[i]>m)
m = a[i]; return m;
(10)10
void main() {
int b[3][4] = { { 7, 12, 6, 8}, { 32, 17, 21, 23},
{ 1, 5, 35, 32}};
int a[] = {9, 7, 18, 6, 1, 3, 2, 5, 11, 4};
printf("\nMax cua b: %d", max(b[0], 12)); printf("\nMax cua a: %d", max(a, 10));
printf("\nMax : %d", max(a+5, 5)); }
0
b
3
(11)11 Con trỏ?
• Con trỏ: Là kiểu liệu dang địa nhớ máy tính
• Biến trỏ: Lưu trữ địa vùng nhớ máy tính
• Khai báo:
<type> *<pointer_var> Ví dụ:
float *pa, a, b;
pa
(12)12
Các phép tốn
• Tốn tử &:
Lấy địa đối tượng &<object>
Ví dụ:
float *pa, a, b; pa = &a;
*pa a
(13)13
Các phép tốn
• Tốn tử *:
Truy xuất đến vùng nhớ mà trỏ trỏ đến *<pointer>
Ví dụ:
float *pa, a, b; pa = &a;
*pa = 5;
*pa a
pa
(14)14
Mảng trỏ
• Mảng quản lý địa • Con trỏ lưu địa
Vì vậy, số tình trỏ đồng với mảng ngược lại
Ví dụ:
int a[10], *pa; pa = a;
0
a
3
(15)15 Mảng trỏ - tt
*pa = 5; a[0]=5
pa = &a[5];
*pa = 7; a[5]=7
0
a
3
pa
5
0
a
3
pa
(16)16 Phép toán +, -, ++,
• Phép +/-: Tăng hay giảm n đơn vị trỏ <pointer> = <pointer> + n
<pointer> += n n số nguyên
• Phép ++/ : Tăng hay giảm đơn vị trỏ <pointer> ++
++<pointer> Ví dụ:
(17)17
Ví dụ:
pa = a;
pa = pa+3;
0
a
3
pa
5
0
a
3
pa
(18)18
*pa=1; a[3]=1 *(pa+4) = a[7]=2 *(a+4) = a[4]=9 pa[5] = a[8]=6
a++; // Sai, a không thay đổi
0
a
3
pa
(19)19
Cấp phát/thu hồi nhớ
• Cấp phát nhớ động
– C: hàm malloc()
(void *)malloc(int size)
Cấp vùng nhớ có size byte trả địa vùng nhớ cấp phát
– C++: toán tử new
new <type>[size]
[size] thành phần nhiệm ý
Cấp vùng nhớ có size phần tử trả địa vùng nhớ cấp phát
(20)20
Cấp phát/thu hồi nhớ - tt
• Thu hồi nhớ
– C: hàm free()
void free(<pointer>)
– C++: toán tử delete
delete [size]<type>
[size] thành phần nhiệm ý Thu hồi vùng nhớ mà trỏ trỏ đến
(21)21
Chuỗi ký tự (String)
• Định nghĩa: Là dãy ký tự chọn lọc
• Cài đặt: Dựa mảng ký tự, có cách cài đặt
– Cách 1: Sử dụng byte để lưu chiều dài chuỗi (Pascal sử dụng cách này)
Ví dụ chuỗi “TIN HOC”
S[8]=‘A’ S=“TIN HOC”
S[2]=‘A’ S=“TAN HOC”
#7 T I N
0
H O C
(22)22 –Cách 2: Sử dụng ký tự đặc biệt làm
ký tự kết thúc chuỗi (C/C++ sử dụng cách này).
Ví dụ chuỗi “TIN HOC”
‘\0’: kí tự có mã ASCii 0
S[1]=‘A’ S=“TAN HOC”
T I N
0
H O C
5
(23)23 Các thao tác chuỗi
• Sao chép chuỗi (strcpy) • So sánh chuỗi (strcmp) • Chiều dài chuỗi (strlen) • Ghép chuỗi (strcat)
(24)24
VD chép chuỗi
void strcpy(char s1[], char s2[]) {
int i = 0;
while (s2[i] != ‘\0’) {
s1[i] = s2[i]; i++;
}
(25)25
VD chép chuỗi – viết lại
void strcpy(char s1[], char s2[]) {
int i = 0;
while (s1[i] = s2[i]) i++;
(26)26
VD chép chuỗi – viết lại lần cuối
void strcpy(char *s1, char *s2) {
while (*s1++ = *s2++); }
• Ghép s2 vào cuối s1
void strcat(char *s1, char *s2) {
while (*s1) s1++;
(27)27
Ghép chuỗi – viết theo 2
void strcat(char s1[], char s2[]) {
int i = 0, j=0;
while (s1[i]) i++;
(28)28 Đổi chuỗi thành số
int atoi(char *s) {
int P = 0; while (*s)
P = P*10 + *s++ -’0’; return P;
(29)29
So sánh chuỗi
int strcmp(char *s1, char *s2) {
while (*s1 == *s2 && *s1) {
s1++; s2++; }
(30)30
Trừu tượng hóa liệu
• Thiết kế cấu trúc liệu cần đạt tính trừu tượng hóa liệu:
– Dữ liệu phải đóng gói: Người lập trình biết kiểu liệu qua tên gọi ngữ nghĩa mà
khơng quan đến tổ chức vật lý
– Che chắn tốt: Người lập trình truy xuất đến thơng qua thao tác (hàm) mà kiểu liệu cung cấp
(31)31
Ví dụ: Thiết kế kiểu tập hợp
#define MAX … // người sử dụng xác định #define N (MAX/8+1)
typedef unsigned char taphop[N];
//============== Tao tap rong ========= void taprong(taphop s)
{
int i;
for (i=0; i<N; i++) s[i] = 0;
(32)32
//========== Dua phan tu x vao tap hop s void thempt(taphop s, int x)
{
s[x/8] = s[x/8] | (1<<(x%8)); }
//========== Loai phan tu x khoi tap hop s void loaipt(taphop s, int x)
{
unsigned char k = 1<<(x%8); s[x/8] = s[x/8] & ~k;
(33)33
//========== Kiem tra phan tu x thuoc tap hop s int thuocve (taphop s, int x)
{
return s[x/8] & (1<<(x%8)); }
//========== Hội tap hop
void hoi(taphop a, taphop b, taphop c) {
int i;
for (i=0; i<N; i++) c[i] = a[i] | b[i]; }
(34)34 Ví dụ: Tìm số ngun tố<=n
#include <iostream.h> #include <iomanip.h> #define MAX 10000
#include "TAPHOP.CPP" void main()
{
int n, i, k; taphop s;
cout<<"\nNhap n:"; cin>>n;
taprong(s);
for (i=2; i<=n; i++) thempt(s, i);
i = 2;
while (i*i<=n) {
k = i*i;
while (k<=n) {
loaipt(s, k); k = k+i; }
do
i++;
while (!thuocve(s, i)); }
cout<<"\nKet qua:\n"; for (i=2; i<=n; i++)
if (thuocve(s, i))
(35)