Tải bản đầy đủ (.docx) (54 trang)

Bài toán quản lí sinh viên bằng danh sách đặc

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 (537.88 KB, 54 trang )

QUẢN LÝ SINH VIÊN

LỜI NĨI ĐẦU
Cơng nghệ thơng tin là một trong những ngành phát triển vượt bậc trong những năm gần đây.
Ngày nay với sự phát triển nhanh chóng của xã hội thì cơng nghệ thơng tin được ứng dụng rộng rãi ở
hầu hết tất cả các lĩnh vực và ngày càng đóng vai trị quan trọng, trở thành một phần thiết yếu trong
đời sống hằng ngày. Công nghệ thơng tin là một ngành địi hỏi ở người học một nền tảng kiến thức
vững chắc, sự tư duy logic cao, hiểu biết sâu rộng trên nhiều lĩnh vực. Với chúng em hiện đang là
những sinh viên công nghệ thông tin cần phải có sự đầu tư, khơng ngừng học hỏi để nâng cao kiến
thức. Do đó để củng cố lại kiến thức đã học, đề tài mà em chọn để thực hiện đồ án là: Bài tốn Quản
lí sinh viên bằng danh sách đặc.
Quản lý sinh viên là một đề tài khơng cịn mới mẻ với các bài tốn quản lý. Việc đưa tin học
vào ứng dụng để quản lý là rất hữu ích, vì chúng ta bỏ ra rất ít thời gian mà lại thu được hiệu quả
cao, rất chính xác và tiện lợi nhanh chóng.
Thơng qua q trình thực hiện đồ án, chúng em đã nắm bắt được những kỹ thuật quan trọng
của việc xây dựng cấu trúc dữ liệu và phân tích, thiết kế giải thuật sao cho tối ưu nhất. Bài toán “Quản
lý sinh viên” mà nhóm chúng em nghiên cứu và trình bày trong báo cáo sau đây là một ví dụ. Chúng
em xin chân thành cảm ơn cô Đỗ Thị Tuyết Hoa đã bổ sung ý tưởng và tận tình giúp đỡ chúng em thực
hiện đồ án này.
Trong q trình thực hiện, khơng tránh khỏi sai xót. Chúng em rất mong nhận được sự góp ý từ
phía thầy cơ để bài làm của chúng em được hoàn thiện hơn.
Đà Nẵng, ngày 02 tháng 06 năm 2017

1


QUẢN LÝ SINH VIÊN

MỤC LỤC
LỜI NÓI ĐẦU…………………………………………………………………………………….01
MỤC LỤC………………………………………………………………………………………… 02


I

Cơ sở lý thuyết
1
2

II

Định nghĩa danh sách đặc ……………………………..……………………………… 03
Biểu diễn danh sách đặc ……………………………………………………………….03

Ứng dụng danh sách đặc vào quản lý sinh viên
1
2
3
4

Đặc tả hệ thống …………………………………………….…………………………...05
Yêu cầu hệ thống …………………………………………………………………………05
Phân tích và thiết kế chương trình ………………………………………………………. 05
Thuật tốn, độ phức tạp và cài đặt chương trình …………………………………………08
4.1: Hiển thị danh sách sinh viên ……………………………………………………….. 10
4.2: Thêm một sinh viên vào danh sách ………………………………………………… 11
4.3: Tìm thơng tin sinh viên theo họ và tên ……………………………………………... 12
4.4: Tìm thơng tin sinh viên theo mã sinh viên ………………………………………….. 12
4.5: Xóa một sinh viên khỏi danh sách …………………………………………………. 12
4.6: Tính điểm trung bình và xét học bổng ……………………………………………... 13
4.7: Xóa sinh viên nữ khóa 08 …………………………………………………………... 13
4.8: Sắp xếp theo họ và tên ……………………………………………………………… 14
4.9: Chèn một sinh viên không thay đổi thứ tự sắp xếp ………………………………… 16

4.10: Thống kê số lượng học sinh và học bổng …………………………………………. 16
4.11: Hàm kiểm tra giới tính ……………………………………………………………. 17
4.12: Hàm kiểm tra ngày tháng …………………………………………………………. 17
4.13: Hàm kiểm tra tên ………………………………………………………………….. 17
4.14: Ghi kết quả ra file …………………………………………………………………. 17

5. Kết quả chương trình ……………………………………………………………………. 18
6. Kết luận …………………………………………………………………………………… 23

2


QUẢN LÝ SINH VIÊN

CHƯƠNG 1: CƠ SỞ LÍ THUYẾT
I.
ĐỊNH NGHĨA DANH SÁCH ĐẶC
Danh sách đặc là danh sách mà không gian bộ nhớ lưu trữ các phần tử được đặt liên
tiếp nhau trong bộ nhớ
II.
BIỂU DIỄN DANH SÁCH ĐẶC

