Bài giảng Kỹ thuật lập trình - Bài 5: Kiểu cấu trúc - Ngô Hữu Dũng
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Bài 5: Kiểu cấu trúc - Ngô Hữu Dũng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_ky_thuat_lap_trinh_bai_5_kieu_cau_truc_ngo_huu_dun.pdf
Nội dung text: Bài giảng Kỹ thuật lập trình - Bài 5: Kiểu cấu trúc - Ngô Hữu Dũng
- Kỹ thuật lập trình Bài 5 – Kiểu cấu trúc Ts. Ngô Hữu Dũng
- Khái niệm Kiểu cấu trúc: Nhóm các phần tử không đồng nhất với nhau Kiểu mảng: Nhóm các phần tử đồ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ữ Kiểu cấu trúc: Nhóm 3 biến với nhau trong cùng một biến date 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 122 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo cấu trúc 1. struct t_date{ // Khai báo kiểu cấu trúc 2. int day; // Gồm 3 phần tử 3. int month; 4. int year; 5. }; 6. struct t_date birthday, today;// Khai báo biến 7. birthday.day = 27; // Truy suất phần tử 8. birthday.month = 8; // Dùng dấu chấm ‘.’ 9. birthday.year = 1996; 10.today.year = 2016; 123 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Cú pháp struct [structure tag] { 1. struct t_name{ 2. char first[10]; 3. char middle[10]; member definition; 4. char last[10]; member definition; 5. }; 6. struct { member definition; 7. int x; 8. int y; } [one or more structure variables]; 9. } A, B; 124 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo cấu trúc và biến 1. struct t_date{ // Khai báo kiểu cấu trúc 2. int day; // Gồm 3 phần tử 3. int month; 4. int year; 5. }today; // Khai báo biến 6. struct t_date birthday; // Khai báo biến 7. birthday.day = 27; // Truy suất phần tử 8. birthday.month = 8; // Dùng dấu chấm ‘.’ 9. birthday.year = 1996; 10.today.year = 2016; 125 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo – Nhiều biến cấu trúc 1. struct t_date{ // Khai báo kiểu cấu trúc 2. int day; // Gồm 3 phần tử 3. int month; 4. int year; 5. }today, birthday; // Khai báo nhiều biến 6. //struct date birthday; 7. birthday.day = 27; // Truy suất phần tử 8. birthday.month = 8; // Dùng dấu chấm ‘.’ 9. birthday.year = 1996; 10.today.year = 2016; 126 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo – Không cần thẻ cấu trúc 1. struct { // Không cần thẻ cấu trúc!? 2. int day; // Gồm 3 phần tử 3. int month; 4. int year; 5. }today, birthday; // Khai báo biến 6. //struct date birthday; 7. birthday.day = 27; // Truy suất phần tử 8. birthday.month = 8; // Dùng dấu chấm ‘.’ 9. birthday.year = 1996; 10.today.year = 2016; 127 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo - typedef 1. typedef struct { // typedef kiểu cấu trúc 2. int day; // Gồm 3 phần tử 3. int month; 4. int year; 5. }date; // Khai báo kiểu 6. date birthday, today; // Khai báo biến 7. birthday.day = 27; // Truy suất phần tử 8. birthday.month = 8; // Dùng dấu chấm ‘.’ 9. birthday.year = 1996; 10.today.year = 2016; 128 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo – Cấu trúc trong cấu trúc 1. struct t_date{ 1. // Sử dụng cấu trúc 2. int day; 2. struct t_student sv; 3. int month; 3. sv.birth.day = 4 4. int year; 4. sv.birth.month = 5; 5. }; 5. sv.birth.year = 1996; 6. struct t_student{ 6. sv.height = 175; 7. char name[50]; 7. sv.weight = 65; 8. struct t_date birth; 8. if(sv.height > 170) 9. int height; 9. printf("Tall one"); 10. int weight; 11.}; 129 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khai báo – Mảng trong cấu trúc 1. struct t_date{ 1. // Sử dụng cấu trúc 2. int day; 2. struct t_student sv; 3. int month; 4. int year; 3. sv.name[0] = 'n'; 5. }; 4. sv.name[1] = 'g'; 6. struct t_student{ 5. sv.name[2] = '\0'; 7. char fullname[50]; 6. strcat(sv.name,"uyen"); 8. struct t_date birth; 7. strcat(sv.name," thi"); 9. int height; 8. strcat(sv.name," ha"); 10. int weight; 11.}; 130 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Khởi tạo giá trị 1.struct t_date{ 2. int day; 3. int month; 4. int year; 5.}nationalDay = {2, 9, 2016}; 6. 7.struct t_date today = {1,9,2016}; 131 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Mảng cấu trúc 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }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; 132 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Tham số cấu trúc – tham trị 1. void printDay(struct t_date aDay) // Tham trị 2. { 3. printf("Ngay %d/%d/",aDay.day,aDay.month); 4. printf("%d.\n", aDay.year); 5. } 6. int main() 7. { 8. struct t_date today = {1, 9, 2016}; 9. printDay(today); // Tham số cấu trúc 10.} 133 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Tham 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. { 4. aDay->day = d; // Con trỏ kiểu cấu trúc 5. aDay->month = m; // Dùng dấu -> thay cho dấu ‘.’ 6. aDay->year = y; 7. } 8. int main() 9. { 10. struct t_date today; 11. editDay(&today, 2, 9, 2016);// Truyền tham biến 12. } 134 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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 Input: Một ngày bất kỳ Đối số của hàm là một biến kiểu ngày Output: Ngày kế tiếp 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 135 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Tìm ngày kế tiếp (2) 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }; 6. 7. // Function prototype 8. struct t_date tomorrow(struct t_date); 136 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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 4. aDay.day++; // Tăng ngày 5. else if (aDay.month < 12){// Tròn tháng, chưa tròn năm 6. aDay.day = 1; // Reset ngày 7. aDay.month ++; // Tăng tháng 8. }else{ // Tròn tháng và tròn năm 9. aDay.day = aDay.month = 1;// Reset ngày, tháng 10. aDay.year ++; // Tăng năm 11. } 12. return aDay; // Trả về ngày kế tiếp 13. } 137 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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) 2. { 3. int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 4. if(d.month!=2) // Nếu không phải tháng 2 5. return days[d.month-1]; 6. else // Nếu là tháng 2 7. if((d.year%4==0&&d.year%100!=0)||d.year%400==0) 8. return 29; // Năm nhuận 9. else 10. return 28; // Năm không nhuận 11. } 138 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Tìm ngày kế tiếp (4) 1. // Sử dụng hàm tomorrow 2. struct t_date today, nextDay, nextOfTomorrow; 3. today.day = 1; 4. today.month = 9; 5. today.year = 2016; 6. 7. nextDay = tomorrow(today); 8. nextDay.day = tomorrow(today).day; 9. nextDay.month = tomorrow(today).month; 10. nextDay.year = tomorrow(today).year; 11. nextOfTomorrow = tomorrow(nextDay); 12. nextOfTomorrow = tomorrow(tomorrow(today)); 139 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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ờ Output: Ngày kế tiếp 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) 140 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Tìm giờ kế tiếp (2) 1. struct t_time{ 2. int hour; 3. int minute; 4. int second; 5. }; 6. 7. struct t_time nextSec(struct t_time); 141 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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ờ 11. }else // Tròn phút, tròn giờ, tròn ngày 12. time.second = time.minute = time.hour = 0;// Ngày mới 13. return time; // Trả về thời gian mới 14. } 142 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Tìm giờ kế tiếp (4) 1. // Dùng hàm nextSec 2. struct t_time time, nextTime; 3. struct t_time nextOfNextTime; 4. time.hour = 4; 5. time.minute = 59; 6. time.hour = 12; 7. nextTime=nextSec(time); 8. 9. nextOfNextTime=nextSec(nextTime); 143 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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 144 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Hoàn chỉnh ngày giờ (2) 1. struct t_date{ 1. struct t_timeday{ 2. int day; 3. int month; 2. int year; 4. int year; 3. int month; 5. }; 6. struct t_time{ 4. int day; 7. int hour; 5. int hour; 8. int minute; 9. int second; 6. int minute; 10. }; 7. int second; 11. struct t_timeday{ 12. struct t_date date; 8. }; 13. struct t_time time; 9. // Cách 2 14. }; 145 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Hoàn chỉnh ngày giờ (3) – Cách 1 1. struct t_timeday timeday; 2. timeday.date.day = 31; 3. timeday.date.month = 12; 4. timeday.date.year = 2016; 5. timeday.time.hour = 23; 6. timeday.time.minute = 59; 7. timeday.time.second = 59; 8. timeday.time = nextSec(timeday.time); 9. if (timeday.time.hour==0&&timeday.time.minute==0&& 10. timeday.time.second==0) 11. timeday.date = tomorrow(timeday.date); 146 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Hoàn chỉnh ngày giờ (4) – Cách 2 1. struct t_timeday{ 1. struct t_timeday nextTime(struct t_timeday1 time) 2. int year; 2. { 3. int month; 3. if (time.second<59) 4. int day; 4. time.second++; 5. int hour; 5. else if(time.minute<59){ 6. int minute; 6. time.second=0; 7. int second; 7. time.minute++; 8. }else if(time.hour<23){ 8. }; 9. time.second=time.minute=0; 9. int daysOfMonth(struct t_timeday d) 10. time.hour++; 10. { 11. } else{ 11. int days[12]={31,28,31,30,31,30,31,31 12. time.second=time.minute=time.hour=0; 12. ,30,31,30,31}; 13. if (time.day<daysOfMonth(time)) 14. time.day++; 13. if(d.month!=2) 15. else if (time.month<12){ 14. return days[d.month-1]; 16. time.day = 1; 15. else 17. time.month ++; 16. if((d.year%4==0&&d.year%100!=0) || 18. }else{ d.year%400==0) 19. time.day = time.month = 1; 17. return 29; 20. time.year ++; 21. } 18. else 22. } 19. return 28; 23. return time; 20. } 24. } 147 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví 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 148 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Ví dụ vận dụng – Quản lý điểm (2) 1. struct t_date{ 1. struct t_student{ 2. int day; 2. int ID; 3. int month; 3. char fullname[50]; 4. int year; 4. struct t_class fractionClass; 5. }; 5. struct t_date birthday; 6. struct t_class{ 6. }; 7. int ID; 8. char name[100]; 7. struct t_examResult{ 9. char Specialized[100]; 8. struct t_student student; 10. }; 9. struct t_subject subject; 11. struct t_subject{ 10. struct t_class fractionClass; 12. int ID; 11. float regularScore; 13. char name[100]; 12. float midtermScore; 14. int theoryCredits; 13. float finalScore; 15. int practiceCredits; 14. float practiceScore; 16. }; 15. }; 149 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng
- Hết bài 5 Dữ liệu có cấu trúc Khai báo Khởi tạo Mảng cấu trúc Tham số Ví dụ vận dụng 150 Kỹ thuật lập trình | DHTH11C | HK1 | 2016-2017 Ts. Ngô Hữu Dũng