Построение калькулятора показателей - PullRequest
0 голосов
/ 11 октября 2019

Я относительно новичок в программировании на C #. Я строю калькулятор экспоненты, и он работает, но во время отладки я столкнулся с проблемой, которую я не понимаю, почему я получаю вывод, который я получаю.

Это рассматриваемый класс и методкогда я получаю вывод, я знаю, что это неправильно. (обратите внимание, что я позже исправил это, сделав его total *= lower в цикле for)

using System;

namespace stars
{

  public class Exponent
  {

    public int Exp(int lower, int power)
    {
      int total = lower;
      if ( power == 0 )
      {
        //returns 1 for any exponent of 0
        Console.WriteLine(" 1");
        return 1;
      }
      else if ( lower == 0 )
      {
        //returns 0 for any base of 0
        Console.WriteLine("0");
        return 0;
      }
      else if ( ( power % 1 ) == 0 ) // check for integer exponent
      {
        for ( int i = 1; !( i > power ); i++ )  //math
        {
          lower *= lower;
        }
        Console.WriteLine(lower);
        return total;
      }
      else
      {
        Console.WriteLine("error");
      }
    }

  }

}

в последнем месте, где у меня есть forloop, чтобы (неправильно) вычислить значение некоторого целого числа длястепень другого целого числа, я (неправильно) выполняю вычисление ниже = ниже * ниже, где ниже - базовое число.

т.е. 5 ^ 4 ,, 5 = ниже, 4 = мощность

в любом случае, когда я запускаю его на 5 ^ 4, результат равен 0. Почему он выходит на 0? Я полагал, что это будет работать так:

5 * 5 = 25 ---> 25 * 25 = 625 ----> 625 * 625 ... и т. Д.

или является конечным значениемнастолько большой, что компилятор выплевывает 0.

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Прежде всего, вы должны изменить total в своей программе и не изменять lower изменение данного параметра часто приводит к ошибкам.

Как то так:

public class Exponent 
{
    // static: we don't want this
    public static int Exp(int lower, int power)
    {
        // Special cases  
        if (power == 0 || lower == 1)
            return 1;
        else if (lower == 0)
            return 0;
        else if (power < 0) //DONE: you've forgot about this case
            throw new ArgumentOutOfRangeException(nameof(power));  

        // we don't want "power % 1 == 0" case - int power is always integer

        // General case: math 
        int total = lower;

        // "!( i > power )" - let's put at simpler (and correct) - "i < power" 
        for (int i = 1; i < power; ++i)      
            total *= lower; 

        return total;  
    }
}

...

// 5**4 == 625
Console.Write(Exponent.Exp(5, 4));
1 голос
/ 11 октября 2019

В коде много проблем, я их исправил. Хотя вы должны рассмотреть и другие сценарии. например, если lower и power - отрицательные числа, если числа большие, это не даст вам требуемого результата.

public static int Exp(int lower, int power) 
{
    int total = lower;
    if (power == 0) {
        //returns 1 for any exponent of 0
        Console.WriteLine(" 1");
        return 1;
    }
    else if (lower == 0) 
    {
        //returns 0 for any base of 0
        Console.WriteLine("0");
        return 0;
    }

    for (int i = 1; i < power; i++) //math
    {
        total *= lower;
    }

    Console.WriteLine(total);
    return total;
}
0 голосов
/ 11 октября 2019

В коде есть немного неправильное оформление, и, очевидно, где-то есть ошибка, иначе вы получите правильный вывод. Давайте разберемся с этим.

Сначала я перепишу ваш код, чтобы он был чище и проще для чтения:

public int Exp(int lower, int power)
{
    int total = lower;

    // 0 to the power of y is always 0
    if ( lower == 0 )
        return 0;

    // x to the power of 0 is always 1
    if ( power == 0 )
        return 1;

    // Your parameters for the Method explicitly state that 
    // 'power' is always an int, so no need to check
    for ( int i = 1; i < power; i++ )
        lower *= lower;

    return total;
}

Очистки, которые я сделал:

  • Удаленоненужные «else if» из кода, так как вы возвращаетесь изнутри своего «if» в любом случае
  • Удалены ненужные фигурные скобки, уменьшающие беспорядок
  • Перемещенные комментарии перед проверкой, так как принято комментировать код над нимне ниже этого

Теперь проблема гораздо более очевидна: вы делаете lower *= lower вместо total *= lower. Итак, правильный код будет таким:

public int Exp(int lower, int power)
{
    int total = lower;

    // 0 to the power of y is always 0
    if ( lower == 0 )
        return 0;

    // x to the power of 0 is always 1
    if ( power == 0 )
        return 1;

    // Your parameters for the Method explicitly state that 
    // 'power' is always an int, so no need to check
    for ( int i = 1; i < power; i++ )
        total *= lower;

    return total;
}
...