1. Trang chủ
  2. » Công Nghệ Thông Tin

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

54 1,4K 20

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 54
Dung lượng 522,71 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Chương trình được viết bằng

Trang 1

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 toá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 toá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 quá 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 quá 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

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU……….01

MỤC LỤC……… 02

I Cơ sở lý thuyết 1 Định nghĩa danh sách đặc ……… ……… 03

2 Biểu diễn danh sách đặc ……….03

II Ứng dụng danh sách đặc vào quản lý sinh viên 1 Đặc tả hệ thống ……….……… 05

2 Yêu cầu hệ thống ………05

3 Phân tích và thiết kế chương trình ……… 05

4 Thuật toá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

Trang 3

CHƯƠNG 1: CƠ SỞ LÍ THUYẾT

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êntiế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ủamả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ố nguyên Ngoài ra, dochiề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ủadanh 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ểmtra 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%)

Trang 4

- 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ử đứngliề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ử)

Trang 5

CHƯƠNG 2: ỨNG DỤNG DANH SÁCH ĐẶC VÀO QUẢN LÍ SINH VIÊN

I ĐẶC TẢ BÀI TOÁ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ệcquả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 sinhviê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ôngviệ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 toá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 thaotá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ếmsinh 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ụngcô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ầnmềm quản lý có thể thay thế hoàn toà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áctrường hợp sau:

Trang 6

- 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ùngnhau

- 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 toá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 trungbì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;

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

Trang 7

3 Tìm thông tin sinh viên theo họ và tê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 yê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

Trang 8

8 Sắp xếp theo họ tê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ữ)

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 TOÁ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

date,infor1 gender,infor1 classs,infor2 math,infor2 physics,infor2 it)

- char *rtrim(char *s)

Trang 9

- void getlist(DS &A, int &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 date,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:

Trang 10

+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 toá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ếntươ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ếntươ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.

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

Trang 11

A[i].date, giới tính A[i].gender, lớp A[i].classs, điểm toán A[i].math, điểm lý A[i].physics , điểm tinA[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 toá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 toá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 đó:

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 danhsá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

Trang 12

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) = ∑

i=0

n

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 haykhô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ượclạ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ệchiể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ưngDisplayone 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

Trang 13

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 ngoà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

Trang 14

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 toá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

+ 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)

Trang 15

Bước 3: Cho biến i chạy từ đầu  nDo_Dai-1 nếu gặp khoảng trắng thì thoá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].

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ì thoá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àoHoVaTen.p[Dem]

2 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ạikết quả trả về 1 tức là nếu x<y thì kết quả -1 , x>y kết quả là 1 , thoá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âugiống nhau, trả về kết quả là 0 , thoá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ểmtra 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àihơn xâu x, kết quả trả về -1 ngược lại kết quả trả về 1 thoát chương trình

3 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 toá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à jtươ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 b<a thìhoà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à hoán đổi tương tự với phầnhọ

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ầntên đệm

Trang 16

+ Độ 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) = ∑

i=0

n

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

+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 sinhviê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ếuS=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 a<b thì chènsinh 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 a<b thì chèn sinh viên vào vị trí i-1 (với I là vị trí sinh viên b) Kếtthúc chương trình

+ Độ 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) = ∑

i=0

n

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+1Bước 3: Nếu j<n thì so sánh B[i] và B[j], nếu giống nhau thì dịch bảng lên 1 đoạn 1,tứ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

Trang 17

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  mBước 2: Khởi tạo biến sosinhvien=0, tonghocbong=0Bước 3: Duyệt danh sách cho j chạy từ 0  n-1Bước 4: Nếu so sánh B[i]=A[j] thì sosinhvien=sosinhvien+1,tonghocbong=tonghocbong+A[j].hocbong

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ì thoát chương trình, nếu S=8 thì kiểm tra ngày thuộc khoảng từ

0-31 là được, tiến tới bước 5, nếu ngoà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 ngoà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

Trang 18

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ớibướ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

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 jlê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 thoá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:

Trang 19

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

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

Trang 20

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

Trang 21

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

Trang 22

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 :

Trang 23

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 :

Trang 24

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

+Hoà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

Trang 25

const int Nmax=100;

typedef char infor1[100];

typedef float infor2;

Ngày đăng: 26/08/2017, 20:57

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w