Answer the question
In order to leave comments, you need to log in
How will the protection against changing a vector of zero length look like?
Hello. Wrote a class using a vector. But here I choose editing and, for example, I have three rows filled in the table. I edit the first line, but the last one always changes. It seems like you need to write protection against changing a vector of zero length. But I don't know how to do it. Please, if you can, show how it's done. Thanks in advance.
Sport.h file
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <fstream>
using namespace std;
typedef string str;
class Sport
{
private:
str Name;
char Team;
float Bal;
int Mesto;
vector<Sport> SP;
public:
Sport();
Sport(str name, char team, float bal, int mesto, vector<Sport> sp);
void setName(const str&);
void setTeam(char);
void setBal(float);
void setMesto(int);
const str& getName() const;
const char getTeam() const;
const float getBal() const;
const int getMesto() const;
void Menu();
void Show();
void Add();
void Del();
void Remove();
~Sport();
};
#include "Sport.h"
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
Sport::Sport()
{
Name = "Имя не указано";
Team = '\0';
Bal = 0.0;
Mesto = 0;
}
Sport::~Sport()
{
}
Sport::Sport(str name, char team, float bal, int mesto, vector<Sport> sp)
: Name(name), Team(team), Bal(bal), Mesto(mesto), SP(sp)
{ }
void Sport::setName(const str& name)
{
Name = name;
}
void Sport::setTeam(char team)
{
Team = team;
}
void Sport::setBal(float bal)
{
Bal = bal;
}
void Sport::setMesto(int mesto)
{
Mesto = mesto;
}
const str& Sport::getName() const
{
return Name;
}
const char Sport::getTeam() const
{
return Team;
}
const float Sport::getBal() const
{
return Bal;
}
const int Sport::getMesto() const
{
return Mesto;
}
void Sport::Menu()
{
cout << "1 - Добавить нового участника\n";
cout << "2 - Редактировать данные об участнике\n";
cout << "3 - Удалить участника\n";
cout << "0 - Выход\n";
}
void Sport::Show()
{
system("cls");
cout << "------------------------------------------------------------------------------------------------" << endl;
cout << "Ведомость спортивних состязаний" << endl;
cout << "------------------------------------------------------------------------------------------------" << endl;
cout << " №" << setw(26) << "Фамилия участника" << setw(20) << "Код команды" << setw(25) << "Количество балов" << setw(20) << "Место в итоге" << endl;
cout << "------------------------------------------------------------------------------------------------" << endl;
for (int i = 0; i < SP.size(); i++) {
cout << " " << i + 1 << '\t' << setw(15) << SP[i].Name << setw(20) << SP[i].Team << setw(24) << SP[i].Bal << setw(20) << SP[i].Mesto << endl;
if (i != SP.size() - 1)
{
cout << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " << endl;
}
}
cout << "------------------------------------------------------------------------------------------------" << endl;
cout << " Примечание: D - Динамо, C - Спартак, S - Шахтер" << endl;
cout << "------------------------------------------------------------------------------------------------" << endl;
}
void Sport::Add()
{
int n;
Sport t;
SP.push_back(t);
cout << "Введите фамилию участника: ";
cin >> SP[SP.size() - 1].Name;
do {
n = 0;
cout << "Введите код команды (D - Динамо, C - Спартак, S - Шахтер):";
cin >> SP[SP.size() - 1].Team;
if (SP[SP.size() - 1].Team != 'D' && SP[SP.size() - 1].Team != 'C' && SP[SP.size() - 1].Team != 'S')
{
n = 1;
cout << "Вы ввели некорректный код команды, повторите ввод:\n";
}
} while (n == 1);
n = 0;
do {
n = 0;
cout << "Введите количество балов: ";
cin >> SP[SP.size() - 1].Bal;
if (!cin.good() || SP[SP.size() - 1].Bal < 0)
{
n = 1;
cout << "Вы ввели некорректное число, повторите ввод:\n";
}
} while (n == 1);
n = 0;
do {
n = 0;
cout << "Введите итоговое место: ";
cin >> SP[SP.size() - 1].Mesto;
if (SP[SP.size() - 1].Mesto < 0)
{
n = 1;
cout << "Вы ввели некорректное число, повторите ввод:\n";
}
} while (n == 1);
n = 0;
Show();
}
void Sport::Del()
{
int n;
cout << "Введите номер строки, которую Вы желаете удалить: ";
cin >> n;
SP.erase(SP.begin() + n - 1);
Show();
}
void Sport::Remove()
{
int p;
int n;
cout << "Введите номер строки, которую Вы хотите отредактировать: ";
cin >> n;
cout << "Введите фамилию участника: ";
cin >> SP[n - 1].Name;
do {
p = 0;
cout << "Введите код команды (D - Динамо, C - Спартак, S - Шахтер)::";
cin >> SP[SP.size() - 1].Team;
if (SP[SP.size() - 1].Team != 'D' && SP[SP.size() - 1].Team != 'C' && SP[SP.size() - 1].Team != 'S') {
n = 1;
cout << "Вы ввели некорректный код команды, повторите ввод:\n";
}
} while (p == 1);
p = 0;
do {
p = 0;
cout << "Введите количество балов: ";
cin >> SP[SP.size() - 1].Bal;
if (SP[SP.size() - 1].Bal < 0)
{
p = 1;
cout << "Вы ввели некорректное число, повторите ввод:\n";
}
} while (p == 1);
p = 0;
do {
p = 0;
cout << "Введите итоговое место: ";
cin >> SP[SP.size() - 1].Mesto;
if (SP[SP.size() - 1].Mesto < 0)
{
p = 1;
cout << "Вы ввели некорректное число, повторите ввод:\n";
}
} while (p == 1);
p = 0;
Show();
}
#include "Sport.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
int c;
Sport B;
do {
B.Menu();
cout << "Ваш выбор: ";
cin >> c;
switch (c) {
case 1:
B.Add();
break;
case 2:
B.Remove();
break;
case 3:
B.Del();
break;
case 0:
break;
default: cout << "Некорректный вариант выбора!" << endl;
}
} while (c != 0);
_getch();
return 0;
}
Answer the question
In order to leave comments, you need to log in
Remove is a very strange name for "edit mode". Name it Edit or something :-)
I think the problem is this: in Remove you first read the number n of the line for editing, but you continue to drive all the data into SP[SP.size() - 1]
The vector has useful features: a link to the last element: SP.back(), check for emptiness: SP.empty()
The code will be much easier to read if you get a reference to the element with which you are supposed to work, and do all the actions with it. Those. instead of SP[SP.size() - 1] enter the reference Sport& curSport = SP[SP.size() - 1]; and continue to work with her.
In addition to checking the input data, it would be nice to check if the array is out of bounds. Here, for example:
cout << "Введите номер строки, которую Вы хотите отредактировать: ";
cin >> n;
cout << "Введите фамилию участника: ";
cin >> SP[n - 1].Name;
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question