E
E
Egor Nameles2018-09-11 14:51:48
C++ / C#
Egor Nameles, 2018-09-11 14:51:48

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();
};

Sport.cpp file
#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();
}

main.cpp file
#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

1 answer(s)
P
Pavel, 2018-09-13
@EgaNator

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 question

Ask a Question

731 491 924 answers to any question