Вектор, хранящий некогерентные данные - PullRequest
1 голос
/ 05 мая 2019

Я следую примеру в Программировании: Принципы и практики C +, однако, когда я пытаюсь отобразить вектор, все, что я получаю, - это, по сути, шум (случайные числа в серии). Любая помощь будет принята с благодарностью.

Я пытался играть с типами данных (int, unsigned int), endl вместо \ n в конце и незначительными изменениями синтаксиса. Кажется, ничего не работает

std::vector<double>sumbank;
int vectorsize = 0;

std::cout << "Enter amount of digits you will be storing \n";
std::cin >> vectorsize;
for (unsigned int a=0; a < vectorsize; ++a)
{
    double sum = 0;
    std::cout << "Please Enter Your First Number\n";
    std::cin >> sum;
    sumbank.push_back(sum);

}

for (unsigned int b = 0; b < sumbank.size(); ++b)
{
    std::cout << sumbank[b] << '/n';
}

1 Ответ

0 голосов
/ 05 мая 2019

in

std::cout << sumbank[b] << '/n';

Ваш символ новой строки неправильный, должен быть '\n' или лучше std::endl

Ваше сообщение

 std::cout << "Enter amount of digits you will be storing \n";

почему цифра?вы вводите двойной

и в

 std::cout << "Please Enter Your First Number\n";

почему «первый»?

Вы также смешиваете число со знаком и без знака в сравнении

Я рекомендую вам проверить успешность ввода, поэтому if (! (cin >> var)) ...error... В противном случае, если вы введете недопустимое значение, все последующие вводы ничего не сделают


Изменить для вашего замечания " Я пытаюсь понять, чтосбрасывает буферы, как это работает и почему его полезно":

, имеющего

int vectorsize = 0;

std::cin >> vectorsize;

, если вводится что-то другое, чем число, поток ошибочен, и вы не можете прочитатьиз него с успехом, пока он находится в этом состоянии, поэтому, чтобы снова прочитать число, вам нужно очистить ошибку и, конечно, обойти неверный ввод, который все еще присутствует в потоке.

Поскольку вы читаете несколько чиселв вашем коде может быть полезно иметь специальную функцию, чтобы не повторять код, это может быть:

#include <iostream>

// return false in case of EOF, else true
bool readInt(std::istream & is, int & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid number ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readInt(std::cin, v))
    std::cout << "EOF!" << std::endl;
  else
    std::cout << "the number is " << v << std::endl;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : aze
invalid number ('aze'), redo
23
the number is 23
pi@raspberrypi:/tmp $ echo "aze qsd" | ./a.out
enter an integer : invalid number ('aze'), redo
invalid number ('qsd'), redo
EOF!
pi@raspberrypi:/tmp $ 

Конечно, вы также можете определитьфункция шаблона, чтобы не быть liпередано в int :

#include <iostream>

// return false in case of EOF, else true
template <typename T>
bool readIt(std::istream & is, T & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid input ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readIt(std::cin, v)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the integer is " << v << std::endl;

  float f;

  std::cout << "enter a float : ";
  if (!readIt(std::cin, f)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the float is " << f << std::endl;

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall t.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : 12
the integer is 12
enter a float : 12.34
the float is 12.34
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ ./a.out
enter an integer : a
invalid input ('a'), redo
12
the integer is 12
enter a float : b
invalid input ('b'), redo
12.34
the float is 12.34
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...