【问题标题】:C# where I went wrongC# 我哪里出错了
【发布时间】:2016-08-02 08:02:32
【问题描述】:

这是我已经提交的练习,我想更好地了解我哪里出错了。该程序应该计算我们可以吃多少糖果以及剩下多少包装,假设有一个促销活动,对于 X 数量的包装我们可以获得 Y 个免费糖果,然后我们可以使用这些包装来获得额外数量的免费糖果,直到我们没有达到获得更多所需的金额。

我的解决方案适用于几种情况,但不适用于某些情况,例如:

对于 4 Wraps 获得 2 免费赠品,购买 8 = 13 Eaten 和 5 WrapLeft(应该是 14 Eaten 和 2 WrapsLeft)。

我已经阅读了很多次代码,但不知道是我设计的公式糟糕还是编码错误(尽管它编译正常)。我被困住了。

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

namespace candy
{
    class Program
    {
        static void Main(string[] args)
        {
            int Wrap = 0;
            int Freebie = 0;
            int TotalFreebie = 0;
            int Buy = 0;
            int Increment = 0;
            int Eaten = 0;
            int WrapsLeft = 0;

            Console.WriteLine("Introduce amount of wraps");
            Wrap = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Introduce number of freebies per wrap");
            Freebie = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Introduce amount of candy bought");
            Buy = Int32.Parse(Console.ReadLine());

            TotalFreebie = (Buy / Wrap) * Freebie;
            Eaten = Buy + TotalFreebie;
            WrapsLeft = Eaten - Buy;

            if (Freebie > Buy || Freebie >= Wrap)
            {
                Console.WriteLine("COMPANY GOES BANKRUPT");
                Console.ReadLine();
            }
            else
            {
                if (TotalFreebie > Wrap)
                {
                    do
                    {
                        TotalFreebie = (Buy / Wrap) * Freebie;
                        Increment = TotalFreebie / Wrap;
                        Increment++;
                        Eaten = Buy + TotalFreebie + Increment;
                        WrapsLeft = Eaten - (Buy + TotalFreebie);

                    } while (TotalFreebie > Wrap);
                }

                else 
                {
                    if (TotalFreebie == Wrap && Buy > Wrap)
                    {
                        TotalFreebie = (Buy / Wrap) * Freebie;
                        Eaten = Buy + TotalFreebie + Freebie;
                        WrapsLeft = Eaten - (Buy + TotalFreebie);
                    }

                    else
                    {
                        TotalFreebie = (Buy / Wrap) * Freebie;
                        Eaten = Buy + TotalFreebie;
                        WrapsLeft = Eaten - Buy;
                    }
                }

                TotalFreebie = (Buy / Wrap) * Freebie;
                Eaten = Buy + TotalFreebie + (TotalFreebie / Wrap);

                if (TotalFreebie > Wrap)
                {
                    WrapsLeft = Eaten - (Buy + TotalFreebie);
                }

                else
                {
                    WrapsLeft = Eaten - Buy;
                }

                Console.WriteLine("{0} {1}", Eaten, WrapsLeft);
                Console.ReadLine();
            }
        }
    }
}

【问题讨论】:

  • 你试过调试你的代码吗?
  • 是的,但我还是不太明白,我们仍然从伪代码开始使用 Visual Studio。
  • 我仍然无法理解您的问题。我有点困惑。但是,我认为您的意思是您购买了一定数量的糖果,例如 8 个,您可以用 4 包吃过的糖果换取另外 2 个糖果,您可以继续这样做,直到用完包装.而你所需要的,是原始数量的糖果一共能得到多少糖果,交易后还剩下多少包装纸。这是正确的吗?
  • 没错,“Eaten”·是“最终消耗的糖果数量(购买+赠品总数”,WrapLeft 是“我将购买的糖果和包装纸交换后剩余的包装纸数量)我还可以用来为 Y 数量的包装器获得 X 数量的免费赠品的免费赠品”。
  • 您的代码中有一些错误。变量 Compro 在哪里定义?你也拼错了一个 Frebie。

标签: c#


【解决方案1】:

只是为了向您展示哪里出了问题...如果用户输入与您提到的场景匹配,请查看流程...

