有很多问题,但我似乎无法在答案中找到原因。它通常是:不,用此替换它或者这应该有用。
我的任务是创建一个程序,要求用户输入一个3位正整数(十进制),将其转换为八进制。
例如,在纸上:将数字112转换为八进制。 (8是八进制的基数。)
您将采取以下步骤:
从下到上的剩余是八进制数,代表112的十进制数。 所以112的八进制数是160。
我在互联网上找到了以下程序,但我完全不了解它。 该计划的评论是我的。有人可以向我解释一下吗?
//declaration and initialization of variables but why is there an array?
int decimalNumber, quotient, i = 1, j;
int[] octalNumber = new int[100];
//input
Console.WriteLine("Enter a Decimal Number :");
decimalNumber = int.Parse(Console.ReadLine());
quotient = decimalNumber;
//as long as quotient is not equal to 0, statement will run
while (quotient != 0)
{
//this is how the remainder is calculated but it is then put in an array + 1, i don't understand this.
octalNumber[i++] = quotient % 8;
//divide the number given by the user with the octal base number
quotient = quotient / 8;
}
Console.Write("Equivalent Octal Number is ");
//i don't understand the code below here aswell.
for (j = i - 1; j > 0; j--)
Console.Write(octalNumber[j]);
Console.Read();
真正感谢任何帮助。
答案 0 :(得分:4)
首先要理解的是:这是解决这个问题的一种可怕方法。代码充满了奇怪的选择;看起来有人采取了这个问题的错误C解决方案并将其转换为C#而不需要仔细考虑或使用良好实践。如果您正在尝试学习如何理解您在互联网上找到的糟糕代码,这是一个很好的例子。如果您正在尝试学习如何设计好的代码,这是一个很好的例子。
//declaration and initialization of variables but why is there an array?
有一个数组,因为我们希望存储所有八进制数字,而数组是一种方便的机制,用于存储大量相同类型的数据。
但我们可以在这里提出一些更相关的问题:
i
- 显然是数组的当前索引 - 从一开始?!这简直太怪异了。数组在C#中从零开始。然后我们继续:
decimalNumber = int.Parse(Console.ReadLine());
此代码假定输入的文本是合法的整数,但不保证。所以这个程序会崩溃。应该使用TryParse
,并且应该处理失败模式。
// this is how the remainder is calculated but it is
// then put in an array + 1, i don't understand this.
octalNumber[i++] = quotient % 8;
该代码的作者认为他们很聪明。这太聪明了。在头脑中重写代码,首先应该如何实现它。首先,将i
重命名为currentIndex
。接下来,为每个语句生成一个副作用,而不是两个:
while (quotient != 0)
{
octalNumber[currentIndex] = quotient % 8;
currentIndex += 1;
quotient = quotient / 8;
}
现在应该清楚发生了什么。
// I don't understand the code below here as well.
for (j = i - 1; j > 0; j--)
Console.Write(octalNumber[j]);
做一个小例子。假设数字是14,八进制是16。第一次通过循环我们在插槽1中放入6。下一次,我们在插槽2中放置1.因此数组为{0, 6, 1, 0, 0, 0, 0 ... }
,i
为3.我们希望输出16
。所以我们将j从i-1循环到1,然后打印出1然后打印6。
所以,为你锻炼:再次编写这个程序,这次使用精心设计的C#程序的惯例。将您的尝试放在代码审查网站上,人们将很乐意为您提供有关如何改进它的提示。
答案 1 :(得分:3)
这已经内置于.NET中,Convert.ToString已经这样做了。
在您的代码中,在您decimalNumber = int.Parse(...)
之后,您可以执行此操作:
Console.WriteLine(Convert.ToString(decimalNumber, 8));
Console.Read();
然后删除剩下的代码。
现在,如果您不是在询问如何在.NET中进行八进制转换,而是实际上该代码是如何工作的,那么它的工作方式如下:
这个循环很重要:
1 while (quotient != 0)
{
//this is how the remainder is calculated but it is then put in an array + 1, i don't understand this.
2 octalNumber[i++] = quotient % 8;
//divide the number given by the user with the octal base number
3 quotient = quotient / 8;
}
我在行中添加了一些数字,以便更容易编写说明。
基本上,循环执行此操作(上面的行对应于下面的点)。
%
处理,将该数字存储到下一个位置的数组中。然后循环回来。
然而,由于我们基本上找到了从最右侧到左侧的所有数字,所以最后的循环以相反的顺序将它们写回。
作为对读者的练习,如果您:
,请尝试弄清楚问题中的代码如何表现(提示,它没有正常运行,但Convert.ToString确实如此)
答案 2 :(得分:0)
使用数组是因为它们在while循环的每个交互中计算每个数字。 (例如){0,6,1}
程序的最后一部分是打印每个数字,从数组中的最后一项开始,然后移到第一项。在这种情况下,它会打印出来: 160