Ответы пользователя по тегу C++
  • Почему printf не выводит переменные?

    myjcom
    @myjcom Куратор тега C++
    Почему printf не выводит переменные?

    printf("%s", "Znachenie", &p);
    int printf( const char* format, ... );

    выводит %s writes a character string которую вы передаете аргументом "Znachenie"
    %f converts floating-point number to the decimal notation которое вы передаете аргументом p
    printf("%s %f", "Znachenie", p);

    но так не совсем удобно
    вот так проще
    printf("Znachenie %f", p);

    оператор address-of перед именем переменной не нужен.
    Ответ написан
    Комментировать
  • Как решать задачу?

    myjcom
    @myjcom Куратор тега C++
    Собственно
    отсюда

    #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    auto fx = [](int x){
      int r = 0;
      switch(x % 3)
      {
        case 0:
          r = x * x;
          break;
        case 1:
          r = x;
          break;
        default:
          r = x / 3;
          break;
      }
      return r;
    };
    
    auto calculate = [](const vector<int>& vx, auto fx){
      vector<int> calcValues(vx.size());
      transform(vx.begin(), vx.end(), calcValues.begin(), fx);
      return calcValues;
    };
    
    int main()
    {
      cout << "Введи кол-во чисел: ";
      int n = 0;
      cin >> n;
    
      cout << "Введи через пробел " << n << " натуральных чисел:\n" << "$: ";
      vector<int> values(n);
      copy_n(istream_iterator<int>(cin), n, values.begin());
    
      cout << "Результат твоих расчетов:\n";
      copy_n(calculate(values, fx).begin(), n, ostream_iterator<int>(cout, "\n"));
    }


    тебе нужна только fx в остальное можешь не погружаться, кроме того что
    Даны натуральные числа

    https://ru.wikipedia.org/wiki/Натуральное_число --> unsigned
    Ответ написан
    Комментировать
  • Как посчитать количество пара в set?

    myjcom
    @myjcom Куратор тега C++
    Попробую угадать.
    Если нужно считать это значит что может быть больше одного.
    Если больше одного в данном случае (set) то это multiset.
    Вы же count используете не для проверки наличия элемента во множестве?
    #include <iostream>
    #include <set>
    #include <utility>
    #include <string>
    using namespace std;
    
    int main()
    {
      multiset<pair<string, string>> pss{
        {"one", "one"}, {"two", "two"}, {"two", "two"},
        {"three", "three"}, {"three", "three"}, {"three", "three"}
      };
    
      auto cnt = pss.count({"three", "three"});
    
      cout << R"(pss.count({"three", "three"}))" << " == " << cnt << endl;
    }
    Ответ написан
    Комментировать
  • Как считать вторую строку?

    myjcom
    @myjcom Куратор тега C++
    Но не таким способом

    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <vector>
    using namespace std;
    
    int main()
    {
      size_t n = 4;
      string s = "42 54 35 76";
      
      istringstream is(s);
      
      vector<int> v;
      copy_n(istream_iterator<int>(is), n, back_inserter(v));
    
      /*******
      ** vector<int> v2(n);
      ** copy_n(istream_iterator<int>(is), n, v.begin());
      *******/
      copy_n(v.begin(), n, ostream_iterator<int>(cout, " "));
    }

    Ответ написан
    Комментировать
  • Как сохранить в памяти и суммировать в число определенную в байтах массу файлов а затем использовать результат?

    myjcom
    @myjcom Куратор тега C++
    https://en.cppreference.com/w/cpp/filesystem
    Если доступен С++17
    #include<iostream>
    #include<filesystem>
    #include<string>
    using namespace std;
    namespace fs = filesystem;
    
    auto getDirectorySize(const fs::path& p)
    {
      uintmax_t size = 0;
      if(fs::is_directory(p))
      {
        for(const auto& f : fs::directory_iterator(p))
        {
          size += f.file_size();
        }
      }
      return size;
    }
    
    int main()
    {
      string directory{ "C:\\TEMP" };
      fs::path dp{ directory };
      
      auto size{ getDirectorySize(dp) };
      cout << "size of "  << directory 
           << " "         << size 
           << " bytes"    << endl;
    }

    Или

    #include<iostream>
    #include<fstream>
    #include<string>
    #include<vector>
    using namespace std;
    
    size_t getFileSize(const string& filename)
    {
      ifstream ifs(filename);
      size_t size = 0;
      if(ifs)
      {
        ifs.seekg(0, ios_base::end);
        size = ifs.tellg();
      }
      return size;
    }
    
    int main()
    {
      vector<string> filenames{
        "C:\\TEMP\\aaa.txt", "C:\\TEMP\\bbb.txt", "C:\\TEMP\\ccc.txt"
      };
    
      size_t size = 0;
    
      for(const string& fn : filenames)
      {
        size += getFileSize(fn);
      }
    
      cout << "Size: " << size << endl;
    }

    Ответ написан
    7 комментариев
  • Как в Arduino развернуть данные?

    myjcom
    @myjcom Куратор тега C++
    развернуть

    Как-то так

    // LEFT --> [127 ... 0] --> [32 ... 4095]
    // 
    // RIGHT --> [129 ... 255] --> [32 ... 4095]
    
    int calc_speed(int value)
    {
      int speed = 0; // для наглядности без ? :
      if(value > 128)
      {
        speed = 4095 / 127 * (value - 128);
      }
      else
      {
        speed = 4095 / 127 * (128 - value);
      }
      return speed;
    }
    
    void drive_forward(int speed)
    {
      MSS.analogWrite(15, 0);
      MSS.analogWrite(14, speed);                                
    }
    
    void drive_backward(int speed)
    {
      MSS.analogWrite(14, 0);                             
      MSS.analogWrite(15, speed);
    }
    
    void stop()
    {
      MSS.analogWrite(14, 0);                             
      MSS.analogWrite(15, 0);
    }
    
    void move()
    {
      int ds = ps2x.Analog(PSS_LX);
      
      if(ds > 128)
      {
        drive_forward(calc_speed(ds));
      }
      else if(ds < 128)
      {
        drive_backward(calc_speed(ds));
      }
      else
      {
        stop();
      }
    }
    Ответ написан
    Комментировать
  • Stl c++ min elem?

    myjcom
    @myjcom Куратор тега C++
    гуглил, что-то не выходит понять

    https://en.cppreference.com/w/cpp/algorithm/min_element

    но почему она не возвращает значения сразу , а только в конце? каким образом происходит сравнение?

    min_element
    template<class ForwardIt, class Compare>
    ForwardIt min_element(ForwardIt first, ForwardIt last, Compare comp)
    {
        if (first == last) return last;
     
        ForwardIt smallest = first;
        ++first;
        for (; first != last; ++first) { // не возвращает значения сразу
            if (comp(*first, *smallest)) { //  каким образом происходит сравнение
                smallest = first;
            }
        }
        return smallest; // а только в конце
    }


    написал код чтобы легче было ориентироваться

    https://ru.cppreference.com/w/cpp/numeric/math/abs
    #include<cmath>
    // ...
    
    int result = *min_element(array.begin(), array.end(), [](int a, int b) { return abs(a) < abs(b); });
    
    // ...
    Ответ написан
    Комментировать
  • Проверка на числовой ввод. Как работает код?

    myjcom
    @myjcom Куратор тега C++
    while (!(cin >> x) or cin.get() != '\n')
    пока( не (прочитать из буфера ввода целое) или прочитанный из буфера символ не равен '\n')

    не понимаю как работает второй while.

    while (cin.get() != '\n');
    так же.
    пока(прочитанный из буфера символ не равен '\n') nop


    Так получше будет
    string s;
    getline(cin, s);
    istringstream is(s);
    while(is >> s)
    {
      int i = 0;
      try
      {
        i = stoi(s);
      }
      catch(exception& e)
      {
        cout << "Ошибка: " << e.what() << " " << s << "\n";
        continue;
      }
      cout << "i == " << i << "\n";
    }
    Ответ написан
    4 комментария
  • Как считывать построчно данные из буфера?

    myjcom
    @myjcom Куратор тега C++
    string msg = "Съешь ещё этих мягких французских булок";
      ostringstream os;
      os << "Съешь ещё этих мягких французских булок\n"
         << "Съешь ещё этих мягких французских булок\n"
         << "Съешь ещё этих м"
         << "ягких французских булок\n"
         << "Съешь ещё этих мягких французских булок\n";
    
      istringstream is(os.str());
    
      string line;
     
      while(is)
      {
        getline(is, line);
        if(is.fail())
        {
          os.str("");
          os << line;
          break;
        }
        cout << "line: " << line << "\n";
      }
    Ответ написан
  • Как найти у, заданную параметрически?

    myjcom
    @myjcom Куратор тега C++
    "приравниваю" - это очень плохая терминология.
    Есть объявление и инициализация, есть присвоение. Что такое обнулил/занулил/приравнял непонятно.

    init-declarator-list - comma-separated list of declarators with optional initializers. запятая разделитель.

    comma operator a, b - evaluate expression a, disregard its return value and complete any side-effects, then evaluate expression b, returning the type and the result of this evaluation запятая оператор.

    запятая в объявлении переменных несет только синтаксическую функцию разделителя.

    перед компиляцией это
    float i, a, x = 0;
    будет развернуто в это
    float i;
    float a;
    float x = 0;


    Подскажите пожалуйста, где я ошибаюсь..

    даже если предположить что i == 0.0 и a == 0.0
    float y = ((i + x) / (2.5 * i + pow(x, i)) ) + a * pow(sin(x), i + 1);

    что получается?
    float y = x / 1;

    это бессмысленно, предположу учитывая параметрическое задание ф-ции и график, что тут должен быть цикл.
    Ответ написан
    Комментировать
  • Как на C++ дергать логи из syslog?

    myjcom
    @myjcom Куратор тега C++
    Oct  2 23:39:48 dvrh systemd-resolved[562]: Server returned er....

    для такого вида примитив.
    только по времени.

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sys/utsname.h>
    
    std::string getTimestamp(const std::string& line)
    {
      auto pos = line.rfind(' ');
      return line.substr(pos + 1, line.size() - pos);
    }
    
    int main(int argc, char* argv[])
    {
      if(argc < 3)
      {
        std::cerr << "usage: file timestamp timestamp\n/var/log/syslog 11:00:00 12:00:00\n";
        exit(EXIT_FAILURE);
      }
    
      struct utsname uts;
    
      if(uname(&uts) == -1)
      {
        exit(EXIT_FAILURE);
      }
    
      if(std::ifstream flog(argv[1]); flog)
      {
        std::string start{argv[2]};
        std::string stop {argv[3]};
        std::string line;
    
        while(getline(flog, line))
        {
          std::string header = getTimestamp(line.substr(0, line.find(uts.nodename) - 1));
          if(header >= start && header <= stop)
          {
            std::cout << line << "\n";
          }
        }
      }
      else
      {
        std::cerr << "Cannot open file: " << argv[1];
      }
    }


    если еще и с датой - чуть больше.
    Ответ написан
    Комментировать
  • Mysql и Сокеты c++?

    myjcom
    @myjcom Куратор тега C++
    Proshka17,
    Я так понимаю такая функция есть в MySQL.h

    нет не так

    там https://dev.mysql.com/doc/dev/mysql-server/latest/...
    #ifdef WIN32_LEAN_AND_MEAN
     #include <winsock2.h>
    #endif

    при использовании
    WinSock2.h совместно с mysql.h
    получается два определения
    accept(int, int, int)

    чтобы это пофиксить не надо дополнительно включать WinSock2.h
    или
    #include<WinSock2.h>
    #include<WS2tcpip.h>
    #undef WIN32_LEAN_AND_MEAN
    #include "MySQL.h"
    Ответ написан
    Комментировать
  • Как сделать чтобы string считывался?

    myjcom
    @myjcom Куратор тега C++
    dmitrysergeevich198, опять?
    Что здесь не правильно?

    Как сделать чтобы string считывался?

    Не могу понять почему не получается с помощью getline это сделать.

    getline(cin, specialisty); локальной переменной с именем specialisty нет.
    #include <string> // не "string.h" (Си) и не <cstring>
    // ... 
    getline(cin, mvd->specialisty);
    // ...
    Ответ написан
  • Как сделать двухмерный динамический массив в котором в одной ячейке может храниться несколько чисел?

    myjcom
    @myjcom Куратор тега C++
    #include <iostream>
    #include <vector>
    #include <tuple>
    using namespace std;
    
    int main()
    {
      vector<vector<tuple<int, int, int>>> values(3);
      values[0].emplace_back(1, 2, 3);
      values[1].emplace_back(4, 5, 6);
      values[2].emplace_back(7, 8, 9);
    
      for(const auto& xv : values)
      {
        for(const auto [one, two, three] : xv)
        {
          cout << one << " " << two << " " << three;
        }
        cout << "\n";
      }
      cin.get();
    }
    Ответ написан
    Комментировать
  • Где можно найти нормальный учебник по графам?

    myjcom
    @myjcom Куратор тега C++
    Касьянов В. Н., Евстигнеев В. А. - Графы в программировании: обработка, визуализация и применение
    Год выпуска: 2003
    Автор: В. Н. Касьянов, В. А. Евстигнеев
    Издательство: БХВ - Петербург
    ISBN: 5-94157-184-4
    Количество страниц: 1104

    P.S.

    Где я могу такое найти?

    там где весь мир ищет, если нет в библиотеке или магазине
    торренты уже 18 лет существуют.
    Ответ написан
    Комментировать
  • Что здесь не правильно?

    myjcom
    @myjcom Куратор тега C++
    Можно помочь с ответом, а не включать своё остроумие, подсказка небольшая.

    Больше не могу

    #include<iostream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<memory>
    #include<sstream>
    #include<Windows.h>
    using namespace std;
    
    enum class spType {ALL, SP, TH};
    
    class Policlinic
    {
    public:
      Policlinic();
      ~Policlinic();
      // ... 
      void addSpecialists(const string& s);
      void addTherapists(const string& s);
      void printPersonnel(spType = spType::ALL);
      // ...
      // Геттеры Сеттеры сам по шаблону
      // ...
    private:
      struct Personnel;
      unique_ptr<Personnel> m_personnel;
    
      string desk;
      string type;
    
      unsigned pharmacy = 0;
    
      friend istream& operator>>(istream& is, vector<string>& values);
      friend ostream& operator<<(ostream& os, const vector<string>& values);
    };
    
    struct Policlinic::Personnel
    {
      vector<string> specialists;
      vector<string> therapists;
    };
    
    Policlinic::Policlinic() : m_personnel(make_unique<Personnel>())
    {
    }
    
    Policlinic::~Policlinic()
    {
    }
    
    istream& operator>>(istream& is, vector<string>& values)
    {
      copy(istream_iterator<string>{is}, {}, back_inserter(values));
      return is;
    }
    
    ostream& operator<<(ostream& os, const vector<string>& values)
    {
      copy(values.begin(), values.end(), ostream_iterator<string>{os, "\n"});
      return os;
    }
    
    void Policlinic::addSpecialists(const string& s)
    {
      istringstream is(s);
      is >> m_personnel->specialists;
    }
    
    void Policlinic::addTherapists(const string& s)
    {
      istringstream is(s);
      is >> m_personnel->therapists;
    }
    
    void Policlinic::printPersonnel(spType stype)
    {
      switch(stype)
      {
      case spType::SP:
        cout << "Специалисты:\n"
             << m_personnel->specialists;
        break;
    
      case spType::TH:
        cout << "Терапевты:\n" 
             << m_personnel->therapists;
        break;
    
      default:
        cout << "[Весь персонал]\n";
             printPersonnel(spType::SP);
             printPersonnel(spType::TH);
        break;
      }
    }
    
    int main()
    {
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      setlocale(LC_ALL, "ru");
    
      Policlinic ply;
    
      // Для простоты
      string value;
      
      cout << "Введите врачей специалистов через пробел \n$: ";
      getline(cin, value);
      ply.addSpecialists(value);
      
      cout << "\nВведите врачей терапевтов через пробел\n$: ";
      getline(cin, value);
      ply.addTherapists(value);
     
      ply.printPersonnel(spType::ALL);
    
      system("pause");
    }

    Ответ написан
    1 комментарий
  • Как в цикле удалить минимальный элемент вектора?

    myjcom
    @myjcom Куратор тега C++
    Из описания

    #include<iostream>
    #include<vector>
    #include<iterator>
    #include<algorithm>
    #include<fstream>
    #include<numeric>
    using namespace std;
    
    int get_min_even(const vector<int>& numbers)
    {
      vector<int> result;
      copy_if(numbers.cbegin(), numbers.cend(), 
              back_inserter(result), [](const int i){ return !(i % 2); });
      return *min_element(result.cbegin(), result.cend());
    }
    
    int main()
    {
      vector<int> numbers;
    
      ios_base::sync_with_stdio(false);
    
      if(ifstream in("D:\\numbers_in.txt"); in)
      {
        copy(istream_iterator<int>{in}, {}, back_inserter(numbers));
      }
    
      if(ofstream out("D:\\numbers_out.txt"); out)
      {
        out << get_min_even(numbers);
      }
    
      int count = numbers.size() - 2; // предположим 10
      
      for(int i = 0; i < count; ++i)
      {
        // вставка в начало вектора это BAD.
        numbers.push_back(accumulate(numbers.cbegin(), numbers.cend(), 0)); 
        numbers.erase(remove(numbers.begin(), numbers.end(), *min_element(numbers.begin(), numbers.end())));
      }
    
      // Это потому что вставляли в конец, теперь нужно перевернуть.
      reverse(numbers.begin(), numbers.end()); 
      // маленький костыль
      swap(numbers[count], numbers[count + 1]); 
    
      if(ofstream out("D:\\numbers_result_out.txt"); out)
      {
        copy(numbers.cbegin(), numbers.cend(), ostream_iterator<int>{out, "\n"});
      }
     
      cout << "Ok" << endl;
      cin.get();
    }

    Ответ написан
    Комментировать
  • Как сделать ввод элементов в динамический массив в классе?

    myjcom
    @myjcom Куратор тега C++
    Константин Подыганов,
    У меня при вводе ограничивается ввод до 5-ти символов, а я хочу ввести любое число, любого количества

    Допишешь сам?
    #include<iterator>
    #include<iostream>
    #include<algorithm>
    #include<memory>
    using namespace std;
    
    class Decmal
    {
    public:
      explicit Decmal(size_t size = 5);
      Decmal(const Decmal&);
      size_t get_size() const
      {
        return size;
      }
      // ...
    private:
      size_t size;
      unique_ptr<char> data;
      // ...
    private:
      void resize(size_t sz);
      friend istream& operator>>(istream& is, Decmal& dec);
      friend ostream& operator<<(ostream& os, const Decmal& dec);
    };
    
    Decmal::Decmal(size_t size) : size{ size }, data(new char[size])
    {
      fill_n(data.get(), size, '0');
    }
    
    Decmal::Decmal(const Decmal& rh)
    {
      size = rh.size;
      data.reset(new char[size]);
      copy_n(rh.data.get(), size, data.get());
    }
    
    void Decmal::resize(size_t new_size)
    {
      if(size < new_size)
      {
        data.reset(new char[new_size]);
        size = new_size;
      }
    }
    
    istream& operator>>(istream& is, Decmal& dec)
    {
      is.putback(is.get());
      size_t new_size = static_cast<size_t>(is.rdbuf()->in_avail() - 1);
    
      dec.resize(new_size);
    
      copy_n(istream_iterator<char>{is}, dec.size, dec.data.get());
      return is;
    }
    
    ostream& operator<<(ostream& os, const Decmal& dec)
    {
      copy_n(dec.data.get(), dec.size, ostream_iterator<char>{os});
      return os;
    }
    
    int main()
    {
      Decmal x;
    
      cin >> x;
    
      cout << x.get_size() << " " << x << endl;
    
      system("pause");
    }

    Константин Подыганов
    Не совсем понял принцип работы этого кода.

    Без всего

    #include<iterator>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    class Decmal
    {
    public:
      explicit Decmal(size_t size = 5);
      Decmal(const Decmal&);
      ~Decmal(){ delete[] data; }
    
      size_t get_size() const
      {
        return size;
      }
      // ...
    private:
      size_t size;
      unsigned char* data = nullptr;
      // ...
    private:
      void resize(size_t sz);
      friend istream& operator>>(istream& is, Decmal& dec);
      friend ostream& operator<<(ostream& os, const Decmal& dec);
    };
    
    Decmal::Decmal(size_t size) : size{ size }, data(new unsigned char[size])
    {
      fill_n(data, size, '0');
    }
    
    Decmal::Decmal(const Decmal& rh)
    {
      size = rh.size;
      delete[] data;
    
      data = new unsigned char[size];
    
      copy_n(rh.data, size, data);
    }
    
    void Decmal::resize(size_t new_size)
    {
      if(size < new_size)
      {
        delete[] data;
        data = new unsigned char[new_size];
        size = new_size;
      }
    }
    
    istream& operator>>(istream& is, Decmal& dec)
    {
      char c = 0;
      size_t sz = 0;
    
      while(is.read(&c, 1) && c != '\n') // \n == 10 \r == 13
      {
        if(sz == dec.size)
        {
          unsigned char* tmp = new unsigned char[sz + 1];
          copy_n(dec.data, dec.size, tmp);
          dec.resize(sz + 1);
          copy_n(tmp, dec.size, dec.data);
          delete[] tmp;
        }
        dec.data[sz] = c;
        ++sz;
      }
    
      return is;
    }
    
    ostream & operator<<(ostream& os, const Decmal& dec)
    {
      copy_n(dec.data, dec.size, ostream_iterator<char>{os});
      return os;
    }
    
    int main()
    {
      Decmal x;
    
      cin >> x;
    
      cout << x.get_size() << " " << x << "\n";
    
      Decmal y = x;
    
      cout << y << endl;
    
      system("pause");
    }

    Ответ написан
    7 комментариев
  • Как сделать QGraphicsItem, который может быть и картинкой, и текстом?

    myjcom
    @myjcom Куратор тега C++
    QLabel может "быть" или картинкой, или текстом
    https://forum.qt.io/topic/82420/show-picture-using...
    Ответ написан
    Комментировать