cấu trúc dữ liệu kiểu mảng là một kiểu dữ liệu có cấu trúc, bao gồm một tập hữu hạn các phần tử có cùng kiểu dữ liệu, có tên chung, được lưu trữ kế tiếp nhau trong bộ nhớ Kích thước của mảng được xác định ngay khi khai báo và là cố định Các phần tử trong mảng có tên chung là tên của mảng và được phân biệt với nhau thông qua chỉ số của chúng Mảng thường được dùng để lưu một dãy giá trị như: dãy số nguyên, dãy số thực, dãy kí tự, ma trận, …
BÀI GIẢNG HỌC PHẦN KỸ THUẬT LẬP TRÌNH CHƯƠNG 4: CÁC KIỂU DỮ LIỆU CÓ CẤU TRÚC Nội dung 4.1 Kiểu mảng 4.2 Kiểu xâu ký tự 4.3 Kiểu cấu trúc 4.1 Kiểu mảng • • • • Khái niệm mảng Khai báo sử dụng mảng Các thao tác mảng Một số chương trình với mảng Khái niệm mảng • Là kiểu liệu có cấu trúc, bao gồm tập hữu hạn phần tử có kiểu liệu, có tên chung, lưu trữ nhớ • Kích thước mảng xác định khai báo cố định • Các phần tử mảng có tên chung tên mảng phân biệt với thông qua số chúng • Mảng thường dùng để lưu dãy giá trị như: dãy số nguyên, dãy số thực, dãy kí tự, ma trận, … Khai báo sử dụng mảng (1) • Khai báo mảng: kiểu_dữ_liệu tên_mảng[N1][N2]…[Nn] đó: - kiểu_dữ_liệu: kiểu liệu phần tử mảng - tên_mảng: tên biến mảng - N1, N2, …, Nn: kích thước chiều mảng Số phần tử mảng: N1 * N2 * … * Nn • Ví dụ: - int a[10], b[20]; - float matran[10][20]; Khai báo sử dụng mảng (2) • Có thể sử dụng thị #define để xác định kích thước chiều mảng Ví dụ: #define N1 20 #define N2 30 int a[N1]; float b[N1][N2]; Khai báo sử dụng mảng (3) • Kết hợp khởi tạo giá trị khai báo mảng: - Khởi tạo giá trị cho phần tử mảng Ví dụ: int a[3] = {4,5,9}; float x[2][3] = {{2,1.5,3}, {1,3,4.25}}; - Khởi tạo giá trị cho số phần tử đầu mảng Ví dụ: int b[5] = {2,6,1}; - Khi khơng khai báo kích thước, kích thước mảng với số lượng giá trị khởi tạo Ví dụ: int c[] = {15,20,36,54}; Khai báo sử dụng mảng (4) • Khai báo kiểu mảng: - Cách 1: #define tên_mảng {giá_trị_1, …, giá_trị_n} Không truy cập vào phần tử mảng - Cách 2: const kiểu_dữ_liệu tên_mảng[N1] … [Nn] = {giá_trị_1, …, giá_trị_n} Ví dụ: const int hangmang1[4] = {10,20,25,40}; const float hangmang2[] = {4.5,9.25}; const float hangmang3[5] = {1.5,2,5}; Khai báo sử dụng mảng (5) • Lưu trữ liệu kiểu mảng: - Các phần tử mảng lưu trữ ô nhớ nhớ - Kích thước nhớ lưu trữ: N1 * N2 * … * Nn * sizeof(kiểu_dữ_liệu) - Các phần tử mảng đánh số, phần tử có số 0, phần tử thứ i có số i-1 - Biến mảng lưu trữ địa ô nhớ vùng nhớ cấp phát Khai báo sử dụng mảng (6) • Sử dụng mảng: - Cú pháp truy cập vào phần tử mảng: tên_mảng[chỉ_số_1][chỉ_số_2] … [chỉ_số_n] - Ví dụ: int a[4]; Các truy cập hợp lệ: a[0], a[1], a[2], a[3] Các truy cập không hợp lệ: a[-2], a[-1], a[4], a[5], … 10 Ví dụ (1) Chương trình làm việc với ký tự/xâu ký tự: #include #include #include int main(void) { char c, s[30]; printf("Nhap ky tu c: ");scanf("%c",&c); if(isalpha(c)) { if(isupper(c)) printf("Ky tu vua nhap la ky tu in hoa '%c', ky tu in thuong tuong ung la '%c'!",c,tolower(c)); else printf("Ky tu vua nhap la ky tu in thuong '%c', ky tu in hoa tuong ung la '%c'!",c,toupper(c)); } 31 Ví dụ (2) Chương trình làm việc với ký tự/xâu ký tự (tiếp): else if(isdigit(c)) printf("Ky tu vua nhap la ky tu so '%c'!",c); fflush(stdin); printf("\nNhap xau ky tu s: ");gets(s); printf("Do dai thuc cua xau la %d",strlen(s)); printf("\nXau chu in hoa tuong ung la: %s",strupr(s)); printf("\nXau chu in thuong tuong ung la: %s",strlwr(s)); printf("\nXau dao tuong ung la: %s",strrev(s)); return 0; } 32 Một số chương trình với xâu ký tự • Viết chương trình cho phép người dùng nhập vào xâu ký tự s, đếm số ký tự 'A' 'a' có mặt s, thay ký tự ký tự 'B' đưa xâu hình • Viết chương trình cho phép người dùng nhập vào xâu ký tự s Xây dựng xâu s1 gồm toàn ký tự chữ, s2 gồm tồn ký tự số có s, thơng báo kết hình 33 4.3 Kiểu cấu trúc • • • • • Định nghĩa kiểu cấu trúc Khai báo biến cấu trúc Truy nhập đến thành phần cấu trúc Mảng cấu trúc Phép gán cấu trúc 34 Định nghĩa kiểu cấu trúc • Cú pháp: struct tên_kiểu_cấu_trúc { khai_báo_các_thành_phần_trong_cấu_trúc; }; Trong đó: - Việc khai báo thành phần tuân theo quy tắc khai báo biến thông thường (tên_kiểu tên_thành_phần;) - Kiểu liệu thành phần kiểu (nguyên, thực, ký tự, mảng, xâu hay kiểu cấu trúc) Ví dụ: struct ngaythang {int ngay; int thang; int nam;}; 35 Khai báo biến cấu trúc (1) • Cú pháp: struct tên_kiểu_cấu_trúc tên_biến_cấu_trúc; Ví dụ: struct ngaythang ngaysinh; • Khi có nhiều biến kiểu cấu trúc, khai báo gộp với tên biến viết ngăn cách dấu , Ví dụ: struct ngaythang ngaydi, ngayden; • Có thể kết hợp khai báo khởi tạo giá trị cho biến cấu trúc Ví dụ: struct ngaythang ngaysinh = {12,10,1988}; 36 Khai báo biến cấu trúc (2) • Có thể kết hợp việc định nghĩa kiểu cấu trúc với khai báo biến cấu trúc theo cú pháp: struct tên_kiểu_cấu_trúc { khai_báo_các_thành_phần_trong_cấu_trúc; } tên_biến_cấu_trúc1, tên_biến_cấu_trúc2, …; Ví dụ: struct ngaythang {int ngay; int thang; int nam;} ngaydi,ngayden; 37 Khai báo biến cấu trúc (3) • Có thể sử dụng cú pháp sau để khai báo biến cấu trúc: (bỏ tên_kiểu_cấu_trúc) struct { khai_báo_các_thành_phần_trong_cấu_trúc; } tên_biến_cấu_trúc1, tên_biến_cấu_trúc2, …; Chỉ khai báo biến cấu trúc, không định nghĩa kiểu cấu trúc Ví dụ: struct {int ngay; int thang; int nam;} ngaydi,ngayden; 38 Lưu ý • Có thể sử dụng cú pháp typedef để định nghĩa kiểu cấu trúc: typedef struct { khai_báo_các_thành_phần_trong_cấu_trúc; } tên_kiểu_cấu_trúc; Khi đó, cú pháp khai báo biến cấu trúc là: tên_kiểu_cấu_trúc tên_biến_cấu_trúc; Ví dụ: typedef struct {int ngay; int thang; int nam;} ngaythang; Khai báo biến ngaysinh: ngaythang ngaysinh; 39 Truy nhập đến thành phần cấu trúc • Cú pháp: tên_cấu_trúc.tên_thành_phần Ví dụ: printf("%d",ngaysinh.ngay); ngaydi.ngay = ngayden.ngay+2; ngaydi.thang = 12; … 40 Mảng cấu trúc • Có thể khai báo mảng gồm phần tử thuộc kiểu cấu trúc định nghĩa trước Ví dụ: struct ngaythang ngaythuephong[10]; ngaythuephong mảng có 10 phần tử Mỗi phần tử cấu trúc kiểu ngaythang • Lưu ý: Khi nhập liệu cho phần tử mảng cấu trúc, cần nhập liệu cho thành phần cấu trúc 41 Phép gán cấu trúc (1) • Khi biến cấu trúc phần tử mảng cấu trúc kiểu với nhau, thực phép gán giá trị: - Gán giá trị biến cấu trúc cho biến cấu trúc khác - Gán giá trị biến cấu trúc cho phần tử mảng cấu trúc ngược lại - Gán giá trị phần tử mảng cấu trúc cho phần tử mảng cấu trúc khác Mỗi phép gán cấu trúc tương đương với dãy phép gán thành phần tương ứng cho 42 Phép gán cấu trúc (2) • Ví dụ: Khai báo: struct ngaythang ngay1,ngay2,ngaythue [10],ngaytra[10]; Các phép gán sau hợp lệ: ngay1 = ngay2; ngaythue[0] = ngay1; ngay2 = ngaytra[0]; ngaythue[0] = ngaytra[0]; 43 Ví dụ (1) • Chương trình nhập/hiển thị danh sách n cán bộ: #include int main(void) { struct canbo { char macb[6]; char hoten[30]; char mapb[6]; }; struct canbo dscb[50]; int i,n; printf("Nhap so can bo n = ");scanf("%d",&n); 44 Ví dụ (2) } for(i=0;i