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...
                
              
                                            
                                
            
 
            
                 30 trang
30 trang | 
Chia sẻ: putihuynh11 | Lượt xem: 594 | Lượt tải: 0 
              
            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:
 bai_giang_ky_thuat_lap_trinh_ts_ngo_huu_dung_ky_thuat_lap_trinh_ngo_huu_dung_bai_05_3966_1985330.pdf bai_giang_ky_thuat_lap_trinh_ts_ngo_huu_dung_ky_thuat_lap_trinh_ngo_huu_dung_bai_05_3966_1985330.pdf