出于某种原因,如果没有其他工作

时间:2012-08-23 22:37:47

标签: c# if-statement

所以,如果能正常工作,我似乎无法得到别的东西。

我一直在做的是编写一个单元转换器来尝试自学编程的基础知识,我对它有些新意。所以新说这实际上是我第一次工作while循环。所以我一直在编写代码,然后做一个在编程方面有点经验的朋友告诉我这样做。哪个代码分别表示方法。我使用VS2010自动方法为此做事,因为我自己不知道怎么做。有问题的完整源代码在这里http://pastebin.com/9mZPPtWr问题是这一个

`

      else if (type == "cups")

      {

        Console.WriteLine("Enter a number of liters to be converted into cups.");
        amount = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

      }`

我在控制台中输入了杯子,尽管每次其他输入/输入工作正常并且每次循环回到选择位,我似乎无法使该部分代码起作用。它只是不会显示,我已经在它上面工作了一个小时,我开始认为我错过了一些非常明显的东西,或者一些非常神秘的东西。此外,我有很多重复的代码,我想知道是否有办法将其简化为更少的重复。

谢谢,我希望这是可读和可理解的。即使我的代码可能不是。我还从Accelerated C#获得了起始代码(最高位)。如果需要,会详细说明我的问题。

6 个答案:

答案 0 :(得分:4)

我运行了你的代码并且(在修复了一个简单的错误之后)它正确地输入了你引用的 else

您可能希望回显您键入的内容,以确保您没有输入错误输入。

错误是你有

  

完成

单独一行。大概你想要分配一个值。

答案 1 :(得分:2)

首先:第141行有错误。删除done字。我建议这只是复制粘贴错误。第二个:在这里你说你的代码是:

else if (type == "cups")

      {

        Console.WriteLine("Enter a number of liters to be converted into cups.");
        amount = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

      }

但是在解决方案中,您提供的链接是:

else if(type == "cups")
                    {

                        Console.WriteLine("Enter a number of liters to be converted into cups.");
                        amount = Convert.ToDouble(Console.ReadLine());
                        Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");

                    }

我建议它只是注意力不集中。您的代码工作正常,只需替换

Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");

Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

在您的解决方案中。

讨论简化代码并删除重复内容。当然有办法做到这一点。该过程称为代码重构。例如,您在项目中写道:

...
else if(type == "grams")
                    {

                        amount = gramsToOunces(ozToGramsConverter, ref done);

                    }
...

评估您替换为gramToOunces()方法的amount。这在某种程度上也是代码重构。你应该采用代码的公共部分并查看它们所依赖的内容。例如:

private static double MilesToFeet(UnitConverter milesToFeetConverter, ref int done)
        {

            double amount;
            Console.WriteLine("Enter a number of miles to be converted to feet.");
            amount = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine(milesToFeetConverter.Convert(amount) + " feet to said number of miles.");

            return amount;

        }

每个转换方法都有这样的结构。在每种方法中,你都会这样做。您打印相同的指令消息...您声明相同数量的变量并将其值设置为控制台输入...然后您写入几乎相同的信息消息。所有这一切都取决于N方法,你可以放在一个方法。首先,您应该扩展转换器类。再添加两个字符串字段字段。 FromUnitToUnit。为什么???因为您将转换器实例作为参数提供给您的方法。您可以使用此实例存储有关此转换器的更多信息,以及之后创建信息消息。例如:

public class UnitConverter
    {
        double ratio;
        public string From { get; set; }
        public string To { get; set; }
        public UnitConverter(double unitratio) { ratio = unitratio; }
        public double Convert(double unit) { return unit * ratio; }
    }

当您创建转换器实例时,请为这些属性设置适当的值。

UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};

现在让我们编写一个方法,它将对你已经创建的所有方法(gramToOunces,kmToMiles等)进行重新定位;

private static void MakeConversion(UnitConverter customConverter)
        {
            Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
            double amount = Convert.ToDouble(Console.ReadLine());
            string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
            Console.WriteLine(message);
        }

现在您可以删除所有方法,如果是块,您可以调用这个方法,只需使用不同的参数而不是调用不同的方法,这些方法也是如此。

else if(type ==“miles”)             {                  MakeConversion(milesToFeetConverter);             }

在所有这些操作之后,您的解决方案将如下所示:

using System;

namespace ConsoleApplication2
{
    public class UnitConverter
    {
        double ratio;
        public string From { get; set; }
        public string To { get; set; }
        public UnitConverter(double unitratio) { ratio = unitratio; }
        public double Convert(double unit) { return unit * ratio; }
    }

    class Test
    {
        private static void MakeConversion(UnitConverter customConverter)
        {
            Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
            double amount = Convert.ToDouble(Console.ReadLine());
            string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
            Console.WriteLine(message);
        }

        public static void Main()
        {                 
            UnitConverter feetToInchesConverter = new UnitConverter(12) { From = "feet", To = "inches"};
            UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};
            UnitConverter kmsToMilesConverter = new UnitConverter(1.609) { From = "kilometers", To = "miles"};
            UnitConverter centToInchesConverter = new UnitConverter(2.54) { From = "centimeters", To = "inches" };
            UnitConverter ozToGramsConverter = new UnitConverter(28.349) { From = "ounces", To = "grams" };
            UnitConverter cupsTolitConverter = new UnitConverter(4.226) { From = "cups", To = "litters" };

            string type;
            int done;

            done = 0;

            while(done == 0)
            {
                {
                    type = Console.ReadLine();

                    if(type == "centi")
                    {
                        MakeConversion(centToInchesConverter);
                    }

                    else if(type == "feet")
                    {
                        MakeConversion(feetToInchesConverter);
                    }

                    else if(type == "km")
                    {
                        MakeConversion(kmsToMilesConverter);
                    }

                    else if(type == "miles")
                    {
                        MakeConversion(milesToFeetConverter);
                    }

                    else if(type == "grams")
                    {
                        MakeConversion(ozToGramsConverter);
                    }

                    else if(type == "cups")
                    {
                        MakeConversion(cupsTolitConverter);
                    }

                    else if(type == "end")
                    {
                        done = 1;
                    }
                }
            }
        }
    }
}

当然,你可以做更多的事情来使代码更容易和更清晰。如果使用case替换MakeConversion方法直接替换为UnitConverter类,则更改类的体系结构。这只是我对你能做什么的建议。但首先要尝试学习如何编写你的oun方法和类,并且不要使用VisualStudio方法生成器,你应该知道如何自己编写方法。我试图解释一下,希望它有所帮助

答案 2 :(得分:0)

您链接到的代码的第141行是:

141 - done

你不会使用该变量进行任何操作,也不会以分号结尾。

(由于您没有使用Visual Studio编辑器,我怀疑该程序正在运行,因此您引入了编译时错误。现在每次运行该程序时,您可能正在运行旧版本。 希望您可以下载和使用Visual Studio Express,这将增加学习时间并减少混淆时间。祝你好运)

答案 3 :(得分:0)

在您编写的代码中 -

Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");  

但是你在帖子中给了 -

Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");  

可能这就是你在控制台输出中找不到它的原因。否则它的工作正常。

答案 4 :(得分:-1)

如果“If else”没有被击中,则表示以下两种情况之一:先前条件为真,或条件为假。

比较strings时,'=='运算符区分大小写所以请务必考虑到这一点。这是一个更复杂的主题,随着你的进步将在以后有意义。

祝你好运!

答案 5 :(得分:-3)

我的建议:使用Nunit并为其编写单元测试。 Nunit将给出预期和实际价值,你会明白为什么这不起作用。