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

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

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

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

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


рис 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.

Оставить комментарий