Рубрики
Без рубрики

Современная задача Cpp на мобильных устройствах – Наибольший общий делитель

Привет! Я Ксавье Жувено, и вот вторая часть длинной серии, посвященной современным вызовам C++…. С тегами android, cpp, java, mobile.

Привет! Я Ксавье Жувено, и вот вторая часть длинной серии о Современный вызов C++ . В этой статье я собираюсь объяснить, как я решил вторую проблему на C++ и как я интегрировал решение в проект Android.

Цель этой второй задачи проста. Мы должны вычислить наибольший общий делитель двух положительных целых чисел, заданных пользователем, и мы выводим его пользователю. Решение будет вычислено на C++, а интерфейс для получения пользовательского ввода и отображения результата будет обрабатываться с помощью Android Studio Framework.

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

Решение на C++

Реализовать алгоритм нахождения наибольшего общего делителя двух чисел непросто… это буквально дано стандартом! 😉 Действительно, в C++17 функция std::gcd делает именно это !

Итак, все, что нам нужно сделать, это включить заголовок « из std и использовать std::gcd функция.

Если вы используете более старую версию стандарта C++, то вам придется ее реализовать. Я могу порекомендовать вам этот пост Stack Exchange об этом, если хотите. 🙂

Пользовательский интерфейс на Android Studio

В отличие от реализации решения на C++, пользовательский интерфейс потребует некоторой работы. Действительно, мы хотим иметь возможность иметь в нашем приложении решение для нашей первой проблемы и для второй проблемы тоже.

Для достижения этой цели нам нужно будет сделать две вещи:

  • Добавьте новое действие, в котором будет отображена вторая проблема и вычислено решение
  • Добавьте кнопки, чтобы иметь возможность переходить от первой проблемы ко второй.

Новая деятельность для решения новой проблемы

Чтобы создать новое действие, все, что вам нужно сделать, это щелкнуть правой кнопкой мыши на архитектуре папки вашего приложения и перейти в Пустое действие , как показано ниже:

Затем укажите название вашего нового действия (я назвал свое Problem_2 ) и нажмите Готово , чтобы создать ваше новое действие.

Хорошо, но конкретно, что это значит? Прежде всего, если вы откроете файл Прежде всего, если вы откроете файл


Затем, если вы заглянете в свои файлы Java, должно быть, был создан новый файл с классом, названным в честь вашего нового действия. Это класс, в котором мы будем обрабатывать вводимые пользователем данные, чтобы передать их алгоритму C++, прежде чем отображать результат пользователю.

И, наконец, во вложенной папке layout ваших ресурсов вы можете увидеть, что добавлен новый xml. Этот xml-файл будет содержать все элементы, которые мы хотим отобразить на экране, когда пользователь посмотрит на вторую проблему.

Как и в первой проблеме ), все, что нам нужно, это EditText и TextView для получения пользовательского ввода и отображения решения пользователю, поэтому я рекомендую прочитать it ), если вы этого не сделали.

Увязка двух видов деятельности

Теперь, когда мы создали наше новое действие для нашей проблемы, нам нужно иметь возможность получить к нему доступ через наше приложение. Самый простой способ сделать это – создать кнопку в первом проблемном интерфейсе для перехода ко второму проблемному интерфейсу.

Чтобы сделать это, мы начнем с добавления обратного вызова, функции, которая будет вызываться кнопкой, в первом действии. Эта функция выглядит следующим образом:

public void goToNextProblem(View v)
{
    Intent intent = new Intent(this, Problem_2.class);
    startActivity(intent);
}

В этой функции мы создаем Intent и передаем ему класс нашего второго действия. Затем мы начинаем это упражнение. Довольно прямолинейно, не правда ли?! 🙂

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


Что здесь важно, так это то, что у нас есть поле android:onClick , заданное с нашим именем обратного вызова. Таким образом, когда пользователь нажмет на кнопку, это запустит нашу функцию.

Вы можете сделать то же самое во втором упражнении, чтобы иметь возможность вернуться к первому упражнению. И вуаля, у вас есть правильный пользовательский интерфейс для решения двух первых проблем. Все, что нам нужно сделать, это связать пользовательский интерфейс с алгоритмом C++.

Использование собственного кода C++

В этой части мы рассмотрим класс Java второго действия.

public native String Gcd(int i, int j);

private int extractNumberFromEditText(EditText et)
{
    assert et.getText().length() != 0 : "The EditText must not be empty";
    return Integer.parseInt(et.getText().toString());
}

private void computeAndDisplayResult()
{
    EditText et1 = findViewById(R.id.first_input_number);
    EditText et2 = findViewById(R.id.second_input_number);

    int firstNumber = extractNumberFromEditText(et1);
    int secondNumber = extractNumberFromEditText(et2);

    TextView tv = findViewById(R.id.result);
    tv.setText(getString(R.string.result_placeholder, Gcd(firstNumber, secondNumber)));
}

Если вы прочитали мой пост в блоге о решении первой проблемы , эта часть не приносит ничего нового. Сначала мы объявляем функцию Gcd , связанную в библиотеке C++. Затем у нас есть метод, который получает EditText с помощью пользовательского ввода, мы извлекаем из них входные данные, мы получаем TextView , где мы собираемся отобразить результат, мы вычисляем результат и отображаем его.

Но в отличие от первой проблемы, этот код находится в частной функции. Нет в EditText обратном вызове. Это происходит из-за одной важной вещи. Мы не можем вычислить алгоритм GCD, если есть только один пользователь ввода. Мы должны убедиться, что оба пользовательских ввода заполнены.

Итак, вот как выглядит обратный вызов:

EditText et = findViewById(R.id.first_input_number);
et.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        EditText et = findViewById(R.id.second_input_number);
        if(et.getText().length() == 0 || count == 0)
        {
            return;
        }
        computeAndDisplayResult();
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

Итак, для первого EditText , когда текст меняется, мы проверяем, является ли новый текст не пустым ( count ) и является вторым EditText не является пустым ( et.gettext().length() ).Если none пусто, мы вызываем нашу функцию для вычисления и отображения результата. Если один из них пуст, мы ничего не делаем, возвращаясь напрямую. Для второго EditText код аналогичен, только EditText изменение идентификаторов. 😉

Вывод

Итак, теперь у нас есть приложение, которое может решить первые две проблемы Современный вызов C++ и узнал что-то новое в Android Studio, что для этой проблемы было для меня реальной целью, поскольку алгоритм C++ уже интегрирован в стандарт C++.

Вы можете отметить, что решения, написанные в этом посте, включают не все источники для создания работающей программы, а только интересную часть источников для решения этой проблемы. Если вы хотите просмотреть программы от начала до конца, вы можете зайти на мой аккаунт GitHub , изучить полное решение, добавить комментарии или задать вопросы, если хотите, на платформе, на которой вы читаете эту статью, это также поможет мне улучшить качество моих статей.

Спасибо вам всем за чтение этой статьи, И до моей следующей статьи желаю вам отличного дня 😉

Интересные ссылки

Оригинал: “https://dev.to/10xlearner/the-modern-cpp-challenge-on-mobile-greatest-commont-divisor-1p58”