Kiểu dữ liệu

52
TRẦN MINH THÁI 1

description

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ớ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ự = với Vc = { a-z, A-Z} - PowerPoint PPT Presentation

Transcript of Kiểu dữ liệu

Page 1: Kiểu dữ liệu

TRẦN MINH THÁI

1

Page 2: 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}*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 đó

2

Page 3: Kiểu dữ liệu

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.

3

Page 4: Kiểu dữ liệu

* Kiểu dữ liệu cơ bảnLà những kiểu dữ liệu đơn giản, không có cấu truc thường được các ngôn ngữ lập trinh cấp cao xây dựng săn như một thành phần của ngôn ngữ để giảm nhe công việc cho người lập trinh.* Kiểu có thư tự rời rac: số nguyên, ký tự* Kiểu có thư tự không rời rac: 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 truc, thường chi được sửe dụng làm nền để xây dựng các kiểu dữf liệu phưc tap khác.

4

Page 5: Kiểu dữ liệu

*Kiểu dữ liệu có cấu truc cơ bản *Mảng *Chuôi ký tự*Cấu truc

*Kiểu dữ liệu hướng giải quyết vấn đềNhững kiểu dữ liệu có cấu truc 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 truc dữ liệu cơ bản *Danh sách*Hàng đợi*Ngăn xếp *Cấu truc cây

5

Page 6: Kiểu dữ liệu

* Mảng thực chất là một biến được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần.

* Các thành phần của mảng là tập hợp các biến có cung kiểu dữ liệu và cung tên. Do đó để truy xuất các biến thành phần, ta dung cơ chế chi mục theo dang: tên mảng [chỉ số]

* Mảng có n phần tử thi chi số được tính từ 0 đến n-1

Giá trị

15 6 7 11 9 3 8 10 25

Chỉ số 0 1 2 3 4 5 6 7 8

6

Page 7: Kiểu dữ liệu

Cách 1: Con tro hăng*Cu 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};

Giá trị

11 11 11 11 11

Chỉ số 0 1 2 3 47

Page 8: Kiểu dữ liệu

Cách 2: Con tro*Y nghia: Khi ta khai báo một mảng với kiểu dữ liệu bất ki (int,

float, char,…) thi tên của mảng thực chất là một hăng địa chỉ cua phân tử đâu tiên.*Cú pháp:

< Kiểu dữ liệu > *< Tên mảng >;*Vi du :

int *p; // khai bao con tro pint 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 thi 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

8

Page 9: Kiểu dữ liệu

*Nhập / xuất

*Tim kiếm

*Sắp xếp

*Kiểm tra

*Đếm

*Thêm / xóa

*Tính tổng, giá trị trung binh, …

9

Page 10: Kiểu dữ liệu

*Cho mảng sau:

*Hãy trinh bày từng bước chèn 111 vào vị trí 3 của mảng

12 5 7 9 21 380 1 2 3 4 5

12 5 70 1 2 3 4 5

38219

111

10

Page 11: Kiểu dữ liệu

*Hãy viết hàm chèn phần tử có giá trị x vào vị trí k cho trước trong mảng a kích thước n theo mẫu sau:

void ChenX(int a[], int &n, int x, int k);

11

Page 12: Kiểu dữ liệu

Hãy viết hàm chèn phần tử có giá trị x vào sau phần tử có giá trị nho nhất có trong mảng a, kích thước n (giả sử mảng không có giá trị trung nhau)

12

Page 13: Kiểu dữ liệu

*Cho mảng sau:

*Hãy trinh bày từng bước xóa phần tử tai vị trí 3 trong mảng

12 5 7 9 21 380 1 2 3 4 5

12 5 7 90 1 2 3 4 5

21 38

13

Page 14: Kiểu dữ liệu

*Hãy viết hàm xóa phần tử tai vị trí k cho trước trong mảng a kích thước n theo mẫu sau:

void XoaTaiVTk(int a[], int &n, int k);

14

Page 15: Kiểu dữ liệu

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ị trung nhau)

15

Page 16: Kiểu dữ liệu

*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 tro hăng

