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 |
Chia sẻ: putihuynh11 | Lượt xem: 465 | 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