Задача
Даны действительные числа [latex]x,y[/latex] [latex](x\neq y)[/latex]. Меньшее из этих двух чисел заменить их полусуммой, а большее — их удвоенным произведением.
Тесты
Было дано | Стало после проверки | Комментарий | ||
x | y | x | y | |
38.76 | -24.33 | -1886.0615999 | 7.215 | Пройден |
11.346 | 23.228 | 17.287 | 527.0898 | Пройден |
-2444.2 | 1231.444 | -606.378 | -6019790.8496 | Пройден |
767.2 | -1455.24 | -2232920.256 | -344.02 | Пройден |
0 | 213.4 | 106.7 | 0 | Пройден |
1111 | 0 | 0 | 555.5 | Пройден |
123.4 | 123.4 | Ничего не выйдет, х=у | Не пройден | |
0 | 0 | Ничего не выйдет, х=у | Не пройден |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <iostream> #include <math.h> int main() { double x,y,div,mult;//Описание переменных для хранения входных данных.// scanf("%lf%lf", &x, &y); //Чтение из стандартного потока ввода.// if (x!=y) //Первый критерий отбора данных// { printf("Дано: \nx=%lf y=%lf \n",x,y);//Вывод начальных переменных// div=(x+y)/2; //Заранее вычисляем значения конечных переменных. mult=2*x*y; if (x<y) //Второй критерий отбора данных// { x=div; y=mult; } else { y=div;//Формулы подсчета новых переменных, неудовлетворяющих критерию 2// x=mult; } printf("После проверки стало: \nx=%4.4lf y=%4.4lf.",x,y); //Вывод измененных переменных (самого результата).// } else { printf("Ничего не выйдет, х=у"); //Вывод оповещения о неправильном вводе данных (при несоответствии первому критерию). } return 0; } |
Для получения ответа переменной необходимо преодолеть критерий [latex](x\neq y)[/latex].
Если же [latex](x\neq y)[/latex], то программа сравнивает сами переменные. Тут может быть два случая:
- Если [latex]x>y[/latex], то начальные значения переменных мы должны изменить на [latex]x=\frac{x+y}{2}[/latex], a [latex]y=2*x*y[/latex].
- Если [latex]y>x[/latex], то начальные значения переменных мы должны изменить на [latex]y=\frac{x+y}{2}[/latex], a [latex]x=2*x*y[/latex].
Программа вначале высчитывает конечные х и у по формулам и при выполнении условий просто присваивает переменным значения. Тем самым мы упрощаем программу (т.к. расчет значений идет только один раз вместо двух).
Второй вариант решения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> void swap(double &x,double &y) //Описываем функцию, которая присваивает конечные значения х и у { double tmp=(x+y)/2; //Описываем воспомогательную переменную, для присываивания значений x=2*x*y; //Присваивание значений. y=tmp; } int main() { double x,y;//Описание переменных для хранения входных данных.// scanf("%lf%lf", &x, &y); //Чтение из стандартного потока ввода.// if (x!=y) //Первый критерий отбора данных// { printf("Дано: \nx=%lf y=%lf \n",x,y); //Вывод начальных переменных// x>y?swap(x,y):swap(y,x); //Условный оператор, проверяющий какая переменная больше. printf("После проверки стало: \nx=%.3lf у=%.3lf",x,y);//Вывод измененных переменных (самого результата).// } else { printf("Ничего не выйдет, х=у"); //Вывод оповещения о неправильном вводе данных (при несоответствии первому критерию). } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import java.util.*; import java.lang.*; import java.io.*; class Numbers { public static void main (String[] args) throws java.lang.Exception { double div, mult;//Описание переменных для хранения входных данных.// Scanner in = new Scanner(System.in); //Чтение из стандартного потока ввода.// double x = in.nextDouble(); double y = in.nextDouble(); if (x != y) //Первый критерий отбора данных// { System.out.println("Дано: x = " + x + " y = " + y);//Вывод начальных переменных// div = (x + y) / 2; //Заранее вычисляем значения конечных переменных. mult = 2 * x * y; if (x < y) //Второй критерий отбора данных// { x = div; y = mult; } else { y = div;//Формулы подсчета новых переменных, неудовлетворяющих критерию 2// x = mult; } System.out.printf("После проверки стало: x = " + x + " y = " + y); //Вывод измененных переменных (самого результата).// } else { System.out.printf("Ничего не выйдет, х=у"); //Вывод оповещения о неправильном вводе данных (при несоответствии первому критерию). } } } |
— x, y это не метки. А вот «меньшее», «большее» «заменить» могут ими быть.
— Все формулы кодируются дважды. Это создаёт высокую вероятность ошибки и считается неприемлемым. В таких случаях удобно использовать адреса. Т.е. работать с предварительно вычисленными адресами меньшего и большего элементов — «положить по адресу наименьшего», «положить по адресу наибольшего».
Т.е. решение может быть зачтено и без переделок, но не на 10.
Все исправил, добавил второе решение.
Принято. Но я не имел в виду использование функций: