Опровержение мудреца. Анализируем предложенный алгоритм
Цель работы: Написать развлекательно-обучающую публикацию по языку программирования 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.
Автор: Вячеслав