@OwerFan

Как задать и считать бесконечность?

Считываю матрицу из файла. Некоторые элементы равны бесконечности. Как записать в файл бесконечность, чтобы потом можно было считать их из файла как бесконечность?
  • Вопрос задан
  • 5339 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Code
#include<iostream>
#include<fstream>
#include<limits>
#include<vector>
#include<iterator>
#include<algorithm>
#include<string>
using namespace std;

int main()
{
  const string filein = "D:\\numbers_in.txt";
  const string fileout = "D:\\numbers_out.txt";
  vector<double> v;

  ios_base::sync_with_stdio(false);

  if(ifstream ifs(filein); ifs)
  {
    transform(istream_iterator<string>{ifs}, {}, back_inserter(v), [](const auto& xs){
      double d = numeric_limits<double>::infinity();
      try
      {
        d = stod(xs);
      }
      catch(...)
      {
        cout << "wrong\n";
      }
      return d;
    });
  }

  copy(v.begin(), v.end(), ostream_iterator<double>{cout, " "});

  if(ofstream ofs(fileout); ofs)
  {
    copy(v.begin(), v.end(), ostream_iterator<double>{ofs, " "});
  }

  cin.get();
}

numbers_in.txt
-1.0 3.0e5 inf 23.01 55.003
numbers_out.txt
-1 300000 inf 23.01 55.003

Для матрицы
-1.0 3.0e5 inf
5.0 inf 0.008
1.45 3.99 -5.25

+/- Аналогично

#include<iostream>
#include<fstream>
#include<limits>
#include<vector>
#include<iterator>
#include<algorithm>
#include<string>
#include<sstream>
using namespace std;

auto parse_line = [](istream& is)
{
  vector<double> row;
  transform(istream_iterator<string>{is}, {}, back_inserter(row), [](const auto& xs){
      double d = numeric_limits<double>::infinity();
      try
      {
        d = stod(xs);
      }
      catch(...)
      {
        cout << "wrong\n";
      }
      return d;
    });
  return row;
};

int main()
{
  const string filein = "D:\\numbers_in.txt";
  const string fileout = "D:\\numbers_out.txt";

  vector<vector<double>> matrix;

  ios_base::sync_with_stdio(false);

  if(ifstream ifs(filein); ifs)
  {
    string line;
    while(getline(ifs, line))
    {
      istringstream is{ line };
      matrix.push_back(parse_line(is));
    }
  }

  for(const auto& v : matrix)
  {
    copy(v.begin(), v.end(), ostream_iterator<double>{cout, " "});
    cout << "\n";
  }
  
  if(ofstream ofs(fileout); ofs)
  {
    for(const auto& v : matrix)
    {
      copy(v.begin(), v.end(), ostream_iterator<double>{ofs, " "});
      ofs << "\n";
    }
  }

  cin.get();
}



А нужно написать бесконечность потому что потом буду искать минимальный элемент среди этих элементов и чтобы этот минус не мешал поиск.


минимальный элемент среди этих элементов
using Matrix = vector<vector<double>>;

auto find_min = [](const Matrix& m)
{
  vector<double> values;
  for(const auto& row : m)
  {
    values.push_back(*min_element(row.begin(), row.end()));
  }
  return *min_element(values.begin(), values.end());
};

// ... 

cout << "Min element: " << find_min(matrix) << endl;

Min element: -5.25
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Zoominger
@Zoominger
System Integrator
Можно вот так:
#include <limits>
int a = std::numeric_limits<int>::max();

Но можно не заморачиваться и писать что-нибудь типа inf или взять за беконечность какое-либо число (но это г-нокод)
Ответ написан
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
#include <limits>
std::numeric_limits<double>::infinity();
Ответ написан
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Тут есть несколько вариантов решения: https://stackoverflow.com/questions/11420263/is-it...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы