Tài liệu Bài giảng Lập trình C - Chương 4: Các kiểu dữ liệu: CHƢƠNG 4
CÁC KIỂU DỮ LIỆU
Kiểu dữ liệu
2
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à một đối tượng 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}
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 = 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 đó
Kiểu dữ liệu
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.
Các loại kiểu dữ liệu
4
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ậ...
38 trang |
Chia sẻ: honghanh66 | Lượt xem: 1187 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Lập trình C - Chương 4: Các kiểu dữ liệu, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
CHƢƠNG 4
CÁC KIỂU DỮ LIỆU
Kiểu dữ liệu
2
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à một đối tượng 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}
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 = 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 đó
Kiểu dữ liệu
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.
Các loại kiểu dữ liệu
4
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.
Kiểu dữ liệu
5
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
Nếu dữ liệu đƣợc xữ lý theo thứ tự nhập thì hàng đợi đƣợc sử
dụng. Tƣơng tự nếu dữ liệu cần xữ lý theo thứ tự ngƣợc với thứ
tự nhập (tức nhập sau cùng xữ lý trƣớc) có thể dùng ngăn xếp,
Vì thế cấu trúc dữ liệu hƣớng vấn đề đƣợc xác định bởi thuật
toán tƣơng ứng.
Mảng 1 chiều
6
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ó
cùng kiểu dữ liệu và cùng tên. Do đó để truy xuất
các biến thành phần, ta dùng cơ chế chỉ mục.
Khai báo mảng
7
Cách 1: Con trỏ hằng
Cú pháp:
[] ;
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:
[] = {Giá trị};
Ví dụ: int a[5] = {0};
Khai báo mảng
8
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:
*;
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: new
Giải phóng delete
Các thao tác
9
Nhập / xuất
Tìm kiếm
Sắp xếp
Tăng dần, giảm dần
Số lẻ tăng (giảm) dần
Kiểm tra
Đếm
Phần tử x, Số nguyên tố, Mảng con tăng (giảm)
Thêm / xóa
Tính tổng, giá trị trung bình,
Bài tập thực hành
10
18. Viết hàm sắp xếp các phần tử lẻ tăng dần.
19. Viết hàm sắp xếp các phần tử tại vị trí lẻ tăng dần.
20. Viết hàm xoá phần tử tại vị trí lẻ trong mảng.
21. Viết hàm xoá phần tử có giá trị lớn nhất trong mảng.
22. Nhập vào giá trị X. Viết hàm xoá tất cả các phần tử có giá trị nhỏ hơn X.
23. Nhập vào giá trị X. Viết hàm xoá phần tử có giá trị gần X nhất.
24. Viết hàm loại bỏ tất cả các phần tử có giá trị trùng nhau (chỉ giữ lại một phần
tử trong số các phần tử trùng)
25. Viết hàm chèn phần tử có giá trị X vào vị trí đầu tiên của mảng.
26. Viết hàm chèn phần tử có giá trị X vào phía sau phần tử có giá trị lớn nhất
trong mảng.
27. Viết hàm chèn phần tử có giá trị X vào trƣớc phần tử có giá trị là số nguyên tố
đầu tiên trong mảng.
Chuỗi ký tự
11
Chuỗi ký tự 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 [ ] ;
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’.
Khai báo
12
Cách 2: Con trỏ
char *;
Ví dụ : char *chuoi;
Nhập
13
cin.getline(chuoi, số ký tự tối đa);
Ví dụ:
char *str;
str = new char [30];
cin.getline(str, 30);
Các hàm thƣ viện –
14
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);
Các hàm thƣ viện – (tt)
15
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[]);
Các hàm thƣ viện – (tt)
16
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);
Các hàm thƣ viện – (tt)
17
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[]);
Các hàm thƣ viện – (tt)
18
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[]);
Bài tập
19
28. Đếm có bao nhiêu khoảng trắng trong chuỗi.
29. Nhập vào một chuỗi, hãy loại bỏ những khoảng
trắng thừa trong chuỗi.
30. Nhập vào hai chuỗi s1 và s2, nối chuỗi s2 vào s1.
Xuất chuỗi s1 ra màn hình.
31. Đổi tất cả các ký tự có trong chuỗi thành chữ
thƣờng (không dùng hàm strlwr).
32. Đổi tất cả các ký tự trong chuỗi sang chữ in hoa
(không dùng hàm struppr).
33. Viết chƣơng trình đổi những ký tự đầu tiên của mỗi
từ thành chữ in hoa.
Kiểu dữ liệu có cấu trúc
20
Cấu trúc thực chất là một kiểu dƣ̃ liệu do ngƣời dùng định nghĩa 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;
Ví dụ:
struct ttDate
{
char thu[5];
unsigned char ngay;
unsigned char thang;
int nam;
};
typedef struct ttDate DATE;
Truy cập các thuộc tính cấu trúc
21
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
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
22
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;
};
Ví dụ:
struct ttNode
{
int key;
struct ttNode *pNext;
};
Bài tập
23
55. Viết chƣơng trình sử dụng kiểu dữ liệu cấu trúc để hiển thị giờ, phút,
giây ra màn hình.
Tính khoảng cách giữa 2 mốc thời gian và so sánh 2 mốc thời gian và
cho biết kết quả.
56. Viết chƣơng trình sử dụng kiểu dữ liệu cấu trúc thể hiện ngày, tháng,
năm ra màn hình.
Tính khoảng cách giữa 2 ngày và so sánh 2 ngày và cho biết kết quả.
57. Viết chƣơng trình khai báo kiểu dữ liệu để biểu diễn một phân số. Hãy
viết hàm thực hiện những công việc sau:
Tính tổng, hiệu, tích, thƣơng hai phân số.
Rút gọn phân số.
Qui đồng hai phân số.
So sánh hai phân số.
Mảng cấu trúc
24
Cách khai báo tƣơng tự nhƣ mảng một chiều hay ma
trận (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 hay ma trận. 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)
Nguyên tắc lập trình trên mảng cấu trúc
25
Do kiểu dƣ̃ liệu có cấu trúc thƣờng chứa rất nhiều thành
phần nên khi viết chƣơng trình loại này ta cần lƣu ý:
Xây dựng hàm xƣ̉ ly ́ cho một kiểu cấu trúc.
Muốn xƣ̉ lý cho mảng cấu trúc, ta gọi lại hàm xƣ̉ ly ́
cho một kiểu cấu trúc đã đƣợc xây dựng bằng cách
dùng vòng lặp.
Mảng 2 chiều
26
Mảng hai chiều thực chất là mảng một chiều trong đó
mỗi phần tử của mảng là một mảng một chiều, và đƣợc
truy xuất bởi hai chỉ số dòng và cột.
Từ khái niệm trên ta có thể đƣa ra một khái niệm về
mảng nhiều chiều nhƣ sau: mảng có từ hai chiều trở
lên gọi là mảng nhiều chiều.
Khai báo
27
Cách 1: Con trỏ hằng
[][];
Ví dụ:
int A[10][10]; // Khai báo mảng 2 chiều kiểu int gồm 10 dòng, 10 cột
float b[10][10]; // Khai báo mảng 2 chiều kiểu float gồm 10 dòng, 10 cột
Cách 2 : Con trỏ
**;
Ví dụ :
int **A ; // Khai báo mảng động 2 chiều kiểu int
float **B ; // Khai báo mảng động 2 chiều kiểu float
Truy xuất
28
Để 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.
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;
Các thao tác
29
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
1. Nhập/xuất ma trận
30
void NhapMT(int a[][MAX], int dong, int cot)
{ for(int i=0;i<dong;i++) {
for(int j=0;j<cot;j++) {
cout<<"Nhap phan tu thu a["<<i<<"]["<<j<<"]";
cin>>a[i][j];
}
}
}
void XuatMT(int a[][MAX], int dong, int cot)
{ for(int i=0;i<dong;i++)
{ for(int j=0;j<cot;j++)
cout<<a[i][j]<<" ";
cout<<"\n";
}
}
2. Tìm kiếm
31
int PhanTuMax(int a[][MAX], int dong, int cot)
{
int max=a[0][0];
for(int i=0;i<dong;i++)
for(int j=0;j<cot;j++)
if(a[i][j]>max)
max=a[i][j];
return max;
}
Tìm phần tử có giá trị lớn nhất trong ma trận
3. Đếm
32
int DemPTAm(int a[][MAX], int dong, int cot)
{
int dem=0;
for(int i=0;i<dong;i++)
for(int j=0;j<cot;j++)
if(a[i][j]<0)
dem++;
return dem;
}
VD: đếm số lượng phần tử âm trong ma trận
4. Tính tổng/ trung bình
33
int TongPTLe(int a[][MAX], int dong, int cot)
{
int tong=0;
for(int i=0;i<dong;i++)
for(int j=0;j<cot;j++)
if(a[i][j]%2!=0)
tong=tong+a[i][j];
return tong;
}
VD: Tính tổng các phần tử lẻ
BÀI TẬP - IN
34
1. Viết hàm nhập ma trận các số nguyên dƣơng (nhập sai
báo lỗi và không cho nhập).
2. Viết chƣơng trình in ra các phần tử nằm trên 2 đƣờng
chéo.
3. Viết hàm in ra các phần tử nằm phía trên đƣờng chéo phụ
của ma trận vuông các số nguyên.
4. Viết hàm in ra các phần tử nằm phía dƣới đƣờng chéo
phụ của ma trận vuông các số nguyên.
5. Viết hàm in ra các phần tử nằm phía trên đƣờng chéo
chính của ma trận vuông các số nguyên.
6. Viết hàm in ra các phần tử nằm phía dƣới đƣờng chéo
chính của ma trận vuông các số nguyên.
BÀI TẬP – TÌM - TỔNG – ĐẾM
35
9. Viết hàm tính tổng các phần tử trên cùng một dòng.
10. Viết hàm tính tổng các phần tử nằm trên đƣờng chéo chính của
ma trận vuông.
11. Viết hàm tính giá trị trung bình của các phần tử nhỏ nhất trên mỗi
cột.
12. Viết hàm tìm vị trí phần tử lớn nhất trong ma trận các số nguyên.
13. Viết hàm tìm vị trí phần tử chẵn cuối cùng trong ma trận các số
nguyên.
14. Viết hàm tìm phần tử chẵn dƣơng và nhỏ nhất trong ma trận.
15. Viết hàm tìm dòng có tổng lớn nhất trong ma trận các số thực.
16. Viết hàm đếm các giá trị nhỏ hơn x trong ma trận các số thực.
17. Viết hàm đếm các giá trị âm, dƣơng trong ma trận các số thực.
Ma trận vuông
36
Đƣờ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
Đƣờng chéo Ma trận vuông
37
38
Các file đính kèm theo tài liệu này:
- chuong_4_cac_kieu_du_lieu_9766.pdf