Ở trong bài trước, chúng ta đã hoàn thành các chức năng tạo file mới, mở file cũ và thêm - sửa - xóa thông tin của học sinh. Trong bài viết này chúng ta sẽ hoàn thành các chức năng còn lại là liệt kê toàn bộ học sinh, lọc học sinh theo thông tin và lưu dữ liệu vào file.
Liệt kê toàn bộ học sinh
Ta sẽ thống nhất sử dụng một mẫu output chung cho thông tin học sinh, bao gồm 5 dòng:
Dòng đầu tiên là mã số học sinh, chính là chỉ số phần tử của học sinh đó trong mảng
Dòng thứ hai là tên, lớp và địa chỉ của học sinh
3 dòng tiếp theo là điểm số 3 môn của học sinh
Và tất nhiên, vì ta phải in thông tin học sinh ra nhiều lần, sẽ tiện lợi hơn nếu ta viết một hàm printStudentInfo(int id) để in thông tin của học sinh ở chỉ số id.
Bây giờ để in tất cả học sinh trong danh sách ra, ta chỉ cần duyệt các phần tử từ 1 tới number, và gọi hàm printStudentInfo() thôi.
Lọc học sinh theo thông tin
Đều đầu tiên khi lọc học sinh theo thông tin là phải hỏi người dùng muốn dùng thông tin nào để lọc ra.
Ok, giờ nảy sinh ra một vấn đề như thế này: 3 thông tin đầu tiên sẽ là dữ liệu kiểu string, trong khi ba thông tin sau là dữ liệu kiểu double. Đối với dữ liệu kiểu số, ta còn phải hỗ trợ khả năng tìm kiếm các học sinh có giá trị lớn hơn, nhỏ hơn, vân vân… chứ không chỉ là các học sinh có điểm số bằng một mức nào đó. Ta sẽ viết riêng việc tìm kiếm theo các giá trị string và việc tìm kiếm các giá trị số thành hai chương trình con riêng - searchStudentByString() và searchStudentByScore().
Đối với việc tìm kiếm học sinh theo string, ta chỉ cần đọc vào một giá trị tìm kiếm data nữa.
Đối với việc tìm kiếm học sinh theo điểm số, ngoài giá trị so sánh data, ta còn phải đọc thêm một giá trị compare, là lựa chọn của người dùng về phép so sánh.
Toàn bộ nội dung của hàm searchStudent() như sau
Tìm kiếm học sinh theo string
Việc tìm kiếm học sinh theo string khá là đơn giản - ta chỉ cần duyệt qua tất cả học sinh, lấy giá trị phù hợp theo yêu cầu byWhat được đưa ra, và so sánh với giá trị yêu cầu value. Nếu bằng nhau, ta in ra thông tin của học sinh.
Tìm kiếm học sinh theo điểm số
Việc tìm kiếm học sinh theo điểm số về cơ bản là giống với tìm kiếm bằng string, nhưng ta cần thêm một bước trung gian là thực hiện phép so sánh phù hợp với giá trị compare nhập vào. Ta sẽ đặt biến bool check là kết quả của việc kiểm tra, và nếu check bằng true, ta in ra thông tin của học sinh.
Lưu thông tin học sinh vào file
Như đã nói ở bài trước, việc lưu thông tin vào file có thể được lưu vào file đang được mở ra, hoặc lưu vào file mới. Do đó trước khi bắt đầu lưu, ta cần kiểm tra xem hiện tại đang có file mở ra hay không, và nếu có thì phải hỏi ý kiến người dùng trước khi lưu.
Nếu như không có file nào được mở cả, thì ta chỉ đơn giản hỏi người dùng tên của file muốn lưu ra.
Ok, giờ file mục tiêu đã có, việc còn lại là viết các thông tin ra theo đúng tiêu chuẩn đã quy định ở bài trước. Nhớ phải mã hóa các dấu cách như đã quy định bằng hàm encode() ở bài trước nhé.
Toàn bộ nội dung của chương trình con saveFile() như sau
Đóng file hiện tại và kết thúc chương trình
Chức năng cuối cùng ta phải làm cho chương trình, đó là đóng file hiện tại lại và chuyển về trạng thái ban đầu (isEditing bằng false).
Phép lịch sự tối thiểu bao giờ cũng phải là hỏi người dùng có muốn lưu trữ file hiện tại không, phòng ngừa việc ấn nhấm mà tắt đi không lưu lại.
Sau khi đã đảm bao file được lưu rồi, ta chỉ cần chuyển isEditing về false, là kết thúc phiên làm việc với file.
Đó, vậy là chương trình của chúng ta đã hoàn tất!
Bình luận
Trong lập trình thực tế, chúng ta sẽ muốn lưu trữ các thông tin như trong ví dụ này bằng các cơ sở dữ liệu, với khả năng hỗ trợ tìm kiếm trực quan và hiệu quả hơn. Nhưng để phục vụ mục đích của bài viết là luyện tập tổng hợp, bài thực hành sử dụng cách đọc và viết ra file mà ta đã biết.
Chương trình sau khi hoàn thành cũng rất dài, tới gần 400 dòng. Trong lập trình thực tế ta sẽ muốn tránh việc viết một file quá dài dòng như thế này, mà thay vào đó là viết chương trình ra thành các module nhỏ, và gọi các module nhỏ trong một file lớn. Điều này giúp cho việc bảo trì chương trình dễ dàng hơn. Đó cũng chính là một chức năng quan trọng của việc lập trình hướng đối tượng - Object Oriented Programming - mà chúng ta sẽ bắt đầu đề cập tới kể từ bài viết tiếp theo.
Tới đây là kết thúc bài thực hành tổng hợp rồi. Các bạn có thể xem code mẫu và download chương trình hoàn trình trên repository GitHub của nhóm Cowboy Coder.