2017-08-12 39 views
-1

因此,我目前是C#的初学者,我有一个练习来解决我的作业 - 用户从控制台输入一个介于0到100之间的整数,包括数字的英文单词写在控制台上,所以如果输入为1,则为“1”,如果输入为2,则为“2”,如果输入为25,则输入“25”等等。问题是,出于某种原因,当我使用判断自动化系统测试我的程序时,我只得到84/100分,并且我无法理解为什么,在代码中没有看到任何错误,这里是:c#在简单练习中遇到问题

class Program 
{ 
    static void Main() 
    { 
     var a = int.Parse(Console.ReadLine()); 
     if (a < 20) 
     { 
      if (a == 0) Console.WriteLine("zero"); 
      else if (a == 1) Console.WriteLine("one"); 
      else if (a == 2) Console.WriteLine("two"); 
      else if (a == 3) Console.WriteLine("three"); 
      else if (a == 4) Console.WriteLine("four"); 
      else if (a == 5) Console.WriteLine("five"); 
      else if (a == 6) Console.WriteLine("six"); 
      else if (a == 7) Console.WriteLine("seven"); 
      else if (a == 8) Console.WriteLine("eight"); 
      else if (a == 9) Console.WriteLine("nine"); 
      else if (a == 10) Console.WriteLine("ten"); 
      else if (a == 11) Console.WriteLine("eleven"); 
      else if (a == 12) Console.WriteLine("twelve"); 
      else if (a == 13) Console.WriteLine("thirteen"); 
      else if (a == 14) Console.WriteLine("fourteen"); 
      else if (a == 15) Console.WriteLine("fifteen"); 
      else if (a == 16) Console.WriteLine("sixteen"); 
      else if (a == 17) Console.WriteLine("seventeen"); 
      else if (a == 18) Console.WriteLine("eighteen"); 
      else Console.WriteLine("nineteen"); 
     } 
     else if (a == 20 || a == 30 || a == 40 || a == 50 || a == 60 || a == 70 || a == 80 || a == 90 || a == 100) 
     { 
      if (a == 20) Console.WriteLine("twenty"); 
      else if (a == 30) Console.WriteLine("thirty"); 
      else if (a == 40) Console.WriteLine("forty"); 
      else if (a == 50) Console.WriteLine("fifty"); 
      else if (a == 60) Console.WriteLine("sixty"); 
      else if (a == 70) Console.WriteLine("seventy"); 
      else if (a == 80) Console.WriteLine("eighty"); 
      else if (a == 90) Console.WriteLine("ninety"); 
      else Console.WriteLine("hundred"); 
     } 
     else 
     { 
      if (a/10 == 2) Console.Write("twenty "); 
      else if (a/10 == 3) Console.Write("thirty "); 
      else if (a/10 == 4) Console.Write("forty "); 
      else if (a/10 == 5) Console.Write("fifty "); 
      else if (a/10 == 6) Console.Write("sixty "); 
      else if (a/10 == 7) Console.Write("seventy "); 
      else if (a/10 == 8) Console.Write("eighty "); 
      else Console.Write("ninety "); 
      if (a % 10 == 1) Console.WriteLine("one"); 
      else if (a % 10 == 2) Console.WriteLine("two"); 
      else if (a % 10 == 3) Console.WriteLine("three"); 
      else if (a % 10 == 4) Console.WriteLine("four"); 
      else if (a % 10 == 5) Console.WriteLine("five"); 
      else if (a % 10 == 6) Console.WriteLine("six"); 
      else if (a % 10 == 7) Console.WriteLine("seven"); 
      else if (a % 10 == 8) Console.WriteLine("eight"); 
      else Console.WriteLine("nine"); 
     } 
    } 
} 
+5

神圣的母亲,这是很多如果陈述 – jdmdevdotnet

+2

我们不知道什么是自动判断的要求。干净的代码,更智能的做法或其他方式。你应该问问你的教授。 – mybirthname

+1

尝试运行for循环从0到100而不是用户输入,运行相同的方法,检查是否得到所有正确的文本,如果不是,那么代码是好的,但你失去了关于它如何写的点 - 100 %你不需要这么多if-elses –

回答

1

就像我在我的评论中说的,我们无法知道你的作业的评判自动系统需求。你需要问你的教授。

在这里,你的问题稍微聪明一点就知道如何解决将来的问题。

var zeroToNighteenArr= new[] { "zero", "one", "two", "three", "four", .. till 19 }; 
var numbersDividedByTenArr = new[] {"zero", "ten" "twenty", "thirty", "forty", ... untill 100 }; 

if(userInput<20) 
{ 
    Console.WriteLine(zeroToNigteenArr[userInput]); 
} 
else 
{ 
    //in numbers to numbersDividedByTenArr you can remove the "zero" and "ten", if you want to copy same definition of words 
    //but in this case you need to write it numbersDividedByTenArr[userInput/10 -2] to receive proper result. 
    string result = numbersDividedByTenArr[userInput/10]; 

    result += userInput%10 != 0 ? $" {zeroToNigteenArr[userInput%10]}": ""; 
    Console.WriteLine(result); 
} 

这里我们使用数组的好处,我们可以通过他的索引获取数组的元素。在我们的数组的实现中,您将索引0->“零”,1 - >“一个”等等。通过这种方式,当我们写zeroToNighteenArr[userInput]时,您会收到此号码的单词表示形式。

+0

尽管您承认法官自动化系统的要求未知,但现在仍然可以说得太早,无法回答。把它放在一边,你基本上是通过完全重写他的代码来“修复”OP的问题。这不是学习的好方法,因为没有人知道问题的原因是什么。学习是我认为的OP的关键。另外,考虑到OP代码的风格,数组可能对于OP来说太快了。一旁的情况下,我喜欢你的答案 – MickyD

0

这将是一个大胆的猜测,所以请容易对我。

Console.Out属性被初始化时,底层TextWriterAutoFlush属性设置为true。为此,首次致电Console.Write的第一个字"twenty ""thirty "等的结果可能会导致底层缓冲区被刷新。

我猜测,你的教授的代码可能会使用一个StreamReader以只读的是,在第一缓冲到达这几个字符,而不是继续,直到CRLF或者当你的应用程序中存在,therfore导致不匹配预期值。

换句话说,它看起来像你打破了你的教授的应用程序,这里是你如何能确认:

如果下面的程序分数/100那么我敢打赌,你的教授应用程序错误未能在应用程序存在之前阅读您的整个控制台输出流。

static void Main(string[] args) 
{ 
    Console.ReadLine(); 

    Console.Write("o"); 
    Console.Out.Flush(); // force it 
    Console.WriteLine("ne"); 
} 
+0

有趣的是这实际上做的工作,给了我点 – asdsafasfasfasf

+0

嗯,这是值得一试。尽管如此,仍然令人困惑。 – Biscuits

+0

我很好奇看到你的教授的代码。你总是可以尝试[反编译](https://www.jetbrains.com/decompiler/download/)它... – Biscuits