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
Bảng băm trong C++
Bang-bam-trong-cpp

Tìm hiểu về cấu trúc dữ liệu phổ biến là bảng băm hay HashTable trong C++

Cây nhị phân trong C++
Cay-nhi-phan-trong-cpp

Giới thiệu về cấu trúc cây, cây nhị phân và cây nhị phân tìm kiếm, các thao tác trên cây Read more

Đa hình trong C++
Da-hinh-trong-cpp

Tìm hiểu về tính đa hình trong C++, phương thức ảo, phương thức thuần ảo, lớp trừu tượng và interface.

Thuật toán sắp xếp trong C++
Sorting-Algorithms

Tìm hiểu về các thuật toán sắp xếp phổ biến nhất, minh họa bằng ngôn ngữ C++

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments