1. Trang chủ
  2. » Luận Văn - Báo Cáo

nghiên cứu và cài đặt chương trình thực hiện quản lý kết quả học tập của sinh viên

38 45 1
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Nghiên cứu và cài đặt chương trình thực hiện Quản lý kết quả học tập của sinh viên
Tác giả Nguyễn Thị Diễm Quỳnh, Phạm Thị Mai, Tống Diệu Linh, Nguyễn Thùy Trang, Nguyễn Trọng Thức, Phạm Nguyễn Minh Tiến
Người hướng dẫn Ts. LƯU MINH TUẤN
Trường học Trường Đại học Kinh tế Quốc dân
Chuyên ngành Cấu trúc Dữ liệu & Giải thuật
Thể loại Tiểu luận
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 38
Dung lượng 383,55 KB

Cấu trúc

  • Chương I. GIỚI THIỆU ĐỀ TÀI VÀ PHÁT BIỂU ĐỀ TÀI (4)
    • A. Giới thiệu về đề tài (4)
    • B. Đối tượng nghiên cứu (5)
    • C. Phạm vi nghiên cứu (5)
    • D. Mục đích nghiên cứu (5)
  • Chương II. NỘI DUNG NGHIÊN CỨU (5)
    • A. Lý thuyết (5)
    • B. Thêm mới phần tử vào danh sách móc nối kép (7)
    • C. Tìm kiếm danh sách sinh viên (23)
    • D. Sửa thông tin sinh viên trên danh sách móc nối kép (26)
    • E. Xóa 1 sinh viên cụ thể trên danh sách móc nối kép (31)
    • F. Đưa ra danh sách sinh viên (34)
  • Chương III. Đánh giá kết quả nghiên cứu và kết luận (36)
  • Tài liệu tham khảo (37)

Nội dung

Từ chương trình Quản lý kết quả học tập của sinh viên, ngườiquản lý sẽ có thể dễ dàng truy cập và quản lý thông tin sinh viên một cách hiệu quả.Chương trình sẽ giúp tiết kiệm thời gian v

GIỚI THIỆU ĐỀ TÀI VÀ PHÁT BIỂU ĐỀ TÀI

Giới thiệu về đề tài

Nghiên cứu và cài đặt chương trình thực hiện Quản lý kết quả học tập của sinh viên ( gồm :Mã Sinh Viên , họ tên , ngày sinh, địa chỉ ,kết quả môn học ) bằng danh sách móc nối kép.

1 Trình bày lý thuyết về cấu trúc dữ liệu và giải thuật sử dụng để cài đặt:

- Giới thiệu về danh sách móc nối kép và cấu trúc dữ liệu của nó.

- Mô tả giải thuật để thêm, tìm kiếm, sửa và xóa sinh viên trong danh sách móc nối kép.

2 Cài đặt chương trình thực hiện các chức năng sau:

- Thêm một sinh viên mới vào danh sách móc nối kép:

+ Nhập thông tin mã sinh viên, họ tên, ngày sinh, địa chỉ và kết quả môn học từ bàn phím.

+ Tạo một nút mới trong danh sách móc nối kép và gắn thông tin sinh viên vào nút đó.

- Tìm kiếm một sinh viên trong danh sách móc nối kép:

+ Nhập mã sinh viên từ bàn phím.

+ Duyệt qua danh sách móc nối kép và tìm sinh viên có mã sinh viên trùng khớp.

+ Hiển thị thông tin của sinh viên tìm được (nếu có).

- Sửa thông tin của một sinh viên trong danh sách móc nối kép:

+ Nhập mã sinh viên từ bàn phím.

+ Duyệt qua danh sách móc nối kép và tìm sinh viên có mã sinh viên trùng khớp.

+ Cho phép người dùng chỉnh sửa thông tin của sinh viên đó (họ tên, ngày sinh, địa chỉ, kết quả môn học).

- Xóa một sinh viên cụ thể trong danh sách móc nối kép:

+ Nhập mã sinh viên từ bàn phím.

