Ответы пользователя по тегу C++
  • Как задать и считать бесконечность?

    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
    Ответ написан
    Комментировать
  • Что означает < в уравнение, и как его решить?

    myjcom
    @myjcom Куратор тега C++
    x++*n
    берем х умножаем на n, увеличиваем x на единицу. (постфиксный инкремент)

    А это уже
    (x+1)*n < n+1 // вы скобки забыли
    префиксный инкремент
    ++x * n < n + 1
    P.S.
    а выражение целиком это предикат
    Предикат в программировании — выражение, использующее одну или более величину с результатом булева типа.


    bool - type, capable of holding one of the two values: true or false.


    Зачем этот знак?

    less than operator C++
    1) Returns true if lhs is less than rhs, false otherwise.
    Ответ написан
    Комментировать
  • Как исправить C2259?

    myjcom
    @myjcom Куратор тега C++
    // ...
    Effect(string n) : name{ n }{}
    virtual ~Effect() = 0;
    // ...
    // ...
    FireBall::FireBall(string _name) : Effect(_name), count{ 10 }
    {
    }
    // ...


    https://en.cppreference.com/w/cpp/memory/unique_ptr
    vector<unique_ptr<Effect>> effects;
    effects.push_back(make_unique<FireBall>("Огненный шар"));
    Ответ написан
    Комментировать
  • Почему мой код не работает согласно заданию?

    myjcom
    @myjcom Куратор тега C++
    int a{}, b{}, c{};
    cin >> a >> b >> c;
    cout << a * 100 + b * 10 + c;
    Ответ написан
  • Как исправить C2061?

    myjcom
    @myjcom Куратор тега C++
    Compiler Error C2061
    The compiler found an identifier where it wasn't expected. Make sure that identifier is declared before you use it.

    По правилам языка, чтобы что-то использовать нужно это сначала объявить.
    в файле player.h у вас препроцессором вставляется код из "Mob.h"
    #include "Mob.h"
    где используется Player, объявление которого находится после первого использования.
    Нужно использовать Forward declaration
    Как исправить

    Например так
    #pragma once
    #include "Weapon.h"
    
    class Mob;
    class Player
    {
    public:
      int health, armor, exp, mana;
      int currentHealth, currentArmor, currentMana, toNextLvlExp, balance;
      int missChanceBody, missChanceHead, missChanceLegs;
    
      Weapon sword;
      Weapon magicStick;
    
      Player(int _health, int _armor, const Weapon& _sword, const Weapon& _magicStick);
      int takePhysicalDamage(Mob& m);
    };

    mob.h:
    #pragma once
    #include <string>
    #include "Player.h"
    Ответ написан
    Комментировать
  • Вылетает бесконечное число "cout" при вводе символа. Что делать?

    myjcom
    @myjcom Куратор тега C++
    Что делать?

    #include <iostream> 
    using namespace std;
    int main()
    {
      float x, y;
      char z;
      char c = 'n';
      do {
        cout << "Write your first number:";
        cin >> x;
        cout << "Write your second number:";
        cin >> y;
        cout << "Write your sign:";
        cin >> z;
        switch(z)
        {
          case '+':
          {
            cout << "Your answer: "
                 << x << "+" << y << "="
                 << x + y
                 << "\n";
          }
          break;
    
          case '-':
          {
            cout << "Your answer: "
                 << x << "-" << y << "="
                 << x - y
                 << "\n";
          }
          break;
    
          case '*':
          {
            cout << "Your answer: "
                 << x << "*" << y << "="
                 << x * y
                 << "\n";
          }
          break;
    
          case '/':
          {
            if(y == 0)
            {
              cout << "You cant division!" << endl;
            }
            else
            {
              cout << "Your answer: "
                   << x << "/" << y << "="
                   << x / y
                   << "\n";
            }
          }  
          break;
        }
        cout << "continue? (y/n): ";
      } while((cin >> c) && c == 'y');
    }

    Ответ написан
    Комментировать
  • Как установить количество знаков после запятой в QT?

    myjcom
    @myjcom Куратор тега C++
    double x = 12.3456789;
    double y = 98.7654321;
    QString str = QString("x: %1 y: %2").arg(x, 0, 'f', 3).arg(y, 0, 'f', 3);

    OUT:
    x: 12.346 y: 98.765

    https://doc.qt.io/qt-5/qstring.html#arg-9
    https://doc.qt.io/qt-5/qstring.html#argument-formats
    Ответ написан
    Комментировать
  • Выбор компилятора для c++, какой выбрать?

    myjcom
    @myjcom Куратор тега C++
    Любой из исходя из поддержки тех или иных features.
    P.S.
    Про конкретную платформу тут речи не идет?
    Ответ написан
    Комментировать
  • Как удалить файл с помощью функции DeleteFile() в C++?

    myjcom
    @myjcom Куратор тега C++
    Задача: удалить из каталога все файлы в названии которых есть символ "~" и размер которых 0.

    А так?
    #include<iostream>
    #include<string>
    #include<filesystem>
    #include<vector>
    
    // #include<windows.h> // DeleteFile ...
    
    using namespace std;
    using namespace experimental::filesystem;
    
    auto pred = [](const auto& entry)
    {
      return !is_directory(entry.path()) &&
             entry.path().filename().string().find("~") != string::npos &&
             file_size(entry.path()) == 0;
    };
    
    auto getFiles_if(const string& dir, decltype(pred) p)
    {
      vector<directory_entry> result;
    
      if(!exists(dir))
      {
        cerr << "error: " << dir << "does not exist!";
        return result;
      }
      copy_if(directory_iterator(dir), {}, back_inserter(result), p);
    
      if(result.empty())
      {
        cout << "files not found\n";
      }
    
      return result;
    }
    
    int main()
    {
      string dir = "D:\\temp";
    
      for(const auto& pf : getFiles_if(dir, pred))
      {
        string file = pf.path().string();
        cout << "delete file? " << file << " (y/n): ";
        if(char c = 0; (cin >> c), c == 'y')
        {
          if(remove(pf.path())) // Всего лишь заменить на DeleteFile(file.c_str());
          {
            cout << "delete: " << file << "\n";
          }
          // ...
        }
        else
        {
          cout << "skip: " << file << "\n";
        }
      }
    
      system("pause");
    }
    Ответ написан
    Комментировать
  • Почему в C++ после несоответствия введенных данных определённому типу программа завершается?

    myjcom
    @myjcom Куратор тега C++
    Почему так?

    см. комментарий

    А вообще раздели потоки
    ответственность.

    #include<iostream>
    #include<string>
    #include<sstream>
    using namespace std;
    
    struct Entry
    {
      string name;
      int age;
    };
    
    istream& operator>>(istream& is, Entry& e)
    {
      is >> e.name >> e.age;
      return is;
    }
    
    ostream& operator<<(ostream& os, Entry& e)
    {
      os << e.name << " " << e.age;
      return os;
    }
    
    int main()
    {  
      string line;
    
      getline(cin, line);
      istringstream is(line);
    
      is.exceptions(ios_base::failbit);
    
      Entry e;
      try // I know it was wrong.
      {
        while(is >> e)
        {
          cout << e << "\n";
        }
      }
      catch(exception& e)
      {
        cerr << e.what() << endl;
      }
    
      cout << "Done!\n";
    
      string answer;
      cin >> answer;
    
      system("pause");
    }

    Ответ написан
  • Как универсально изменить цвет слова?

    myjcom
    @myjcom Куратор тега C++
    Задаю такой вопрос ибо не нашёл универсального решения

    ----> Источник инфы
    #include<iostream>
    #include<cstdlib>
    int main()
    {
      system(" "); // пробел важен
      std::cout << "\x1b[31m" << "Hello user!";
      std::cin.get();
    }

    Linux/Win10
    Ответ написан
    Комментировать
  • Запись в переменную литерала не его типа?

    myjcom
    @myjcom Куратор тега C++
    #include<iostream>
    int main()
    {
      int a;
      std::cin.operator>>(a);
      std::operator<<(std::cout, "a  = ").operator<<(a);
    }

    это std::cin
    а это то, что вызывается для чтения int.
    2. basic_istream& operator>>( int& value );

    подробнее...

    где-то тут он проверяет что вы ввели, потом генерируется исключение и состояние потока переходит в
    this->_M_setstate(ios_base::badbit)

    Данил,
    Каким образом символы конвертируется именно в 0?

    где-то там же вашей переменной int a; присваивается ноль __v = 0;
    Ответ написан
    Комментировать
  • Работа с файлами в c++?

    myjcom
    @myjcom Куратор тега C++
    daneil1,
    уже 2 день с этой задачей борюсь

    как это реализовать(теоретически)?

    Видимо вы просто не знакомы.
    spoiler

    #include<iostream>
    #include<sstream>
    #include<string>
    #include<fstream>
    
    using namespace std;
    
    string process(const string& filename)
    {
      ostringstream os;
      if(ifstream ifs(filename); ifs)
      {
        string line;
        while(getline(ifs, line))
        {
          if(auto pos = line.find("link"); pos != string::npos)
          {
            pos = line.find('\"', pos);
            auto end = line.find('\"', pos + 1);
            os << process(line.substr(pos + 1, end - pos - 1));
            continue;
          }
          os << line << "\n";
        }
      }
      return os.str();
    }
    
    int main()
    {
      cout << process("text.txt");
      cin.get();
    }

    Ответ написан
    Комментировать
  • Сравнение массива и введеного пользователя числа?

    myjcom
    @myjcom Куратор тега C++
    для упорядоченной последовательности
    эффективным считается Двоичный поиск
    std::binary_search
    bsearch
    или использовать (если нет повторяющихся значений) подходящий контейнер
    например

    #include <iostream>
    #include <set>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    int main()
    {
      set<int> nums;
      generate_n(inserter(nums, nums.end()), 42, []{ return rand() % 42; });
      int n = 0; cin >> n;
      cout << "\n" 
           << ((nums.find(n) != nums.end()) ? "" : "Not ") 
           << "Found" 
           << endl;
    }



    А без цикла никак?

    Можно (нужно ли) и без цикла, функцией

    #include <iostream>
    
    bool find(int a[], int sz, int value)
    {
      if(sz == -1)
        return false;
      else if(a[sz] == value)
        return true;
      else
        return find(a, sz - 1, value);
    }
    
    int main()
    {
      int nums[] = { 4, 6, 9, 11 };
    
      int i = 0;
    
      std::cin >> i;
    
      std::cout << "\n" 
                << std::boolalpha 
                << find(nums, sizeof(nums) / sizeof(int) - 1, i);
    }

    Ответ написан
    Комментировать
  • Почему при передаче произволного количества аргументов в функцию появляются лишние аргументы?

    myjcom
    @myjcom Куратор тега C++
    задание от Страуструпа не про это (пример использования и
    ответ на почему там же)
    а про это

    ++

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
      if(argc > 0)
      {
        vector<string> args(&argv[1], &argv[argc]);
        for(const auto& n : args)
        {
          cout << "Hello " << n << "\n";
        }
      }
    }


    или
    //...
    for(int i = 1; i < argc; ++i)
    {
      cout << "Hello " << argv[i] << "\n";
    }
    //...



    Она получает имя (name) как параметр командной строки и выдает "Hello, name". Измените программу так, чтобы она получала произвольное число имен и всем им выдавала свое приветствие: "Hello, ...".


    т.е.
    hello.exe name1 name2 name3
    из командной строки выдает
    Hello name1
    Hello name2
    Hello name3


    P.S.
    Уровень сложности 1.5 по классификации Страуструпа, как бы намекает.
    на Variadic functions там есть
    другое упражнение

    13. (*3) Напишите функцию обработки ошибок, первый параметр который подобен форматирующей
    строке-параметру printf() и содержит форматы %s, %c и %d. За ним может следовать произвольное
    количество числовых параметров. Функцию printf() не используйте. Если смысл формата %s и
    других форматов вам неизвестен, обратитесь к $$10.6. Используйте stdarg.h.



    Крайне полезно обратить внимание на
    Alternatives && Notes

    Как вариант

    #include <iostream>
    
    template<typename... Arg>
    auto say_hello(std::ostream& os, Arg... args)
    {
      ((os << args << "\n") , ...);
    }
    
    int main(int argc, char* argv[])
    {
      say_hello(std::cout, "Name", "Name1", "Name2");
      std::cin.get();
    }

    Ответ написан
    Комментировать
  • Возможен ли в С++ ввод символов без пробелов?

    myjcom
    @myjcom Куратор тега C++
    Если именно так а3 и ни в каком другом виде
    то замените string на char.

    а если что-то типа ab123 и т.п.
    тогда что-то типа

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    using mytype = pair<string, int>;
    
    istream& operator>>(istream& is, mytype& m)
    {
      while(isalpha(is.peek()))
      {
        m.first.push_back(is.get());
      }
      is >> m.second;
      return is;
    }
    
    ostream& operator<<(ostream& os, const mytype& m)
    {
      return os << m.first << m.second;
    }
    
    
    int main()
    {
      mytype mt;
    
      cin >> mt;
    
      cout << mt << endl;
    }

    Ответ написан
    Комментировать
  • Почему у меня в консоли выводит одно и то же число, но я хочу сделать рандомное?

    myjcom
    @myjcom Куратор тега C++
    Или так, С++ же в тэге.
    #include<random>
    #include<iostream>
    #include<ctime>
    
    int main()
    {
      std::default_random_engine dre(std::time(nullptr));
      std::uniform_int_distribution<int> di(1, 80);
    
      std::cout << di(dre) << std::endl;
    
      std::cin.get();
    }


    Ну а если rand() то хотя бы так
    https://en.cppreference.com/w/cpp/numeric/random/rand

    На заметку:

    У вас main(...) не совсем корректна
    и в С++ "принято" явно указывать заголовочные файлы
    у вас <cstdlib> и <ctime>
    Ответ написан
    Комментировать
  • Что не так с вызовом функций типа void в PlatformIO?

    myjcom
    @myjcom Куратор тега C++
    Нужно добавить предварительное объявление или определить функцию до её первого использования.

    void screen_function(); // объявление
    // ...
    void loop(){
       screen_function(); // первое использование
    }
    // ...
    
    void screen_function()
    {
    // ... определение
    }
    Ответ написан
    1 комментарий
  • Как протестировать с помощью gtest функцию main(argc, argv[])?

    myjcom
    @myjcom Куратор тега C++
    Lo-st,
    Начало -> на примере VS
    https://docs.microsoft.com/ru-ru/visualstudio/test...

    Тестировать сразу функцию main в зависимости от входных параметров argc и argv.

    не совсем понятно что такое тестировать функцию main? Но вот пример из документации
    https://github.com/google/googletest/blob/master/g...
    Ответ написан
    4 комментария