//For 4 Wraps get 2 Freebies, Buy 8 = 13 Eaten and 5 WrapLeft (should be 14 Eaten and 2 WrapsLeft).
static void Main(string[] args)
{
    int Wrap = 0;
    int Freebie = 0;
    int TotalFreebie = 0;
    int Buy = 0;
    int Increment = 0;
    int Eaten = 0;
    int WrapsLeft = 0;

    Console.WriteLine("Introduce amount of wraps");
    Wrap = Int32.Parse(Console.ReadLine()); // 4
    Console.WriteLine("Introduce number of freebies per wrap");
    Freebie = Int32.Parse(Console.ReadLine()); // 2
    Console.WriteLine("Introduce amount of candy bought");
    Buy = Int32.Parse(Console.ReadLine()); // 8

    TotalFreebie = (Buy / Wrap) * Freebie; // 8/4*2 = 4
    Eaten = Buy + TotalFreebie; // 8+4 = 12
    WrapsLeft = Eaten - Buy; 12-8 = 4

    if (Freebie > Buy || Freebie >= Wrap) // 2 > 8 || 2 >= 4 *FALSE*
    {
        Console.WriteLine("COMPANY GOES BANKRUPT");
        Console.ReadLine();
    }

    else
    {
        if (TotalFreebie > Wrap) // 4 > 4 *TRUE*
        {
            do
            {
                TotalFreebie = (Buy / Wrap) * Freebie;
                Increment = TotalFreebie / Wrap;
                Increment++;
                Eaten = Buy + TotalFreebie + Increment;
                WrapsLeft = Eaten - (Buy + TotalFreebie);

            } while (TotalFreebie > Wrap);
        }

        else 
        {
            if (TotalFreebie == Wrap && Buy > Wrap) // 4 == 4 && 8 > 4 *TRUE*
            {
                TotalFreebie = (Buy / Wrap) * Frebie; // 8/4*2 = 4
                Eaten = Buy + TotalFreebie + Freebie; // 8+4+2 = 14
                WrapsLeft = Eaten - (Buy + TotalFreebie); // 14-(8+4) = 2
            }

            else 
            {
                TotalFreebie = (Buy / Wrap) * Freebie;
                Eaten = Buy + TotalFreebie;
                WrapsLeft = Eaten - Buy;
            }
        }

        TotalFreebie = (Buy / Wrap) * Freebie; // 8/4*2 = 4
        Eaten = Buy + TotalFreebie + (TotalFreebie/Wrap); // 8+4+(4/4) = 13 

        if (TotalFreebie>Wrap) // 4>4 *FALSE*
        {
            WrapsLeft = Eaten - (Buy + TotalFreebie);
        }

        else
        {
            WrapsLeft = Eaten - Buy; // 13-8 = 5 
        }



        Console.WriteLine("{0} {1}", Eaten, WrapsLeft); // 13 5
        Console.ReadLine();
    }
}

这是修改后的版本...由于我删除了一些代码,您可能想验证您最初的错误处理是否仍然适用..

//For 4 Wraps get 2 Freebies, Buy 8 = 13 Eaten and 5 WrapLeft (should be 14 Eaten and 2 WrapsLeft).
static void Main(string[] args)
{
    int Wrap = 0;
    int Freebie = 0;
    int TotalFreebie = 0;
    int Buy = 0;
    int Increment = 0;
    int Eaten = 0;
    int WrapsLeft = 0;

    Console.WriteLine("Introduce amount of wraps");
    Wrap = Int32.Parse(Console.ReadLine()); // 4
    Console.WriteLine("Introduce number of freebies per wrap");
    Freebie = Int32.Parse(Console.ReadLine()); // 2
    Console.WriteLine("Introduce amount of candy bought");
    Buy = Int32.Parse(Console.ReadLine()); // 8


    if (Freebie > Buy || Freebie >= Wrap) // 2 > 8 || 2 >= 4 *FALSE*
    {
        Console.WriteLine("COMPANY GOES BANKRUPT");
        Console.ReadLine();
    }

    else
    {
        TotalFreebie = (Buy/Wrap)*Freebie; // (8/4)*2 = 4

        WrapsLeft = Buy%Wrap + TotalFreebie; = 8%4 + 4 = 0+4 = 4

        while(WrapsLeft >= Wrap) // 4>=4 *TRUE* // 2>=4 *FALSE*
        {
            TotalFreebie += (WrapsLeft/Wrap)*Freebie; // 4 + (4/4)*2 = 4 + 2 = 6
            WrapsLeft = (WrapsLeft/Wrap)*Freebie; // (4/4)*2 = 2
        }            

        Eaten = Buy + TotalFreebie; // 8+6 = 14

        Console.WriteLine("{0} {1}", Eaten, WrapsLeft); // 14 2
        Console.ReadLine();
    }
}

