You are on page 1of 28

Self-defined data types

1
KIỂU DỮ LIỆU STRUCT
(Practice: Array structure with self-defined data types)

by Khoa Anh Tran - KTLT 2018


Self-defined data types

2 NỘI DUNG

Bổ sung các thao tác - yêu cầu

by Khoa Anh Tran - KTLT 2018


Self-defined data types

3 Các bước xây dựng project


(1) Tạo project

 Tạo mới một Solution/folder để lưu mã lệnh (Empty project)


Tạo tập tin .h rỗng: <sinhvien.h>
Tạo tiếp tập tin cài đặt .cpp rỗng: <cd_sinhvien.cpp>
Tạo tiếp tập tin chứa chương trình chính .cpp: <Tên SV_3 ký tự
cuối của mã sinh viên>; Ví dụ: Teo_041.cpp

Kiến nghị: Tên project: Baitap01; Tên solution: <mã sinh viên>

by Khoa Anh Tran - KTLT 2018


Self-defined data types

4 Các bước xây dựng project


(2) Sao chép

 Chép tập tin “data<0i>.txt” vào folder project vừa tạo (Window Explorer);
i=1, 2, …
 Thực hiện việc chép mã lệnh mẫu
 Chép mã lệnh từ tập tin “khaibao.h” vào “sinhvien.h”
 Chép mã lệnh từ tập tin “caidat.cpp” vào “cd_sinhvien.cpp”
 Chép mã lệnh từ tập tin “ctc.cpp” vào <Teo_041.cpp>

Dữ liệu mẫu lưu trong folder struct02 gồm: data<0i>.txt, khaibao.h, caidat.cpp, ctc.cpp)

by Khoa Anh Tran - KTLT 2018


Self-defined data types

5 Các bước xây dựng project


(3) Chạy thử

 Build, sửa lỗi và chạy thử


 Xác định các chức năng đã có trong chương trình mẫu
 Cài đặt thêm các thao tác theo yêu cầu (xem các yêu cầu ở mục
tiếp theo)

Demo
by Khoa Anh Tran - KTLT 2018
Self-defined data types

6 NỘI DUNG

Dựng project từ chương trình mẫu

by Khoa Anh Tran - KTLT 2018


Self-defined data types

7 Bổ sung các thao tác - yêu cầu

Bài toán: cho danh sách các sinh viên


(masv, hoten, gtinh, dchi, dtb)

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

Yêu cầu thực hiện các thao tác sau:

by Khoa Anh Tran - KTLT 2018


Self-defined data types

8 Bổ sung các thao tác - yêu cầu


(1) Tìm sinh viên có dtb lớn nhất

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

Theo bạn Input, Output là gì? Input: (a, n); Output: vị trí của SV có đtb lớn nhất (int)

by Khoa Anh Tran - KTLT 2018


int TimMax(const Sinhvien a[], int n);
Self-defined data types

9 Bổ sung các thao tác - yêu cầu


(1) Tìm sinh viên có dtb lớn nhất
0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

 Giải thuật
o Giả sử SV đầu tiên là SV có dtb lớn nhất: vt=0
Làm thế nào để tìm được SV o Cho i chạy từ 1 tới cuối
có ĐTB lớn nhất?
Nếu a[i].dtb>a[vt].dtb -> vt=i
by Khoa Anh Tran - KTLT 2018
 Kết quả: vt
Self-defined data types

10 Bổ sung các thao tác - yêu cầu


(1) Tìm sinh viên có dtb lớn nhất

int TimMax(const Sinhvien a[], int n) //Lời gọi hàm


{ case k’:
int vt = 0; vt = TimMax(a,n);
for (int i = 1; i < n; i++) cout << "\nSinh vien co dtb lon nhat: ";
if (a[i].dtb > a[vt].dtb) XuatSV(a[vt]);
vt = i; break;
return vt;
}

by Khoa Anh Tran - KTLT 2018


Self-defined data types

11 Bổ sung các thao tác - yêu cầu


(2) Tìm sinh viên có mã số xx

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

Theo bạn Input, Output là gì? Input: (a, n), xx; Output: vị trí của SV có mã số xx (int)

by Khoa Anh Tran - KTLT 2018


int TimSV(const Sinhvien a[], int n,int xx);
Self-defined data types

12 Bổ sung các thao tác - yêu cầu


(2) Tìm sinh viên có mã số xx

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

 Giải thuật
o Khởi gán vt=-1 //chưa tìm thấy SV có mã số xx
Làm thế nào để tìm được SV
có mã số xx?
o Cho i chạy từ 0 tới cuối

