Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (114.53 KB, 35 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
1
2
3
• Định nghĩa
• Cách biểu diễn và các phép tốn trên danh sách
đặc
- Khởi tạo danh sách
4
• Định nghĩa: Mảng là cấu trúc bao gồm các thành
phần cùng kiểu dữ liệu, mỗi thành phần được
gọi là phần tử và xác định qua chỉ số.
<i>Trong C/C++ khai báo:</i>
<b>elem a[spt];</b>
<b>Trong đó elem là kiểu phần tử (element type); spt là số </b>
<i>Ví dụ:</i>
int a[10]; //mảng a gồm 10 phần tử kiểu int
5
<i>• Mảng được quản lý bằng một địa chỉ trong </i>
bộ nhớ máy tính và các phần tử được bố
<i>trí tuần tự liên tiếp theo chỉ số</i>
• Chính vì vậy dãy dữ liệu lưu trữ trong
mảng còn được gọi là danh sách đặc
0 1 2 9
6
• Truy xuất mảng: Truy xuất qua các phần
tử của mảng theo chỉ 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 1 2 9
a
7
• Viết đoạn chương trình cộng dồn n giá trị
của mảng vào a[0]
<i><b>for (i=1; i<n; i++)</b></i>
<i><b>a[0] = a[0]+a[i]; </b></i>
<i><b>Viết lại</b></i>
<i><b>t = a[0];</b></i>
<i><b>for (i=1; i<n; i++)</b></i>
<i><b>t = t+a[i];</b></i>
8
• Là mảng bao gồm các phần tử có kiểu là
mảng
vd: int a[3][4];
Vd: viết hàm tìm max của mảng số nguyên
0 1 2 1
a
3 0
9
<i><b>int max( int a[ ], int n)</b></i>
<i><b>{</b></i>
<i><b>int m = a[0];</b></i>
<i><b>for (int i=1; i<n; i++)</b></i>
<i><b>if (a[i]>m) </b></i>
<i><b>m = a[i];</b></i>
<i><b>return m;</b></i>
10
<i><b>void main()</b></i>
<i><b>{</b></i>
<i><b>int b[3][4] = { { 7, 12, 6, 8},</b></i>
<i><b>{ 32, 17, 21, 23},</b></i>
<i><b>{ 1, 5, 35, 32}};</b></i>
<i><b>int a[] = {9, 7, 18, 6, 1, 3, 2, 5, 11, 4};</b></i>
<i><b>printf("\nMax cua b: %d", max(b[0], 12));</b></i>
<i><b>printf("\nMax cua a: %d", max(a, 10));</b></i>
<i><b>printf("\nMax : %d", max(a+5, 5));</b></i>
<i><b>}</b></i>
0 1 2 1
b
3 0
11
• Con trỏ: Là kiểu dữ liệu dang địa chỉ bộ nhớ
máy tính
• Biến con trỏ: Lưu trữ địa chỉ của vùng nhớ
máy tính
• Khai báo:
<type> *<pointer_var>
Ví dụ:
float *pa, a, b;
pa
12
• Tốn tử &:
Lấy địa chỉ của 1 đối tượng
&<object>
Ví dụ:
float *pa, a, b;
pa = &a;
*pa
a
13
• Tốn tử *:
Truy xuất đến vùng nhớ mà con trỏ trỏ đến
*<pointer>
Ví dụ:
float *pa, a, b;
pa = &a;
*pa = 5;
*pa
a
pa
14
• Mảng được quản lý bằng địa chỉ
• Con trỏ lưu địa chỉ
<b>Vì vậy, trong một số tình huống con trỏ được </b>
đồng nhất với mảng và ngược lại
Ví dụ:
int a[10], *pa;
pa = a;
0 1 2 9
a
3
15
*pa = 5; a[0]=5
pa = &a[5];
*pa = 7; a[5]=7
0 1 2 9
a
3
pa
5
0 1 2 9
a
3
pa
16
--• Phép +/-: Tăng hay giảm n đơn vị trỏ
<pointer> = <pointer> + n
<pointer> += n
n là số nguyên
• Phép ++/--: Tăng hay giảm 1 đơn vị trỏ
<pointer> ++
++<pointer>
Ví dụ:
17
Ví dụ:
pa = a;
pa = pa+3;
0 1 2 9
a
3
pa
5
0 1 2 9
a
3
pa
18
*pa=1; a[3]=1
*(pa+4) = 2 a[7]=2
*(a+4) = 9 a[4]=9
pa[5] = 6 a[8]=6
a++; // Sai, a không thay đổi được
0 1 2 9
a
3
pa
19
• Cấp phát bộ nhớ động
<i><b>– C: hàm malloc()</b></i>
<i><b>(void *)malloc(int size)</b></i>
<i>Cấp vùng nhớ có size byte trả về địa chỉ của vùng nhớ </i>
được cấp phát
<i><b>– C++: toán tử new</b></i>
new <type>[size]
[size] là thành phần nhiệm ý
<i>Cấp vùng nhớ có size phần tử trả về địa chỉ của </i>
vùng nhớ được cấp phát
20
• Thu hồi bộ nhớ
– C: hàm free()
<i><b>void free(<pointer>)</b></i>
<i><b>– C++: toán tử delete</b></i>
<i><b>delete [size]<type></b></i>
[size] là thành phần nhiệm ý
Thu hồi vùng nhớ mà con trỏ trỏ đến
21
• Định nghĩa: Là 1 dãy các ký tự chọn lọc
• Cài đặt: Dựa trên mảng các ký tự, có 2 cách
cài đặt
– Cách 1: Sử dụng byte đầu tiên để 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 1 2 3 4
H O C
22
T I N
0 1 2 3 4
H O C
5 6 7 8
23
• 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
void strcpy(char s1[], char s2[])
{
int i = 0;
while (s2[i] != ‘\0’)
{
s1[i] = s2[i];
i++;
}
25
void strcpy(char s1[], char s2[])
{
int i = 0;
while (s1[i] = s2[i])
i++;
26
void strcpy(char *s1, char *s2)
{
while (*s1++ = *s2++);
}
• <sub>Ghép s2 vào cuối s1</sub>
void strcat(char *s1, char *s2)
{
while (*s1) s1++;
27
void strcat(char s1[], char s2[])
{
int i = 0, j=0;
while (s1[i]) i++;
28
int atoi(char *s)
int P = 0;
while (*s)
P = P*10 + *s++ -’0’;
return P;
29
int strcmp(char *s1, char *s2)
{
while (*s1 == *s2 && *s1)
{
s1++;
s2++;
}
30
• Thiết kế 1 cấu trúc dữ liệu cần đạt được tính
trừu tượng hóa dữ liệu:
– Dữ liệu phải được đóng gói: Người lập trình chỉ biết
khơng quan đến tổ chức vật lý
– Che chắn tốt: Người lập trình chỉ truy xuất đến nó
thơng qua các thao tác (hàm) mà kiểu dữ liệu cung
cấp.
31
#define MAX … // do 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
//========== Dua phan tu x vao tap hop s
{
s[x/8] = s[x/8] | (1<<(x%8));
}
//========== Loai phan tu x ra khoi tap hop s
void loaipt(taphop s, int x)
{
unsigned char k = 1<<(x%8);
s[x/8] = s[x/8] & ~k;
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 2 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
#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))