C# 十进制到八进制
有很多问题,但我似乎无法从答案中找到原因。它通常是:不,用这个替换这个,否则这个应该可以用 我的任务是创建一个程序,要求用户输入一个3位正整数十进制,并将其转换为八进制 例如,在纸上:将数字112转换为八进制。8是八进制的基数 以下是您将采取的步骤: 112/8=14余数=0 14/8=1余数=6 1/8=0余数=1 从下到上的余数是以十进制表示112的八进制数。 所以112的八进制数是160 我在网上找到了以下程序,但我不完全理解。 节目中的评论是我的。谁能给我解释一下吗C# 十进制到八进制,c#,decimal,octal,C#,Decimal,Octal,有很多问题,但我似乎无法从答案中找到原因。它通常是:不,用这个替换这个,否则这个应该可以用 我的任务是创建一个程序,要求用户输入一个3位正整数十进制,并将其转换为八进制 例如,在纸上:将数字112转换为八进制。8是八进制的基数 以下是您将采取的步骤: 112/8=14余数=0 14/8=1余数=6 1/8=0余数=1 从下到上的余数是以十进制表示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();
非常感谢您的帮助。这已经内置到.NET中,并且已经做到了这一点 在您的代码中,在您有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;
}
我在行中添加了一些数字,以便于编写描述
基本上,这个循环是这样的:上面的线对应下面的点
只要我们有一个数字要转换,即我们还没有完成,循环。
算出最低有效位,这是除以8后的余数,由,%处理,将此数字存储到下一个位置的数组中。
除以8以去掉最低有效数字,并将所有其他数字上移一位
然后循环返回
但是,由于我们基本上找到了从最右边到左边的所有数字,因此末尾的循环会以相反的顺序将它们写回
作为对读者的练习,如果您:
输入负数
输入0
提示,它的行为不正确,但Convert.ToString会使用数组,因为它们在while循环的每次迭代中都计算每个数字。e、 g.{0,6,1} 程序的最后一部分是打印每个数字,从数组中的最后一项开始,移动到第一项。在这种情况下,它将打印出:
160首先要了解的是:这是解决这个问题的可怕方法。代码中充满了奇怪的选择;看起来有人在没有仔细考虑或使用良好实践的情况下,采用了一个糟糕的C语言解决方案,并将其翻译成了C语言。如果你想学习如何理解互联网上的蹩脚代码,这就是一个很好的例子。如果您正试图学习如何设计好代码,这是一个很好的例子,说明了什么是不应该做的
//declaration and initialization of variables but why is there an array?
有一个数组,因为我们希望存储所有的八进制数字,而数组是一种方便的机制,用于存储大量相同类型的数据
但我们可以在这里问一些更相关的问题:
为什么是100码?这没有错,但这远远超出了必要的范围。什么样的思维过程导致100人被选中?为什么这个思维过程没有记录在案?
为什么是int数组?我们正在输出文本,这是一个字符序列。拥有一堆魔咒似乎更自然。
为什么是数组?由于我们正在构建先进先出的数据结构,堆栈似乎更合适。或者为什么不简单地累积一个字符串?如果字符串较大,则效率较低,但来自32位整数的八进制字符串永远不会较大!
为什么程序会产生到控制台的输出?当然,一个更好的分解程序会有一个方法,它接受一个int并返回一个八进制字符串,然后可以打印出来。
为什么有些变量有描述性名称,有些变量有非描述性名称?代码的作者是否故意试图混淆读者?还是他们只是没有仔细考虑?
为什么我——显然是数组中的当前索引——从1开始?!这简直太离奇了。数组在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。接下来,每个语句产生一个副作用,而不是两个: 现在应该清楚发生了什么
// 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。下一次通过时,我们将1放入插槽2中。所以数组是{0,6,1,0,0,0,0…},i是3。我们希望输出16。所以我们把j从i-1循环到1,然后打印出1
n6
所以,为您做一个练习:再次编写这个程序,这次使用设计良好的C程序的约定。将您的尝试放在代码审查网站上,人们会很乐意为您提供改进建议。Convert.ToString DecimalNumber,8不够好吗?有一个数组,因为每个八进制数字存储在一个位置。最后,数组中存储的数字将以相反的顺序写入控制台。请参阅我的任务。。。文章的一部分:这消除了一半的代码。这更容易阅读,更容易理解。我不明白为什么程序员用一行代码就能完成这个程序,却把它弄得如此复杂。不,我只是在练习@OrkhanAlikhanov,使用Convert.ToString可以完美地解决该任务,如果任务是我必须自己编写所有代码作为家庭作业的一部分,那么这是另一个问题。我注意到%是余数运算符,而不是模运算符。哦,相信我,我已经多次向文档团队表达了强烈的意见,他们愿意在C文档中编造一些疯狂的东西。你的意思是不产生副作用,因为它实际上是一种效果而不是副作用,因为它是你想要的?请不要恨我-说得好。如果它是预期的效果,它不是副作用!我一直认为数组中存储的数据是按时间顺序排列的。就像上面的例子一样,它是:{0,1,6,0,0,…}。谢谢你的解释。这完全有道理。@iLisJoels:数组只是一个获取索引并根据需要生成与该索引对应的变量的设备。所以新的int[100]产生了一个10个变量的集合,索引从0到9。@EricLippert我想你的句子中有一个拼写错误。但朋友之间的数量级是多少;
// I don't understand the code below here as well.
for (j = i - 1; j > 0; j--)
Console.Write(octalNumber[j]);