Массивы с плавающей запятой, хранящие мусорное значение, несмотря на правильно заданный ввод

#c #io #floating-point

#c #io #с плавающей запятой

Вопрос:

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

 #include <iostream>
#include <iomanip>
#include <vector>
using namespace std;



int main(){
 
   int n,m;
  cin>>n>>m;
 vector<float>prb(n 1,0),prft(n 1,0),loss(n 1,0);
  for(int i=1;i<=n;i  ){
    float x;
    cin>>x;
    prb.push_back(x);
  }
  for(int i=1;i<=n;i  ){
    float x;
    cin>>x;
    prft.push_back(x);
  }
    for(int i=1;i<=n;i  ){
    float x;
    cin>>x;
    loss.push_back(x);
  }
  
  cout<<endl;
  
   for(ll i=1;i<=n;i  ){
    cout<<prb[i]<<' ';
  }
  cout<<endl;
   for(ll i=1;i<=n;i  ){
    cout<<prft[i]<<' ';
  }
  cout<<endl;
   for(ll i=1;i<=n;i  ){
    cout<<loss[i]<<' ';
  }
 
 
 
 
  
return 0;
}

  

Ввод :

 4 2  
0.50 0.50 0.50 0.50  
4.00 1.00 2.00 3.00  
4.00 0.50 1.00 1.00
  

Вывод :

 0 0 0 0 
0 0 0 0
0 0 0 0

  

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

Комментарии:

1. typedef unsigned long long int ull;typedef long long int ll; — Нет абсолютно никакой необходимости в этих сумасшедших макросах. C имеет int64_t , uint64_t . Во-вторых, это: float prb[n 1]; и строки, которые выглядят так, не являются допустимыми C . Похоже, вы изучаете C с этих сайтов «конкурентного программирования».

2. Действительно, но в любом случае это облегчает мою жизнь. Как же так? Замедление выглядит нормально для меня?

3. Ваш код имеет много признаков использования для так называемых сайтов-конкурентов. Все такие сайты учат, что это действительно вредные привычки, которые вам не следует использовать (и если вы используете какой-либо из них на собеседовании, вас, скорее всего, не примут на работу). Включая один (массивы переменной длины), который делает ваш код недопустимым в стандартном C .

4. Дело в том, что другие здесь смотрят на ваш код. Запутывание его с помощью этих безумных макросов затрудняет другим отслеживание того, что вы делаете. Во-вторых, C запускает индексы массива с 0 , не 1 .

5. @PawanNirpal — Теперь вы создали другую проблему. Теперь вы определяете размеры своих векторов при построении, но затем вы вызываете push_back увеличение размера векторов. Теперь вы видите, почему конкурентные сайты по программированию бесполезны в обучении правильному написанию кода на C .

Ответ №1:

Сохраняемые значения не являются нулями, просто вы инициализируете свои векторы с заданным размером, при этом эти значения равны нулю.

push_back добавляет новые элементы в конец вектора.

Использование at вместо push_back — это исправление.

Комментарии:

1. Спасибо за усилия, но я все еще получаю те же нули.

Ответ №2:

Поехали,

 vector<float>prb(n 1,0),prft(n 1,0),loss(n 1,0);
  

Может быть заменен на,

 vector<float>prb(n),prft(n),loss(n);
  

В вашей оригинальной программе это исправить 🙂

Кроме того, при доступе к значениям (именно cout ) обращайтесь к i-1-му элементу вместо i-го. Поскольку индексация по умолчанию выполняется на основе 0, и вы получаете доступ с индекса 1.

Например, prb[i-1], prft [i-1] и потеря [i-1].

Комментарии:

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

Ответ №3:

Это работает, просто проверьте этот пример кода и введите входные числа с плавающей запятой

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

int main()
{
    vector<float> v1;
    float x;
    for(int i=0;i<5;i  ){
      cin>>x;
      v1.push_back(x);
    }
    for (int i = 0; i < v1.size();   i) {
        cout << v1[i] << ' ';
    }
    return 0;
}