@KaktuZHD

Как можно исправить код для поиска квадратных уравнений?

Мне нужно сделать код на поиск квадратного уравнения через методы
Я сделал такой код, но

static void Main(string[] args)
        {
            result();
        }
           static double vvod(out double a, out double b, out double c)
            {
            Console.WriteLine("Введите данные уравнения"); // Введите данные уравнения
            Console.Write("Введите а: "); // Введите а
             a = double.Parse(Console.ReadLine()); // Считывание с клавиатуры данную а
            Console.Write("Введите b: "); // Введите b
             b = double.Parse(Console.ReadLine()); // Считывание с клавиатуры данную b
            Console.Write("Введите c: "); // Введите c
             c = double.Parse(Console.ReadLine()); // Считывание с клавиатуры данную c

            Console.WriteLine("Ваше уравнение: " + a + "x^2 + " + b + "x + " + c + " = 0"); // Ваше уравнение 
            return 0;
            }

           static double disc(out double D)
           {
            vvod(out double a, out double b, out double c);
            D = b * b - (4 * a * c); // Обьявление переменной Дискриминант
            return 0;
           }
           static void result()
           {
            vvod(out double a, out double b, out double c);
            disc(out double D);
            if (D < 0) // Условие, если Дискриминант < 0
            {
                Console.WriteLine("Нет решений, т.к D < 0 "); // Вывод ответа
            }
            else if (D > 0) // // Условие, если Дискриминант > 0
            {
                double x1 = (-b + Math.Sqrt(D)) / (2 * a); // Обьявление переменной х1 и решение
                double x2 = (-b - Math.Sqrt(D)) / (2 * a); // Обьявление переменной х2 и решение
                Console.WriteLine("Ваш ответ: x1 = " + x1 + " x2 = " + x2); // Вывод ответа
            }
            else // (D == 0)  Условие, если Дискриминант = 0
            {
                double x1 = (-b + Math.Sqrt(0)) / (2 * a); // Обьявление переменной х1 и решение
                double x2 = x1; // Обьявление переменной х2 и решение
                Console.WriteLine("Ваш ответ: x2 = x1 = " + x1); // Вывод ответа
            }
           }


Как мне сделать, чтобы метод vvod не повторялся , а просто копировал значения?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
using static ConsoleApp.ConsoleInput;

namespace ConsoleApp;

public class Program
{
    static void Main(string[] args)
    {
        new Program().Run(args);
    }

    private void Run(string[] args)
    {
        Console.WriteLine("Введите данные уравнения"); // Введите данные уравнения
        double a = RequestUserInputAsDouble("Введите число a:"); // Введите а
        double b = RequestUserInputAsDouble("Введите число b:"); // Введите b
        double c = RequestUserInputAsDouble("Введите число c:"); // Введите c
        Console.WriteLine("Ваше уравнение: " + a + "x^2 + " + b + "x + " + c + " = 0");
        double discriminant = CalculateDiscriminant(a, b, c);

        if (discriminant < 0) // Условие, если Дискриминант < 0
        {
            Console.WriteLine("Нет решений, т.к D < 0 "); // Вывод ответа
        }
        else if (discriminant > 0) // // Условие, если Дискриминант > 0
        {
            double x1 = (-b + Math.Sqrt(discriminant)) / (2 * a); // Обьявление переменной х1 и решение
            double x2 = (-b - Math.Sqrt(discriminant)) / (2 * a); // Обьявление переменной х2 и решение
            Console.WriteLine("Ваш ответ: x1 = " + x1 + " x2 = " + x2); // Вывод ответа
        }
        else // (D == 0)  Условие, если Дискриминант = 0
        {
            double x1 = (-b + Math.Sqrt(0)) / (2 * a); // Обьявление переменной х1 и решение
            double x2 = x1; // Обьявление переменной х2 и решение
            Console.WriteLine("Ваш ответ: x2 = x1 = " + x1); // Вывод ответа
        }
    }

    private double CalculateDiscriminant(double a, double b, double c)
    {
        // Вычисление переменной Дискриминант
        return b * b - (4 * a * c);
    }
}


Класс, который позволяет запросить ввод пользователя и если пользователь ввёл неверные данные, которые нельзя конвертировать в целевой тип данных, то ввод снова запрашивается у пользователя.
using System.Globalization;

namespace ConsoleApp;

internal static class ConsoleInput
{
    private static readonly CultureInfo CommaCulture =
        new(CultureInfo.InvariantCulture.LCID)
        {
            NumberFormat = { NumberDecimalSeparator = "," }
        };
    private static readonly CultureInfo PointCulture =
        new(CultureInfo.InvariantCulture.LCID)
        {
            NumberFormat = { NumberDecimalSeparator = "." }
        };


    /// <summary>
    /// Запросить ввод у пользователя. Если ввод нельзя конвертировать в целевой тип,
    /// то ввод будет запрошен повторно. Это обобщённый метод, позволящий реализовать 
    /// несколько других методов, требующих ввод в определённом формате.
    /// </summary>
    /// <typeparam name="TResult">
    /// Тип результата, который ожидается от метода конвертации.
    /// </typeparam>
    /// <param name="tryConvert">Ссылка на метод конвертации.</param>
    /// <param name="message">
    /// Сообщение, которое будет показано пользователю каждый новый запрос ввода значения.
    /// </param>
    /// <returns></returns>
    private static TResult RequestUserInput<TResult>(
        Func<string, (bool, TResult)> tryConvert, string? message = null)
        where TResult : struct
    {
        TResult result;
        while (true)
        {
            if (!string.IsNullOrWhiteSpace(message))
            {
                Console.WriteLine(message);
            }

            string? line = Console.ReadLine();
            if (!string.IsNullOrWhiteSpace(line))
            {
                var (success, convertedValue) = tryConvert(line);
                if (success)
                {
                    result = convertedValue;
                    break;
                }
            }
        }

        return result;
    }

    /// <summary>
    /// Запросить у пользователя ввод числа типа double.
    /// Допускается в качестве разделителя "," и ".".
    /// </summary>
    /// <param name="message">
    /// Сообщение, которое будет показано пользователю каждый новый запрос ввода значения.
    /// </param>
    /// <returns></returns>
    public static double RequestUserInputAsDouble(string? message = null)
    {
        return RequestUserInput(userInput =>
        {
            CultureInfo culture = CultureInfo.InvariantCulture;
            if (userInput.Contains(",")) culture = CommaCulture;
            if (userInput.Contains(".")) culture = PointCulture;
            return double.TryParse(
                userInput, NumberStyles.Float, culture, out var result)
                ? (true, result)
                : (false, 0d);
        }, message);
    }

    // И другие типы в том же духе
    public static int RequestUserInputAsInt32(string? message = null)
    {
        return RequestUserInput(userInput =>
                int.TryParse(userInput, out var result)
                    ? (true, result)
                    : (false, 0),
            message);
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы