Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2021, 08:37   #1
Artur221
Пользователь
 
Регистрация: 18.03.2021
Сообщений: 26
По умолчанию Обьясните пожалуйста что делает код

Обьясните пожалуйста что делает код, по строкам
Код:
#include 
#include 
#include 
#include 
#include 
 
using namespace std;
 
int main()
{
    uint64_t x; //на всякий случай 64
    vector v;
 
    while ( cin >> x ) {
        v.clear();
 
        for (uint64_t t = x; t; t /= 10)
            v.push_back(t % 10);
 
        auto it = v.crbegin();
        for (; it != v.crend(); ++it)
            if ( any_of( it + 1, v.crend(), bind2nd( less(), *it ) ) )
                break;
        if (it == v.crend()) cout << "OK: " << x << endl;
    }
    return 0;
}
Artur221 вне форума Ответить с цитированием
Старый 31.10.2021, 09:35   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Artur221, ничего не делает, синтаксические ошибки
Алексей1153 вне форума Ответить с цитированием
Старый 31.10.2021, 09:53   #3
Artur221
Пользователь
 
Регистрация: 18.03.2021
Сообщений: 26
По умолчанию

Алексей1153, он работает,из строки,где словом считается последовательность цифр, показывает слова,в которых цифры идут по возрастанию

библиотеки почему-то не скопировались просто
Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdint>

using namespace std;

int main()
{
    int x;
    vector<int> v;

    while (cin >> x) {
        v.clear();

        for (int t = x; t; t /= 10)
            v.push_back(t % 10);

        auto it = v.crbegin();
        for (; it != v.crend(); ++it)
            if (any_of(it + 1, v.crend(), bind2nd(less<int>(), *it)))
                break;
        if (it == v.crend()) cout << "OK: " << x << endl;
    }
    return 0;
}

Последний раз редактировалось Artur221; 31.10.2021 в 09:57.
Artur221 вне форума Ответить с цитированием
Старый 02.11.2021, 07:32   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Artur221, это не библиотеки, а заголовочные файлы


std::bind и std::bind2nd пользоваться не рекомендуется, поскольку они сильно снижают читаемость. Вместо них удобнее использовать лямбды

вот я переписал код в более читаемом виде

Код:
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    int x{};
    while (std::cin >> x)
    {
        std::vector<int> v;

        //введённое число раскладываем на цифры в виде массива
        //(младший разряд - младший индекс)
        for (int t = x; t; t /= 10)
        {
            v.push_back(t % 10);
        }
        //распечатываем массив
        for(auto i:v)std::cout<<i<<',';
        std::cout<<'\n';

        //для каждого элемента массива проверяем,
        //что все последующие элементы - больше
        bool wrong{};
        for (auto it = v.crbegin(); it != v.crend(); ++it)
        {
            if (std::any_of(it + 1, v.crend(), [l=*it](auto& r){return l<r;}))
            {
                //обнаружен неправильный порядок
                wrong=true;
                break;
            }
        }
        
        if(wrong)
        {
            std::cout << "not OK: " << '\n';
        }
        else
        {
            std::cout << "OK: " << '\n';
        }
        
        std::cout << '\n';
    }
    return 0;
}

Последний раз редактировалось Алексей1153; 02.11.2021 в 07:42.
Алексей1153 вне форума Ответить с цитированием
Старый 02.11.2021, 21:49   #5
Artur221
Пользователь
 
Регистрация: 18.03.2021
Сообщений: 26
По умолчанию

Алексей1153, спасибо большое за ответ!а как к проверке на возрастание добавить еще и проверку на четность?
Artur221 вне форума Ответить с цитированием
Старый 02.11.2021, 22:30   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Использовать оператор
Код:
if( (i % 2) == 0)
https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B
digitalis вне форума Ответить с цитированием
Старый 03.11.2021, 08:07   #7
Artur221
Пользователь
 
Регистрация: 18.03.2021
Сообщений: 26
По умолчанию

Алексей1153, ,а для чего нужна это условие "return l<r" если переменная r всегда равна 0?
Artur221 вне форума Ответить с цитированием
Старый 03.11.2021, 08:53   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Artur221, с чего вдруг она всегда равна 0 ?

Цитата:
if (std::any_of(it + 1, v.crend(), [l=*it](auto& r){std::cout<<"r=="<<r<<'\n'; return l<r;}))
вывод:
Код:
54321
1,2,3,4,5,
r==4
r==3
r==2
r==1
r==3
r==2
r==1
r==2
r==1
r==1
OK:
l - это текущее захваченное лямбдой левое значение, r - итерируемое правое (все более старшие элементы массива)


кстати, я не обратил внимание, что в цикле crbegin и crend
так что коментарий
Цитата:
//что все последующие элементы - больше
следует понимать наоборот - все предыдущие )


-------------
вообще, такой велосипед обычно нет нужды делать, так как есть std::is_sorted

Последний раз редактировалось Алексей1153; 03.11.2021 в 08:57.
Алексей1153 вне форума Ответить с цитированием
Старый 04.11.2021, 14:56   #9
Artur221
Пользователь
 
Регистрация: 18.03.2021
Сообщений: 26
По умолчанию

Алексей1153, не подскажите,как сделать так,чтобы в вашем коде входная строка с последовательностью цифр уже была записана в файле,и ее не нужно было вводить в консоли,а выходные данные сохранялись в файле?
Artur221 вне форума Ответить с цитированием
Старый 04.11.2021, 15:13   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Artur221, если очень по простому, то примерно так https://onlinegdb.com/n6nP3ZxMn

Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <fstream>

int main()
{
    std::vector<int> v;
    {
        std::ifstream file{"input.txt"};
        if(int x{}; file>>x)
        {
            //введённое число раскладываем на цифры в виде массива
            //(младший разряд младший индекс)
            for(int t = x; t; t /= 10)
            {
                v.push_back(t % 10);
            }
        }
    }
        
    //сюда будет производиться вывод
    std::stringstream ss;
    
    //распечатываем массив
    for(auto i:v)ss<<i<<',';
    ss<<'\n';

    //для каждого элемента массива проверяем,
    //что все последующие элементы - больше
    bool wrong{};
    for (auto it = v.crbegin(); it != v.crend(); ++it)
    {
        if (std::any_of(it + 1, v.crend(), [&ss,l=*it](auto& r){ss<<"r=="<<r<<'\n'; return l<r;}))
        {
            //обнаружен неправильный порядок
            wrong=true;
            break;
        }
    }

    if(wrong)
    {
        ss << "not OK: " << '\n';
    }
    else
    {
        ss << "OK: " << '\n';
    }
    ss << '\n';

    //вывод в консоль и в файл
    std::cout<<ss.str();
    std::ofstream{"output.txt"}<<ss.str();
        
    return 0;
}
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните, что делает этот код и напишите, пожалуйста, несколько комментариев narekkg Помощь студентам 0 12.06.2015 18:07
Что это ? Что и как делает этот код? Dimka-novitsek Общие вопросы C/C++ 1 03.05.2015 01:57
Обьясните пожалуста как и что делает эта программа и почему она это делает. Dimka-novitsek Общие вопросы C/C++ 7 16.10.2013 12:02
Обьясните, что делает это программа??? ~Леди~ Общие вопросы Delphi 2 05.04.2011 10:47
Подскажите пожалуйста что делает этот код SlashMan JavaScript, Ajax 3 10.01.2010 22:41