package com.example.hard_practice; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.*; public class MainActivity extends Activity { private EditText etArgument, etPrecision, etLower, etUpper, etStep; private TextView tvFormula, tvResult, tvReference, tvTable; private Button btnCalculate, btnReset, btnExit, btnSwitch; private TableLayout tlTable; private boolean mode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Инициализируем переменные, связывая их с элементами интерфейса etArgument = (EditText) findViewById(R.id.etArgument); etPrecision = (EditText) findViewById(R.id.etPrecision); etLower = (EditText) findViewById(R.id.etLower); etUpper = (EditText) findViewById(R.id.etUpper); etStep = (EditText) findViewById(R.id.etStep); tvFormula = (TextView) findViewById(R.id.tvFormula); tvResult = (TextView) findViewById(R.id.tvResult); tvReference = (TextView) findViewById(R.id.tvReference); tvTable = (TextView) findViewById(R.id.tvTable); btnCalculate = (Button) findViewById(R.id.btnCalculate); btnReset = (Button) findViewById(R.id.btnReset); btnSwitch = (Button) findViewById(R.id.btnSwitch); btnExit = (Button) findViewById(R.id.btnExit); tlTable = (TableLayout) findViewById(R.id.tlTable); // Устанавливаем формулу разложения в ряд Маклорена для arctg(x) tvFormula.setText("arctg(x) = x - x^3/3 + x^5/5 - x^7/7 + ..."); // Устанавливаем начальным режим ввода данных (способ 1) mode = false; switchMode(); btnCalculate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { calculate(); // Вызываем метод для вычисления значения функции } }); btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { reset(); } }); btnExit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btnSwitch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mode = !mode; // Переключаем режим ввода данных switchMode(); } }); } private void calculate() { try { // Получаем данные из элементов ввода double argument = Double.parseDouble(etArgument.getText().toString()); double precision = Double.parseDouble(etPrecision.getText().toString()); double lower = Double.parseDouble(etLower.getText().toString()); double upper = Double.parseDouble(etUpper.getText().toString()); double step = Double.parseDouble(etStep.getText().toString()); // Проверяем корректность входных данных if (argument < -1 || argument > 1) { throw new IllegalArgumentException("Аргумент должен быть в диапазоне [-1, 1]"); } if (precision <= 0) { throw new IllegalArgumentException("Точность должна быть положительной"); } if (lower < -1 || lower > 1) { throw new IllegalArgumentException("Нижняя граница должна быть в диапазоне [-1, 1]"); } if (upper < -1 || upper > 1) { throw new IllegalArgumentException("Верхняя граница должна быть в диапазоне [-1, 1]"); } if (step <= 0) { throw new IllegalArgumentException("Шаг изменения должен быть положительным"); } double result = 0; // Переменная для хранения результата double term = argument; // Переменная для хранения текущего члена ряда int n = 0; // Переменная для хранения номера члена ряда // Пока член ряда больше заданной точности while (Math.abs(term) > precision) { result += term; // Добавляем член ряда к результату n++; term = -term * argument * argument * (2 * n - 1) / (2 * n + 1); // Вычисляем следующий член ряда } // Вычисляем эталонное значение функции с помощью стандартной функции класса Math double reference = Math.atan(argument); tvResult.setText("Результат: " + result); tvReference.setText("Эталонный результат: " + reference); // Очищаем таблицы от предыдущих результатов tlTable.removeAllViews(); // Если режим ввода данных - способ 2 if (mode) { // Создаем заголовок таблицы TableRow header = new TableRow(this); TextView tvX = new TextView(this); TextView tvY = new TextView(this); TextView tvZ = new TextView(this); tvX.setText("Аргумент"); tvY.setText("Результат"); tvZ.setText("Эталон"); header.addView(tvX); header.addView(tvY); header.addView(tvZ); tlTable.addView(header); // Заполняем таблицу результатами вычислений for (double x = lower; x <= upper; x += step) { // Опять вычисляем значение функции с помощью разложения в ряд Маклорена для способа 2 double y = 0; double t = x; int m = 0; while (Math.abs(t) > precision) { y += t; m++; t = -t * x * x * (2 * m - 1) / (2 * m + 1); } double z = Math.atan(x); // Эталонное значение // Создаем строку таблицы TableRow row = new TableRow(this); TextView tvXValue = new TextView(this); TextView tvYValue = new TextView(this); TextView tvZValue = new TextView(this); tvXValue.setText(String.valueOf(x)); tvYValue.setText(String.valueOf(y)); tvZValue.setText(String.valueOf(z)); row.addView(tvXValue); row.addView(tvYValue); row.addView(tvZValue); tlTable.addView(row); } } } catch (NumberFormatException e) { Toast.makeText(this, "Пожалуйста, введите корректные числа", Toast.LENGTH_SHORT).show(); } catch (IllegalArgumentException e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); } } // Метод для сброса входных данных на значения по умолчанию private void reset() { etArgument.setText(""); etPrecision.setText(""); etLower.setText(""); etUpper.setText(""); etStep.setText(""); tvResult.setText(""); tvReference.setText(""); tlTable.removeAllViews(); } private void switchMode(){ // Если режим ввода данных - способ 1 if (!mode) { // Делаем видимыми элементы для ввода одного аргумента etArgument.setVisibility(View.VISIBLE); tvResult.setVisibility(View.VISIBLE); tvReference.setVisibility(View.VISIBLE); // Делаем невидимыми элементы для ввода диапазона аргументов etLower.setVisibility(View.GONE); etUpper.setVisibility(View.GONE); etStep.setVisibility(View.GONE); tvTable.setVisibility(View.GONE); tlTable.setVisibility(View.GONE); // Изменяем текст кнопки btnSwitch.setText("Способ 2"); } else { // Делаем невидимыми элементы для ввода одного аргумента etArgument.setVisibility(View.GONE); tvResult.setVisibility(View.GONE); tvReference.setVisibility(View.GONE); // Делаем видимыми элементы для ввода диапазона аргументов etLower.setVisibility(View.VISIBLE); etUpper.setVisibility(View.VISIBLE); etStep.setVisibility(View.VISIBLE); tvTable.setVisibility(View.VISIBLE); tlTable.setVisibility(View.VISIBLE); // Изменяем текст кнопки btnSwitch.setText("Способ 1"); } } }