Để biểu diễn danh sách đặc chúng ta sử dụng một dãy (mảng) các phần tử có kiểu dữ liệu là
kiểu dữ liệu của các phần tử trong danh sách. Do vậy, chúng ta cần biết trước số phần tử tối đa của
mảng cũng chính là chiều dài tối đa của danh sách thơng qua một hằng số ngun. Ngồi ra, do
chiều dài của danh sách luôn luôn biến động cho nên chúng ta cũng cần quản lý chiều dài thực của
danh sách thông qua một biến nguyên.
Giả sử chúng ta quy ước chiều dài tối đa của danh sách đặc là 10000, khi đó cấu trúc dữ liệu để
biểu diễn danh sách đặc như sau:
const int MaxLen = 10000; // hoặc: #define MaxLen 10000

int Length;
T CD_LIST[MaxLen]; // hoặc: T * CD_LIST = new T[MaxLen];

Nếu chúng ta sử dụng cơ chế cấp phát động để cấp phát bộ nhớ cho danh sách đặc thì cần kiểm
tra sự thành cơng của việc cấp phát động.
a. Các thao tác cơ bản trên danh sách đặc
a. Khởi tạo danh sách (Initialize).
b. Tạo mới danh sách/ Nhập danh sách.
c. Thêm một phần tử vào danh sách.
d. Tìm kiếm một phần tử trong danh sách.
e. Loại bỏ bớt một phần tử ra khỏi danh sách.
f. Cập nhật giá trị cho một phần tử trong danh sách.
g. Sắp xếp thứ tự các phần tử trong danh sách.
h. Tách một danh sách thành nhiều danh sách.
i. Nhập nhiều danh sách thành một danh sách.
j. Sao chép một danh sách.
k. Hủy danh sách.
b. Ưu điểm và nhược điểm của danh sách đặc
Do các phần tử được lưu trữ liên tiếp nhau trong bộ nhớ, do vậy danh sách đặc có các
ưu nhược điểm sau đây:
Ưu điểm:
- Mật độ sử dụng bộ nhớ của danh sách đặc là tối ưu tuyệt đối (100%)
- Việc truy xuất và tìm kiếm các phần tử của danh sách đặc là dễ dàng vì các phần tử đứng
liền nhau nên chúng ta chỉ cần sử dụng chỉ số để định vị vị trí các phần tử trong danh sách
(định vị địa chỉ các phần tử)
3


QUẢN LÝ SINH VIÊN


Nhược điểm:
- Việc thêm, bớt các phần tử trong danh sách đặc có nhiều khó khăn do chúng ta phải di dời
các phần tử khác đi qua chỗ khác.
c. Ứng dụng của danh sách đặc
Danh sách đặc được ứng dụng nhiều trong các cấu trúc dữ liệu mảng: mảng 1 chiều,
mảng nhiều chiều; Mảng cấp phát tĩnh, mảng cấp phát động; … mà chúng ta đã nghiên cứu và
thao tác khá nhiều trong quá trình lập trình trên nhiều ngơn ngữ lập trình khác nhau.

4


QUẢN LÝ SINH VIÊN

CHƯƠNG 2: ỨNG DỤNG DANH SÁCH ĐẶC VÀO QUẢN LÍ SINH VIÊN
I. ĐẶC TẢ BÀI TỐN
Quản lý sinh viên là cơng việc hằng ngày của phịng quản lý học sinh- sinh viên. Công việc
quản lý sinh viên địi hỏi tính tỉ mỉ, cẩn thận trong từng khâu ghi chép các thông tin cá nhân của sinh
viên: mã số sinh viên, tên sinh viên, ngày tháng năm sinh, lớp….cũng như công việc thống kê kết quả
học tập cần rõ ràng và chính xác. Trước đây cơng nghệ thơng tin chưa phát triển mạnh mẽ, các công
việc được xử lý thủ công, chủ yếu là ghi chép bằng bút, sổ sách chính vì vậy rất tốn cơng sức và khá
nhiều thời gian. Ngày nay khi mà khoa học kỹ thuật phát triển, đặc biệt là sự bùng nổ công nghệ
thơng tin thì việc quản lý sinh viên sẽ dễ dàng hơn nhiều. Xuất phát từ nhu cầu đó mà bài toán Quản
lý sinh viên ra đời. Yêu cầu của bài tốn là tạo ra chương trình có thể thực hiện các thao tác quản lý
sinh viên một cách dễ dàng, tiện lợi dựa trên sự trợ giúp của máy tính. Mọi cơng việc phải được thao
tác trên một vùng dữ liệu chung để đảm bảo việc đồng bộ với nhau trong khâu quản lý
II. YÊU CẦU HỆ THỐNG
Quản lý điểm sinh viên là chương trình quản lý hồ sơ, điểm học tập của sinh viên trong quá
trình theo học tại trường. Chương trình có thể thực hiện các cơng việc thêm mới sinh viên, tìm kiếm
sinh viên theo một điều kiện nào đó, xóa sinh viên, liệt kê danh sách sinh viên….
Chương trình được viết bằng ngơn ngữ C và dựa trên cấu trúc lưu trữ của danh sách đặc

