【问题标题】:C# Compound Interest Calculator (beginner)C# 复利计算器(初级)
【发布时间】:2019-11-15 00:38:30
【问题描述】:

C# 初学者,尝试创建一个程序,让用户输入金额、年份和费率,然后计算总金额。利率除以 100 得到十进制值,年份乘以 12 得到月利率。

代码如下:

class Program
{  
    static void Main(string[] args)
    {
        CompoundClass program = new CompoundClass();

        Console.Write("Please enter the initial balance for your account: ");
        double balance = Convert.ToDouble(Console.ReadLine());

        Console.Write("Please enter the annual interest rate: ");
        double interestRate = Convert.ToDouble(Console.ReadLine());

        program.Rate(interestRate);

        Console.Write("How many years will you acrue interest? ");
        double anualAmount = Convert.ToDouble(Console.ReadLine());

        program.Years(anualAmount);

        Console.WriteLine($"Your balance after {anualAmount} years is {totalAmount:C}\n");

        Console.ReadLine();
    }
}

class CompoundClass
{
    public double rate;
    public double yearlyRate;
    public double balance;

    public void Rate(double interestRate)
    {
        if (interestRate > 0)
        {
           rate = interestRate / 100;
        }
    }

    public void Years(double anualAmount)
    {
        if (anualAmount > 0)
        {
            yearlyRate = anualAmount * 12;
        }
    }

    public void addMethod(double totalAmount)
    {
        for (int i = 1; i < yearlyRate + 1; i++)
        {
            totalAmount = balance * Math.Pow(1 + rate / yearlyRate, yearlyRate * i);
        }
    }
}

我不断收到错误:

CS0103当前上下文中不存在名称“totalAmount”。

我不知道是否有任何信息被正确提取和存储/计算。

【问题讨论】:

  • 能否访问变量取决于变量的作用域和访问级别。
  • 你没有在任何地方定义一个名为 totalAmount 的变量,除了作为 addMethod 方法的参数,它永远不会被调用。
  • 所以我必须加倍总金额;以及在 addMethod 中使用它?为什么我不必为年度金额或利息率这样做? totalAmount 应该是计算的总金额。
  • 在我看来,如果您想获得“总金额”,那么您应该创建一个返回该值的属性或方法。也许最简单的方法是将addMethod 重命名为GetTotalAmount,让它返回double 而不是void(它似乎不需要任何输入参数),然后进行计算并返回值从那个方法。然后调用者可以执行类似var totalAmount = program.GetTotalAmount(); 的操作。通常还有其他问题,但由于您刚刚开始,我想现在可以忽略它们。
  • 另外,一些变量名具有欺骗性。 yearlyRate 不是比率,它是用于计算总数的月数。而您使用的循环只是一遍又一遍地重新分配一个变量,而不是做任何感兴趣的复合。

标签: c#


【解决方案1】:

您遇到该错误是因为“totalAmount”变量只能在 CompoundClass 中访问。这是因为它是使用默认访问修饰符 private 创建的。 您为 CompoundClass 创建了一个对象

CompoundClass program = new CompoundClass();

您已经使用对象访问了方法。关于您对年度金额或利息率的问题,您没有从 CompoundClass 访问变量,您只是从 Program 类中传递了它们。但是,您仍然可以通过 program.rate 等对象访问 rate、yearlyRate 和 balance。这是因为您已将它们声明为公开的。

public double rate;
public double yearlyRate;
public double balance;

如果您也想访问 totalAmount,请将其声明为公开。

program.addMethod(balance);
Console.WriteLine($"Your balance after {anualAmount} years is {program.totalAmount:C}\n");

【讨论】:

  • 哦,好吧!我实施了更改,但出现此错误:CS1061 C# 不包含定义,并且找不到接受第一个类型参数的可访问扩展方法(您是否缺少 using 指令或程序集引用?)
  • 你需要添加一个公共变量:(public double TotalAmount { get; set; }public void AddMethod(double balance) // Preferred casing { for (int i = 1; i &lt; yearlyRate + 1; i++) { TotalAmount = balance * Math.Pow(1 + rate / yearlyRate, yearlyRate * i); } }在程序类中你需要program.AddMethod(balance); Console.WriteLine($"Your balance after {anualAmount} years is {program.TotalAmount:C}\n");
【解决方案2】:

您正在尝试打印出(来自program)您尚未声明的变量的值(来自program 中的totalAmount)。

由于您想要计算 totalAmount,因此您希望更改您的 addMethod 以返回计算的金额,而不是接受 totalAmount 作为参数。

例如在program

double totalAmount = addMethod();
Console.WriteLine($"Your balance after {anualAmount} years is {totalAmount:C}\n");

并实现addMethod返回值:

public void addMethod()
{
    double calculatedTotalAmount = 0;

    for (int i = 1; i < yearlyRate + 1; i++)
    {
        calculatedTotalAmount = balance * Math.Pow(1 + rate / yearlyRate, yearlyRate * i);
    }

    return calculatedTotalAmount;
}

实际上,您将在方法范围内计算的值分配给totalAmount,它在外部范围内声明。

【讨论】:

  • 谢谢!我调试的时候,总金额回来为0。这是计算错误吗?
  • 看起来像一个逻辑错误。我复制了你的代码,主要是为了突出变量范围的差异以及你如何返回一个值,因此可能复制了你的逻辑错误。也许使用调试器逐步完成......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多