by Khoa Anh Tran - KTLT 2018


Nếu a[i].masv = xx -> vt=i (dừng)
 Kết quả: vt
Self-defined data types

13 Bổ sung các thao tác - yêu cầu


(2) Tìm sinh viên có mã số xx

int TimSV(const Sinhvien a[], int //Lời gọi hàm


n,int xx) cout<<“\nNhap xx= ”; cin>>xx;
{ vt = TimSV(a, n, xx);
int vt = -1; if (vt == -1)
for (int i = 0; i < n; i++) cout << "\nxx khong ton tai trong DS.";
if (a[i].masv == xx){ else
vt = i; break; {
} cout << "\nSinh vien co ma so la xx: ";
return vt; XuatSV(a[vt]);
} by Khoa Anh Tran - KTLT 2018 }
Self-defined data types

14 Bổ sung các thao tác - yêu cầu


(3) Đếm số SV có giới tính là “nam”

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

Theo bạn Input, Output là gì? Input: (a, n); Output: dem (int) – số SV có giới tính là nam

by Khoa Anh Tran - KTLT 2018


int DemSV(const Sinhvien a[], int n);
Self-defined data types

15 Bổ sung các thao tác - yêu cầu


(3) Đếm số SV có giới tính là “nam”

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

 Giải thuật
o Khởi gán: dem=0
Làm thế nào để đếm số SV nam?
o Cho i chạy từ 0 tới cuối
Nếu a[i].gtinh = 1 -> dem++
by Khoa Anh Tran - KTLT 2018

 Kết quả: dem


Self-defined data types

16 Bổ sung các thao tác - yêu cầu


(3) Đếm số SV có giới tính là “nam”

int DemSV(const Sinhvien a[], //Lời gọi hàm – tự viết


int n)
{
int dem = 0;
for (int i = 0; i < n; i++)
if (a[i].gtinh == 1)
dem++;
return dem;
}
by Khoa Anh Tran - KTLT 2018
Self-defined data types

17 Bổ sung các thao tác - yêu cầu


(4) Liệt kê những SV có dtb <5
0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

 Input: (a,n)
 Giải thuật
 Output: xuất DSSV có dtb<5 ra màn hình –
không có tham số đầu ra o Cho i chạy từ 0 tới cuối
void LietKe(const Sinhvien a[], Nếu a[i].dtb<5 -> Xuất SV thứ i
int n);
by Khoa Anh Tran - KTLT 2018
 Kết quả: DSSV có dtb<5
Self-defined data types

18 Bổ sung các thao tác - yêu cầu


(4) Liệt kê những SV có dtb <5

void LietKe(const Sinhvien a[], int n) //Lời gọi hàm


{ case k’:
for (int i = 0; i < n; i++) cout << "\nSinh vien co dtb <5: \n";
if (a[i].dtb < 5) LietKe(a, n);
{ break;
XuatSV(a[i]);
cout << endl;
}
}
by Khoa Anh Tran - KTLT 2018
Self-defined data types

19 Bổ sung các thao tác - yêu cầu


(5) Liệt kê những SV có dtb < k

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

Theo bạn Input, Output là gì? Input: (a, n), k; Output: không có

void LietKeNHK(const Sinhvien a[], int n, float k);


by Khoa Anh Tran - KTLT 2018
Self-defined data types

20 Bổ sung các thao tác - yêu cầu


(5) Liệt kê những SV có dtb < k

0 1 2 3 4 5 6 7 8 9
a 003 002 009 011 019 100
n=10 VVT TTB NVT TAK TVA NPT
1 0 1 0 sv5 sv6 sv7 sv8 1 0
1 PNT 2 DVC 12 DDC 3 DDC 5 DDC 5 TCV
6.2 7.1 7.8 7.0 6.8 8.3

 Giải thuật

Làm thế nào để liệt kê được các


o Cho i chạy từ 0 tới cuối
SV thỏa y/c bài toán? Nếu a[i].dtb<k -> Xuất SV thứ i

by Khoa Anh Tran - KTLT 2018


 Kết quả: DSSV có dtb<k
Self-defined data types

21 Bổ sung các thao tác - yêu cầu


(5) Liệt kê những SV có dtb < k

void LietKe(const Sinhvien a[], int n, //Lời gọi hàm – tự viết


float k)
{
for (int i = 0; i < n; i++)
if (a[i].dtb < k)
{
XuatSV(a[i]);
cout << endl;
}
} by Khoa Anh Tran - KTLT 2018
Bài tập
Self-defined data types