Hiện nay các trường đại học của Việt Nam, cũng như các doanh nghiệp đang trong tiến trình
ứng dụng mạnh mẽ sự phát triển của công nghệ thông tin vào quản lý. Mới đầu chỉ là những máy tính
cá nhân đơn giản và cho đến nay là các mạng thông tin phức tạp. Tuy nhiên do đặc điểm công nghệ
thông tin của Việt Nam mới trong quá trình phát triển nên mặc dù đã quan tâm đến việc ứng dụng
công nghệ thông tin vào quản lý nhưng các phần mềm hệ thống, các phần mềm trợ giúp hoặc phần
mềm quản lý có thể thay thế hồn tồn cơng việc thủ cơng chưa được quan tâm. Với chương trình
“quản lý sinh viên” này hy vọng sẽ giúp cho công tác quản lý sinh viên diễn ra đơn giản và tiết kiệm
thời gian hơn
III. PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH
a. Cấu trúc dữ liệu chương trình
Để giúp cho việc quản lý được chặc chẽ, dễ dàng, chương trình quản lí sinh viên sẽ có các
trường hợp sau:

5


QUẢN LÝ SINH VIÊN

-

msv (mã sinh viên) có kiểu dữ liệu char, với độ dài 100 kí tự, mỗi sinh viên có một mã số
riêng, khơng trùng lặp
fullname (họ và tên) có kiểu dữ liệu char, với độ dài 100 kí tự, họ tên sinh viên có thể trùng
nhau
date (ngày sinh) có kiểu dữ liệu char, với độ dài 100 kí tự, ngày sinh có thể trùng nhau
gender (giới tính) có kiểu dữ liệu char, với độ dài 100 kí tự,
classs (lớp) có kiểu dữ liệu char, với độ dài 100 kí tự
math (điểm tốn) có kiểu dữ liệu float
physics (điểm lý) có kiểu dữ liệu float
it (điểm tin) có kiểu dữ liệu float

dtb (điểm trung bình) có kiểu dữ liệu float, điểm trung bình được tính bằng cách lấy trung
bình cộng điểm thi các mơn học của sinh viên
hb (học bổng)
typedef char infor1[100];
typedef float infor2;
struct element {
infor1 msv;
infor1 fullname;
infor1 date;
infor1 gender;
infor1 classs;
infor2 math;
infor2 physics;
infor2 it;
infor2 dtb;
infor2 hb;
};

b. Các chức năng của chương trình
1. Hiển thị danh sách sinh viên
- Duyệt danh sách sinh viên trong file
- In thông tin sinh viên ra màn hình
2. Thêm một sinh viên vào danh sách
- Nhập thông tin chi tiết cho một sinh viên.
- Chèn sinh viên vào danh sách ở vị trí đầu tiên.
3. Tìm thơng tin sinh viên theo họ và tên
6


QUẢN LÝ SINH VIÊN


- Nhập họ và tên sinh viên từ bàn phím.
- Duyệt qua danh sách sinh viên.
- Tìm kiếm sinh viên theo họ tên mà người dùng yêu cầu.
- Hiển thị thơng tin sinh viên cần tìm ra màn hình.
4. Tìm sinh viên theo mã số sinh viên
- Nhập mã số sinh viên từ bàn phím .
- Duyệt qua danh sách sinh viên.
- Tìm kiếm sinh viên theo họ tên mà người dùng yêu cầu.
- Hiển thị thông tin sinh viên cần tìm ra màn hình.
5. Xóa một sinh viên khỏi danh sách
- Nhập số thự tự cần xóa khỏi danh sách.
- Duyệt qua danh sách sinh viên.
- Tìm kiếm sinh viên theo số thứ tự mà người dùng u cầu.
- Xóa sinh viên vừa tìm được.
6. Tính điểm trung bình và xét học bổng
- Duyệt danh sách sinh viên
- Thực hiện tính điểm trung bình và xét học bổng của từng sinh viên
- Hiển thị danh sách sinh viên sau khi đã tính điểm trung bình và xét học bổng
7. Xóa các sinh viên nữ khóa 08
- Duyệt danh sách sinh viên
- Tìm kiếm sinh viên là nữ khóa 08
- Xóa các sinh viên vừa tìm được
8. Sắp xếp theo họ tên
7


QUẢN LÝ SINH VIÊN

- Duyệt danh sách sinh viên

- Sắp xếp danh sách sinh viên theo họ tên
- Hiển thị danh sách đã sắp xếp
9. Chèn một sinh viên không thay đổi thứ tự sắp xếp.
- Nhập thông tin sinh viên từ bàn phím.
- Duyệt danh sách sinh viên
- Hiển thị danh sách đã sắp xếp
10. Thống kê số lượng học sinh từng lớp và học bổng.
- Duyệt điểm trung bình và học bổng của từng sinh viên
- Hiển thị bảng tổng số sinh viên và tổng số học bổng của từng lớp
11. Hàm kiểm tra giới tính nhập từ bàn phím. (Nam/ Nữ)
- Trả về kết quả 1 nếu nhập đúng.
12. Hàm kiểm tra ngày tháng nhập từ bàn phím. (xx/xx/xx)
- Trả về kết quả 8 nếu nhập đúng.
13. Hàm kiểm tra tên nhập từ bàn phím . ([A-Z]xxx [A-Z]xxx [A-Z]xxx [A-Z]xxx)
- Trả về kết quả 1 nếu nhập đúng.
14. Ghi kết quả ra file
- Ghi kết quả ra file, thông tin mỗi sinh viên trên một hàng.
IV. THUẬT TỐN, ĐỘ PHỨC TẠP VÀ CÀI ĐẶT CHƯƠNG TRÌNH
a. Định nghĩa cấu trúc cho chương trình quản lí sinh viên
- void insert(DS &A, int &n, int t,infor1 msv,infor1 fullname,infor1
gender,infor1 classs,infor2 math,infor2 physics,infor2 it)
- char *rtrim(char *s)
- void getlist(DS &A, int &n)
8