【讨论】:

  • 说实话有太多多余的逻辑,已经没有意义了。如果你想再试一次,我建议重新设计程序。
  • 好的...灯亮了,谢谢!!!所以问题是我非常糟糕地定义了 IF 条件,我应该更具体地定义每个 IF。结果为 13 的情况也应该定义为带有条件的 if,并且 WrapsLeft 变量应该在每个主 IF 下定义。
  • 我也是这么想的,我一直在写代码,以至于我什至没有清楚地思考。我会重新设计,看看这次我是否有能力做对。非常感谢您花时间帮我看看!
  • 我编辑并添加了一个可以帮助您解决问题的工作
  • 哇,谢谢!我也会尝试使用其他数字,看看它是如何工作的,如果我需要添加其他东西,但你告诉我正确的路径,谢谢!
【解决方案2】:

您的代码存在一些问题。

您使用Int32.Parse(Console.ReadLine()); 设置的三个变量只设置一次。在初始输入后,它们不会在整个代码中更改。所以,看看这个循环:

        do
        {
            TotalFreebie = (Buy_SETONCE / Wrap_SETONCE) * Freebie_SETONCE;
            Increment = TotalFreebie / Wrap_SETONCE;
            Increment++;
            Eaten = Buy_SETONCE + TotalFreebie + Increment;
            WrapsLeft = Eaten - (Buy_SETONCE + TotalFreebie);
        } while (TotalFreebie > Wrap_SETONCE);

您会看到设置了一次的变量,因为当时我重命名了 _SETONCE 附加到它们的名称。您会看到,通过循环的每次迭代,TotalFreebie 将是一个常量值,因为它仅由设置一次的值组成。所以这意味着如果TotalFreebie > Wrap_SETONCEtrue 那么你永远不会离开循环。

如果你不进入循环,那么你会点击if 的另一侧,这将设置TotalFreebieEatenWrapsLeft,但在此代码运行后立即再次设置这三个变量:

    TotalFreebie = (Buy_SETONCE / Wrap_SETONCE) * Freebie_SETONCE;
    Eaten = Buy_SETONCE + TotalFreebie + (TotalFreebie / Wrap_SETONCE);

    if (TotalFreebie > Wrap_SETONCE)
    {
        WrapsLeft = Eaten - (Buy_SETONCE + TotalFreebie);
    }
    else
    {
        WrapsLeft = Eaten - Buy_SETONCE;
    }

因此,您的代码实际上如下所示:

Console.WriteLine("Introduce amount of wraps");
Wrap_SETONCE = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce number of freebies per wrap");
Freebie_SETONCE = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce amount of candy bought");
Buy_SETONCE = Int32.Parse(Console.ReadLine());

TotalFreebie = (Buy_SETONCE / Wrap_SETONCE) * Freebie_SETONCE;
Eaten = Buy_SETONCE + TotalFreebie;
WrapsLeft = Eaten - Buy_SETONCE;

if (Freebie_SETONCE > Buy_SETONCE || Freebie_SETONCE >= Wrap_SETONCE)
{
    Console.WriteLine("COMPANY GOES BANKRUPT");
    Console.ReadLine();
}
else
{
    TotalFreebie = (Buy_SETONCE / Wrap_SETONCE) * Freebie_SETONCE;
    Eaten = Buy_SETONCE + TotalFreebie + (TotalFreebie / Wrap_SETONCE);

    if (TotalFreebie > Wrap_SETONCE)
    {
        WrapsLeft = Eaten - (Buy_SETONCE + TotalFreebie);
    }
    else
    {
        WrapsLeft = Eaten - Buy_SETONCE;
    }

    Console.WriteLine("{0} {1}", Eaten, WrapsLeft);
    Console.ReadLine();
}

现在用于测试公司是否破产的if 不依赖于TotalFreebieEatenWrapsLeft 变量的初始值,因此您可以将这些计算移至@ 的后半部分987654337@.

但这会导致一些不必要的重复。

假设我可以忽略错误的 do 循环,我最终可以像这样编写你的整个代码:

Console.WriteLine("Introduce amount of wraps");
int Wrap = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce number of freebies per wrap");
int Freebie = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce amount of candy bought");
int Buy = Int32.Parse(Console.ReadLine());

if (Freebie > Buy || Freebie >= Wrap)
{
    Console.WriteLine("COMPANY GOES BANKRUPT");
}
else
{
    int TotalFreebie = (Buy / Wrap) * Freebie;
    int Eaten = Buy + TotalFreebie + (TotalFreebie / Wrap);
    int WrapsLeft = Eaten - Buy - (TotalFreebie > Wrap ? TotalFreebie : 0);
    Console.WriteLine("{0} {1}", Eaten, WrapsLeft);
}
Console.ReadLine();

【讨论】:

  • 其实这看起来更像是我们教授给我们的解决方案,更有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2013-12-25
  • 2011-07-21
  • 2018-01-21
  • 1970-01-01
相关资源
最近更新 更多