【问题标题】:C# method returning formulaC#方法返回公式
【发布时间】:2016-02-05 09:52:19
【问题描述】:
  static void Main(string[] args)
        {
            double creditcardbalance;
            creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance");

            double monthlypayementamount;
            monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount");

            double percentagerate;
            percentagerate = (int)GetPositiveDecimal("Enter In Percentage Rate");

            CreditCardMonths();
        }

        static void CreditCardMonths()
        {
            double dailyinterestrate;
            double payoff;
            double percentagerate = 0;
            double creditcardbalance = 0;
            double monthlypayementamount = 0;

            dailyinterestrate = (double)percentagerate / 365;
            payoff = (int)(-(1d / 30) * Math.Log(1 + creditcardbalance / monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30))) / Math.Log(1 + dailyinterestrate)) + 1;

            Console.WriteLine("It will take {0} months to pay off the loan", payoff);
            displaymenu();
            Console.ReadKey();
        }      

一旦在 main 方法中声明了 CreditCardMonths() 方法,我的公式的答案在它应该返回正数时返回负整数。?? 我错过了什么?

我的完整代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DebtCalculator
{
    class Program
    {
        static void Main(string[] args)
        {
            double creditcardbalance;
            creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance");
            double monthlypayementamount;
            monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount");

            double percentagerate;
            percentagerate = (int)GetPositiveDecimal("Enter In Percentage Rate");

            CreditCardMonths();
        }

这是一段代码作品:

double creditcardbalance;
            Console.WriteLine("Enter in credit card balance:");
            creditcardbalance = double.Parse(Console.ReadLine());

            double monthlypayementamount;
            Console.WriteLine("Enter in the monthly payement amount:");
            monthlypayementamount = double.Parse(Console.ReadLine());

            double percentagerate;
            Console.WriteLine("Enter in annual percentage rate:");
            percentagerate = double.Parse(Console.ReadLine());
            // outputs
            double payoff;
            double dailyinterestrate;

            // Daily interest formula calculated by apr divided by 365
            dailyinterestrate = percentagerate / 365;
            //Introducing formula for output
            //Payoff needed to display whole numbers, although in ints output 1/30 = 0 so adding 1d (double) allows precise calculation.+1 allows it to round up to the nearest dollar.
            payoff = (int)(-(1d / 30) * Math.Log(1 + creditcardbalance / monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30))) / Math.Log(1 + dailyinterestrate)) + 1;
            //Introduce output for display

            {
                Console.WriteLine("It will take {0} months to pay off the loan", payoff);
                Console.WriteLine("Goodbye");
                // keep console open
                Console.ReadKey();

但似乎通过创建一个名为 CreditCardMonths 的方法返回一个负整数? 我的 Y/N 循环方法也不起作用。

        static void CreditCardMonths()
        {
            double dailyinterestrate;
            double payoff;
            double percentagerate = 0;
            double creditcardbalance = 0;
            double monthlypayementamount = 0;

            dailyinterestrate = (double)percentagerate / 365;
            payoff = (int)(-(1d / 30) * Math.Log(1 + creditcardbalance / monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30))) / Math.Log(1 + dailyinterestrate)) + 1;

            Console.WriteLine("It will take {0} months to pay off the loan", payoff);
            displaymenu();
            Console.ReadKey();
        }      

        static decimal GetPositiveDecimal(string message)
        {
            decimal value = 0;
            Console.WriteLine(message);
            value = decimal.Parse(Console.ReadLine());
            while (value <= 0)
            {
                Console.WriteLine("invalid input. Please enter a non negative Decimal");
                Console.WriteLine(message);
                value = decimal.Parse(Console.ReadLine());
            }
            return value;
        }
        static double GetPositiveDouble(string message)
        {
            double value = 0;
            Console.WriteLine(message);
            value = double.Parse(Console.ReadLine());
            while (value <= 0)
            {
                Console.WriteLine("Invalid Input . Enter In A Non Negative Number");
                Console.WriteLine(message);
                value = double.Parse(Console.ReadLine());
            }
            return value;
        }
        static void menuItem()
        {
            char menuItem;
            {
                menuItem = GetUpperCaseYN();
                ProcessMenuItem(menuItem);
            }
            Console.WriteLine("Thank you, goodbye.");
            Console.ReadLine();
        }
        static char GetUpperCaseYN()
        {
            char menuItem;
            menuItem = char.Parse(Console.ReadLine());
            menuItem = char.ToUpper(menuItem);
            while (menuItem != 'Y' && menuItem != 'N')
            {
                Console.WriteLine("Invalid Menu Item");
                menuItem = char.Parse(Console.ReadLine());
                menuItem = char.ToUpper(menuItem);
            }

            return menuItem;
        }
        static void displaymenu()
        {
            Console.WriteLine("Calculate Another? (Y/N)");
        }

        static void ProcessMenuItem(char menuItem)
        {
            switch (menuItem)
            {

                case 'Y':
                   ;
                    break;

                case 'N':
                    Console.ReadKey();
                    Console.WriteLine("Goodbye!");
                    Console.ReadKey();
                    break;
            }
            Console.ReadKey();
        }
    }
}

【问题讨论】:

  • 在 CreditCardMonths 方法上放置一个断点并逐步验证您的值。您应该能够找到您的问题。还要确保你没有声明一个局部范围的变量来掩盖一个方法/类范围的变量

标签: c# methods return formula


【解决方案1】:

您错过了这样一个事实,即一种方法中的变量与其他方法中的变量是不同的变量,即使它们具有相同的名称。

因此,例如,您在方法 Main 中具有可变百分比率,在方法 CreditCardMonths 中具有可变双倍百分比率。它们是不同的内存——不同的变量。 您需要执行以下操作之一: 在类级别声明方法之外的变量。 你的方法是统计的,所以你需要包含关键字static

static double creditcardbalance;
static double monthlypayementamount;
static double percentagerate;

static void Main(string[] args)
    {
        creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance");

        monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount");

        percentagerate = (int)GetPositiveDecimal("Enter In Percentage Rate");

        CreditCardMonths();
    }

并且不要在第二种方法中声明它们,因为它会(所谓的)隐藏范围。

注意:当您学习更多有关编程的知识时,请考虑使用方法参数将您的子方法需要的数据传递给它们。

https://msdn.microsoft.com/en-us/library/0f66670z.aspx

【讨论】:

  • 请详细说明
猜你喜欢
  • 2015-01-26
  • 2012-11-05
  • 2019-06-17
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多