Bài giảng Kỹ thuật lập trình: Bài 5 do TS. Ngô Hữu Dũng biên soạn cung cấp cho người học các kiến thức: Khái niệm kiểu cấu trúc, khai báo cấu trúc, khai báo cấu trúc và biến, khai báo – Nhiều biến cấu trúc, không cần thẻ cấu trúc, cấu trúc trong cấu trúc, mảng trong cấu trúc,...
Trang 1Kỹ thuật lập trình
Bài 5 – Kiểu cấu trúc
Ts Ngô Hữu Dũng
Trang 2Khái niệm
Kiểu cấu trúc: Nhóm các phần tử không đồng nhất với nhau
Ví dụ 1: Một ngày được lưu trong 3 biến riêng biệt
int day = 28, month = 8, year = 2016;
Vậy mỗi ngày ta phải dùng 3 biến riêng biệt để lưu trữ
Ví dụ 2: Một sinh viên gồm nhiều thông tin liên quan
char fullname[50]; date birthday; int height; int weight;
Kiểu cấu trúc: Nhóm các phần tử với nhau trong một biến student
Trang 3Khai báo cấu trúc
1 struct t_date{ // Khai báo kiểu cấu trúc
5 };
6 struct t_date birthday, today; // Khai báo biến
Trang 5Khai báo cấu trúc và biến
1 struct t_date{ // Khai báo kiểu cấu trúc
5 } today ; // Khai báo biến
6 struct t_date birthday; // Khai báo biến
Trang 6Khai báo – Nhiều biến cấu trúc
1 struct t_date{ // Khai báo kiểu cấu trúc
5 } today, birthday ; // Khai báo nhiều biến
6 //struct date birthday;
Trang 7Khai báo – Không cần thẻ cấu trúc
1 struct { // Không cần thẻ cấu trúc!?
6 //struct date birthday;
Trang 8Khai báo - typedef
1 typedef struct { // typedef kiểu cấu trúc
Trang 9Khai báo – Cấu trúc trong cấu trúc
Trang 10Khai báo – Mảng trong cấu trúc
Trang 11Khởi tạo giá trị
Trang 125 }holidays[10]; // Mảng kiểu cấu trúc, 10 phần tử
6 struct t_date dates[3] = {{1, 9, 2016},
7 {4,7,2016},{9,12,2016}}; // Khai báo và khởi tạo
8 holidays[4].day = 30; // Truy suất phần tử
9 holidays[4].month = 4;
10 dates[2].year = 2015;
Trang 13Tham số cấu trúc – tham trị
8 struct t_date today = {1, 9, 2016};
10 }
Trang 14Tham số cấu trúc – tham biến
1 // Tham biến, dùng kiểu con trỏ
2 void editDay( struct t_date* aDay, int d, int m, int y)
3 {
7 }
8 int main()
9 {
10 struct t_date today;
11 editDay( &today , 2, 9, 2016); // Truyền tham biến
12 }
Trang 15Ví dụ vận dụng – Tìm ngày kế tiếp
Viết hàm tính ngày mai là ngày mấy
Cấu trúc dữ liệu gồm ngày, tháng, năm
Dùng cấu trúc kiểu ngày gồm các phần tử ngày, tháng, năm
Đối số của hàm là một biến kiểu ngày
Hàm trả về kiểu ngày
Gợi ý thuật toán
Nếu ngày chưa phải là ngày cuối cùng của tháng thì tăng ngày
Nếu là ngày cuối cùng của tháng thì tăng tháng
Nếu là ngày cuối cùng của năm thì tăng năm
Trang 17Ví dụ vận dụng – Tìm ngày kế tiếp (2)
1 struct t_date tomorrow( struct t_date aDay)
2 {
3 if (aDay.day < daysOfMonth(aDay)) // Chưa tròn tháng
5 else if (aDay.month < 12){ // Tròn tháng, chưa tròn năm
11 }
12 return aDay; // Trả về ngày kế tiếp
13 }
Trang 18Ví dụ vận dụng – Tìm ngày kế tiếp (3)
Hàm tính số ngày trong tháng, có tính đến năm nhuận
=IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)<>0)),"Leap Year", "NOT a Leap Year")
1 int daysOfMonth( struct t_date d)
Trang 20Ví dụ vận dụng – Tìm giờ kế tiếp
Viết hàm tính giờ sau khi tăng một giây
Cấu trúc dữ liệu gồm giờ, phút, giây
Thiết kế cấu trúc kiểu giờ gồm các phần tử giờ, phút, giây
Input: Một giờ bất kỳ
Đối số của hàm là một biến kiểu giờ
Hàm trả về kiểu giờ
Gợi ý thuật toán
Tương tự như bài tính ngày kế tiếp
Điểm khác biệt: Năm kế tiếp không bị giới hạn, giờ kế tiếp bị giới hạn (24)
Trang 22Ví dụ vận dụng – Tìm giờ kế tiếp (3)
1 struct t_time nextSec( struct t_time time)
2 {
3 if (time.second < 59) // Chưa tròn phút
4 time.second++; // Tăng giây
5 else if (time.minute < 59) { // Tròn phút, chưa tròn giờ
6 time.second = 0; // Reset giây
7 time.minute++; // Tăng phút
8 } else if (time.hour < 23){ //Tròn phút, giờ, chưa tròn ngày
9 time.second = time.minute = 0; // Reset giây, phút
10 time.hour++; // Tăng giờ
12 time.second = time.minute = time.hour = 0; // Ngày mới
13 return time; // Trả về thời gian mới
14 }
Trang 23Ví dụ vận dụng – Tìm giờ kế tiếp (4)
Trang 24Ví dụ vận dụng – Hoàn chỉnh ngày giờ
Viết hàm tính ngày giờ hoàn chỉnh
Cấu trúc dữ liệu gồm ngày, tháng, năm, giờ, phút, giây
Dùng cấu trúc kiểu ngày giờ gồm các phần tử trên
Input: Một ngày giờ bất kỳ
Output: Ngày giờ kế tiếp
Gợi ý thuật toán
Tìm số giây tiếp theo như bài nextSec
Nếu sang ngày mới thì tìm ngày tiếp theo như bài tomorrow
Trang 25Ví dụ vận dụng – Hoàn chỉnh ngày giờ (2)
12 struct t_date date;
13 struct t_time time;
Trang 26Ví dụ vận dụng – Hoàn chỉnh ngày giờ (3) – Cách 1
1 struct t_timeday timeday;
Trang 27Ví dụ vận dụng – Hoàn chỉnh ngày giờ (4) – Cách 2
1. struct t_timeday nextTime( struct t_timeday1
Trang 28Ví dụ vận dụng – Quản lý điểm
Thiết kế cấu trúc dữ liệu để quản lý sinh viên
Mỗi lớp học phần gồm mã lớp, tên lớp, chuyên ngành
Mỗi sinh viên gồm mã sinh viên, tên sinh viên, cấu trúc lớp học
phần, ngày sinh
Mỗi môn học gồm mã môn học, tên môn học, tín chỉ lý thuyết, tín chỉ thực hành
Bảng điểm gồm cấu trúc sinh viên, cấu trúc môn học, cấu trúc
lớp học phần, điểm thường kỳ, giữa kỳ, cuối kỳ và thực hành
Ghi chú
Cơ sở dữ liệu thực tế của bảng điểm có thể chỉ chứa mã sinh
viên, mã môn học, mã kỳ thi, và điểm
Trang 296 };