Tải bản đầy đủ (.doc) (31 trang)

Cấu trúc dữ liệu trừu tượng (ADT)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (573.26 KB, 31 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
BÀI TẬP LỚN
MÔN: KỸ THUẬT LẬP TRÌNH
NHÓM 03
Sinh viên thực hiện : Trần Ngọc Thái
Đinh Văn Chinh
Nguyễn Văn Mạnh
Bùi Thị Lệ Quyên
Nguyễn Mạnh Tuấn
Lớp : CNTT3,4,5 – K55
Giáo viên hướng dẫn : TS. Vũ Thị Hương Giang
Kỹ thuật lập trình
Hà Nội, tháng 5 năm 2012
Nhóm PE03 - Lớp IT3040- K55
2
Kỹ thuật lập trình
MỤC LỤC
MỤC LỤC 3
LỜI NÓI ĐẦU 4
PHÂN CÔNG THÀNH VIÊN TRONG NHÓM 5
Viết báo cáo, tài liệu chương trình 5
PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP 6
CHƯƠNG 1. CÀI ĐẶT CHƯƠNG TRÌNH 14
TÀI LIỆU THAM KHẢO 28
PHỤ LỤC 29
Nhóm PE03 - Lớp IT3040- K55
3
Kỹ thuật lập trình
LỜI NÓI ĐẦU


Trong thời gian đầu học tập tại viện Công nghệ thông tin và truyền thông của
đại học Bách khoa Hà Nội, chúng em đã được học và tiếp xúc với một số môn cơ sở
ngành trong đó có môn Kỹ thuật lập trình. Học phần này được giảng dạy với mục đích
giúp sinh viên có được các kiến thức cơ bản của kỹ thuật lập trình, có khả năng phân
tích, xây dựng chương trình, làm chủ các kỹ thuật: viết mã hiệu quả, gỡ rối, đánh giá
chương trình. Việc thực hiện bài tập lớn lần này đã tạo cơ hội để chúng em áp dụng
những kiến thức đã học đó trong môn kĩ thuật lập trình để xây dựng một chương trình
hoàn chỉnh.
Bài tập lớn có chủ đề về việc tạo một cấu trúc dữ liệu trừu tượng (ADT) gồm 2
thành phần: mảng các số thực và số lượng gái trị lưu trữ trong mảng; ADT cho phép
thực hiện một số thao tác sắp xếp, tìm kiếm, thống kê…, bên cạnh đó bài toán cũng
yêu cầu viết một chương trình cung cấp các chức năng để kiểm tra ADT đó.
Để có thể tiến hành bài tập này, trước hết, nhóm đã tìm hiểu để nắm vững yêu
cầu của đề bài, phân tích các yêu cầu ẩn và hiện của bài toán, trong đó đặc biệt chú
trọng đến khái niệm thế nào là một ADT cũng như các thuộc tính của nó. Bước tiếp
theo là thiết kế giải pháp, trong bước này chúng em đã chia bài toán thành các phần
nhỏ hơn, thiết kế giải thuật phù hợp cho mỗi phần, việc thiết kế được tuân thủ theo
phương thức thiết kế top-down. Sau đó, nhóm tiến hành cài đặt thiết kế trên cơ sở các
giải thuật được lựa chọn ở trên, trong quá trình vừa viết mã nguồn, chúng em vừa tiến
hành kiểm tra. Khi cài đặt xong chương trình, nhóm thực hiện việc chạy thử và kiểm
tra tổng thể chương trình, tìm và sửa các lỗi để đảm bảo cho chương trình chạy thông
và chạy đúng trong các tình huống khác nhau. Khi chương trình đã chạy thông và
đúng, chúng em tiến hành tinh chỉnh mã nguồn, để đảm bảo mã nguồn là tối ưu, thời
gian chạy được rút ngắn nhiều nhất có thể. Sau khi đã hoàn thiện chương trình, nhóm
tiến hành viết tài liệu cho chương trình.
Vì đây là bài tập lớn đầu tiên yêu cầu sử dụng tất cả các kĩ thuật đã học cùng
với việc chúng em chưa có nhiều kinh nghiệm lập trình nên dù đã cố gắng rất nhiều,
song trong quá trình thực hiện bài tập lớn vẫn còn nhiều thiếu sót, kính mong cô giáo
và các bạn nhận xét và đóng góp ý kiến để chúng em có thể hoàn thiện hơn nữa
chương trình của mình.

Cuối cùng, chúng em xin chân thành cảm ơn TS Vũ Thị Hương Giang đã
hướng dẫn để nhóm có thể hoàn thành bài tập lớn này.
Nhóm PE03 - Lớp IT3040- K55
4
Kỹ thuật lập trình
PHÂN CÔNG THÀNH VIÊN TRONG NHÓM
Trên cơ sở bài tập tuần 5 đã nộp xây dựng bài tập lớn với các modul, tài liệu báo cáo
Phân công công việc như sau:
Viết chương trình
Tên công việc Người thực hiện Thời gian
Tạo modul Array.h, hamphu.h,menu.h Tuấn 14/04/2012
Tao modul nhapxuat.h, sapxep.h Mạnh 14/04/2012
Tạo modul minmax.h,thongke.h Thái 14/04/2012
Tạo modul timkiem.h,dpt.h Chinh 14/04/2012
Tạo Checkarray.cpp, các bộ dữ liệu Quyên 14/04/2012
Ghép các modul để chạy thử 15-16/04/2012
Testing, phát hiện lỗi
Tên công việc Người thực hiện Thời gian
Chức năng 1,2,13,14 Tuấn 17/04/2012
Chức năng 3,4,5 Thái 17/04/2012
Chức năng 6,7 Chinh 17/04/2012
Chức năng 8,9,10 Quyên 17/04/2012
Chức năng 11,12 Mạnh 17/04/2012
Tổng hợp lỗi, tiến hành hiệu chỉnh, sửa
lỗi
18-19/04/2012
Tổng hợp chương trình hoàn chỉnh 20/04/2012
Viết báo cáo, tài liệu chương trình
Tên công việc Người thực hiện Thời gian
Lời nói đầu, biểu đồ IPO 4 chức năng

đầu,các kĩ thuật đã áp dụng(2 mục đầu)
Quyên 22/04/2012
Biểu đồ IPO 10 chức năng tiếp,kết quả
chương trình 8 chức năng đầu
Tuấn 25/04/2012
Mục thiết kế chương trình, kết quả
chương trình 6 chức năng tiếp
Chinh 25/04/2012
Thiết kế giải thuật, các kĩ thuật xây dựng
chương trình, các kĩ thuật viết mã nguồn
hiệu quả
Thái 24/04/2012
Thiết kế dữ liệu, phong cách lập trình Mạnh 23/04/2012
Giao diện chương trình Thái, Chinh 23/04/2012
Kết luận và hướng phát triển Quyên, Mạnh 25/04/2012
Phụ lục Tuấn 24/04/2012
Nhóm PE03 - Lớp IT3040- K55
5
Kỹ thuật lập trình
PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP
Yêu cầu chương trình:
Bài toán yêu cầu tạo một ADT có tên là Array và lưu trữ trong file Array.h
ADT này bao gồm 2 thành phần thông tin:
+ Max: mảng các giá trị số thực
+ count: số lượng các giá trị lưu trữ trong mảng Max
ADT này cho phép thực hiện một số thao tác trên mảng số thực:
I .Khởi tạo một phiên bản mới của chính nó
ii. Gán giá trị cho các thành phần thông tin của một đối tương Array
iii. Sắp xếp các phần tử của mảng theo giải thuật bubble sort
iv. Sắp xếp các phần tử của mảng theo giải thuật insertion sort

v. Sắp xếp các phần tử của mảng theo giải thuật selection sort
vi. Tìm giá trị lớn nhất được lưu trữ trong mảng và vị trí của các phần tử có giá trị
lớn nhất trong mảng
vii. Tìm giá trị nhỏ nhất được lưu trữ trong mảng và vị trí của các phần tử có giá
trị nhỏ nhất trong mảng
viii. Tìm giá trị trung bình của các phần tử trong mảng
ix. Tìm độ lệch về giá trị giữa 2 phần tử có vị trí biết trước trong mảng
x. Tìm độ lệch trung bình về giá trị của các phần tử trong mảng
xi. Tìm kiếm (theo giải thuật sequential search) phần tử của mảng có giá trị là x ;
nếu tìm thấy thì đưa ra vị trí của phần tử đó trong mảng, nếu không thì trả lại giá trị
là 0.
xii. Tìm kiếm (theo giải thuật binary search) phần tử của mảng có giá trị là x ; nếu
tìm thấy thì đưa ra vị trí của phần tử đó trong mảng, nếu không thì thông báo là
không tìm thấy phần tử như vậy.
xiii. Biểu diễn độ phức tạp tính toán theo ký pháp big-O và hiện thị thời gian tính
toán thực tế bằng micro-second.
Cùng với đó, bài toán cũng yêu cầu viết một chương trình cung cấp các chức
năng để kiểm tra ADT này; chương trình được lưu trữ trong file CheckArray.cpp.
Hàm menu() : gồm các tùy chọn
1-13: các chức năng tính toán trên mảng
Tùy chọn 1: có menu con cho phép
Nạp thông tin vào từ bàn phím hoặc từ 1 file dữ liệu vào/ra (I/O data file)
Quay lại menu chính
Tùy chọn 2-13: có menu con cho phép
In kết quả ra màn hình hoặc ra 1 file dữ liệu vào/ra (I/O data file)
Quay lại menu chính
14: thoát khỏi chương trình
Nhóm PE03 - Lớp IT3040- K55
6
Kỹ thuật lập trình

0.1. Biểu đồ IPO
0.1.1. Chức năng 1: khởi tạo một phiên bản của chính nó
INPUT PROCESS OUTPUT
Mảng cũ Khởi tạo Mảng mới
0.1.2. Chức năng 2: Nhập các giá trị cho các phần tử trong mảng
Input Process Output
Các nguồn dữ liệu vào Lựa chọn Cách nhập dữ liệu
Dữ liệu Đọc dữ liệu
Gán giá trị cho các phần tử
của mảng
Mảng có các phần tử
1.2.3,4,5: Chức năng 3: Sắp xếp
Input Process Output
Các cách sắp xếp Lựa chọn 1 cách sắp xếp
Mảng đã được gán giá trị Sắp xếp Mảng đã được sắp xếp
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
1.2.6,7: Chức năng 4: Tìm kiếm phần tử nhỏ nhất(lớn nhất)
Input Process Output
Mảng đã được gán giá trị Tìm kiếm min (max) Min (max)
Tìm kiếm vị trí min (max) vị trí min (max)
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
1.2.8 Chức năng 8
Tính giá trị trung bình của các phần tử trong mảng
In ra màn hình hoăc file
INPUT PROCESS OUTPUT
Mảng được gắn giá trị Cộng tổng Tổng
Tổng, số phần tử Chia trung bình Trung bình
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu

In kết quả
1.2.9 Chức năng 9
Nhóm PE03 - Lớp IT3040- K55
7
Kỹ thuật lập trình
Nhập vào vị trí 2 phần tử bất kỳ
Tính độ lệch và in ra màn hình hoặc file
INPUT PROCESS OUTPUT
Vị trí x1, vị trí x2 Đọc vào Hai vị trí
Max[x1],Max[x2] Tính hiệu hai giá trị Hiệu
Hiệu Lấy trị tuyệt đối Độ lệch
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả

2.10 Chức năng 10
Tính độ lệch trung bình của các phần tử trong mảng
In ra màn hình hoặc ra file.
INPUT PROCESS OUTPUT
Mảng được gắn giá trị Cộng Tổng1
Tổng1, số phần tử Chia trung bình Trung bình
Các phần tử, trung bình Lấy hiệu Hiệu
Hiệu Lấy trị tuyệt đối Độ lệch các phần tử
Độ lệch các phần tử Cộng Tổng 2
Tổng, số phần tử Chia trung bình Độ lệch trung bình
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
1.2.11 Chức năng 11
Thực hiện tìm kiếm nhị phân
In ra vị trí các phần tử tìm được ra màn hình hoặc file.


INPUT PROCESS OUTPUT
Mảng được gắn giá trị Sắp xếp Mảng được sắp xếp
Mảng được sắp xếp Tìm kiếm nhị phân Phần tử cần tìm
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
1.2.12 Chức năng 12
Nhóm PE03 - Lớp IT3040- K55
8
Kỹ thuật lập trình
Thực hiện tìm kiếm nhị phân
In ra vị trí các phần tử tìm được ra màn hình hoặc file.

INPUT PROCESS OUTPUT
Mảng chứa các phần tử Tìm kiếm tuần tự Phần tử cần tìm
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
1.2.13
Tính thời gian thực hiện chương trình
In ra màn hình hoặc file.
INPUT PROCESS OUTPUT
Điểm bắt đầu, điểm kết thúc Lấy hiệu Hiệu số chu kì
Hiệu số chu kì, số chu kì/1s chia Số s
Số s Nhân 1000000 Số microsecond
Các cách xuất dữ liệu Lựa chọn 1 cách xuất dữ liệu
In kết quả
0.2. Thiết kế chương trình
<Vẽ và giới thiệu cấu trúc phân cấp của chương trình, mối quan hệ giữa các thành
phần trong chương trình
Nhóm PE03 - Lớp IT3040- K55
9

Kỹ thuật lập trình
Cấu trúc phân cấp chương trình: dựa vào các chức năng mà chương trình chính được
chia làm nhiều modul khác nhau. Chương trình chính chỉ chứa các lệnh gọi tới các
hàm trong modul.
Chương trình được chia làm các modul
Nhóm PE03 - Lớp IT3040- K55
O
U
T
P
U
T
Bàn
phím
file
I
N
P
Bàn
phím
file
10
Sắp xếp
Thời
gian
tính
toán &
độ phức
tạp
Tìm

kiếm
Các giá
trị đặc
trưng
Bubble sort
Insertion sort
Selection sort
Thời gian tính toán
Binary search
Sequential search
Độ lệch trung bình, độ lệch
giữa 2 phần tử
Giá tri trung bình
Giá tri min,max
Độ phức tạp của thuật toán
K thut lp trỡnh
1. Modul nhapxuat.h:
Cha hm khoi_tao(),nhap_mang(), in_mang() v sfree().
Thc hin chc nng nhp d liu t bn phớm hoc file, ng thi thc hin chc
nng xut d liu ra mn hỡnh hoc file, thc hin gii phúng d liu
2. Modul menu.h:
Cha cỏc bng menu menu(), menu2(),menu3() a ra cỏc bng menu cho
ngi dựng tin thao tỏc
3. Modul hamphu.h:
Cha cỏc hm nh Swap(), kt(), giỳp thc hin cỏc thao tỏc i ch v kim tra
4. Modul sapxep.h:
Cha cỏc hm Bubble_sort(),Insertion_sort() v Selection_sort() cha cỏc thut
toỏn sp xp
5. Modul minmax.h:
Cha cỏc chng trỡnh tỡm GTLN v GTNN nh: min(), max().

6. Modul thongke.h
Cha cỏc chng trỡnh phc v thao tỏc thng kờ:
- Do_lech(): tớnh lch gia 2 phn t
- Do_lech_tb(): tớnh lch trung bỡnh ca mng
- gttb(): tớnh giỏ tr trung bỡnh cỏc phn t ca mng
7. Modul timkiem.h
Cha cỏc chng trỡnh tỡm kim:
- Sequential_search(): tỡm kim tun t
- Binary_search(): tỡm kim nh phõn
8. Modul dpt.h:
Cha chng trỡnh Dpt() hin th phc tp tớnh toỏn v thi gian tớnh toỏn
0.3. Thit k d liu
Do yờu cu ca bi toỏn l to ra mt mng khụng gii hn phn t v cú th thao tỏc
trờn mng ú nờn nhúm s dng kiu cu trỳc Class trong C++ vỡ lớp có thể tạo ra
(bằng cách khai báo) nhiều đối tợng (biến, mảng) khác nhau. Mỗi đối tợng có vùng
nhớ riêng của mình.
C th thit k d liu nh sau:
Class : array
Cỏc thnh phn d liu (thuc tớnh):
- Max: mng cha cỏc phn t kiu s thc
float *Max
- count : cha s lng cỏc phn t.
int count
Khai bỏo cỏc phng thc (thao tỏc) trờn lp nh sau:
- int menu() Bng menu chớnh
- int menu2() Bng menu ph thc hin chc nng 13
- int menu3() Bng menu thc hin hin th kt qu
- void khoi_tao() chng trỡnh khi to mt mng mi
- void nhap_mang() chng trỡnh nhp cỏc phn t ca mng
- void in_mang() chng trỡnh in ra cỏc phn t ca mng sau khi sp xp

- void Bubble_sort() Thut toỏn sp xp ni bt
Nhúm PE03 - Lp IT3040- K55
11
Kỹ thuật lập trình
- void Insertion_sort() – Thuật toán sắp xếp chèn
- void Selection_sort() – Thuật toán sắp xếp lựa chọn
- void max() – chương trình tìm phần tử lớn nhất và vị trí trong mảng
- void min() - chương trình tìm phần tử nhỏ nhất và vị trí trong mảng
- int kt() – hàm trả về số lượng các phần tử trong mảng
- void gttb() – chương trình tính giá trị trung bình các phần tử của mảng
- void do_lech() – chương trình tính độ lệch hai phần tử của mảng
- void do_lech_tb() – Chương trình tính độ lệch trung bình các phần tử của
mảng
- void Sequential_search() – Thuật toán tìm kiếm tuần tự
- void Binary_search() – Thuật toán tìm kiếm nhị phân
- void Dpt() – Chương trình đưa ra độ phức tạp và thời gian tính toán
- void swap(float &a,float &b) – đổi chỗ hai phần tử của mảng
- void sfree() – giải phóng bộ nhớ
• Để lưu lại mảng ban đầu (tránh trường hợp mảng bị thay đổi sau khi sắp xếp):
tạo thêm một mảng số thực B copy lại mảng A sau khi nhập dữ liệu vào
• Tạo các biến start_Bubble, finish_Bubble, start_Insertion,…. để phục vụ tính
thời gian.
• Các chức năng được nhóm lại trong các modul để phân biệt với nhau. Có các
modul như sau:
1. menu.h
2. hamphu.h
3. nhapxuat.h
4. sapxep.h
5. minmax.h
6. thongke.h

7. timkiem.h
8. dpt.h
0.4. Thiết kế giải thuật
0.4.1. Giải thuật 1
Tìm kiếm nhị phân:
Được chia ra làm 3 công việc chính:
- Sắp xếp mảng theo chiều không giảm
- Tìm kiếm giá trị x trong mảng bằng Binary search
- In ra các phần tử có giá trị x
Cụ thể như sau
1. Sắp xếp các phần tử theo chiều không giảm
Nhóm PE03 - Lớp IT3040- K55
12
Kỹ thuật lập trình
Sử dụng thuật toán Bubble sort để thực hiện sắp xếp các phần tử của mảng Max
theo chiều không giảm.
Tuy nhiên sau khi sắp xếp thì vị trí các phần tử không còn như trước nữa nên nếu
thực hiện tìm kiếm sẽ dẫn đến kết quả không chính xác, do đó tạo một mảng b lưu vị
trí ban đầu của các phần tử mảng Max, như vậy khi thực hiện tìm kiếm sẽ chỉ cần đưa
ra các phần tử mảng b.
2. Thực hiện tìm kiếm nhị phân
Tạo thêm 1 mảng là mảng c để lưu vị trí các phần tử có giá trị x (như vậy sẽ tiện
hơn khi in kết quả ra file và ra màn hình)
Tạo các biến l,r,m để lưu vị trí đầu mảng, cuối mảng và giữa mảng.
Thực hiện so sánh giá trị phần tử giữa mảng với giá trị cần tìm kiếm. Có 3 trường
hợp:
- Nếu Max[m]>x, tức là phần tử cần tìm kiếm ở bên trái phần tử m, thực hiện
tìm kiếm nhị phân với nửa trái của mảng
- Nếu Max[m]<x, tức là phần tử cần tìm kiếm ở bên phải phần tử m, thực hiện
tìm kiếm nhị phân với nửa phải của mảng

- Nếu Max[m]=x, phần tử m là phần tử có giá trị x
Ở trường hợp cuối mặc dù đã tìm được vị trí m có giá trị x nhưng có thể các phần tử
bên cạnh m cũng có giá trị x (do phần tử x không phải là duy nhất, và mảng xếp theo
chiều không giảm) do đó tạo 2 biến t va p (t =m-1, p=m+1) để xét các phần tử lân cận
m. Nếu các phần tử này cũng có giá trị x thì lưu vị trí các phần tử này vào mảng c.
Như vậy sau bước này ta đã có vị trí tất cả các phần tử có giá trị x.
3. In vị trí các phần tử
Trước khi in vị trí các phần tử cần làm 2 việc:
- Trả lại vị trí ban đầu cho các phần tử của mảng Max(bằng cách dùng mảng
B)
- Sắp xếp lại các phần tử mảng c để kết quả in ra theo chiều tăng dần về vị trí
Sau đó thực hiện in kết quả .
Nhóm PE03 - Lớp IT3040- K55
13
Kỹ thuật lập trình
CHƯƠNG 1. CÀI ĐẶT CHƯƠNG TRÌNH
1.1. Các kỹ thuật lập trình đã áp dụng
<Liệt kê các kỹ thuật lập trình đã sử dụng để làm bài tập lớn >
STT Mô tả kỹ thuật / quy tắc Mô tả đối tượng áp dụng (hàm,
biến, biểu thức, câu lệnh) và
phạm vi áp dụng
I. Các kỹ
thuật làm việc
với biến
1. Tùy vào phạm vi hoạt
động của biến mà ta khai
báo biến là toàn thể hay
cục bộ
Các biến tính thời gian:
start_Bubble,finish_Bubble,

count… được sử dụng trong toàn
bộ chương trình nên là biến toàn
thể.
Các biến đặc trưng cho từng
chương trình con thì chỉ khai báo
là biến cục bộ
2. Đặt tên biến mang tính gợi
nhớ
VD: các biến: ten (tên file). temp
(biến trung gian lưu giá trị phần
tử đọc vào),dem (đếm số phần tử)

3. Sử dụng các kiểu dữ liệu
hợp lý:
+ Dùng kiểu double khi
cần kết quả có độ chính
xác cao
+Dùng kiểu int cho các
biến chỉ số
+Ví dụ như biến dl (biến lưu tổng
độ lệch các phần tử), biến kq (lưu
kết quả độ lệch trung bình giữa
các phần tử)…
+ Ví dụ i(dùng làm chỉ số chạy
khi duyệt các phần tử của mảng)

4. Sử dụng các biến trung
gian để phân biệt các bước
tính toán.
VD: Ví dụ biến cục bộ temp

trong phần nhapxuat.h (biến trung
gian lưu giá trị phần tử đọc vào),
biến cục bộ temp lưu giá trị trung
gian của phần sắp xếp….
5. Khởi tạo giá trị ban đầu
cho biến
VD: các biến đếm được khởi tạo
giá trị ban đầu la 0, các biến tính
tổng được khởi tạo giá trị ban đầu
là 0…
II. Các kỹ
thuật viết mã
chương trình
hiệu quả
1. +Gióng hàng các cặp dấu
đóng, mở ngoặc cùng cấp.
+Viết dấu mở ngoặc nhọn
ngay sau câu lệnh
+Sử dụng các khoảng cách
hợp lý để dễ đọc các câu
Mã nguồn chương trình
Nhóm PE03 - Lớp IT3040- K55
14
Kỹ thuật lập trình
lệnh
2. -Lựa chọn cấu trúc lặp hợp
lý: đối với vòng lặp biết
trước số lần lặp dùng vòng
lặp for, nếu không biết
trước số lần lặp dùng vòng

lặp while hoặc do…while.
-VD: trong các hàm sắp xếp, do
biết trước số lượng phần tử cần
duyệt nên sử dụng vòng lặp for,
ngược lại trong hàm
nhapxuat(),khi đọc dữ liệu từ file,
chưa biết số lượng phần tử nên
dùng vòn lặp while
3. Kết hợp lệnh break khi sử
dụng cấu trúc switch…
case
-Sử dụng trong phần giao diện
khi người dùng lựa chọn các chức
năng
III. Các kỹ
thuật thiết kế
chương trình
1. Có cấu trúc modul:
Đã xây dựng các modul
khác nhau với các chức
năng riêng biệt.
Tránh sử dụng vòng lặp
goto
VD: modul: sapxep.h chứa các
hàm sắp xếp như Bubble_sort,
Insertion_sort,…
Trong chương trình không sử
dụng vòng lặp goto
2. Chia bài toán ra thành
nhiều bài toán nhỏ hơn rồi

giải quyết từng bài toán
nhỏ
VD: chức năng tìm kiếm nhị
phân được chia ra thành 3 bài
toán nhỏ:
+ Sắp xếp mảng theo chiều không
giảm
+Tìm kiếm nhị phân
+In kết quả
3. Thiết kế theo kiểu Top-
down
Thiết kế toàn bộ chương trình
một cách sơ bộ rồi mới đi vào chi
tiết
IV. Các kỹ
thuật xây
dựng hàm/thủ
tục
1. Sử dụng các hàm định
nghĩa sẵn
Tạo hàm mới do người lập
trình định nghĩa
VD hàm fabs() để tính độ lệch giá
trị 2 phần tử
Vd: hàm swap() hoán đổi vị trí 2
phần tử
2. Sử dụng tham số kiểu
tham chiếu
VD hàm đổi chỗ
Swap(float &a, float &b)

3. Đặt tên hàm và thủ tục
ngắn gọn có tính chất gợi
nhớ
Đặt tên tham số không
trùng tên biến
VD: hàm nhap_mang(),
in_mang(), khoi_tao()….
4. Những thao tác lặp đi lặp
lại thì tạo hàm để chương
trình ngắn gọn hơn
VD hàm in_mang(), kt(),…
V. Các kỹ
thuật bẫy lỗi
và lập trình
phòng ngừa
1. Sử dụng đúng kiểu dữ liệu
các biến, tránh tràn số
VD sử dụng kiểu double thay vì
float cho các biên tính toán kết
quả như: kq, gttb,dl…
2. Không thay đổi tham số
của các hàm, không thay
đổi mục đích ban đầu của
các hàm.
Nhóm PE03 - Lớp IT3040- K55
15
Kỹ thuật lập trình
3. Đảm bảo các lỗi buffer
overflows, divide for zero
không xảy ra

4. Đảm bảo giá trị các biến
luôn trong vùng kiểm soát
VI. Phong
cách lập trình
1.
2.

1.2. Kết quả chương trình
Chức
năng
Chữ ký (Khai báo chức
năng)
Tình trạng khi nộp bài Người thực hiện : ai
làm gì
1 Khởi tạo mảng 2 Mạnh: cài đặt
Tuấn: kiểm thử
2 Gán giá trị các thành phần
của mảng
3 Mạnh: cài đặt
Tuấn: kiểm thử
3 Sắp xếp theo Bubble sort 3 Mạnh: cài đặt
Thái: kiểm thử
4 Sắp xếp theo Insertion sort 3 Mạnh: cài đặt
Thái: kiểm thử
5 Sắp xếp theo Selection 3 Mạnh: cài đặt
Thái: kiểm thử
6 Tìm kiếm GTLN và vị trí
GTLN
3 Thái: cài đặt
Chinh: kiểm thử

7 Tìm kiếm GTNN và vị trí
GTNN
3 Thái: cài đặt
Chinh: kiểm thử
8 Tính giá trị trung bình các
phần tử của mảng
3 Thái: cài đặt
Quyên: kiểm thử
9 Tính độ lệch hai phần tử của
mảng
3 Thái: cài đặt
Quyên: kiểm thử
10 Tính độ lệch trung bình các
phần tử của mảng
3 Thái: cài đặt
Quyên: kiểm thử
11 Tìm kiếm theo Sequential
search
3 Chinh: cài đặt
Mạnh: kiểm thử
12 Tìm kiếm theo Binary search 3 Chinh: cài đặt
Mạnh: kiểm thử
13 Biểu diễn độ phức tạp và thời
gian tính toán
3 Chinh: cài đặt
Thái: kiểm thử
14 Thoát 3 Chinh: cài đặt
Thái: kiểm thử
Nhóm PE03 - Lớp IT3040- K55
16

Kỹ thuật lập trình
1.3. Giao diện chương trình
<Chụp các màn hình vào/ra cho các chức năng quan trọng. Mô tả chi tiết từng chức
năng
1. Giao diện chính của chương trình (bảng Menu chính)
Bảng Menu chính
2. Chức năng nhập dữ liệu (chức năng 2)
Sau khi đã khởi tạo mảng, trên bảng Menu chính, bấm phim 2-ENTER, chương
trình sẽ chuyển sang chức năng gán giá trị cho các phần tử của mảng:
Màn hình sẽ hiển thị bảng chọn nguồn dữ liệu:
Bảng chọn nguồn dữ liệu
Nhóm PE03 - Lớp IT3040- K55
17
Kỹ thuật lập trình
a. Nhập dữ liệu từ bàn phím
Sau khi chọn chức năng nhập mảng từ bàn phím (phím số 1 trong bảng chọn nguồn
dữ liệu), màn hình sẽ hiện yêu cầu nhập số phần tử của mảng và nhập giá trị cho từng
phần tử.
Sau đó màn hình sẽ hiển thị danh sách các phần tử của mảng
Màn hình nhập số lượng phần tử và nhập giá trị cho các phần tử
b. Nhập dữ liệu từ file
Sau khi lựa chọn chức năng nhập mảng từ file (phím số 2 trong bảng chọn
nguồn dữ liệu), màn hình sẽ hiện yêu cầu nhập tên tệp dữ liệu đầu vào.
Nếu file không tồn tại hoặc không mở được file thì màn hình sẽ hiển thị thông
báo:”không mở được file”.
Nếu file tồn tại màn hình sẽ hiển thị thong báo “đã đọc file thành công”, sau đó sẽ
hiển thị số lượng phần tử của mảng, lúc này màn hình hiển thị lựa chọn có hiển hị
mảng vừa nhập hay không.
Màn hình nhập dữ liệu từ file
Nhóm PE03 - Lớp IT3040- K55

18
Kỹ thuật lập trình
Màn hình hiển thị các phần tử nhập từ file
Như vậy là kết thúc quá trình nhập dữ liệu. Nhấn 1 phím bất kì để trở về menu chính.
3. Các chức năng sắp xếp
Trên màn hình Menu chính khi lựa chọn các phím 3,4,5 chương trình sẽ thực hiện
chức năng sắp xếp các phần tử của mảng (3. Theo Bubble sort, 4. Theo Insertion sort,
5. Theo Selection sort)
Nếu mảng không có phần tử nào chương trình sẽ thong báo mảng rỗng
Màn hình thông báo mảng rỗng
Nhóm PE03 - Lớp IT3040- K55
19
Kỹ thuật lập trình
Khi mảng đã chứa một số lượng phần tử chương trình sẽ thực hiện sắp xếp các
phần tử. Sau khi đã sắp xếp xong các phần tử của mảng theo chiều không giảm màn
hình sẽ hiển thị yêu cầu lựa chọn cách hiển thị kết quả:
Màn hình lựa chọn cách hiển thị kết quả
a. In ra màn hình
Khi lựa chọn in ra màn hình (phím 1 trên màn hình hiển thị kêt quả), màn hình sẽ
hiển thị danh sách các phần tử sau khi sắp xếp
Màn hình hiển thị các phần tử sau khi sắp xếp
Nhóm PE03 - Lớp IT3040- K55
20
Kỹ thuật lập trình
b. In ra file
Khi lựa chọn việc in ra file (phím 2 trên màn hình hiển thị kết quả), màn hình sẽ
hiển thị các nguồn dữ liệu ra (ghi lên file đã có sẵn hoặc tạo file mới để ghi).
Màn hình hiển thị in ra file
Trong đó file Output.txt là file có sẵn để in các kết quả.
• In ra file Output.txt

Sau khi chọn in ra file Output(phím 1 trên màn hình) màn hình sẽ đưa ra thông báo
ghi thành công.
Thông báo in ra file Output.txt
Nhóm PE03 - Lớp IT3040- K55
21
Kỹ thuật lập trình
• In ra file mới
Sau khi chọn in ra file mới (phím 2 trên màn hình), màn hình sẽ yêu cầu nhập tên
file để lưu kết quả (chỉ cần nhập tên, không cần định dạng vì đã định dạng txt)
Màn hình nhập file mới
Sau khi đã in ra file mới màn hình sẽ hiện thông báo thành công
Màn hình thông báo
Kết thúc chức năng sắp xếp. Nhấn 1 phím bất kì để trở về menu chính.
4. Chức năng tìm và in vị trí GTLN
Trên màn hình Menu chính khi lựa chọn các phím 6 chương trình sẽ thực hiện chức
năng tìm kiếm giá trị lớn nhất của mảng
Nếu mảng không có phần tử nào chương trình báo rỗng
Khi mảng đã chứa các phần tử chương trình sẽ thực hiện tìm kiếm GTLN và vị trí
của nó trong mảng.
Sau đó màn hình sẽ lại đưa ra yêu cầu lựa chọn cách in kết quả (in ra màn hình
hoặc in ra file)
a. In ra file (tương tự như trên)
b. In ra màn hình
Nhóm PE03 - Lớp IT3040- K55
22
Kỹ thuật lập trình
Màn hình hiển thị kết quả
Kết thúc việc tìm GTLN. Nhấn 1 phím bất kì để trở về menu chính.
5. Tính độ lệch hai phần tử trong mảng
Trên màn hình Menu chính khi lựa chọn các phím 9 chương trình sẽ thực hiện chức

năng tính độ lệch hai phần tử trong mảng.
Nếu mảng không có phần tử nào chương trình báo rỗng
Khi mảng đã chứa các phần tử chương trình sẽ thực hiện tính độ lệch hai phần tử
trong mảng
Màn hình sẽ yêu cầu nhập vị trí 2 phần tử:
Nhập vị trí hai phần tử
Sau đó chương trình sẽ tính toán và đưa ra yêu cầu lựa chọn cách in kết quả (in ra
màn hình hoặc in ra file)
a. In ra file (tương tự như trên)
b. In ra màn hình
Màn hình sẽ hiển thị giá trị hai phần tử và độ lệch của chúng
Nhóm PE03 - Lớp IT3040- K55
23
Kỹ thuật lập trình
Màn hình hiển thị kết quả
6. Chức năng tìm kiếm
Trên màn hình Menu chính khi lựa chọn các phím 11, 12 chương trình sẽ thực hiện
chức năng tìm kiếm trong mảng (11. Tìm kiếm tuần tự, 12. Tìm kiếm nhị phân)
Nếu mảng không có phần tử nào chương trình báo rỗng
Khi mảng đã chứa các phần tử chương trình sẽ thực hiện tìm kiếm các phần tử của
mảng.
Màn hình sẽ yêu cầu nhập vào giá trị phần tử cần tìm kiếm
Màn hình nhập giá trị tìm kiếm
Sau đó chương trình sẽ tính toán và đưa ra yêu cầu lựa chọn cách in kết quả (in ra
màn hình hoặc in ra file)
a. In ra file (tương tự như trên)
b. In ra màn hình
Nếu không có phần tử nào có giá trị như thế màn hình sẽ hiển thị thông báo
Nhóm PE03 - Lớp IT3040- K55
24

Kỹ thuật lập trình
Khi không có giá trị nào thỏa mãn
Nếu tìm được giá trị trong mảng màn hình sẽ hiển thị vị trí các phần tử có giá trị đó
Khi tìm được giá trị thỏa mãn
7. Chức năng biểu diễn độ phức tạp tính toán và thời gian tính toán
Trên màn hình Menu chính khi lựa chọn các phím 13 chương trình sẽ thực hiện
chức năng biểu diễn độ phức tạp tính toán và thời gian tính toán.
Màn hình Menu lựa chọn của chức năng này
Khi đó hãy chọn một chức năng cần xem thời gian tính toán.
Nhóm PE03 - Lớp IT3040- K55
25

×