所以,如果能正常工作,我似乎无法得到别的东西。
我一直在做的是编写一个单元转换器来尝试自学编程的基础知识,我对它有些新意。所以新说这实际上是我第一次工作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#获得了起始代码(最高位)。如果需要,会详细说明我的问题。
答案 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方法,你可以放在一个方法。首先,您应该扩展转换器类。再添加两个字符串字段字段。 FromUnit
和ToUnit
。为什么???因为您将转换器实例作为参数提供给您的方法。您可以使用此实例存储有关此转换器的更多信息,以及之后创建信息消息。例如:
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将给出预期和实际价值,你会明白为什么这不起作用。