Всё работало, а теперь перестало, как добавил try...catch блоки. За говнокод ругаться не надо пожалуйста, ещё учусь. Класс от которого наследуется не закидывал, т.к. не имеет смысла. Он абстрактный с одним методом.
Весь проект на GitHub (Класс Rectangle был идентичным с классом Circle, но что-то пошло не так. Rectangle полностью рабочий, есть догадка что сломалось из-за того, что не правильно добавил исключения цветам и всё пошло не туда.)
Суть проблемы : После задачи в конструкторе значений и после вызова метода tostring() выводит нулевые значения для площади и для цвета.
Класс когда всё работало без проблем
class Circle : Figure
{
public byte R { get; }
public byte G { get; }
public byte B { get; }
double area;
public double Radius { get; set; }
public Circle(double radius, byte r, byte g, byte b)
{
Console.Write("\nУкажите радиус круга: ");
radius = Convert.ToDouble(Console.ReadLine());
if (radius < 0)
{
Console.WriteLine("Радиус должен быть не отрицательным.");
while (true)
{
Console.Write("Укажите радиус: ");
radius = Convert.ToDouble(Console.ReadLine());
if (radius < 0)
Console.WriteLine("Вы опять ввели отрицательное значение.);
if (radius > 0)
break;
}
}
Console.WriteLine("Чтобы фигурка была красивой укажи цвет для неё");
Console.Write("Enter 1st RGB id color: ");
r = Convert.ToByte(Console.ReadLine());
Console.Write("Enter 2nd RGB id color: ");
g = Convert.ToByte(Console.ReadLine());
Console.Write("Enter 3rd RGB id color: ");
b = Convert.ToByte(Console.ReadLine());
R = r;
G = g;
B = b;
Radius = radius;
}
public override double Aria()
{
return area = Math.PI * Math.Pow(Radius, 2);
}
public override string ToString()
{
if (R == 255 && B == 0 && G == 0)
{
return "\nPure Red \n";
}
if (R == 0 && B == 255 && G == 0)
{
return "\nPure Blue \n";
}
if (R == 0 && B == 0 && G == 255)
{
return "\nPure Green \n";
}
return $"\n{Math.Round(area,3)} см^2 - площадь круга \nR:{R} G:{G} B:{B} - цвет фигуры";
}
Класс когда я сломал что-то и всё пошло не так. (Всегда выводит нулевые значения)
class Circle : Figure
{
int exception;
public byte R { get; }
public byte G { get; }
public byte B { get; }
double area;
public double Radius { get; set; }
public Circle(double radius, byte r, byte g, byte b)
{
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("\nУкажите радиус круга: ");
radius = Convert.ToDouble((Console.ReadLine()));
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
}
exception = 0;
if (radius < 0)
{
Console.WriteLine("Радиус должен быть не отрицательным.");
while (true)
{
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Укажите радиус круга: ");
radius = Convert.ToDouble((Console.ReadLine()));
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
}
if (radius < 0)
Console.WriteLine("Вы опять ввели отрицательное значение.");
if (radius > 0)
break;
}
}
Console.WriteLine("Укажите цвет для фигуры в формате RGB: ");
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 1st RGB id color: ");
r = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (r < 0)
{
Console.WriteLine("Введено отрицательное значение");
while (true)
{
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 1st RGB id color: ");
r = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (r < 0)
Console.WriteLine("Вы опять ввели отрицательное значение.");
if (r > 0)
break;
}
}
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 2nd RGB id color: ");
g = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (g < 0)
{
Console.WriteLine("Введено отрицательное значение");
while (true)
{
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 2nd RGB id color: ");
g = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (g < 0)
Console.WriteLine("Вы опять ввели отрицательное значение.");
if (g > 0)
break;
}
}
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 3rd RGB id color: ");
b = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (b < 0)
{
Console.WriteLine("Введено отрицательное значение");
while (true)
{
for (int i = 0; i == exception; i++)
{
try
{
Console.Write("Enter 2nd RGB id color: ");
b = Convert.ToByte(Console.ReadLine());
}
catch (FormatException ex)
{
Console.WriteLine($"{ex.Message} Нужно вводить число. ");
exception++;
}
catch (OverflowException ex)
{
Console.WriteLine($"{ex.Message} Выход за диапазон (0-255)");
exception++;
}
}
exception = 0;
if (b < 0)
Console.WriteLine("Вы опять ввели отрицательное значение.");
if (b > 0)
break;
}
R = r;
G = g;
B = b;
Radius = radius;
}
}
public override double Aria()
{
return area = Math.PI * Math.Pow(Radius, 2);
}
public override string ToString()
{
if (R == 255 && B == 0 && G == 0)
{
return "\nPure Red \n";
}
if (R == 0 && B == 255 && G == 0)
{
return "\nPure Blue \n";
}
if (R == 0 && B == 0 && G == 255)
{
return "\nPure Green \n";
}
return $"\n{Math.Round(area,2)} см^2 - площадь круга \nR:{R} G:{G} B:{B} - цвет фигуры";
}
}
У вас проблема в том, что код
R = r;
G = g;
B = b;
Radius = radius;
недоступен, перенесите его после фигурной скобки и все должно сработать.
В вашем случае для того, чтобы заставить пользователя ввести правильное число, проще всего использовать TryParse
(в примере указан тип byte
, для переменной double
используйте double
):
byte x;
while (!byte.TryParse (Console.ReadLine (), out x)) {
Console.WriteLine ("Введите число от 0 до 255 включительно.");
}
Можно добавить дополнительные проверки, если хотите:
byte x;
while (!byte.TryParse (Console.ReadLine (), out x) || x == 9) {
Console.WriteLine ("Введите число от 0 до 255 включительно, и не 9.");
}
Если вы хотите ловить разные исключения и показывать разные сообщения, можно сделать и более громоздкую проверку:
byte x;
while (true) {
try {
x = byte.Parse (Console.ReadLine ());
// можно добавить сюда свои условия, как в примере с девяткой
if (x == 9) Console.WriteLine ("Мне не нравится число 9.");
else break;
}
catch (FormatException e) {
Console.WriteLine ("Введенная строка не была числом.");
}
catch (OverflowException e) {
Console.WriteLine ("Введенное число не находилось вне диапазона [0, 255].");
}
}
Если последний вариант вас не пугает, и вы хотите его использовать, я все же советую убрать его в отдельную функцию, чтобы не повторяться, а писать защищенный ввод одной строчкой.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При вызове функций необходимо выполнять запись в базу действияФункции все разнородные, т