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 (2.06 MB, 21 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<small>2.</small>
<small>2.</small>
Để đáp ứng yêu cầu môn học cũng như mong muốn tìm hiểu, mở rộng kiếnthức về ngơn ngữ lập trình nói chung và mơn cấu trúc dữ liệu và giải thuậtnói riêng, nhóm chúng em đã cùng nhau hướng đến những đề tài hướng vớinhững tiêu chí:
Hữu ích
Có tính thực tế, khả thiÁp dụng được kiến thức đã học
Học hỏi them kiến thức mới với tối đa khả năng của bản thanVới những tiêu chí đó, nhóm chúng em đã lựa chọn chủ đề “Quản lý sinhviên” để triển khai thực hiện.
Đây là một chủ đề mở, có rất nhiều hướng đi cũng như hướng phát triển
Input: Dữ liệu của sinh viên:Họ và tên
Mã số sinh viênThông tin môn học:
Tên môn họcMã học phầnSố tín chỉĐiểm giữa kìSố buổi vắngOutput: Những kết quả đã qua xử lý
Danh sách các sinh viên xếp theo MSSVĐiểm quá trình của sinh viên
Sinh viên được tìm kiếmFile danh sách lớp
<b>Trần Đình Vương</b> 20214154
Tìm hiểu đề tàiLên ý tưởng
Triển khai và cài đặt chươngtrình- Coder phụ
Phát triển sản phẩmLàm báo cáo phần I,II,II
Đã hoàn thành
<b>Cao Danh Khang</b> 20213967
Tìm hiểu đề tài Lên ý tưởng
Triển khai và cài đặt chươngtrình-Coder chính
Phổ biến kiến thức mới cho cảnhóm
Phát triển sản phẩmLàm báo cáo phần I,II,III
Đã hồn thành
<b>Ngơ Thái Bình</b> 20213820
Tìm hiểu đề tài
Tìm hiểu CSDL LinkedListTìm hiểu thư việnTheo dõi tiến trình Làm báo cáo phần IV,V
Đã hồn thành
<b>Cao Việt Bình</b> 20213818
Tìm hiểu đề tài Tìm hiểu giải thuậtBinary Search và QuickSort
Tìm hiểu thư việnLàm PowerPoint giới thiệuLàm báo cáo phần IV,V,VI
Đã hoàn thành
Linked list là một cấu trúc tuần tự bao gồm một chuỗi các item theo thứ tự tuyến tính được liên kết với nhau. Do đó, ta chỉ có thể truy cập tuần tự vào linked list, không thể thực hiện truy cập ngẫu nhiên. Linked list là cung cấp cho chúng ta một cấu trúc dữ liệu đơn giản và linh hoạt cho các tập hợp động
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">Các phần tử trong linked list được gọi là các <b>node</b>.
Mỗi node sẽ chưa một <b>key</b> và một con trỏ trỏ tới node kế tiếp của nó, được
<b>gọi là next</b>
Thuộc tính tên là <b>head</b> trỏ tới phần tử đầu tiên của linked list.
<b>Phần tử cuối cùng của linked list có tên là tail</b>
Một số loại linked list có thể kể tới bao gồm:
Singly linked list: Duyệt qua các phẩn tử chỉ có thể thực hiện theo chiều hướng về phía trước.
Doubly linked list: Duyệt qua các phẩn tử có thể thực hiện theo cả chiều tiếnvà lùi. Các node sẽ bao gồm thêm một con trỏ được gọi là <b>pre</b>, trỏ tới node trước đó.
Circular linked list: Là một doubly linked list đặc biệt, khi mà con trỏ prev của head trỏ tới tail và con trỏ next của tail trỏ tới head.
Các phép tốn trên linked list
Tìm kiếm: Tìm phần tử đầu tiên với key là trong một linked list được cho <b>k</b>
trước được thực hiện đơn giản bằng một quá trình duyệt tuần tự và trả về con trỏ trỏ tới phần tử đó.
Thêm: Để thêm một key vào một linked list có sẵn, ta có thể thực hiện theo 3 cách: thêm vào đầu list, thêm vào giữa list hoặc thêm vào cuối của list.
Xoá: Xoá một phần tử khỏi một linked list cho trước. Ta khơng thể xố <b>x</b>
một node với chỉ một bước. Việc xố một node có thể thực hiện theo 3 cách: xoá từ đầu danh sách, xoá từ giữa danh sách hoặc xoá từ cuối danh sách.Ưu điểm:
Tiết kiếm bộ nhớ và cấp phát động: Không như array cần 1 lượng chỉ định ô nhớ trên bộ nhớ ngay khi khỏi tạo. Linked list chỉ sử dụng bộ nhớ để lưu trữ khi dữ liệu thực sự được lưu vào linked list.
Nó cịn có thể lưu các phần tử ở bất cứ đâu được phép trên bộ nhớ mà khôngcần các ô nhớ liền kề nhau như array
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">Quick insertion (Thêm rất nhanh với complexity chỉ là O(1))Quick deletion (Xóa nhanh)
<b>Một số áp dụng Linked List trong chương trình:</b>
Xóa sinh viên:
Thêm sinh viên:
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">Thêm học phầnXóa học phầnĐiểm danh:
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><b>Thuật tốn tìm kiếm nhị phân (Binary Search) hay cịn được gọi là tìm</b>
kiếm một nửa là thụât toán tiếp kiếm được sử dụng rất nhiều trong thực tếcho phép tìm kiếm vị trí của một phần tử trong một mảng đã được sắp xếp.
<b>Thụât tốn tìm kiếm nhị phân thực hiện tìm kiếm một mảng đã sắp xếp </b>
bằng cách liên tục chia các khoảng tìm kiếm thành 1 nửa. + Bắt đầu với một khoảng từ phần tử đầu mảng, tới cuối mảng.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">+ Nếu giá trị của phần tử cần tìm nhỏ hơn giá trị của phần từ nằm ở giữa khoảng thì thu hẹp phạm vi tìm kiếm từ đầu mảng tới giửa mảng và ngược lại.
+ Cứ thế tiếp tục chia phạm vi thành các nửa cho dến khi tìm thấy hoặc đã duyệt hết.
Thuật tốn tìm kiếm nhị phân tỏ ra tối ưu hơn so với tìm kiếm tuyết tính ở các mảng có độ dài lớn và đã được sắp xếp.
Ngược lại, tìm kiếm tuyến tính sẽ tỏ ra hiệu quả hơn khi triển khai trên các mảng nhỏ và chưa được sắp xếp.
Ý tưởng triển khai thuật toán
Cho một mảng đã sắp xếp arr[] có n phần tử, viết một hàm tìm kiếm trả vềchỉ số của phần tử có giá trị x trong arr[].
+ Xét một đoạn trong mảng <b>arr[left...right]</b>. Lúc này giá trị của left và right lần luợt là 0 và số phần tử của mảng - 1.
<b>+ So sánh x với phần tử nằm ở vị trí chính giữa của mảng (mid = (left + right) /2). Nếu x bằng arr[mid] thì trả về vị trí và thốt vịng lặp.</b>
+ Nếu <b>x < arr[mid] </b>thì chắc chắn x sẽ nằm ở phía bên trái tức là từ <b>arr[left....mid-1]</b>.
+ Nếu <b>x > arr[mid]</b> thì chắc chắn x sẽ nằm ở phía bên phải mid tức là ở khoảng <b>arr[mid+1...right]</b>.
+ Tiếp tục thực hiện chia đơi các khoảng tìm kiếm tới khi nào tìm thấy được vị trí của x trong mảng hoặc khi đã duyệt hết mảng.
Độ phức tạp:
+ Trường hợp tốt nhất là O(1) + Trường hợp xấu nhất là O(log2n) + Trung bình cũng là O(log2n)
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">Áp dụng giải thuật Binary Search trong chương trình:
- Quick sort là thuật toán sắp xếp, hoạt động theo cách sau: Chọn một phầntử trong mảng làm điểm đánh dấu và sau đó chia mảng thành hai mảng conbằng cách so sánh các phần tử trong mảng với điểm đánh dấu. Mảng 1 sẽchứ các phần tử nhỏ hơn hoặc bằng điểm đánh dấu và mảng 2 sẽ gồm cácphần tử lớn hơn điểm đánh dấu.
- Thực hiện:Chọn phần tử chốt.
Khai báo 2 biến con trỏ để trỏ để duyệt 2 phía của phần tử chốt.Biến bên trái trỏ đến từng phần tử mảng con bên trái của phần tử chốt.Biến bên phải trỏ đến từng phần tử mảng con bên phải của phần tử chốt.Khi biến bên trái nhỏ hơn phần tử chốt thì di chuyển sang phải.Khi biến bên phải nhỏ hơn phần tử chốt thì di chuyển sang trái.
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">Nếu không xảy ra trưởng hợp 5 và 6 thì tráo đổi giá trị 2 biến trái và phải.Nếu trái lớn hơn phải thì đây là giá trị chốt mới.
- Áp dụng QuickSort trong chương trình:
<b>Tính thực thi nhanh: Nếu bạn đã sành sỏi về C++ thì bạn có thể lập trình </b>
rất nhanh. Một trong những mục tiêu của C++ chính là khả năng thực thi. Vànếu bạn cần thêm các tính năng cho chương trình, C++ cho phép bạn sử dụng ngôn ngữ Assembly (Hợp ngữ) – Ngơn ngữ lập trình bậc thấp nhất dùng để giao tiếp trực tiếp với phần cứng của máy tính.
<b>Thư viện đầy đủ: Có rất nhiều tài nguyên sử dụng cho người lập trình bằng </b>
C++, bao gồm cả đồ hoạ API, 2D, 3D, vật lý các thiết bị âm thanh hỗ trợ giúp cho lập trình viên dễ dàng thực thi.
<b>Đa mơ hình: C++ cũng cho phép bạn lập trình theo cấu trúc tuyến tính, </b>
hướng chức năng, hướng đối tượng đa dạng tuỳ theo yêu cầu của người lập trình.
Thư viện:
Sử dụng thư viện trong c++
Sử dụng MySQL: hệ thống quản trị cơ sở dữ liệu mã nguồn mở (RelationalDatabase Management System, viết tắt là RDBMS) hoạt động theo mơhình client-server. RDBMS là một phần mềm hay dịch vụ dùng để tạo vàquản lý các cơ sở dữ liệu (Database) theo hình thức quản lý các mối liênhệ giữa chúng.
Bài báo cáo: Nhom_11_Report.docx
Video chạy thực nghiệm: Nhom_11_Demo.mp4
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">Dữ liệu được lưu trữ tại cơ sở dữ liệu là sinhvien với 2 bảng là sinhvien_1 vàhocphan.
Ví dụ: Thêm một sinh viên có MSSV = 2021007+ Trước:
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">+ Sau:
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">- Tính năng 2: Xóa sinh viên
Ví dụ: Xóa sinh viên có MSSV=2021007
+ Trước:
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">
+ Sau:
- Chức năng 3: Thêm học phần
Ví dụ: Thêm học phần GT1 cho sinh viên có MSSV = 2021007+ Trước:
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">+ Sau:
- Chức năng 6: Tìm kiếm sinh viên
Ví dụ: Tìm kiếm sinh viên có MSSV = 2021005
- Chức năng 7: In ra số sinh viên trong danh sách
- Chức năng 8: In ra danh sách
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">- Chức năng 9: In ra danh sách sinh viên theo thứ tự tăng dần của điểm trungbình giữa kì
Về mặt trình bày code: Cần rút ngắn, tối giản
Về độ phức tạp thuật toán: Cần tối ưu thêm thời gian chạy để cóthể xử lý được lượng data vô cùng lớn
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">Về các chức năng khác của sản phẩm: Cần nghiên cứu nhiềukiến thức để tạo ra nhiều chức năng hữu ích hơn nữa
Về mặt hình thức sản phẩm: Cần nghiên cứu kiến thức để hìnhthức sản phẩm trở thành 1 web hay app đặc thù
Môn học Cấu trúc dữ liệu và giải thuật vô cùng quan trong, là phầnkiến thức khơng thể thiếu, gắn bó mãi mãi với sinh viên ngành Điệntử viễn thông chúng em
Học đi đôi với hành, chúng ta cần sử dụng kiến thức đã học để ápdụng vào 1 việc nào đó để giúp ta nắm vững kiến thức và tìm ra đượcnhững điều mới mẻ
Khi bắt đầu làm một bài tập lớn, sản phẩm, dự án bất kỳ thì chúng tađều cần lên kế hoạch cụ thể
Chọn đề tài vừa trong khả năng của bản thân, vừa có sự thử thách nhấtđịnh
Sau khi hoàn thành sản phẩm, cần phải suy nghĩ thêm để phát triểnsản phẩm, khắc phục những hạn chế của sản phẩm
Kỹ năng làm việc nhóm rất quan trọng, cần phải phân chia công việcrõ ràng và giúp đỡ nhau trong quá trình làm việc, hiểu được điểmmạnh yếu của nhau
Để học tốt môn Cấu trúc dữ liệu và giải thuật, chúng em cần phải nắmvững kiến thức môn Kỹ thuật lập trình C/C++
Cần hiểu bản chất khi học vì thường xuyên phải code giấy, khơngđược phụ thuộc vào máy tính
Lượng kiến thức lớn, cần phải đầu tư nhiều thời gian học và thực hànhđể nắm được kiến thức
Cần phải nắm vững từng phần kiến thức mới ứng dụng được vài mộtbài tập lớn
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">Những khó khăn trên chỉ là những thử thách của mơn học, nếu làm tốtthì kiến thức đã học ở môn Cấu trúc dữ liệu và giải thuật sẽ giúp íchrất nhiều cho bản thân sinh viên chúng em.
Cấu trúc dữ liệu và giải thuật là môn học quan trọng đối với sinh viên nhữngngành liên quan CNTT nói chung và ngành Điện tử-Viễn thơng nói riêng.Chúng em đã hiểu rằng ngơn ngữ lập trình có thể thay đổi nhưng cốt lõi làcấu trúc giữ liệu và giải thuật sẽ giúp chúng em học được ngơn ngữ mớinhanh chóng.
Chúng em xin chân thành cảm ơn sự chỉ dạy nhiệt tình và những ví dụ minhhọa của cơ giúp chúng em học tập. Cảm ơn cơ vì đã giao một bài tập lớn đểchúng em được có cơ hội thử thách bản than vào một project khơng chỉ đơngiản là code mà cịn là tinh thần làm việc, tìm hiểu những thứ mới mẻCuối cùng, sản phẩm của chúng em vẫn còn nhiều thiếu sót do thiếu nhiềukinh nghiệm cũng như kĩ năng, mong cơ nhận xét, góp ý để chúng em hồnthiện hơn.
</div>