Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

C++ "vector subscript out of range"

Featured Replies

Добър вечер!

При изпълняване на задача попаднах в следната ситуация...

Spoiler

Задача:

До участие в национална олимпиада по програмиране се допускат студенти (име, ЕГН, университет, факултет, специалност, събрани точки) и ученици (име, ЕГН, училище, клас, събрани точки). Данните за всички участници се съхраняват в един масив.
Да се състави програма, която изпълнява от меню следните операции:
-    добавя към масива данните на пореден участник;
-    извежда всички въведени данни;
-    извежда данните на участника с най-много точки;

-    създава масив с данните на всички участнички с повече от 30 точки.

При дебъгване на програмата издава следната грешка : 'vector subscript out of range'.

Spoiler

Където въпросната грешка се отбелязва на сравнението : if (30<pps[i]->getScores()) { в функцията:

void Over30sc() {
    scores30.clear();
    string name, PID, university, faculty, specialty, school, grade;
    float scores;
    for (int i = 0; pps.size(); i++) {
            if (30<pps[i]->getScores()) {  // точно тук
                if ((pps[i])->getType() == "University") {
                    scores30.push_back(pps[i]);
                }
                else {
                    scores30.push_back(pps[i]);
                }
            }
    }
    for (int j = 0; scores30.size(); j++) {
        if (scores30[j]->getType() == "University") {
            scores30[j]->display();
            cout << "University Student succesfuly added to the array";
        }
        else if (scores30[j]->getType() == "School") {
            scores30[j]->display();
            cout << "School Student succesfuly added to the array";
        }
    }
}

Снимки: 

Spoiler

1.png.e892ca868cb2ecce121fd81a5a1f8f05.png2.png.6182ffecd23927b2023a62e0619a9f1a.png

Пълен код:

Spoiler
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class CPerson {
protected:
	string name;
	string PID;
	float scores;
public:
	//Constructors
	CPerson();
	CPerson(string, string, float);
	//Getters
	string getName();
	string getPID();
	float getScores();
	//Setters
	void setName(string);
	void setPID(string);
	void setScores(float);
	//Methods
	virtual void display() = 0;
	virtual string getType() = 0;
};

//Constructors
CPerson::CPerson() {
	name;
	PID;
	scores = 0;
}

CPerson::CPerson(string name, string PID, float scores) {
	this->setName(name);
	this->setPID(PID);
	this->setScores(scores);
}

//Getters
string CPerson::getName() {
	return this->name;
}
string CPerson::getPID() {
	return this->PID;
}
float CPerson::getScores() {
	return this->scores;
}

//Setters
void CPerson::setName(string name) {
	this->name = name;
}
void CPerson::setPID(string PID) {
	this->PID = PID;
}
void CPerson::setScores(float scores) {
	this->scores = scores;
}

//Methods
void CPerson::display() {
	cout << "Name: " << this->getName() << endl;
	cout << "PID: " << this->getPID() << endl;
	cout << "Scores: " << this->getScores() << endl;
}

class UStudent :public CPerson {
protected:
	string university;
	string faculty;
	string specialty;
public:
	//Constructrs
	UStudent();
	UStudent(string, string, float, string, string, string);
	//Getters
	string getUniversity();
	string getFaculty();
	string getSpecialty();
	//Setters
	void setUniversity(string);
	void setFaculty(string);
	void setSpecialty(string);
	//Methods
	void display();
	string getType();
};

//Constructors
UStudent::UStudent() {
	university;
	faculty;
	specialty;
}
UStudent::UStudent(string name, string PID, float scores, string university, string faculty, string specialty)
	: CPerson::CPerson(name, PID, scores), university(university),faculty(faculty),specialty(specialty) {}

//Getters
string UStudent::getUniversity() {
	return this->university;
}
string UStudent::getFaculty() {
	return this->faculty;
}
string UStudent::getSpecialty() {
	return this->specialty;
}
//Setters
void UStudent::setUniversity(string university) {
	this->university;
}
void UStudent::setFaculty(string faculty) {
	this->faculty;
}
void UStudent::setSpecialty(string specialty) {
	this->specialty;
}
//Methods
void UStudent::display() {
	CPerson::display();
	cout << "University: " << this->getUniversity() << endl;
	cout << "Faculty: " << this->getFaculty() << endl;
	cout << "Specialty: " << this->getSpecialty() << endl;
}
string UStudent::getType() {
	return "University";
}

vector<CPerson*> pps;

class SStudent : public CPerson {
protected:
	string school;
	string grade;
public:
	//Constructors
	SStudent();
	SStudent(string, string, float, string, string);
	//Getters
	string getSchool();
	string getGrade();
	//Setters
	void setSchool(string school);
	void setGrade(string grade);
	//Methods
	void display();
	string getType();
};

//Constructors
SStudent::SStudent() {}
SStudent::SStudent(string name, string PID, float scores, string school, string grade) :
	CPerson::CPerson(name, PID, scores), school(school), grade(grade) {}


//Getters
string SStudent::getSchool() {
	return this->school;
}
string SStudent::getGrade() {
	return this->grade;
}
//Setters
void SStudent::setSchool(string) {
	this->school;
}
void SStudent::setGrade(string) {
	this->grade;
}
//Methods
void SStudent::display() {
	CPerson::display();
	cout << "School: " << this->getSchool()<< endl;
	cout << "Grade: " << this->getGrade() << endl;
}
string SStudent::getType() {
	return "School";
}

vector<CPerson*> scores30;

void AddParticipant() {
	char choice;
	string name;
	string PID;
	float scores;

	cout << "University or School student(U / S) : "; cin >> choice;
	cin.ignore();
	cout << "Name: "; getline(cin, name);
	cout << "PID: "; getline(cin, PID);
	cout << "Scores: "; cin >> scores;

	if (choice == 'U' || choice == 'u') {
		string university;
		string faculty;
		string specialty;
		cin.ignore();
		cout << "University: "; getline(cin, university);
		cout << "Faculty: "; getline(cin, faculty);
		cout << "Specialty: "; getline(cin, specialty);

		pps.push_back(new UStudent(name, PID, scores, university, faculty, specialty));
	}
	else if (choice == 'S' || choice == 's') {
		string school;
		string grade;
		cin.ignore();
		cout << "School: "; getline(cin, school);
		cout << "Grade: "; getline(cin, grade);

		pps.push_back(new SStudent(name, PID, scores, school, grade));
	}
}

void MostScores(){
	float msc=0;
	for (int i = 1; i < pps.size(); i++) {
		if (pps[i]->getScores() < pps[i - 1]->getScores()) {
			msc = pps[i]->getScores();
		}
}
	cout << msc;
}

void Over30sc() {
	scores30.clear();
	string name, PID, university, faculty, specialty, school, grade;
	float scores;
	for (int i = 0; pps.size(); i++) {
			if (30<pps[i]->getScores()) {
				if ((pps[i])->getType() == "University") {
					scores30.push_back(pps[i]);
				}
				else {
					scores30.push_back(pps[i]);
				}
			}
	}
	for (int j = 0; scores30.size(); j++) {
		if (scores30[j]->getType() == "University") {
			scores30[j]->display();
			cout << "University Student succesfuly added to the array";
		}
		else if (scores30[j]->getType() == "School") {
			scores30[j]->display();
			cout << "School Student succesfuly added to the array";
		}
	}
}

int main() {
	int size = pps.size();
	char choice;

	do {
		cout << "MENU\n";
		cout << "\t1.Add a student.\n";
		cout << "\t2.Display all info.\n";
		cout << "\t3.Display participant with most scores.\n";
		cout << "\t4.Add participants with 30+ scores to an array.\n";
		cout << "Choice: "; cin >> choice;

		switch (choice)
		{
		case'0':
			cout << "\nThank you for using the program!\nExiting...\n";
			break;
		case '1':
			AddParticipant();
			break;
		case '2':
			for (int i{}; i < pps.size(); i++) {
				if (pps[i]->getType() == "University") {
					cout << "\nUniversity Student:\n";
					pps[i]->display();
				}
				else if (pps[i]->getType() == "School") {
					cout << "\nSchool Student:\n";
					pps[i]->display();
				}
			}
			break;
		case '3':
			MostScores();
			break;
		case '4':
			Over30sc();
			break;
		default:
			cout << "\nInvalid operation code!\n";
			break;
		}

	} while (choice != '0');
	}

 

 

За първи път се сблъсквам с вектори. Ако може някой да разясни ситуацията или да ме светне с по-практичен метод за изпълнение на условието.

Програмата е Visual Studio 2019, уменията ми ниво - първокурсник. :writealetter:

Благодаря!

  • Автор
преди 23 минути, Raze написа:

До тук добре.. 5 пъти я гледах тази публикация, чак сега се осъзнах..

Обаче тук и нов проблем:5.png.b93e64d4a8ea86cdbacafeb8c125cbc8.png

Код:

Spoiler
void Over30sc() {
	scores30.clear();
	string name, PID, university, faculty, specialty, school, grade;
	float scores;
	for (vector<int>::reverse_iterator i = pps.rbegin(); i < pps.rend(); ++i) {
			if (30<pps[*i]->getScores()) {
				if ((pps[*i])->getType() == "University") {
					scores30.push_back(pps[*i]);
				}
				else {
					scores30.push_back(pps[*i]);
				}
			}
	}
	for (int j = 0; scores30.size(); j++) {
		if (scores30[j]->getType() == "University") {
			scores30[j]->display();
			cout << "University Student succesfuly added to the array";
		}
		else if (scores30[j]->getType() == "School") {
			scores30[j]->display();
			cout << "School Student succesfuly added to the array";
		}
	}
}

 

 

защо мислиш, че така се задава for цикъл?

for (int i = 0; pps.size(); i++) 

Очевадно е че ще увеличава i докато препълни масива и излезе извън размерите му.

  • Автор
преди 3 минути, ined написа:

защо мислиш, че така се задава for цикъл?

for (int i = 0; pps.size(); i++) 

Очевадно е че ще увеличава i докато препълни масива и излезе извън размерите му.

Грешката тук е моя. Пропуснал съм i< след множеството промени.

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.