+ Duyệt qua danh sách móc nối kép và tìm sinh viên có mã sinh viên trùng khớp.

+ Xóa sinh viên đó khỏi danh sách móc nối kép.

3 Đưa ra danh sách sinh viên giỏi và sinh viên học lại:

- Duyệt qua danh sách móc nối kép và lọc ra các sinh viên có kết quả môn học tốt (ví dụ: điểm trung bình trên 8)

- Hiển thị danh sách sinh viên giỏi.

- Duyệt qua danh sách móc nối kép và lọc ra các sinh viên có kết quả môn học yếu (ví dụ: điểm trung bình dưới 5).

Đối tượng nghiên cứu

Hướng đến những người tìm hiểu về công nghệ nói chung và Cấu trúc dữ liệu và giải thuật nói riêng Cụ thể hơn là thực hiện Quản lý kết quả học tập của sinh viên bằng danh sách móc nối kép.

Phạm vi nghiên cứu

Sử dụng lý thuyết và sự hiểu biết để tìm hiểu về danh sách móc nối đơn để quản lý kết quả học tập của sinh viên.

Mục đích nghiên cứu

- Tạo ra chương trình thực hiện quản lý kết quả học tập của sinh viên

- Lưu trữ thông tin về sinh viên bao gồm: Mã Sinh Viên, họ tên, ngày sinh, địa chỉ

- Ghi nhận và quản lý kết quả môn học của sinh viên.

Chương trình sử dụng danh sách móc nối kép để lưu trữ thông tin của sinh viên,đảm bảo tính linh hoạt và dễ dàng truy xuất dữ liệu.

NỘI DUNG NGHIÊN CỨU

Lý thuyết

Mô tả cấu trúc lưu trữ móc nối (danh sách móc nối):

• Là tập hợp các phần tử dữ liệu không liên tục được kết nối với nhau thông qua một liên kết (thường là con trỏ)

• Cho phép ta quản lý bộ nhớ linh động

• Các phần tử được chèn vào danh sách và xóa khỏi danh sách một cách dễ dàng

• Tại mỗi nút có hai thành phần:

• Con trỏ trỏ đến phần tử kế tiếp

• Danh sách móc nối kép (Double Linked List) là một cấu trúc dữ liệu trong đó mỗi phần tử (được gọi là node) có kết nối với một phần tử đứng trước và một phần tử đứng sau nó Mỗi node trong danh sách móc nối kép được cấu thành từ ba thành phần là dữ liệu và phần kết nối với node kế tiếp và node trước nó.