char < Tên chuôi > [< Số ký tự tối đa>] ;

Vi du: char chuoi[25]; Ý nghia 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ự vi phân tử thư 25 đa chưa ký tự kết thúc chuôi ‘\0’ )

*Lưu ý: Chuôi ký tự được kết thuc 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’.

16

Page 17: Kiểu dữ liệu

*Ví dụ: Chuôi “NGUYEN VAN A” được lưu

*Cách 2: Con tro

char *< Tên chuôi >;

Ví dụ : char *chuoi;

Cấp phát bộ nhớ trước khi sử dụng chuôi

17

‘N’ ‘G’ ‘U’ ‘Y’ ‘E’ ‘N’ ‘ ‘ ‘V’ ‘A’ ‘N’ ‘ ‘ ‘A’ ‘\0’0 1 2 3 4 5 6 7 8 9 10 11 12

Page 18: Kiểu dữ liệu

*cin.getline(chuôi, số ký tự tối đa);

*Ví dụ:

char *str;

str = new char [30];

cin.getline(str, 30);

18

Page 19: Kiểu dữ liệu

*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 thi hàm se đ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’;19

Page 20: Kiểu dữ liệu

*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 va thương. Trả về:

0 : nếu s1 băng s2.

>0: nếu s1 lớn hơn s2.

<0: nếu s1 nho hơn s2.

int strcmp(char s1[],char s2[]); 20

Page 21: Kiểu dữ liệu

*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); 21

Page 22: Kiểu dữ liệu

*Tim 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 chi c: nếu tim thấy

char *strchr(char s[], char c);

*Tim 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 lai: Địa chi bắt đầu chuôi s2 trong s1

char *strstr(char s1[], char s2[]);

22

Page 23: Kiểu dữ liệu

*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ự con lai của s1 sau khi đã bo đi chuôi s2 xuất hiện trong s1.

*Nếu s2 không xuất hiện trong s1 thi kết quả chuôi tách vẫn là s1.

char *strtok(char s1[], char s2[]); 23

Page 24: Kiểu dữ liệu

24

*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?

Page 25: Kiểu dữ liệu

Cấu truc thực chất là một kiểu dữ liệu do người dung định nghia băng cách gom nhóm các kiểu dữ liệu cơ bản có săn trong C thành một kiểu dữ liệu phưc hợp nhiều thành phần

*Khai báo

struct tên_struct

{

khai báo các thuộc tính;

};

typedef struct tên_struct tên_kiểu;25

Page 26: Kiểu dữ liệu

*Ví dụ:

struct ttDate

{

char thu[5];

unsigned char ngay;

unsigned char thang;

int nam;

};

typedef struct ttDate DATE;26

Page 27: Kiểu dữ liệu

*Biến kiểu cấu truc

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 527

Page 28: Kiểu dữ liệu

*Biến con tro kiểu cấu truc

tên_kiểu *tên_biến_con_tro;

tên_biến_con_tro->tên_thuộc_tính;

Ví dụ:

DATE *x ; // khai bao bien x kieu con tro DATE

x -> ngay = 5 ; // gan ngay bang 528

Page 29: Kiểu dữ liệu

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

};29

Page 30: Kiểu dữ liệu

*Ví dụ:

struct ttNode

{

int key;

struct ttNode *pNext;

};30

Page 31: Kiểu dữ liệu

31

Ví dụ: Viết chương trinh nhâp vao toa đô hai điêm trong măt phăng va tinh tông hai toa đô nay

 

//File Khaibao.h

#include <iostream.h>

 

typedef struct DIEM

{

int x;

int y;

};

Page 32: Kiểu dữ liệu

32

//File caidat.cpp

#include "khaibao.h"

void Nhap (DIEM &d)

{

cout<<“\nNhap vao toa do diem\n”;

cout<<“Hoanh do : “;

cin>>d. x;

cout“Tung do : ”;

cin>>d.y;}

Page 33: Kiểu dữ liệu

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;

}

Page 34: Kiểu dữ liệu

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

}

Page 35: Kiểu dữ liệu

*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 truc).

*Cách truy cập phần tử trong mảng cung 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 truc nên phải chi đị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 cung có kiểu là dữ liệu cơ bản (xem lai bảng các kiểu dữ liệu cơ bản)

35

Page 36: Kiểu dữ liệu

Do kiểu dữ liệu có cấu truc thường chưa rất nhiều thành phần nên khi viết chương trinh loai này ta cần lưu ý:

*Xây dựng hàm xử lý cho một kiểu cấu truc.

*Muốn xử lý cho mảng cấu truc, ta goi lai hàm xử lý cho một kiểu cấu truc đã được xây dựng băng cách dung vong lặp.

36

Page 37: Kiểu dữ liệu

37

Viết hàm nhập vào mảng các phân số

struct ttPhanSo

{

int tu, mau;

};

typedef struct ttPhanSo PHANSO;

Page 38: Kiểu dữ liệu

38

void NhapPS(PHANSO &ps)

{

cout<<"Nhap tu so: ";

cin>>ps.tu;

cout<<"\nNhap mau so: ";

cin>>ps.mau;

}

Page 39: Kiểu dữ liệu

39

void NhapMangPS(PHANSO dsps[], int n)

{

for(int i=0; i<n; i++)

{

cout<<”\nNhap vao phan so thu "<< i<<”: “;

NhapPS(dsps[i]);

}

}

Page 40: Kiểu dữ liệu

Cách 1: Con tro hăng< KDL> < Tên mảng >[< Số dong 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ộtfloat b[10][10];//Khai báo ma trận kiểu float gồm 10 dòng 10 cột

Cách 2 : Con tro< Kiểu dữ liệu > **<Tên mảng>;*Ví dụ :

int **A ; // Khai báo ma trận kiểu intfloat **B ; // Khai báo ma trận kiểu float

40

Page 41: Kiểu dữ liệu

41

Để đơ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;

Page 42: Kiểu dữ liệu

Để truy xuất các thành phần của mảng hai chiều ta phải dựa vào chi số dong và chi số cột.

Cu pháp: tên_ma_trận[chỉ số dong][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;

42

Page 43: Kiểu dữ liệu

*Ma trận có số dong và số cột băng nhau

*Đường chéo chính: chi sô dong = chi sô côt

*Đương cheo phụ: chi sô côt + chi sô dong = kich thước - 1

43

Page 44: Kiểu dữ liệu

*Nhập/ xuất

*Tim kiếm

*Đếm

*Tính tổng/ trung binh

*Sắp xếp dong/ cột

*Xóa dong/ cột

*Chèn thêm dong/ cột

44

Page 45: Kiểu dữ liệu

45

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

Page 46: Kiểu dữ liệu

46

void NhapMT(matran a, int sd, int sc){

for(int i=0; i<sd; i++){

for(int j=0; j<sc; j++){

cout<<"Nhap gt ["<<i<<"]["<<j<<"]: ";cin>>a[i][j];

}}

}

Page 47: Kiểu dữ liệu

47

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;

}

}

Page 48: Kiểu dữ liệu

48

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

}

Page 49: Kiểu dữ liệu

49

Cho ma trận số nguyên a, viết các hàm:

*Xuất các phần tử lẻ

*Xuất các phần tử là số nguyên tố

*Xuất các phần tử có giá trị lớn hơn x

Page 50: Kiểu dữ liệu

50

Cho ma trận vuông số nguyên kích thước n, viết các hàm:

*Nhập ma trận

*Xuất ma trận

*Xuất các phần tử năm trên đường chéo chính

*Xuất các phần tử năm trên đường chéo phụ

Page 51: Kiểu dữ liệu

51

Cho ma trận số nguyên, viết các hàm:

*Tim phần tử lớn nhất

*Tim vị trí phần tử lớn nhất

*Tim vị trí xuất hiện của phần tử có giá trị x

*Tim dong có tổng lớn nhất

*Tim cột có giá trị nho nhất

Page 52: Kiểu dữ liệu

52

Cho ma trận số nguyên, viết các hàm:

*Xóa dong có chưa giá trị lớn nhất

*Xóa cột có chưa giá trị x