Bài tập về class có sử dụng vector và có lỗi vector subscript out of range

Em viết code nhưng lúc chạy chương trình thì có hiện lỗi “vector subscript out of range”. Em mong mn xem code của em và chỉ ra lỗi sai chỗ nào dùm e ạ. Em cảm ơm mn nhiều ạ.

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
class Student
{
private:
	string name;
	string phoneNumber;
	float GPA;
public:
	Student() 
	{
	
	}
	Student(string name, string phoneNumber, float GPA)
	{
		this->name = name;
		this->phoneNumber = phoneNumber;
		this->GPA = GPA;
	}
	void insertStudent(vector<Student> student);
	int checkName(vector<Student> student,int n);
	void deleteStudent(vector<Student> student, int n);
	void sort(vector<Student> student, int n);
	void printStudentInfo(vector<Student> student, int id);
};
int Student::checkName(vector<Student> student,int n)
{
	for (int i = 0; i < n; i++)
	{
		if (name == student[i].name)
			return 1;
		else return -1;
	}
}
void Student::insertStudent(vector<Student> student)
{
	string temp; 
	getline(cin, temp);
	Student a;
	cout << "Input name of student: ";
	getline(cin, a.name);
	cout << "Input phone number of student: ";
	cin >> a.phoneNumber;
	cout << "Input GPA of student: ";
	cin >> a.GPA;
}
void Student::deleteStudent(vector<Student> student, int n)
{
	string name;
	Student a;
	cout << "Input name of student: ";
	getline(cin, a.name);
	if (checkName(student, n) != 1)
	{
		cout << "This student is not in the class";
	}
	//student.erase(Student a +1);
}
void Student::sort(vector<Student> student, int n)
{
	Student tmp;
	for (int i = 0; i < n; ++i) 
	{
		for (int j = i + 1; j < n; ++j) 
		{
			if (student[i].GPA < student[j].GPA)
			{
				tmp = student[i];
				student[i] = student[j];
				student[j] = tmp;
			}
		}
	}
}
void Student::printStudentInfo(vector<Student> student, int n)
{
	for (int i = 1; i < n; i++)
	{
		cout << "Name: " << student[i].name << endl;
		cout << "Phone number: " << student[i].phoneNumber << endl;
		cout << "GPA: " << student[i].GPA << endl;
	}
}
int main()
{
	Student a;
	vector<Student> st;
	int n, choice;
	string name, phoneNumber;
	float GPA;
	fstream myFile;
	myFile.open("LopHoc.txt", fstream::in);
	if (myFile.fail())
		cout << "Failed to open this file!" << endl;
	myFile >> n;
	//for (int i = 0; i < n; i++)
	getline(myFile, name);
	myFile >> phoneNumber;
	myFile >> GPA;
	cout << "================MENU================" << endl;
	cout << "0. Exit." << endl;
	cout << "1. Add new student." << endl;
	cout << "2. Delete a student." << endl;
	cout << "3. Sort the list of students." << endl;
	cout << "4. Export all the information of all students in the class." << endl;
	cout << "================END================" << endl;
	do
	{
		cout << "Enter your choice: ";
		cin >> choice;
		switch (choice)
		{
		case 0:
			break;
		case 1:
			cout << "Input information of new student." << endl;
			a.insertStudent(st);
			if (a.checkName(st, n) == 1)
				st.push_back(a);
			else
				cout << "This student is in the class." << endl;
			break;
		case 2:
			a.deleteStudent(st, n);
			break;
		case 3:
			cout << "List of students after sorting descending:" << endl;
			a.sort(st, n);
			break;
		case 4: 
			cout << "Information all the students." << endl;
			a.printStudentInfo(st, n);
			break;
		}
	} while (choice);
	myFile.close();
	return 0;
}

bạn đã thử dịch câu này chưa, sau khi dịch thì bạn có phán đoán ra được điều gì không?

mình dịch lỗi đó ra là chỉ số dưới vector ngoài phạm vi nhưng mình ko biết sửa sao để chương trình chạy được ạ?

Đó là thông báo rằng bạn đang truy xuất bên ngoài phạm vị của vector.
Tôi có 100 phần tử, sao đó xóa 10 phần tử, nhưng tôi vẫn truy xuất đến các phần tử 91 -> 100. Điều gì xảy ra?

Bạn có biết:

  1. vector hỗ trợ tốt hơn mảng cố định.
  2. vector có thuộc tính size là số lượng phần tử hiện có của nó.
  3. vector thì chả cần thêm cái int n nào nữa.

Bạn xem lại, bạn đã dùng bao nhiêu lần int n?

Bạn đang dùng vector kết hợp với mảng nửa vời à?

1 Like

Mình nghĩ sử dụng int n( số học sinh trong file LopHoc.txt) và khi kiểm tra tên có trong danh sách hoặc sort danh sách thì dùng i< n cho vòng lặp để xét từ phần tử ạ. Ngoài sử dụng vòng lặp thì mình ko biết dùng vector như thế nào để xét từng phần tử có trong danh sách ạ, mình cũng mới học vector nên mình ko biết ạ.
Mình viết như vậy là sai hở bạn? Vậy mình cần bỏ hết int n phải ko ạ?

Hỏi nhẹ bạn 1 câu: “Bạn có cập nhật lại giá trị của n khi thêm (insert) hoặc xóa (delete) không?”

Tôi có 100 học sinh.
Có 1 em mới vào, vẫn là 100 em.
Có 5 em nghỉ học, vẫn là 100 em.
Tôi quá đỉnh!

Xét thêm thì bạn lại sai luôn lớp (class) Student, bạn viết Hướng đối tượng (OOP), nhưng lại “khéo léo bẻ lái” nguyên lớp Student sang dạng hàm - chức năng luôn.

:man_facepalming::woman_facepalming:

1 Like

Lúc mình làm thì chưa nghĩ tới khúc cập nhật lại n. Còn khúc sai cái class là s ạ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?