Опровержение мудреца. Анализируем предложенный алгоритм

в 20:51, , рубрики: java, java 8, javase

Опровержение мудреца. Анализируем предложенный алгоритм

Цель работы: Написать развлекательно-обучающую публикацию по языку программирования java.

Публикация предназначена для начинающих программистов. Для тех, кто только начинает изучать язык программирования Java. Однако для понимания и выполнения материала предполагается, что читатель уже знаком с синтаксисом языка, с типами переменных, с областью видимости переменных, с классами и методами, с работой со строками.

В настоящее время в социальных сетях довольно часто встречается такой мем.

Опровержение мудреца. Анализируем предложенный алгоритм - 1
рис 1.

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

Зная язык java мы можем с легкостью проверить все частные случаи.
Мы можем выяснить в каких случаях алгоритм работает правильно и в каких такой алгоритм не выполняется.
Мы с вами спроектируем и напишем программу для вывода всех утверждений для двузначных чисел.
Посчитаем количество правильных и не верных утверждений.
Мы не будем сильно заморачиваться с наследованием и интерфейсами. Спроектируем и реализуем класс,
в котором будет выполняться работа по проверке и подсчету. Сформулируем цель нашей работы.

Цель работы: Спроектировать и реализовать класс, который проверит приведенный выше алгоритм.
Класс будет выводить все двузначные числа для которых алгоритм выполняется правильно
и все двузначные числа, для которых алгоритм выполняется неправильно.
Мы также посчитаем количество правильных и количество неправильных ответов.

Назовем наш класс «опровержение мудреца» («denial of the sage») — DenialOfTheSage.
Расположим наш класс в пакете «denialOfTheSage01».

/*
 * Опровержение мудреца
 */
package denialOfTheSage01;

/**
 *
 * @author  
 */
public class DenialOfTheSage {

    public static void main(String[] args) {

    }
}

Нам понадобятся переменные для подсчета количества правильных ответов и для подсчета количества неправильных ответов алгоритма. Назовем наши переменные countSageIsRight и countSageIsWrong. Выберем тип переменных int. Переменные целого типа.

int countSageIsRight = 0; // количество правильных ответов
int countSageIsWrong = 0; // количество неправильных ответов

Введем еще одну переменную которая будет показывать общее количество ответов.
Назовем переменную countAnswer.

int countAnswer = 0; // общее количество ответов

Мы присвоили переменным значение 0, потому как в самом начале ответов никаких нет.
Для обозначение первого и второго двузначного числа мы будем использовать переменные x и y.

int x,y; // первое и второе двузначное число, которое мы используем

Для вывода чисел и для нашего удобства напишем метод вывода переменных x и y.
Назовем наш метод — showXY:

public static void showXY(int x, int y) {
        System.out.print("для x = " + x + "  y = " + y + " ");
    }

Напишем два метода для вывода ошибается наш «мудрец» или нет в каком-то конкретном случае.

public static void showSageIsTrue() {
        System.out.println("Правда!");
    }
 
    public static void showSageIsFalse() {
        System.out.println("Неправда!");
    }

В программе нам нужно перебрать все двузначные числа от десяти до 99-ти включительно.
Закрытый интервал: [10,99]. Напишем цикл в котором будем перебирать наши двузначные числа.

for (x = 10; x <= 99; x++) { //перебираем x цикле от 10 до 99 включительно
            for (y = 10; y <= 99; y++) { //перебираем y цикле от 10 до 99 включительно
                countAnswer++;
                System.out.print(countAnswer + ".   "); //вывод номера ответа
                showXY(x, y); // вывод на экран для x =  y =
                if (x * y == result(x, y)) {
                    showSageIsTrue(); // выводим "Правда"
                    countSageIsRight++; // увеличиваем счетчик "правды" на единицу
                } else {
                    showSageIsFalse(); // выводим "Неправда"
                    countSageIsWrong++;// увеличиваем счетчик "неправды" на единицу
                }
            }
        }
		

Размещаем его в методе main.

Напишем метод вычисления результата. Реализуем предложенный алгоритм.

  public static int result(int x, int y) {// результат вычисления мудреца по предложенному алгоритму

        int minus_x = 100 - x;
        int minus_y = 100 - y;
        int plus = minus_x + minus_y;
        int hundr_minus_summ = 100 - plus;

        int begin = hundr_minus_summ; // начало числа
        int end = minus_x * minus_y; // окончание числа
        String strResult = String.valueOf(begin) + String.valueOf(end); // объединяем два числа в строке

        int result = Integer.parseInt(strResult);
        return result;
    }

В результате у нас получилась такая программа:


/*
 * Опровержение мудреца
 */
package denialOfTheSage01;

/**
 *
 * @author Ar20L80

 */
public class DenialOfTheSage {

    public static void main(String[] args) {
        int countSageIsRight = 0; // количество правильных ответов
        int countSageIsWrong = 0; // количество неправильных ответов
        int countAnswer = 0; // общее количество ответов
        int x, y; // первое и второе двузначное число, которое мы используем

        for (x = 10; x <= 99; x++) {
            for (y = 10; y <= 99; y++) {
                countAnswer++;
                System.out.print(countAnswer + ".   "); //вывод номера ответа
                showXY(x, y); // вывод на экран для x =  y =
                if (x * y == result(x, y)) {
                    showSageIsTrue(); // выводим "Правда"
                    countSageIsRight++; // увеличиваем счетчик "правды" на единицу
                } else {
                    showSageIsFalse(); // выводим "Неправда"
                    countSageIsWrong++;// увеличиваем счетчик "неправды" на единицу
                }
            }
        }

        System.out.println(); // перевод на новую строку
        System.out.println("Итог: ");
        System.out.println("Мудрец сказал правду " + countSageIsRight + " раз");
        System.out.println("Мудрец сказал неправду " + countSageIsWrong + " раз");
    }

    public static void showXY(int x, int y) { // метод вывода переменных x и y
        System.out.print("для x = " + x + "  y = " + y + " ");
    }

    public static void showSageIsTrue() { // вывод на экран "Правда!"
        System.out.println("Правда!");
    }

    public static void showSageIsFalse() {// вывод на экран "Неправда!"
        System.out.println("Неправда!");
    }

    public static int result(int x, int y) {// результат вычисления мудреца

        int minus_x = 100 - x;
        int minus_y = 100 - y;
        int plus = minus_x + minus_y;
        int hundr_minus_summ = 100 - plus;

        int begin = hundr_minus_summ; // начало числа
        int end = minus_x * minus_y; // окончание числа
        String strResult = String.valueOf(begin) + String.valueOf(end); // объединяем два числа в строке

        int result = Integer.parseInt(strResult); // переводим стоку в int
        return result;
    }

}

Вывод программы:

1.   для x = 10  y = 10 Неправда!
2.   для x = 10  y = 11 Неправда!
3.   для x = 10  y = 12 Неправда!
...
8100.   для x = 99  y = 99 Неправда!

Итог:

Мудрец сказал правду 513 раз
Мудрец сказал неправду 7587 раз

Вы можете самостоятельно улучшить код. К примеру в методе result(int x, int y) я использовал много лишних переменных. Рефакторинг это уже второе дело. Главное, что мы с вами получили на начальном этапе работающую программу. Мы увидели для каких двузначных чисел предложенный нам алгоритм выполняется правильно. Мы посчитали, что количество правильных ответов 513, количество неправильных ответов 7587.

Автор: Вячеслав

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js