1 / 52

Kiểu dữ liệu

Kiểu dữ liệu. TRẦN MINH THÁI. Kiểu dữ liệu. Kiểu dữ liệu T được xác định bởi một bộ <V,O> , với : V : tập các giá trị hợp lệ mà kiểu T có thể lưu trữ O : tập các thao tác xử lý có thể thi hành trên đối tượng kiểu T Ví du 1: Giả sử có kiểu dữ liệu mẫu tự = <Vc ,Oc> với Vc = { a-z, A-Z}

paniz
Download Presentation

Kiểu dữ liệu

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Kiểudữliệu TRẦN MINH THÁI

  2. Kiểudữliệu • Kiểu dữ liệu T được xác định bởi một bộ <V,O> , với : • V : tập các giá trị hợp lệ mà kiểu T có thể lưu trữ • O : tập các thao tác xử lý có thể thi hành trên đối tượng kiểu T • Ví du 1: Giả sử có kiểu dữ liệu mẫu tự = <Vc ,Oc> với • Vc = { a-z, A-Z} • Oc = {lấy mã ASCII của ký tự, biến đổi ký tự thường thành ký tự hoa, …} • Ví dụ 2: Giả sử có kiểu dữ liệu số nguyên = <Vi ,Oi> với • Vi = { -32768..32767} • Oi = { +, -, *, /, %} • Như vậy, muốn sử dụng một kiểu dữ liệu cần nắm vững cả nội dung dữ liệu được phép lưu trữ và các xử lý tác động trên đó

  3. Các thuộc tính của 1 KDL bao gồm: • Tên KDL. • Miền giá trị. • Kích thước lưu trữ. • Tập các toán tử tác động lên KDL.

  4. Cácloạikiểudữliệu • Kiểu dữ liệu cơ bản Là những kiểu dữ liệu đơn giản, không có cấu trúc thường được các ngôn ngữ lập trình cấp cao xây dựng sẵn như một thành phần của ngôn ngữ để giảm nhẹ công việc cho người lập trình. • Kiểu có thứ tự rời rạc: số nguyên, ký tự • Kiểu có thứ tự không rời rạc: số thực. Các kiểu cơ sở rất đơn giản và không thể hiện rõ sự tổ chức dữ liệu trong một cấu trúc, thường chỉ được sử̉ dụng làm nền để xây dựng các kiểu dữ̃ liệu phức tạp khác.

  5. Các loại kiểu dữ liệu • Kiểu dữ liệu có cấu trúc cơ bản • Mảng • Chuỗi ký tự • Cấu trúc • Kiểu dữ liệu hướng giải quyết vấn đề Những kiểu dữ liệu có cấu trúc hướng tới vấn đề cần giải quyết được xây dựng bằng cách kết nối các cấu trúc dữ liệu cơ bản • Danh sách • Hàng đợi • Ngăn xếp • Cấu trúc cây

  6. Mảng 1 chiều • Mảngthựcchất là mộtbiếnđượccấpphátbộ nhớ liêntụcvà baogồmnhiềubiếnthànhphần. • Cácthànhphầncủamảng là tậphợpcácbiến có cùngkiểudữ liệuvà cùngtên. Do đó để truyxuấtcácbiếnthànhphần, ta dùngcơchế chỉ mụctheodạng: tênmảng [chỉsố] • Mảngcón phầntửthìchỉsốđượctínhtừ0 đến n-1

  7. Khai báo mảng Cách 1: Con trỏ hằng • Cú pháp: <Kiểu dữ liệu> <Tên mảng> [<Số phần tử tối đa>] ; • Ví dụ: int a[100]; //Khai bao mang so nguyen a gom 100 phan tu float b[50]; //Khai bao mang so thuc b gom 50 phan tu • Khởi gán giá trị ban đầu cho mảng: <Kiểu dữ liệu> <Tên mảng> [<Kích thước>] = {Giá trị}; Ví dụ: int a[5] = {11};

  8. Khaibáomảng Cách 2: Con trỏ • Ý nghĩa: Khi ta khai báo một mảng với kiểu dữ liệu bất kì (int, float, char,…) thì tên của mảng thực chất là một hằng địa chỉ của phần tử đầu tiên. • Cú pháp: < Kiểu dữ liệu > *< Tên mảng >; • Ví dụ : int *p; // khai bao con tro p int b[100]; p = new int [100]; p = b; // p tro vao phan tu 0 cua mang b • Với cách viết như trên thì ta có thể hiểu các cách viết sau là tương đương : p[i]  *(p + i)  b[i]  *(b+i) • Cấp phát bộ nhớ: new • Giải phóng bộ nhớ: delete

  9. Các thao tác • Nhập / xuất • Tìm kiếm • Sắp xếp • Kiểm tra • Đếm • Thêm / xóa • Tính tổng, giá trị trung bình, …

  10. Chènphầntửvàomảng • Cho mảng sau: • Hãy trình bày từng bước chèn 111 vào vị trí 3 của mảng 111 9 21 38

  11. Chènphầntửvàomảng • Hãyviếthàmchènphầntửcógiátrịx vàovịtrí k chotrướctrongmảng a kíchthước n theomẫusau: void ChenX(int a[], int &n, int x, int k);

  12. Bàitậpápdụng Hãy viết hàm chèn phần tử có giá trị x vào sau phần tử có giá trị nhỏ nhất có trong mảng a, kích thước n (giả sử mảng không có giá trị trùng nhau)

  13. Xóaphầntửkhỏimảng • Cho mảng sau: • Hãy trình bày từng bước xóa phần tử tại vị trí 3 trong mảng 21 38

  14. Xóaphầntửkhỏimảng • Hãyviếthàmxóaphầntửtạivịtrí k chotrướctrongmảng a kíchthước n theomẫusau: void XoaTaiVTk(int a[], int &n, int k);

  15. Bàitậpápdụng Hãy viết hàm xóa phần tử x (nếu có) trong mảng a, kích thước n (giả sử mảng không có giá trị trùng nhau)

  16. Chuỗi ký tự • Chuỗi ký tự là trường hợp đặc biệt của mảng 1 chiều, là một dãy các phần tử, mỗi phần tử có kiểu ký tự • Khai báo: • Cách 1: Con trỏ hằng char < Tên chuỗi > [< Số ký tự tối đa>] ; Ví dụ: char chuoi[25]; Ý nghĩa khai báo 1 mảng kiểu ký tự tên là chuoi có 25 phần tử (như vậy tối đa ta có thể nhập 24 ký tự vì phần tử thứ 25 đã chứa ký tự kết thúc chuỗi ‘\0’ ) • Lưu ý: Chuỗi ký tự được kết thúc bằng ký tự ‘\0’. Do đó khi khai báo độ dài của chuỗi luôn luôn khai báo dư 1 phần tử để chứa ký tự ‘\0’.

  17. Khai báo • Ví dụ: Chuỗi “NGUYEN VAN A”được lưu • Cách 2: Con trỏ char *< Tên chuỗi >; Ví dụ :char *chuoi; Cấp phát bộ nhớ trước khi sử dụng chuỗi

  18. Nhậpchuỗi • cin.getline(chuỗi, số ký tự tối đa); • Ví dụ: char *str; str = new char [30]; cin.getline(str, 30);

  19. Cáchàmthưviện <string.h> • Tính độ dài của chuỗi s int strlen(char s[]); • Sao chép nội dung chuỗi nguồn vào chuỗi đích strcpy(char đích[], char nguồn[]); • Chép n ký tự từ chuỗi nguồn sang chuỗi đích. Nếu chiều dài nguồn < n thì hàm sẽ điền khoảng trắng cho đủ n ký tự vào đích strncpy(char đích[], char nguồn[], int n); *** phải có: đích[n]=‘\0’;

  20. Nối chuỗi s2 vài chuỗi s1 strcat(char s1[],char s2[]); • Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1 strncat(char s1[],char s2[],int n); • So sánh 2 chuỗi s1 và s2 theo nguyên tắc thứ tự từ điển. Phân biệt chữ hoa và thường. Trả về: 0 : nếu s1 bằng s2. >0: nếu s1 lớn hơn s2. <0: nếu s1 nhỏ hơn s2. int strcmp(char s1[],char s2[]);

  21. So sánh n ký tự đầu tiên của s1 và s2, giá trị trả về tương tự hàm strcmp() int strncmp(char s1[],char s2[], int n); • So sánh chuỗi s1 và s2 nhưng không phân biệt hoa thường, giá trị trả về tương tự hàm strcmp() int stricmp(char s1[],char s2[]); • So sánh n ký tự đầu tiên của s1 và s2 nhưng không phân biệt hoa thường, giá trị trả về tương tự hàm strcmp() int strnicmp(char s1[],char s2[], int n);

  22. Tìm sự xuất hiện đầu tiên của ký tư c trong chuỗi s. Trả về: NULL: nếu không có Địa chỉ c: nếu tìm thấy char *strchr(char s[], char c); • Tìm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1. Trả về: NULL: nếu không có Ngược lại: Địa chỉ bắt đầu chuỗi s2 trong s1 char *strstr(char s1[], char s2[]);

  23. Tách chuỗi: • Nếu s2 có xuất hiện trong s1: Tách chuỗi s1 thành hai chuỗi: Chuỗi đầu là những ký tự cho đến khi gặp chuỗi s2 đầu tiên, chuỗi sau là những ký tự còn lại của s1 sau khi đã bỏ đi chuỗi s2 xuất hiện trong s1. • Nếu s2 không xuất hiện trong s1 thì kết quả chuỗi tách vẫn là s1. char *strtok(char s1[], char s2[]);

  24. BÀI TẬP • Viết hàm kiểm tra xem chuỗi có đối xứng hay không?. • Viết hàm kiểm tra xem chuỗi có tuần hoàn hay không?

  25. Kiểu dữ liệu có cấu trúc Cấutrúcthựcchất là mộtkiểudữ liệu do ngườidùngđịnhnghĩabằngcáchgomnhómcáckiểudữ liệucơbản có sẵntrong C thànhmộtkiểudữ liệuphứchợpnhiềuthànhphần • Khaibáo structtên_struct { khaibáocácthuộctính; }; typedefstructtên_structtên_kiểu;

  26. Kiểu dữ liệu có cấu trúc • Ví dụ: structttDate { char thu[5]; unsigned char ngay; unsigned char thang; intnam; }; typedefstructttDate DATE;

  27. Truy cập các thuộc tính cấu trúc • Biến kiểu cấu trúc tên_kiểu tên_biến; tên_biến.tên_thuộc_tính; Ví dụ: DATE x ; // khai bao bien x kieu DATE x.ngay = 5 ; // gan ngay bang 5

  28. Truy cập các thuộc tính cấu trúc • Biến con trỏ kiểu cấu trúc tên_kiểu *tên_biến_con_trỏ; tên_biến_con_trỏ->tên_thuộc_tính; Ví dụ: DATE *x ; // khai bao bien x kieu con tro DATE x -> ngay = 5 ; // gan ngay bang 5

  29. Khai báo đệ qui struct tên_struct { khai báo các thuộc tính; struct tên_struct *tên_thuộc_tính_đệ_qui; };

  30. Ví dụ: struct ttNode { int key; struct ttNode *pNext; };

  31. Vídụ: Viếtchươngtrìnhnhậpvàotoạ độ haiđiểmtrongmặtphẳngvà tínhtổnghaitoạ độ này //File Khaibao.h #include <iostream.h> typedefstructDIEM { int x; int y; };

  32. //File caidat.cpp #include "khaibao.h" void Nhap (DIEM &d) { cout<<“\nNhapvaotoa do diem\n”; cout<<“Hoanhdo : “; cin>>d. x; cout“Tung do : ”; cin>>d.y; }

  33. void Xuat (DIEM d) { cout<<“\nToa do diem : (“ <<d.x<< “,”<<d.y<<”)”; } DIEM Tong (DIEM d1,DIEM d2) { DIEM temp; temp.x = d1.x + d2.x ; temp.y = d1.y + d2.y ; return temp; }

  34. //File main.cpp #include”khaibao.h” void main () { DIEM A , B, AB; //khai bao 3 diem A, B, AB; Nhap ( A ); Xuat ( A ); Nhap ( B ); Xuat ( B ); cout<<“\n Tong cua hai diem vua nhap la : ”; AB = Tong ( A, B); Xuat ( AB ); }

  35. Mảng cấu trúc • Cách khai báo tương tự như mảng một chiều (Kiểu dữ liệu bây giờ là kiểu dữ liệu có cấu trúc). • Cách truy cập phần tử trong mảng cũng như truy cập trên mảng một chiều. Nhưng do từng phần tử có kiểu cấu trúc nên phải chỉ định rõ cần lấy thành phần nào, tức là phải truy cập đến thành phần cuối cùng có kiểu là dữ liệu cơ bản (xem lại bảng các kiểu dữ liệu cơ bản)

  36. Nguyêntắclậptrìnhtrênmảngcấutrúc Do kiểudữ liệu có cấutrúcthườngchứarấtnhiềuthànhphầnnênkhiviếtchươngtrìnhloạinàytacầnlưu ý: • Xâydựnghàmxử lý chomộtkiểucấutrúc. • Muốnxử lý chomảngcấutrúc, tagọilạihàmxử lý chomộtkiểucấutrúcđã đượcxâydựngbằngcáchdùngvònglặp.

  37. Vídụ Viết hàm nhập vào mảng các phân số struct ttPhanSo { int tu, mau; }; typedef struct ttPhanSo PHANSO;

  38. Vídụ void NhapPS(PHANSO &ps) { cout<<"Nhap tu so: "; cin>>ps.tu; cout<<"\nNhap mau so: "; cin>>ps.mau; }

  39. Vídụ voidNhapMangPS(PHANSO dsps[], intn) { for(inti=0; i<n; i++) { cout<<”\nNhapvaophan so thu "<< i<<”: “; NhapPS(dsps[i]); } }

  40. Ma trận Cách 1: Con trỏ hằng < KDL> < Tên mảng >[< Số dòng tối đa>][<Số cột tối đa>]; • Ví dụ: int A[10][10]; //Khai báo ma trận kiểu int gồm 10 dòng, 10 cột float b[10][10];//Khai báo ma trận kiểu float gồm 10 dòng 10 cột Cách 2 : Con trỏ < Kiểu dữ liệu > **<Tên mảng>; • Ví dụ : int **A ; // Khai báo ma trận kiểu int float **B ; // Khai báo ma trận kiểu float

  41. Địnhnghĩakiễudữliệu Để đơn giản trong việc khai báo ma trận: #define MAX 100 typedef <kiểu dữ liệu> matran[MAX][MAX]; Ví dụ: Khai báo ma trận các số nguyên a #define MAX 100 typedef int matran[MAX][MAX]; matran a;

  42. Truy xuất Để truy xuất các thành phần của mảng hai chiều ta phải dựa vào chỉ số dòng và chỉ số cột. Cú pháp: tên_ma_trận[chỉ số dòng][chỉ số cột] • Ví dụ: int A[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} }; Với các khai báo như trên ta có: A[0][0] = 2; A[0][1] = 3; A[1][1] = 6; A[1][3] = 6;

  43. Ma trận vuông • Ma trận có số dòng và số cột bằng nhau • Đường chéo chính: chỉ số dòng = chỉ số cột • Đường chéo phụ: chỉ số cột + chỉ số dòng = kích thước - 1

  44. Các thao tác • Nhập/ xuất • Tìm kiếm • Đếm • Tính tổng/ trung bình • Sắp xếp dòng/ cột • Xóa dòng/ cột • Chèn thêm dòng/ cột

  45. Nhập/xuất ma trậnsốnguyên Khai báo #define MAX 100 typedef int matran[MAX][MAX]; void NhapMT(matran a, int sd, int sc); void XuatMT(matran a, int sd, int sc);

  46. Nhập/xuất ma trậnsốnguyên void NhapMT(matran a, intsd, intsc) { for(inti=0; i<sd; i++) { for(intj=0; j<sc; j++) { cout<<"Nhapgt ["<<i<<"]["<<j<<"]: "; cin>>a[i][j]; } } }

  47. Nhập/xuất ma trậnsốnguyên void XuatMT(matran a, int sd, int sc) { for(int i=0; i<sd; i++) { for(int j=0; j<sc; j++) { cout<<a[i][j]<<"\t"; } cout<<endl; } }

  48. Nhập/xuất ma trậnsốnguyên void main() { matran a; int sd, sc; cout<<"Nhap so dong cua ma tran: "; cin>>sd; cout<<"Nhap so cot cua ma tran: "; cin>>sc; NhapMT(a, sd, sc); XuatMT(a, sd, sc); }

  49. Bàitậpnhập/xuất Cho ma trậnsốnguyên a, viếtcáchàm: • Xuấtcácphầntửlẻ • Xuấtcácphầntửlàsốnguyêntố • Xuấtcácphầntửcógiátrịlớnhơn x

  50. Bàitậpnhập/xuất Cho ma trậnvuôngsốnguyênkíchthước n, viếtcáchàm: • Nhập ma trận • Xuất ma trận • Xuấtcácphầntửnằmtrênđườngchéochính • Xuấtcácphầntửnằmtrênđườngchéophụ

More Related