22 Bổ sung các thao tác - yêu cầu


(6) Kiểm tra xem có SV nào có dtb < 5

 Input: (a,n)
 Output: kq={1, -1} //kq=1 tương ứng có tồn tại SV có dtb<5, ngược lại
hàm trả về -1
int KiemTra(const Sinhvien a[], int n);
 Giải thuật
o Khởi gán: kq=-1
o Cho i chạy từ 0 tới cuối
Nếu a[i].dtb<5 -> kq=1, dừng
 Kết quả: kq
by Khoa Anh Tran - KTLT 2018
Self-defined data types

23 Bổ sung các thao tác - yêu cầu


(6) Kiểm tra xem có SV nào có dtb < 5

int KiemTra(const Sinhvien a[], //Lời gọi hàm


int n)
case k’:
{
kq = KiemTra(a, n);
int kq = -1;
if (kq == -1)
for (int i = 0; i < n; i++)
cout << "\nKhong ton tai SV co dtb < 5";
if (a[i].dtb < 5)
else
{
cout << "\nCo ton tai SV co dtb < 5";
kq = 1;
break;
break;
}
return kq;
}

by Khoa Anh Tran - KTLT 2018


Self-defined data types

24 Bổ sung các thao tác - yêu cầu


(7) Sắp xếp danh sách SV theo họ tên tăng dần

 Input: (a, n)
 Output: DSSV đã được sắp – (a)
void SortASC(Sinhvien a[], int n);
 Giải thuật
o Cho i chạy từ 0 tới kế cuối
o Cho j chạy từ i+1 tới cuối
Nếu a[i].hoten > a[j].hoten -> Hoán vị a[i], a[j]
 Kết quả: (a)
by Khoa Anh Tran - KTLT 2018
Self-defined data types

25 Bổ sung các thao tác - yêu cầu


(7) Sắp xếp danh sách SV theo họ tên tăng dần

void HoanVi(Sinhvien &a, Sinhvien &b) //Lời gọi hàm


{
Sinhvien tam = a; case k’:
a = b; SortASC(a,n);
b = tam;
} XuatDSSV(a,n);
void SortASC(Sinhvien a[], int n) break;
{
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (strcmp(a[i].hoten, a[j].hoten) == 1)
HoanVi(a[i], a[j]);
}

by Khoa Anh Tran - KTLT 2018


Self-defined data types

26 Bài tập 01
 Bổ sung các thao tác dưới đây vào project trên (project: Baitap01)
1. Tìm SV có điểm trung bình (dtb) nhỏ nhất
2. Tính điểm trung bình chung cho n SV
3. Liệt kê các SV có dtb lớn hơn k
4. Đếm số SV có dtb trong đoạn [k1,k2]
5. Kiểm tra xem trong danh sách có SV nào họ: “Tran”?
6. Kiểm tra xem trong danh sách có SV nào có họ là k hay không?
7. Kiểm tra xem trong danh sách có SV nữ nào có đtb dưới k hay không?
8. Sắp xếp danh sách SV theo dtb tăng dần

by Khoa Anh Tran - KTLT 2018


Self-defined data types

27 Bài tập 02
 Bước 01: Tạo một project mới tên Baitap02 trong cùng solution với bài tập ở trên
 Bước 02: sao chép chương trình mẫu “Struct02” gồm 5 file như cách làm ở trên vào
project Baitap02
 Bước 03: bổ sung thêm các yêu cầu dưới đây vào project: Baitap02
1. Thêm 1 SV vào đầu danh sách
2. Thêm 1 SV vào cuối danh sách
3. Thêm 1 SV vào vị trí k trong danh sách
4. Xóa 1 SV tại vị trí k
5. Xóa tất cả SV có dtb bé nhất
6. Sắp xếp SV theo họ tên tăng dần, nếu họ tên trùng nhau sắp theo dtb giảm dần

by Khoa Anh Tran - KTLT 2018


Self-defined data types

28 Bài tập 03
 Viết chương trình nhập vào 1 ngày đầy đủ từ bàn phím. Thực hiện các yêu
cầu sau:
1. Xuất ngày vừa nhập ra màn hình
2. Kiểm tra xem ngày có hợp lệ không?
3. Tìm ngày kế tiếp
4. Tìm ngày trước đó
5. Tính khoảng cách giữa 2 ngày bất kỳ
6. Tính thứ khi biết ngày

by Khoa Anh Tran - KTLT 2018

You might also like