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);
}
}