date,infor1


QUẢN LÝ SINH VIÊN


- void display(DS &A, int n)
- void gotoxy(int x, int y)
- void menu()
- void Displayone (DS A,int i)
- void searchname (DS A,infor1 fullname)
- void searchid (DS A,infor1 fullname)
- void diemtrungbinh (DS &A,int &n)
- int check08(DS &A,int i)
- void dele(DS &A, int &n, int t)
- void delenu(DS &A, int &n)
- void OutputHB(DS A,int n)
- ChiTiet_Ten Tach_HovaTen(char *pTemp)
- int SoSanh(char *x, char *y)
- void SapXep(DS A, int n)
- void chenvao(DS &A, int &n, int t,infor1 msv,infor1 fullname,infor1
gender,infor1 classs,infor2 math,infor2 physics,infor2 it)
- void ghifile(DS A,int n)
- void ThongKe(DS A, int n)
- int checkdate(infor1 date)
- int checkgender(infor1 gender)
- int checkname(infor1 name)
- int main()

b. Thuật toán và độ phức tạp :
1: Hiển thị danh sách sinh viên:
- Duyệt danh sách sinh viên trong file:
9

date,infor1



QUẢN LÝ SINH VIÊN

+Input : Dữ liệu từ một file .txt do người dùng định nghĩa.
+Output : Dữ liệu đã được nạp vào danh sách trong chương trình.
. Đọc dữ liệu từ tệp. Dữ liệu tệp là file .txt chứa danh sách sinh viên,mỗi hàng là thông tin của
một sinh viên bao gồm mã sinh viên, tên sinh viên ,ngày sinh, giới tính, lớp, điểm mơn tốn, lý, tin.
. Danh sách A, gồm các trường như trên.
.Đọc dữ liệu từ tệp:
Bước 1: Đọc từng hàng của tệp, lưu vào mảng ký tự A[i].
Bước 2: Thực hiện cắt chuỗi, gặp dấu “;” thì sẽ cắt phần ở trước lưu vào biến
tương ứng, ví như gặp mã sinh viên thì sẽ cắt mã sinh viên lưu vào biến msv.
Bước 3: Các điểm toán, lý, tin sẽ chuyển từ kiểu ký tự sang số rồi lưu vào biến
điểm tương ứng (math, physics,it)
Bước 4: Sau khi đã hoàn thành việc chuyển các ký tự trên một hàng vào các biến
tương ứng, thực hiện ghi vào danh sách A bằng hàm insert (trình bày ở mục 2.4.2.2)
Bước 5: Thực hiện tương tự đến khi kết thúc file.
+Độ phức tạp thuật toán : trong trường hợp xấu nhất vịng while thực hiện n lần thì độ phức tạp
thuật toán là : T(n) = O(n).

.Tệp demo như sau :

- In thơng tin sinh viên ra màn hình:
1. Hàm display dùng để in thông tin sinh viên ra màn hình.

10


QUẢN LÝ SINH VIÊN


2. Cho một biến i chạy từ 0  n-1 : Với mỗi biến i thì in dữ liệu trong danh sách ứng với vị trí
A[i] ra. Vị trí A[i] gồm các trường mã sinh viên(A[i].msv, họ tênA[i].fullname, ngày sinh A[i].date,
giới tính A[i].gender, lớp A[i].classs, điểm tốn A[i].math, điểm lý A[i].physics , điểm tin A[i].it .
2: Thêm một sinh viên vào danh sách:
+ Input: Nhập thông tin sinh viên từ bàn phím (mã sinh viên, họ tên, ngày sinh, giới tính, lớp,
điểm tốn, điểm lý, điểm tin)
+ Output: Danh sách sau khi đã thêm sinh viên
Bước 1: Đọc dữ liệu từ bàn phím, lưu vào các biến tương ứng đã được định nghĩa.
Dữ liệu ở đây bao gồm mã sinh viên (msv), họ và tên sinh viên (fullname), ngày sinh
(date), giới tính (gender), lớp (classs), điểm tốn (math), điểm lý (physics), điểm tin (it).
Bước 2: Dùng hàm Insert, chèn dữ liệu của sinh viên đã nhập vào bảng.
* Hàm Insert có các giá trị truyền vào hàm (A, n, t, msv, fullname, date, gender, classs, math,
physics, it) trong đó:
A
: tên danh sách.
n
: số các phần tử đã khởi tạo.
t
: vị trí chèn vào
msv
: mã sinh viên
fullname : họ và tên
date
: ngày sinh
gender : giới tính
classs
: lớp
math
: điểm toán
physics : điểm lý

it
: điểm tin
Bước 3: Khởi tạo biến i, biến i là biến đệm dùng để duyệt danh sách trong chương
trình.
Bước 4 : Nếu t có giá trị từ 0  n-1 thì dịch dữ liệu danh sách lên 1 đơn vị kể từ vị
trí t, sao chép dữ liệu đã nhập vào vị trí i=t. Cụ thể :
Bước 4.1: Cho biến i chạy từ n-1 đến t :
Bước 4.2: Với mỗi i gán A[i+1] =A[i] (Dịch dữ liệu lên 1 đơn vị )
Bước 4.3: Sao chép dữ liệu đã nhập vào các trường A[t].
Bước 4.4: Sau khi thực hiện xong công việc, tăng n lên 1 đơn vị vì độ dài danh
sách đã tăng lên 1.
Trong trường hợp chèn dữ liệu đã nhập vào bảng, mặc định của t=0 để chèn dữ liệu vào
vị trí đầu tiên.

11


QUẢN LÝ SINH VIÊN

Trong trường hợp xấu nhất vòng for lặp lại n lần : O(n)
Vậy độ phức thuật toán là T(n) = = O(n²).
3: Tìm thơng tin sinh viên theo họ và tên:
+ Input : Họ và tên sinh viên nhập từ bàn phím, danh sách đã nạp dữ liệu.
+ Output : Thơng tin sinh viên tìm được, nếu tìm khơng có thì báo khơng tìm thấy
Bước 1: Nhập tên sinh viên vào từ bàn phím, lưu vào biến fullname.
Bước 2: Duyệt chương trình từ đầu đến cuối danh sách (0  n-1) :
Bước 3: Khởi tạo một biến k để kiểm tra trong danh sách có sinh viên cần tìm hay
khơng, nếu kết thúc chương trình k=0 thì khơng có sinh viên trong danh sách, ngược
lại thì có.
Bước 4: Nếu so sánh trường A[i].fullname = fullname thì thực hiện đồng thời việc

hiển thị thơng tin sinh viên đó ra với hàm Displayone, tăng k lên 1 đơn vị.
Bước 5: Nếu k=0 thơng báo tìm khơng có sinh viên trong danh sách.
Hàm Displayone để hiển thị thông tin 1 sinh viên, tương tự như hàm Display nhưng
Displayone chỉ duyệt 1 phần tử trong danh sách để hiển thị.
+ Độ phức tạp thuật toán : Trong trường hợp xấu nhất lặp lại n lần thì T(n) = O(n).
4 : Tìm thông tin sinh viên theo mã số sinh viên:
+ Input : Mã số sinh viên nhập từ bàn phím , danh sách đã nạp dữ liệu.
+ Output : Thông tin sinh viên tìm được, nếu tìm khơng có thì báo khơng tìm thấy.
Tương tự như tìm theo họ và tên, chỉ khác tìm theo mã số sinh viên sẽ so sánh với trường
A[i].msv.
+ Độ phức tạp thuật toán : Trong trường hợp xấu nhất lặp lại n lần thì T(n) = O(n).
5 : Xóa một sinh viên khỏi danh sách
+ Input : Nhập vào vị trí cần xóa , danh sách đã nạp dữ liệu.
+ Output : Danh sách sinh viên sau khi đã xóa một sinh viên.
12


QUẢN LÝ SINH VIÊN

Hàm dele(A,n,t) trong đó A: danh sách, n: số các đối tượng đã khởi tạo, t: vị trí.
Bước 1: Nhập vào vị trí cần xóa (ví trí từ 0  n-1), vị trí cần xóa tương ứng với t, nếu
vị trí cần xóa ngồi tầm thì thơng báo lỗi.
Bước 2: Nếu vị trí trong tầm thì dịch danh sách lên 1 đoạn là 1 kể từ vị trí t, tức là
cho một biến i tạm chạy từ t n-1 gán A[i-1]=A[i].
Bước 3: Nếu xóa được thì giảm n đi một đơn vị.
+ Độ phức tạp thuật toán : T(n) = O(n).
6 : Tính điểm trung bình và xét học bổng
+ Input : Danh sách sinh viên đã nạp dữ liệu.
+ Output :Danh sách đã tính điểm trung bình và xét học bổng.
. Tính điểm trung bình và học bổng : hàm diemtrungbinh(A,i).

Bước 1: Duyệt danh sách từ đầu đến cuối
Bước 2: Ứng với mỗi phần tử tính trường điểm trung bình bằng trung bình cộng của
3 trường điểm toán, lý, tin.
Bước 3: Kiểm tra nếu điểm trung bình >=8 thì học bổng =200, nếu điểm trung bình
>=7 và <8 thì học bổng = 100, ngược lại học bổng =0.
+ Độ phức tạp thuật toán : T(n) = O(1);
7 : Xóa các sinh viên nữ khóa 08
+ Input : Danh sách sinh viên đã nạp dữ liệu.
+ Output :Danh sách đã xóa các sinh viên nữ khóa 08.
Hàm delenu (A,n) và hàm check08
1. Hàm check08 để kiểm tra xem khóa của sinh viên đó có phải là 08 hay không. Kiểm tra

đối với trường classs (lớp ) của sinh viên, nếu 2 ký tự đầu là ‘08’ thì đó là sinh viên khóa
08. Cách kiếm tra:
Bước 1: Khởi tạo biến S tạm.
13


QUẢN LÝ SINH VIÊN

Bước 2: Nếu kí tự đầu tiên của A[i].classs = ‘0’ và kí tự tiếp theo của A[i].classs =
‘8’ thì gán S=2, ngược lại S=0.
Bước 3: Nếu S=0 thì đó khơng phải là khóa 08, nếu S=2 thì đó là khóa 08.
2. Hàm delenu dùng để xóa sinh viên giới tính nữ và là khóa 08.

Cách kiểm tra :
Bước 1: Duyệt danh sách với biến i từ đầu tới cuối (0 n-1) , ứng với mỗi phần tử
của danh sách tại vị trí đó :
Bước 2: Kiểm tra xem giới tính của A[i].gender = “nữ” và đó là khóa 08 tức là
check08(A,i) = 2 thì xóa sinh viên tại ví trí i đó đi. Hàm xóa đã giải thích tại 5.

+ Độ phức tạp thuật tốn : T(n) = O(n).
8: Sắp xếp theo họ tên
+ Input : Danh sách sinh viên đã nạp dữ liệu.
+ Output :Danh sách sinh viên sau khi sắp xếp họ tên.
. Sử dụng các hàm Tach_HovaTen(A[i].fullname), SoSanh(char *x, char *y), SapXep (A,n)
. Định dạng ChiTiet_Ten kiểu struct gồm 3 trường Ho,Dem,Ten để lưu dữ liệu.
Trong đó:
. Hàm Tach_HovaTen dùng để tách các phần của họ và tên ra các phần riêng biệt, lưu vào
biến ChiTiet_Ten.
. Hàm SoSanh dùng để so sánh 2 xâu ký tự, tương ứng với so sánh 2 xâu Ten hoặc Ho hoặc
Dem.
. Hàm Sắp xếp dùng để sắp xếp họ và tên theo thứ tự giảm dần trong danh sách
1.

14

Hàm Tach_HovaTen:
+ Input : Họ và tên của sinh viên.
+ Output: Tách các phần họ, tên, đệm lưu vào các biến.
Bước 1: Dùng 1 biến nDo_Dai để lưu độ dài của xâu họ và tên.
Bước 2: Khởi tạo biến HovaTen kiểu ChiTiet_Ten ( đã định nghĩa ở trên).
Bước 3: Cho biến i chạy từ đầu  nDo_Dai-1 nếu gặp khoảng trắng thì thốt, phần từ
ban đầu đến khoảng trắng đầu tiên chính là phần họ. Lưu vào HovaTen.p[Ho].


QUẢN LÝ SINH VIÊN

2.

3.


Bước 4: Cho biến I chạy từ nDo-Dai-1 đến ban đầu nếu gặp khoảng trắng thì thốt,
phần từ cuối đến khoảng trắng cuối đó chính là phần tên. Lưu vào HoVaTen.p[Ten].
Bước 5 : Phần còn lại giữa 2 khoảng trắng chính là phần đệm, lưu vào
HoVaTen.p[Dem]
Hàm SoSanh(char *x, char *y)
+ Input : Một xâu chứa họ hoặc tên hoặc đệm của tên sinh viên.
+ Output: trả về là -1 nếu x<y; 1 nếu x>y; 0 nếu x=y.
Bước 1: Khởi tạo các biến nDo_Dai_x = strlen(x), nDo_Dai_y = strlen(y),
nDo_Dai_min, nDo_Dai_max.
Bước 2: Tìm trong 2 xâu xem xâu nào có độ dài lớn hơn. Gán nDo_Dai_max cho độ
dài của xâu lớn hơn (dài hơn), nDo_Dai_min cho độ dài của xâu bé hơn (ngắn hơn).
Bước 3: Cho i chạy từ 0  nDo_Dai_min nếu x[i]< y[i] thì kết quả trả về -1 ngược lại
kết quả trả về 1 tức là nếu x<y thì kết quả -1 , x>y kết quả là 1 , thốt chương trình.
Bước 4: Nếu kết thúc quá trình chạy trên và i= n_Do_Dai_max thì chứng tỏ 2 xâu
giống nhau, trả về kết quả là 0 , thốt chương trình.
Bước 5: Nếu i=n_Do_Dai_x tức là duyệt hết bước 3 trả về kết quả này và đã qua kiểm
tra bước 4 thì chứng tỏ các ký tự xâu x giống các ký tự đầu tiên xâu y nhưng xâu y dài
hơn xâu x, kết quả trả về -1 ngược lại kết quả trả về 1 thốt chương trình.
Hàm SapXep(A,n) :
+ Input : Danh sách sinh viên đã nạp dữ liệu.
+ Output : Danh sách sinh viên đã sắp xếp họ và tên theo thứ tự giảm dần.
n: số sinh viên đã nạp dữ liệu, i,j: biến tạm khởi tạo chạy trong chương trình.
* Dựa trên thuật tốn sắp xếp nổi bọt.
Bước 1: Cho biến i chạy từ 0  n-1
Bước 2: Cho biến j chạy từ i  n
Bước 3: Dùng hàm Tach_HovaTen để tách họ, tên, đệm của sinh viên ở vị trí i và j
tương ứng.
Bước 4: Dùng hàm SoSanh so sánh tên của 2 sinh viên a,b ( SoSanh(a,b) ) , nếu bhồn đổi vị trí b cho a.

Bước 5: Nếu phần tên bằng nhau thì thực hiện so sánh và hốn đổi tương tự với phần
họ.
Bước 6: Nếu phần họ bằng nhau thì thực hiện so sánh và hoán đổi tương tự với phần
tên đệm.
+ Độ phức tập của thuật toán : Hàm sử dụng 2 vòng for lồng nhau. Trong trường hợp xấu nhất
lặp lại n lần O(n) thì T(n) = T(n) = = O(n²).
9. Chèn một sinh viên không thay đổi thứ tự sắp xếp
+Input : Danh sách sinh viên đã nạp dữ liệu, thông tin sinh viên nhập vào từ bàn phím.

15


QUẢN LÝ SINH VIÊN

+Output : Danh sách sinh viên đã được sắp xếp.
Bước 1: Nhập thông tin sinh viên từ bàn phím (sinh viên a ).
Bước 2: Khởi tạo biến s=0. Biến s ở đây dùng để đánh dấu là đã chèn thành công sinh
viên chưa.
Bước 3: Duyệt danh sách sinh viên, cho i chạy từ 0  n-1 :
Bước 4 : Nếu S<> 1 (tức là chưa chèn sinh viên vào danh sách ) thì tới bước 4, nếu
S=1 thì kết thúc chương trình.
Bước 5 : Khởi tạo j ; j=i+1
Bước 6 : Thực hiện SoSanh Tên của sinh viên vừa nhập (a) với các sinh viên đã có
trong danh sách (b) ( Hàm SoSanh được định ngĩa và giải thích ở 8.), nếu asinh viên vào vị trí i-1 (với i là vị trí của sinh viên b ). Kết thúc chương trình.
Bước 7 : Nếu phần tên của sinh viên a và b giống nhau, tiếp tục so sánh phần họ và tên
đệm, nếu thỏa mãn athúc chương trình.
+ Độ phức tập của thuật tốn : Hàm sử dụng 2 vòng for lồng nhau. Trong trường hợp xấu nhất
lặp lại n lần O(n) thì T(n) = T(n) = = O(n²).

10. Thống kê số lượng học sinh từng lớp và học bổng
+Input : Danh sách sinh viên đã nạp dữ liệu.
+Output : Bảng thống kê lớp, tổng số sinh viên, tổng học bổng.
n: Số sinh viên trong bảng danh sách, gán m=n ban đầu.
. Các công đoạn của hàm ThongKe:
1. Đếm và hiển thị số các lớp khác nhau trong danh sách .
Bước 1: Tạo mảng B, cho i chạy từ 0 n-1, nạp các lớp vào mảng B.
Bước 2: Cho biến i chạy từ 0 n-1, với mỗi i gán i=j+1
Bước 3: . Nếu jtức là cho k chạy từ jn-1, coppy B[k+1] vào B[k]. Giảm m đi 1.
.Nếu B[i] và B[j] khác nhau thì tăng j lên 1.
Mục đích của cơng đoạn này là để lọc các lớp khác nhau trong danh sách. Được m sẽ là
số các lớp khác nhau trong danh sách.
2. Thống kê sinh viên và tổng học bổng của từng lớp.
Bước 1: Duyệt B, cho i chạy từ 0  m
Bước 2: Khởi tạo biến sosinhvien=0, tonghocbong=0
Bước 3: Duyệt danh sách cho j chạy từ 0  n-1
Bước
4:
Nếu
so
sánh
B[i]=A[j]
thì
sosinhvien=sosinhvien+1,
tonghocbong=tonghocbong+A[j].hocbong.
Bước 5: Kết thúc.

16



QUẢN LÝ SINH VIÊN

+Độ phức tạp thuật toán : Hàm sử dụng 7 vòng for nối tiếp nhau nên độ phức tạp thuật toán
T(n) = O(n).
11. Hàm kiểm tra giới tính nhập từ bàn phím. (Nam/ Nữ)
1.

Hàm checkgender (gender).
Bước 1: Khởi tạo biến S=0
Bước 2: So sánh biến gender với “Nam” hoặc “Nữ” nếu đúng thì S=1
Bước 3: Trả về S. Nếu S=1 thì nhập đúng, S=0 thì nhập sai.

12. Hàm kiểm tra ngày tháng nhập từ bàn phím. (xx/xx/xx)
2. Hàm checkdate (date), date lưu vào mảng A.
Bước 1: Khởi tạo biến S=0 để lưu số kí tự đúng.
Bước 2: Kiếm tra nếu vị trí A[2]= ‘/’ và vị trí A[5] = ‘/’ thì S=S+2.
Bước 3: Kiểm tra lần lượt tại các vị trí A[0],A[1],A[3],A[4],A[6],A[7] nếu A[i]> ‘0’ và
A[i] < ‘9’ thì S=S+1
Bước 4: Nếu S<>8 thì thốt chương trình, nếu S=8 thì kiểm tra ngày thuộc khoảng từ 031 là được, tiến tới bước 5, nếu ngồi khoảng thì báo sai – nhập lại.
Bước 5: Kiểm tra tháng từ khoảng 01-12 là được- kết thúc, nếu ngồi khoảng thì báo sai
– nhập lại.
Bước 6: Nếu S=8 thì nhập ngày đã đúng định dạng, S<>8 thì báo sai – nhập lại.
13. Hàm kiểm tra tên nhập từ bàn phím . ([A-Z]xxx [A-Z]xxx [A-Z]xxx [A-Z]xxx)
1. Hàm checkname(name), nếu kí tự đầu tiên và các kí tự sau khoảng trắng in hoa thì được,
trong xâu tên khơng có số và các kí tự đặc biệt.
Bước 1: Tạo mảng A[i] để chứa các số nguyên là các vị trí của các khoảng trắng.
Bước 2: Duyệt kiểm tra biến name, nếu các kí tự nằm trong khoảng từ ‘A’  ‘z’ thì tới
bước 3 cịn khơng thì kết thúc trả giá trị hàm về 0;
Bước 3: Kiêm tra ký tự đầu tiên có phải là in hoa khơng, nếu in hoa thì gán S=1.

17


QUẢN LÝ SINH VIÊN

Bước 4: Cho biến i chạy từ 1  độ dài của name, nếu gặp các kí tự trắng thì lưu các vị
trí đó theo thứ tự vào mảng A, bằng cách khởi tạo biến j =1, kết thúc mỗi lần lưu thì tăng j
lên 1.
Bước 5: Tạo biến luu, gán biến luu  j-1 (số khoảng trắng ).
Bước 6: Duyệt mảng A, cho i chạy từ 1  luu, nếu name[i+1] >= ‘A’ và name[i+1]
<=’Z’ thì S=S+1;
Bước 7: Nếu luu+1=S (số khoảng trắng +1= số chữ viết hoa đầu dịng ) thì trả giá trị
hàm về kết quả 1, ngược lại trả về 0.
14. Ghi kết quả ra file.
Khi thốt chương trình, chương trính sẽ ghi file theo định dạng như file vào.
V. KẾT QUẢ CHƯƠNG TRÌNH :
1. Hiển thị danh sách:

2. Thêm một sinh viên vào danh sách :

18


QUẢN LÝ SINH VIÊN

3. Tìm theo tên của 1 sinh viên :

4. Tìm theo mã số sinh viên :
19



QUẢN LÝ SINH VIÊN

5. Xóa 1 sinh viên khỏi danh sách :

20


QUẢN LÝ SINH VIÊN

6. Tính điểm trung bình và xét học bổng :

7. Xóa sinh viên nữ khóa 08 :

21


QUẢN LÝ SINH VIÊN

8. Sắp xếp theo họ và tên :

9. Chèn vào một sinh viên không thay đổi thứ tự sắp xếp :

22


QUẢN LÝ SINH VIÊN

10. Bảng thống kê sinh viên, học bổng :


VI. Kết luận :
1. Ưu Điểm

+Giao diện khá rõ ràng
+Hồn thiện các chức năng của chương trình
+Xử lý được một số ngoại lệ thường gặp.
+Khá đơn giản và dễ sử dụng
2. Nhược điểm
+Sử dụng phím chuyển qua lại các chức năng gây sự phức tạp.
+Giải thuật chưa thực sự tối ưu.
+Code cịn theo hướng cấu trúc khó nâng cấp về sau.

PHỤ LỤC
#include<stdio.h>
#include <windows.h>
#include<conio.h>
#include <stdlib.h>
#include <string.h>
const int Nmax=100;
typedef char infor1[100];
typedef float infor2;
infor1 gioitinh="Nu";
int demnu=0;
struct element {
infor1 msv;
23


QUẢN LÝ SINH VIÊN


infor1 fullname;
infor1 date;
infor1 gender;
infor1 classs;
infor2 math;
infor2 physics;
infor2 it;
infor2 dtb;
infor2 hb;
};
typedef element DS[Nmax];
typedef struct{
char pHo[20];
char pDem[20];
char pTen[20];
}ChiTiet_Ten;
DS A;
infor1 msv;
infor1 fullname;
infor1 date;
infor1 gender;
infor1 classs;
infor2 math;
infor2 physics;
infor2 it;
24


QUẢN LÝ SINH VIÊN


int n,dem,t,p;
void insert(DS &A, int &n, int t,infor1 msv,infor1 fullname,infor1 date,infor1 gender,infor1
classs,infor2 math,infor2 physics,infor2 it){
int i;
if((n<Nmax)&&(t>=0)&&(t<=n)){
for(i=n-1; i>=t; i--){
A[i+1]=A[i];
}
strcpy(A[t].msv, msv);
strcpy(A[t].fullname,fullname);
strcpy(A[t].date, date);
strcpy(A[t].gender, gender);
strcpy(A[t].classs, classs);

A[t].math =math;
A[t].physics = physics;
A[t].it =it;
n++;
}
}
char *rtrim(char *s)
{
int i = strlen(s) - 1;
while (s[i] == ' ' || s[i] == '\n') i--;
s[i+1] = 0;
return s;
25