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

pdf 30 trang hoanguyen 4440
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:

  • pdfbai_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

  1. Kỹ thuật lập trình Bài 5 – Kiểu cấu trúc Ts. Ngô Hữu Dũng
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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