Tải bản đầy đủ (.ppt) (35 trang)

hoa cuong có thì sử dụng – thích thì lao vào

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


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

2


<b>Chương 1:</b>



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

3


Định nghĩa và các phép tốn trên


danh sách đặc



• Đị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


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

4

1. Mảng (Array) – Định nghĩa



• Đị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>


phần tử.


<i>Ví dụ:</i>


int a[10]; //mảng a gồm 10 phần tử kiểu int


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

5

Tổ chức lưu trữ



<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


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

6

Truy xuất



• 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


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

7


Ví dụ



• 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>


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

8

Mảng nhiều chiều



• 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


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

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>


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

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


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

11

Con trỏ?



• 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


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

12


Các phép tốn



• Tốn tử &:


Lấy địa chỉ của 1 đối tượng
&<object>


Ví dụ:


float *pa, a, b;
pa = &a;


*pa
a


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

13


Các phép tốn



• 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


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

14


Mảng và con trỏ



• 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


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

15

Mảng và con trỏ - tt



*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



</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

16

Phép tốn +, -, ++,



--• 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ụ:


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

17


Ví dụ:


pa = a;


pa = pa+3;


0 1 2 9


a


3


pa



5


0 1 2 9


a


3


pa


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

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


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

19



Cấp phát/thu hồi bộ nhớ



• 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


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

20


Cấp phát/thu hồi bộ nhớ - tt



• 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


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

21


Chuỗi ký tự (String)



• Đị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



</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

22

–Cách 2: Sử dụng 1 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 là 0



S[1]=‘A’

 S=“TAN HOC”



T I N


0 1 2 3 4


H O C


5 6 7 8


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

23

Các thao tác trên 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)


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

24



VD sao chép chuỗi



void strcpy(char s1[], char s2[])
{


int i = 0;


while (s2[i] != ‘\0’)
{


s1[i] = s2[i];
i++;


}


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

25


VD sao chép chuỗi – viết lại



void strcpy(char s1[], char s2[])
{


int i = 0;


while (s1[i] = s2[i])
i++;


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

26



VD sao chép chuỗi – viết lại lần cuối



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++;


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

27


Ghép chuỗi – viết theo bản 2



void strcat(char s1[], char s2[])
{


int i = 0, j=0;


while (s1[i]) i++;


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

28

Đổi chuỗi thành số



int atoi(char *s)


{


int P = 0;
while (*s)


P = P*10 + *s++ -’0’;
return P;


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

29


So sánh 2 chuỗi



int strcmp(char *s1, char *s2)
{


while (*s1 == *s2 && *s1)
{


s1++;
s2++;
}


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

30


Trừu tượng hóa dữ liệu



• 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


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ý


– 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.


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

31


Ví dụ: Thiết kế kiểu tập hợp



#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;


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=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 ra khoi tap hop s
void loaipt(taphop s, int x)


{


unsigned char k = 1<<(x%8);
s[x/8] = s[x/8] & ~k;


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=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 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];
}


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

34

Ví dụ: Tìm các 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))


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35></div>

<!--links-->

×