C# 十进制到八进制

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 我在网上找到了以下程序,但我不完全理解。 节目中的评论是我的。谁能给我解释一下吗 //

有很多问题,但我似乎无法从答案中找到原因。它通常是:不,用这个替换这个,否则这个应该可以用

我的任务是创建一个程序,要求用户输入一个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]);