Cơ bản của node trong ngôn ngữ C++: struct Node{ int data; // Cho giá trị có kiểu số nguyên

Node *next; // Địa chỉ của con trỏ tiếp theo

Node *prev; // Địa chỉ của con trỏ trước đó

1, Node: Mỗi phần tử trong DLL được gọi là một node Mỗi node bao gồm ba phần: dữ liệu, con trỏ prev và con trỏ next Con trỏ prev trỏ đến node trước đó và con trỏ next trỏ đến node tiếp theo.

DLL có hai con trỏ đặc biệt: head và tail Head trỏ đến node đầu tiên còn tail trỏ đến node cuối cùng của danh sách liên kết.

3, Kết nối giữa các Node: Trong DLL, mỗi node được kết nối với node trước và sau nó thông qua con trỏ prev và next Node đầu tiên (head) có con trỏ prev trỏ đến NULL và node cuối cùng (tail) có con trỏ next trỏ đến NULL.

Có thể duyệt danh sách theo cả hai chiều bởi vì danh sách móc nối kép có con trỏ prev để truy cập node trước và con trỏ next để truy cập node sau.

Việc con trỏ prev được thêm vào sau mỗi node,như vậy sẽ tốn thêm không gian bộ nhớ và cách thức hoạt động của danh sách móc nối kép cũng phức tập hơn.

• Một số ứng dụng tiêu biểu:

1, Duyệt danh sách theo hai chiều:DLL cho phép duyệt danh sách theo cả hai chiều,từ đầu đến cuối và ngược lại.Điều này rất hữu ích khi cần xử lí dữ liệu theo cả hai hướng.

Bằng cách duy trì các con trỏ tới các nút trước và sau, danh sách liên kết đôi (DLL) cho phép thực hiện hiệu quả các thao tác xóa và chèn Khi xóa một nút, chỉ cần cập nhật các con trỏ của các nút liền kề để bỏ qua nút đã xóa Tương tự, khi chèn một nút, DLL chỉ cần cập nhật các con trỏ của các nút liền kề để liên kết nút mới vào danh sách.

3, Sắp xếp nhanh (QuickSort) trên DLL:QuickSort là một thuật toán sắp xếp hiệu quả và có thể được áp dụng trên DLL Điều này giúp tăng tốc độ sắp xếp dữ liệu trong danh sách.

4, Ứng dụng trong các cấu trúc dữ liệu phức tạp hơn: DLL cũng được sử dụng như một thành phần cơ bản trong các cấu trúc dữ liệu phức tạp hơn như cây AVL, B-tree, v.v.

Dưới đây là một ví dụ về cách tổ chức một DLL: typedef struct tagDNode {

Data Info; struct tagDNode* pPre; // trỏ đến phần tử đứng trước struct tagDNode* pNext; // trỏ đến phần tử đứng sau

DNODE* pHead; // trỏ đến phần tử đầu danh sách

DNODE* pTail; // trỏ đến phần tử cuối danh sách

• Danh sách liên kết kép (DLL) hỗ trợ nhiều thao tác khác nhau Dưới đây là một số thao tác cơ bản:

1, Tạo danh sách: Tạo một DLL mới Thông thường, khi tạo mới, con trỏ head và tail đều trỏ đến NULL.

2, Thêm phần tử: Có thể thêm một phần tử vào đầu danh sách (push front), cuối danh sách (push back), hoặc vào một vị trí bất kỳ trong danh sách.

3, Xóa phần tử: Có thể xóa một phần tử ở đầu danh sách (pop front), cuối danh sách (pop back), hoặc ở một vị trí bất kỳ trong danh sách.

4, Duyệt danh sách: Duyệt qua tất cả các phần tử trong danh sách, từ đầu đến cuối hoặc ngược lại.

5, Tìm kiếm: Tìm một phần tử trong danh sách dựa trên một tiêu chí nào đó.

6, Sắp xếp: Sắp xếp các phần tử trong danh sách theo một thứ tự nhất định.

7, Hủy danh sách: Xóa tất cả các phần tử trong danh sách và giải phóng bộ nhớ đã cấp phát cho chúng.

Mỗi thao tác trên đều yêu cầu một giải thuật cụ thể và có thể cần phải cập nhật con trỏ prev và next của một hoặc nhiều node.

Thêm mới phần tử vào danh sách móc nối kép

I Lý thuyết và ví dụ về thêm node mới vào danh sách móc nối kép

1 Các cách để chèn thêm một node mới vào danh sách móc nối kép

Một node mới có thể được thêm vào danh sách bằng các cách sau :

Cách 1: Thêm vào đầu danh sách móc nối

Cách 2: Thêm vào cuối danh sách móc nối

Cách 3: Thêm vào trước một node cụ thể

Cách 4: Thêm vào sau một node cụ thể

1.1 Thêm vào đầu danh sách móc nối

Trong trường hợp này, node mới sẽ luôn luôn được chèn vào phía trước node head của danh sách móc nối được cho, và node vừa mới được chèn thêm sẽ trở thành node head mới của danh sách móc nối Nếu như danh sách chưa tồn tại thì node này sẽ trỏ thành node đầu tiên của danh sách.

*Hàm thêm vào đầu danh sách móc nối: void AddHead(List &list, Node* node)

{ if (!list.head) list.head = list.tail = node; else

{ node->next = list.head; list.head->prev = node; list.head = node;

1.2 Thêm vào cuối danh sách móc nối

Trong trường hợp này, node mới sẽ luôn luôn được chèn thêm vào phía sau node cuối cùng của danh sách móc nối kép được cho.

*Hàm thêm vào cuối danh sách móc nối: void AddTail(List &list, Node* node)

{ if (!list.head) list.head = list.tail = node; else

{ node->prev = list.tail; list.tail->next = node; list.tail = node;

1.3 Thêm vào trước một node cụ thể

*Hàm thêm vào trước một node cụ thể: void AddBefore(List &list, Node* node, Node* before)

{ node->next = before; node->prev = before->prev; if (list.head != before) before->prev->next = node; if (list.head == before) list.head = before;

1.4 Thêm vào sau một node cụ thể.

*Hàm thêm vào sau một node cụ thể: void AddAfter(List &list, Node* node, Node* after)

{ node->prev = after; node->next = after->next; after->next = node; if (list.tail != after) after->next->prev = node; if (list.tail == after) list.tail = after;

2 Chương trình thêm mới một phần tử vào danh sách móc nối kép.

2.1 Thêm mới vào đầu danh sách móc nối kép.

#include using namespace std; struct Node { int data;

}; void AddHead(List& list, Node* node) { if (!list.head) list.head = list.tail = node; else { node->next = list.head; list.head->prev = node; list.head = node;

} } void InputList(List& list) { int n; cout > n; for (int i = 0; i < n; i++) { int x; cout next = node; list.tail = node;

} void InputList(List& list) { int n; cout > n; for (int i = 0; i < n; i++) { int x; cout next = node; list.tail = node;

} } void AddBefore(List& list, Node* node, Node* before) { if (before) { node->next = before; node->prev = before->prev; if (list.head != before) before->prev->next = node; if (list.head == before) list.head = node;

} void InputList(List& list) { int n; cout > n; for (int i = 0; i < n; i++) { int x; cout prev = after; node->next = after->next; after->next = node; if (list.tail != after) after->next->prev = node; if (list.tail == after) list.tail = node;

} void InputList(List& list) { int n; cout > n; for (int i = 0; i < n; i++) { int x; cout n; for (int i = 0; i < n; i++) { string name, id, cls; cout next = list.head; list.head->prev = node; list.head = node;

} void AddBefore(List& list, Node* node, Node* before) { if (before) { node->next = before; node->prev = before->prev; if (list.head != before) before->prev->next = node; if (list.head == before) list.head = node;

To create a list of students, the user must first specify the number of students in the list Then, for each student, the user must enter their name, ID, and class The user must press enter after each input to save the information Once all of the students have been entered, the list is complete.

Node* node = new Node{ name, id, cls, NULL, NULL };

This C++ code defines a function named OutputList that prints the contents of a linked list containing student records The function iterates through the linked list, printing the student's name, ID, and class for each node.

} } void AddNewNode(List& list) { string name, id, cls; cout next = node; if (list.tail != after) after->next->prev = node; if (list.tail == after) list.tail = node;

Tìm kiếm danh sách sinh viên

I.Lý thuyết và ví dụ cho tìm kiếm phần tử trong danh sách liên kết kép

1 Cách tìm kiếm một phần tử trong danh sách liên kết đôi Để thực hiện việc tìm kiếm trong danh sách liên kết kép ta cần thực hiện các bước sau :

 Bước 1: Tạo Node p và gán bằng đầu danh sách: p=pHead

 Bước 2: Sử dụng vòng lặp while (p!= NULL) và (p->data != x) o Thực hiện p = p->next; // p trỏ tới phần tử kế tiếp

 Bước 3: Kiểm tra kết quả sau khi thực hiện vòng lặp ở Bước 2 o Nếu p==NULL không có phần tử cần tìm; o Ngược lại: nếu p != NULL thì trỏ đến phần tử cần tìm

2 Hàm tìm kiếm một phần tử trong danh sách liên kết đôi

NODE* TimKiem(DLIST ds, int x){ //tao node p

NODE *p; //gan p bang phan tu dau danh sach p = ds.pHead;//su dung vong lap while ((p!=NULL) && (p->data!=x)){ p=p->next;

} //tra ve ket qua, neu NULL thi khong tim thay return p;

Hàm tìm kiếm trên có kiểu trả về là NODE và truyền vào danh sách cần tìm kiếm và khóa int x để tìm kiếm trong danh sách đó

Chú ý : Hàm trên dù có tìm thấy kết quả hay không thì đều trả về một node p Nếu p NULL thì ta kết luận không tìm thấy , và nếu tìm thấy kết quả thì p !=NULL và ta nhận được kết quả chính là node p.

3.Chương trình tìm kiếm một phần tử trong danh sách liên kết đôi

Trước khi sử dụng hàm tìm khiếm ,ta cần đảm bảo rằng đã có các phần tử nằm trong danh sách tìm kiếm , vì thế ta sẽ nhập các phần tử vào danh sách trước sau mới gọi là hàm tìm kiếm.

{ //khai bao thanh phan du lieu co kieu int int data; //khai bao con tro next co kieu Node de chua dia chi phan tu sau

Node *next; //khai bao con tro prev co kieu Node de chua dia chi phan tu truoc

Node *prev; }; typedef struct Node NODE; struct doulist{ //thanh phan dau danh sach

NODE *pHead; //thanh phan cuoi danh sach

NODE *pTail; }; typedef struct doulist DLIST; void KhoiTao(DLIST &ds){ //dat dia chi dau danh sach bang NULL ds.pHead = NULL; //dat dia chi cuoi danh sach bang NULL ds.pTail = NULL; }

NODE* TaoNode(int x) { //tao mot node p moi

NODE *p; p = new NODE; //neu p==NULL thi khong du bo nho va ket thuc viec tao node if (p==NULL) { printf ("KHONG DU BO NHO"); return NULL;

//gan thanh phan data = x p->data=x;//gan con tro next = NULL p->next=NULL;//gan con tro prev = NULL p->prev = NULL;//tra ve node p da tao return p; } void ThemCuoi(DLIST &ds, NODE*p){

//kiem tra danh sach rong neu rong thi them vao dau va cuoi if (ds.pHead == NULL){ ds.pHead = ds.pTail = p;

}else{ //dat con tro next cua pTail hien tai vao p la node can them cuoi ds.pTail->next = p; //dat con tro prev cua node p ve phan tu cuoi danh sach p->prev = ds.pTail; //thay doi lai phan tu cuoi danh sach ds.pTail = p;

} } void Nhap(DLIST &ds, int n){ //duyet N lan for(int i = 0; i < n; i++){ //nhap du lieu la so nguyen int x int x; printf("Nhap vao so %d: ",i); scanf("%d",&x);

//dua du lieu vua nhap vao node p p = TaoNode(x);

//dua node p vao ham them cuoi va truyen vao node p vua tao

//duyet tu dau danh sach den cuoi danh sach voi dieu kien p!=NULL for(p = ds.pHead; p!= NULL; p=p->next){

//hien thi du lieu cua tung node printf("%d\n",p->data);

NODE* TimKiem(DLIST ds, int x){

//gan p bang phan tu dau danh sach p = ds.pHead;

//su dung vong lap while ((p!=NULL) && (p->data!=x)){ p=p->next;

} //tra ve ket qua, neu NULL thi khong tim thay return p;

//khai bao mot danh sach lien ket doi

//nhap n phan tu int n; printf("NHAP N: "); scanf("%d",&n);

//goi ham nhap tryuyen vao danh sach va N phan tu

//goi ham xuat cac du lieu co trong danh sach printf("DANH SACH VUA NHAP\n");

//nhap gia tri can tim kiem int x; printf("NHAP GIA TRI CAN TIM KIEM: "); scanf("%d",&x);

//goi ham tim kiem truyen vao gia tri x va gan vao node p

//kiem tra ket qua tim kiem if(p == NULL){ printf("\nKHONG TIM THAY KET QUA");

}else{ printf("\nTIM THAY KET QUA: "); printf("%d",p->data);

Ví dụ cho chương trình và kết quả:

NHAP GIA TRI CAN TIM KIEM: 44

Nếu hàm Node TimKiem() trả về NODE p với giá trị p == NULL thì không tìm thấy kết quả Ngược lại, nếu p != NULL thì danh sách có chứa kết quả với khóa X cần tìm.

II Áp dụng tìm kiếm phần tử trong danh sách liên kết kép vào đề tài

Tìm kiếm một sinh viên trên danh sách liên kết kép theo mã sinh viên: Ta cần duyệt danh sách từ đầu đến cuối và so sánh mã sinh viên của mỗi nút với mã sinh viên nhập vào.

+ Nếu tìm thấy, trả về con trỏ đến nút đó

+Nếu không tìm thấy, trả về NULL

// tìm kiếm một sinh viên trên danh sách theo mã sinh viên

// con trỏ để duyệt danh sách while (p != NULL) {

// duyệt đến khi hết danh sách hoặc tìm thấy if (p->data->maSV == maSV) {

// nếu mã sinh viên của nút hiện tại trùng với mã sinh viên nhập vào, trả về con trỏ đến nút đó return p; } p = p->next; // di chuyển con trỏ đến nút tiếp theo }

// nếu duyệt hết danh sách mà không tìm thấy, trả về NULL return NULL;}

Sửa thông tin sinh viên trên danh sách móc nối kép

1, Cách sửa thông tin sinh viên trên danh sách móc nối kép

1 Tìm kiếm nút có mã sinh viên trùng với mã sinh viên nhập vào.

2 Nếu tìm thấy, nhập lại các thông tin mới cho sinh viên đó.

3 Nếu không tìm thấy, thông báo không có sinh viên nào có mã sinh viên đó

2, Mã giả cho phần này có thể như sau: void edit (string maSV) {

// sửa thông tin một sinh viên trên danh sách theo mã sinh viên

// tìm kiếm nút có mã sinh viên trùng với mã sinh viên nhập vào if (p == NULL) {

// nếu không tìm thấy, thông báo không có sinh viên nào có mã sinh viên đó cout hoTen; cout > p->data->ngaySinh; cout > p->data->diaChi; cout > p->data->ketQuaMonHoc; cout next = NULL; node->prev = NULL; return node;

} void addFirst(DoubleLinkedList& list, SinhVien sv) {

Node* node = createNode(sv); if (isEmpty(list)) { list.head = node; list.tail = node;

} else { node->next = list.head; list.head->prev = node; list.head = node;

} } void addLast(DoubleLinkedList& list, SinhVien sv) {

Node* node = createNode(sv); if (isEmpty(list)) { list.head = node; list.tail = node;

} else { node->prev = list.tail; list.tail->next = node; list.tail = node;

} } void insertAfter(DoubleLinkedList& list, Node* node, SinhVien sv) {

Node* newNode = createNode(sv); if (node == list.tail) { addLast(list, sv);

} else { newNode->next = node->next; newNode->prev = node; node->next->prev = newNode; node->next = newNode;

} } void insertBefore(DoubleLinkedList& list, Node* node, SinhVien sv) {

Node* newNode = createNode(sv); if (node == list.head) { addFirst(list, sv);

} else { newNode->prev = node->prev; newNode->next = node; node->prev->next = newNode; node->prev = newNode;

} } void deleteFirst(DoubleLinkedList& list) { if (!isEmpty(list)) {

Node* node = list.head; list.head = node->next; if (list.head != NULL) { list.head->prev = NULL;

} } void deleteLast(DoubleLinkedList& list) { if (!isEmpty(list)) {

Node* node = list.tail; list.tail = node->prev; if (list.tail != NULL) { list.tail->next = NULL;

} } void deleteNode(DoubleLinkedList& list, Node* node) { if (node == list.head) { deleteFirst(list);

} else if (node == list.tail) { deleteLast(list);

} else { node->prev->next = node->next; node->next->prev = node->prev; delete node;

} } void display(DoubleLinkedList list) { if (isEmpty(list)) { cout next;

} if (current->next != NULL) { current->next->prev = current->prev;

} if (current == head) { head = current->next;

} cout tenSV = "Tran Van B"; second->prev = head; second->next = NULL; head->next = second;

Node* third = new Node(); third->maSV = 103; third->tenSV = "Le Van C"; third->prev = second; third->next = NULL; second->next = third;

// In danh sách trước khi xóa printList(head); int maSVcanxoa; cout > maSVcanxoa;

// Xóa sinh viên với mă sinh viên cụ thể xoaSV(head, maSVcanxoa);

// In danh sách sau khi xóa printList(head); return 0;

Đưa ra danh sách sinh viên

1 Lý thuyết về đưa ra danh sách sinh viên giỏi và sinh viên học lại

- Bước 1: Viết hàm để tạo danh sách mới cho sinh viên giỏi và sinh viên học lại dựa trên ngưỡng điểm.

- Bước 2: Tạo danh sách và thêm một số sinh viên (đã bao gồm MSSV, Họ tên, đầy đủ)

- Bước 3: Đặt ngưỡng điểm cho sinh viên giỏi và học lại.

- Bước 4: Gọi hàm tìm sinh viên giỏi và sinh viên học lại và hiển thị kết quả.

Ví dụ: Giải thuật có thể như sau:

//Viết hàm để tạo danh sách mới cho sinh viên giỏi và sinh viên học lại dựa trên ngưỡng điểm. pair timSinhVienGioiVaHocLai(Node* danhSach, float nguongGioi, float nguongHocLai) {

// Khởi tạo danh sách mới cho sinh viên giỏi và học lại.

// Duyệt qua danh sách hiện tại và thêm sinh viên vào danh sách tương ứng.} int main() {

// Tạo danh sách và thêm sinh viên.

// Đặt ngưỡng cho sinh viên giỏi và học lại.

// Gọi hàm tìm sinh viên giỏi và sinh viên học lại và hiển thị kết quả.}

2.Trình bày nội dung về đề tài nghiên cứu

1 Cài đặt thử nghiệm phần mềm Đưa ra danh sách sinh viên học giỏi và sinh viên học lại

#include using namespace std;

// Khai bao cau truc du lieu sinh vien struct SinhVien { int maSinhVien; string hoTen; string diaChi; float diem; };

// Khai báo cau truc du lieu Node cho danh sach moc noi kep struct Node {

// Ham de tao danh sach moi

// Hàm de them nut (sinh vien) vao danh sach

Node* themSinhVien(Node* danhSach, SinhVien sv) {

Node* nutMoi = new Node; nutMoi->data = sv; nutMoi->truoc = NULL; nutMoi->sau = NULL; if (danhSach == NULL) { danhSach = nutMoi;

Node* hienTai = danhSach; while (hienTai->sau != NULL) { hienTai = hienTai->sau;

} hienTai->sau = nutMoi; nutMoi->truoc = hienTai;

// Hàm de hien thi danh sach void hienThiDanhSach(Node* danhSach) {

Node* hienTai = danhSach; while (hienTai != NULL) { cout sau; } return make_pair(dsGioi, dsHocLai); } int main() {

// Tao danh sach va them nut sinh vien

Node* danhSachSinhVien = taoDanhSachMoi(); danhSachSinhVien = themSinhVien(danhSachSinhVien, {1, "Nguyen Van A",

"Tran Dai Nghia", 45.8}); danhSachSinhVien = themSinhVien(danhSachSinhVien, {2, "Tran Thi B", "205 Giai Phong", 75.2}); danhSachSinhVien = themSinhVien(danhSachSinhVien, {3, "Le Van C", "11 Le Thanh Nghi", 92.0});

// Dat nguong cho sinh vien gioi và sinh vien hoc lai float nguongGioi = 80.0; float nguongHocLai = 50.0;

// Tim va hien thi pair ketQua = timSinhVienGioiVaHocLai(danhSachSinhVien, nguongGioi, nguongHocLai); cout

Ngày đăng: 14/08/2024, 16:14

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w