Есть проблема с программой с разветвленными операциями на C#

Рейтинг: 0Ответов: 2Опубликовано: 02.03.2023

В строке 31 объявлена ​​ошибка относительно неинициализированной переменной, хотя я объявил ее назначение (использование локальной переменной "y", которой не присвоено значение. (CS0165)) Строку отметил звездочками

using System;
namespace Program
{
    class Program
    {
        public static void Main(string[] args)
        {
            double a, b, h, x, y;
            Console.WriteLine("Input a =");
            a = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input b =");
            b = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input h =");
            h = Convert.ToDouble(Console.ReadLine());


            for (x = a; x <= b; x += h)
            {
                if (x <= 0.7)
                {
                    y = Math.Atan(Math.Pow(x, 3));
                }
                else if (x > -0.7 && x <= -0.6)
                {
                    y = Math.Tan(x + Math.Log(Math.Abs(x)));
                }
                else if (x >= -0.6)
                {
                    y = 1 / Math.Tan(Math.Pow(x, 2));
                }
                *Console.WriteLine("{0} {1}", x, y);*
            }

        }
    }
}

Ответы

▲ 0Принят

Проблема в том, что не во всех случаях y может быть инициализирован. Проблему можно решить, например, добавив блок else:

for (x = a; x <= b; x += h)
{
   if (x <= 0.7)
   {
       y = Math.Atan(Math.Pow(x, 3));
   }
   else if (x > -0.7 && x <= -0.6)
   {
       y = Math.Tan(x + Math.Log(Math.Abs(x)));
   }
   else if (x >= -0.6)
   {
       y = 1 / Math.Tan(Math.Pow(x, 2));
   }
   else 
   {
       y = 0;
   }
   
   Console.WriteLine("{0} {1}", x, y);
}
▲ 1

Принятый ответ, конечно, решит проблему, но в нём не совсем корректный код.

Итак, почему же компилятор не разрешает вам использовать переменную, после того как вы её проинициализировали, казалось бы, во всех возможных условиях? Всё достаточно просто.

Компилятор рассуждает так:

Хмм, а что если ни одно из условий не выполнится?
Чему тогда будет равна переменная "y"?
Нигде нет присвоения в таком случае.
Кидаю ошибку!

Компилятор не рассчитывает выражения внутри if-ов, по-этому, вам нужно явно сказать компилятору, что если ни одно условие не выполнится, то вот чему равен y. Для этого нужна ветка else:

else
{
    y = ...;
}

В вашем случае последнее условие else if (x >= -0.6) является излишним, по-этому его нужно просто заменить на else:

for (x = a; x <= b; x += h)
{
   if (x <= 0.7)
   {
       y = Math.Atan(Math.Pow(x, 3));
   }
   else if (x > -0.7 && x <= -0.6)
   {
       y = Math.Tan(x + Math.Log(Math.Abs(x)));
   }
   else
   {
       y = 1 / Math.Tan(Math.Pow(x, 2));
   }
   
   Console.WriteLine("{0} {1}", x, y);
}