Quản lý sinh viên [Bài tập C++]

Nội dung bài viết Ẩn
Quản lý sinh viên [Bài tập C++] | Khiêm Lê

Đề bài

Xây dựng chương trình quản lý danh sách sinh viên với các tính năng sau:

  • Nhập và lưu danh sách sinh viên
    • Mô tả: Nhập thông tin sinh viên (MSSV, họ tên, điểm toán, văn, anh) từ file và hệ thống tự tính điểm trung bình
    • Mô tả tương tác:
      1. Nhập lệnh từ terminal: ./qlsv add <đường_dẫn_đến_file>
      2. Đọc file, tính điểm trung bình và lưu vào hệ thống
      3. Thông báo kết quả ra màn hình
  • Tìm kiếm sinh viên theo MSSV hoặc họ tên
    • Mô tả: Tìm kiếm sinh viên theo MSSV hoặc họ tên được nhập từ bàn phím
    • Mô tả tương tác:
      • Nhập lệnh từ Terminal: ./qlsv find <MSSV || họ_tên>
      • Đọc dữ liệu từ hệ thống, tìm kiếm và in kết quả ra màn hình theo format: <STT> <MSSV> <họ_tên> <toán> <văn> <anh_văn> <DTB>
  • Xuất ra màn hình các sinh viên có điểm trung bình trên 5.0
    • Mô tả: Tìm kiếm và in tất cả sinh viên có điểm trung bình trên 5.0
    • Mô tả tương tác:
      • Nhập lệnh từ Terminal: ./qlsv passed
      • Đọc dữ liệu từ hệ thống và in ra tất cả sinh viên có DTB trên 5.0 theo format: <STT> <MSSV> <họ_tên> <toán> <văn> <anh_văn> <DTB>

Source code

Trong video mình sử dụng mảng động và nó không hoạt động hiệu quả đối với dữ liệu quá lớn vậy nên mình chuyển sang dùng kiểu vector để linh hoạt hơn trong việc sử lý dữ liệu lớn. Bạn có thể tham khảo code bên dưới.

#include <iostream>
#include <fstream>
#include <vector>
#include "SinhVien.hpp"
using namespace std;

#define DATABASE_PATH "data.txt"

void saveDataToFile(vector<SinhVien> sv)
{
	ofstream fileStream;
	fileStream.open(DATABASE_PATH, ios::out | ios::app);
	for (int i = 0; i < sv.size(); i++)
	{
		sv[i].printToFile(fileStream);
		fileStream << endl;
	}
}

void addDataFromFile(string path)
{
	ifstream file(path, ios::in);
	if (file.is_open())
	{
		vector<SinhVien> sv;
		string line;
		while (getline(file, line))
		{
			SinhVien sinhVien;
			sinhVien.fromString(line);
			sv.push_back(sinhVien);
		}

		saveDataToFile(sv);
		cout << "Data added successfully!";
		file.close();
	}
}

void loadDataFromFile(vector<SinhVien> &sv)
{
	ifstream file(DATABASE_PATH, ios::in);
	if (file.is_open())
	{
		string line;
		while (getline(file, line))
		{
			SinhVien newSV;
			newSV.fromString(line, true);
			sv.push_back(newSV);
		}
		
		file.close();
	}
}

void findByKeywords(vector<string> keywords)
{
	vector<SinhVien> sv;
	loadDataFromFile(sv);

	int stt = 1;
	cout << "Founded students:\n";
	cout << sv.size();
	for (int i = 0; i < sv.size(); i++)
	{
		if (sv[i].mssv.find(keywords[0]) != string::npos)
		{
			cout << stt++ << ' ';
			sv[i].print();
			cout << endl;
		}
		else
		{
			for (int j = 0; j < keywords.size(); j++)
			{
				if (sv[i].hoTen.find(keywords[j]) != string::npos)
				{
					cout << stt++ << ' ';
					sv[i].print();
					cout << endl;
				}
			}
		}
	}
}

void passedStudents()
{
	vector<SinhVien> sv;
	loadDataFromFile(sv);

	int stt = 1;
	for (int i = 0; i < sv.size(); i++)
	{
		if (sv[i].dtb >= 5.0)
		{
			cout << stt++ << ' ';
			sv[i].print();
			cout << endl;
		}
	}
}

int main(int argc, char* argv[])
{

	string action = argv[1];
	if (action == "add")
	{
		string path = argv[2];
		addDataFromFile(path);
	}
	else if (action == "find")
	{
		vector<string> keywords;
		for (int i = 0; i < argc - 2; i++)
			keywords.push_back(argv[i + 2]);
		
		findByKeywords(keywords);
	}
	else if (action == "passed")
	{
		passedStudents();
	}
	
	return 0;
}
#ifndef SinhVien_hpp
#define SinhVien_hpp
#include <string>
#include <iostream>
#include <vector>
using namespace std;

class SinhVien
{
public:
	string mssv, hoTen;
	float toan, van, av, dtb;

	void fromString(string str, bool fromDB = false)
	{
		vector<string> arr;
		string word;
		for (int i = 0; i <= str.length(); i++)
		{
			if (str[i] == ' ' || i == str.length())
			{
				arr.push_back(word);
				word = "";
			}
			else
			{
				word += str[i];
			}
		}

		int k = arr.size();
		if (fromDB)
		{
			dtb = stof(arr[k - 1]);
			av = stof(arr[k - 2]);
			van = stof(arr[k - 3]);
			toan = stof(arr[k - 4]);
			for (int i = 1; i < k - 4; i++)
			{
				hoTen += arr[i];
				hoTen += ' ';
			}
		}
		else
		{
			av = stof(arr[k - 1]);
			van = stof(arr[k - 2]);
			toan = stof(arr[k - 3]);
			dtb = (toan + av + van) / 3.0;
			for (int i = 1; i < k - 3; i++)
			{
				hoTen += arr[i];
				hoTen += ' ';
			}
		}
		mssv = arr[0];
		hoTen = hoTen.substr(0, hoTen.length() - 1);
	}
	
	void printToFile(ofstream& fileStream)
	{
		fileStream << mssv << ' ';
		fileStream << hoTen << ' ';
		fileStream << toan << ' ';
		fileStream << van << ' ';
		fileStream << av << ' ';
		fileStream << dtb;
	}

	void print()
	{
		cout << mssv << ' ';
		cout << hoTen << ' ';
		cout << toan << ' ';
		cout << van << ' ';
		cout << av << ' ';
		cout << dtb;
	}
};

#endif
111 Nguyen Van A 7.5 7.25 8
112 Le Van B 4.3 5.5 7.83
113 Tran Van C 3 7 3
114 Pham Quoc D 4 4 4
Bài viết liên quan
Dãy Fibonacci [Bài tập Python]
Fibonacci-bai-tap-python

Tìm hiểu về dãy Fibanacci, các thuật toán tính số Fibanacci trong Python

Định nghĩa class CHAR và STRING trong C++ [Bài tập OOP]
Giai-bai-tap-OOP-cpp

Giải bài tập OOP: định nghĩa class CHAR và STRING trong C++

Quản lý nhân viên bằng danh sách liên kết đơn [Bài tập C++]
Quan-ly-nhan-vien-bang-danh-sach-lien-ket-don-bai-tap-cpp

Quản lý nhân viên bằng danh sách liên kết đơn

Các phép toán cơ bản trên phân số [Bài tập C++]
Cac-phep-toan-co-ban-tren-phan-so-cpp

Giải bài tập các phép toán cơ bản trên phân số C++

guest
0 Comments
Inline Feedbacks
View all comments