Kỹ thuật lập trình - Bài 5: Kiểu cấu trúc - Ngô Hữu Dũng

Tài liệu 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 Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017122  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 Khai báo cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017123 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.y...

pdf30 trang | Chia sẻ: putihuynh11 | Lượt xem: 471 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu 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
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 Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017122  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 Khai báo cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017123 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; Cú pháp Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017124 struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables]; 1. struct t_name{ 2. char first[10]; 3. char middle[10]; 4. char last[10]; 5. }; 6. struct { 7. int x; 8. int y; 9. } A, B; Khai báo cấu trúc và biến Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017125 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; Khai báo – Nhiều biến cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017126 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; Khai báo – Không cần thẻ cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017127 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; Khai báo - typedef Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017128 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; Khai báo – Cấu trúc trong cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017129 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }; 6. struct t_student{ 7. char name[50]; 8. struct t_date birth; 9. int height; 10. int weight; 11.}; 1. // Sử dụng cấu trúc 2. struct t_student sv; 3. sv.birth.day = 4 4. sv.birth.month = 5; 5. sv.birth.year = 1996; 6. sv.height = 175; 7. sv.weight = 65; 8. if(sv.height > 170) 9. printf("Tall one"); Khai báo – Mảng trong cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017130 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }; 6. struct t_student{ 7. char fullname[50]; 8. struct t_date birth; 9. int height; 10. int weight; 11.}; 1. // Sử dụng cấu trúc 2. struct t_student sv; 3. sv.name[0] = 'n'; 4. sv.name[1] = 'g'; 5. sv.name[2] = '\0'; 6. strcat(sv.name,"uyen"); 7. strcat(sv.name," thi"); 8. strcat(sv.name," ha"); Khởi tạo giá trị Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017131 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}; Mảng cấu trúc Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017132 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; Tham số cấu trúc – tham trị Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017133 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.} Tham số cấu trúc – tham biến Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017134 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. } Ví dụ vận dụng – Tìm ngày kế tiếp Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017135  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 Ví dụ vận dụng – Tìm ngày kế tiếp (2) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017136 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); Ví dụ vận dụng – Tìm ngày kế tiếp (2) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017137 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. } Ví dụ vận dụng – Tìm ngày kế tiếp (3) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017138  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. } Ví dụ vận dụng – Tìm ngày kế tiếp (4) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017139 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)); Ví dụ vận dụng – Tìm giờ kế tiếp Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017140  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) Ví dụ vận dụng – Tìm giờ kế tiếp (2) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017141 1. struct t_time{ 2. int hour; 3. int minute; 4. int second; 5. }; 6. 7. struct t_time nextSec(struct t_time); Ví dụ vận dụng – Tìm giờ kế tiếp (3) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017142 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. } Ví dụ vận dụng – Tìm giờ kế tiếp (4) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017143 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); Ví dụ vận dụng – Hoàn chỉnh ngày giờ Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017144 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 Ví dụ vận dụng – Hoàn chỉnh ngày giờ (2) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017145 1. struct t_timeday{ 2. int year; 3. int month; 4. int day; 5. int hour; 6. int minute; 7. int second; 8. }; 9. // Cách 2 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }; 6. struct t_time{ 7. int hour; 8. int minute; 9. int second; 10. }; 11. struct t_timeday{ 12. struct t_date date; 13. struct t_time time; 14. }; Ví dụ vận dụng – Hoàn chỉnh ngày giờ (3) – Cách 1 Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017146 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); Ví dụ vận dụng – Hoàn chỉnh ngày giờ (4) – Cách 2 Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017147 1. struct t_timeday nextTime(struct t_timeday1 time) 2. { 3. if (time.second<59) 4. time.second++; 5. else if(time.minute<59){ 6. time.second=0; 7. time.minute++; 8. }else if(time.hour<23){ 9. time.second=time.minute=0; 10. time.hour++; 11. } else{ 12. time.second=time.minute=time.hour=0; 13. if (time.day<daysOfMonth(time)) 14. time.day++; 15. else if (time.month<12){ 16. time.day = 1; 17. time.month ++; 18. }else{ 19. time.day = time.month = 1; 20. time.year ++; 21. } 22. } 23. return time; 24. } 1. struct t_timeday{ 2. int year; 3. int month; 4. int day; 5. int hour; 6. int minute; 7. int second; 8. }; 9. int daysOfMonth(struct t_timeday d) 10. { 11. int days[12]={31,28,31,30,31,30,31,31 12. ,30,31,30,31}; 13. if(d.month!=2) 14. return days[d.month-1]; 15. else 16. if((d.year%4==0&&d.year%100!=0) || d.year%400==0) 17. return 29; 18. else 19. return 28; 20. } Ví dụ vận dụng – Quản lý điểm Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017148  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 Ví dụ vận dụng – Quản lý điểm (2) Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017149 1. struct t_date{ 2. int day; 3. int month; 4. int year; 5. }; 6. struct t_class{ 7. int ID; 8. char name[100]; 9. char Specialized[100]; 10. }; 11. struct t_subject{ 12. int ID; 13. char name[100]; 14. int theoryCredits; 15. int practiceCredits; 16. }; 1. struct t_student{ 2. int ID; 3. char fullname[50]; 4. struct t_class fractionClass; 5. struct t_date birthday; 6. }; 7. struct t_examResult{ 8. struct t_student student; 9. struct t_subject subject; 10. struct t_class fractionClass; 11. float regularScore; 12. float midtermScore; 13. float finalScore; 14. float practiceScore; 15. }; Hết bài 5 Ts. Ngô Hữu DũngKỹ thuật lập trình | DHTH11C | HK1 | 2016-2017150 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

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_ky_thuat_lap_trinh_ts_ngo_huu_dung_ky_thuat_lap_trinh_ngo_huu_dung_bai_05_3966_1985330.pdf