C#十进制到八进制

时间:2017-08-17 17:26:36

标签: 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();

真正感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

首先要理解的是:这是解决这个问题的一种可怕方法。代码充满了奇怪的选择;看起来有人采取了这个问题的错误C解决方案并将其转换为C#而不需要仔细考虑或使用良好实践。如果您正在尝试学习如何理解您在互联网上找到的糟糕代码,这是一个很好的例子。如果您正在尝试学习如何设计好的代码,这是一个很好的例子。

//declaration and initialization of variables but why is there an array?

有一个数组,因为我们希望存储所有八进制数字,而数组是一种方便的机制,用于存储大量相同类型的数据。

但我们可以在这里提出一些更相关的问题:

  • 为什么尺寸为100?这没有错,但这比必要的要大得多。什么思想过程导致100被选中?为什么不在任何地方记录这个思维过程?
  • 为什么是int数组?我们正在输出文本,这是一系列字符。拥有一堆字符似乎更自然。
  • 为什么要一个阵列?由于我们正在构建先进先出数据结构,因此堆栈似乎更合适。或者为什么不简单地积累一个字符串?如果字符串很大,这是低效的,但是32位整数的八进制字符串永远不会很大!
  • 为什么程序会产生输出到控制台?当然,一个更好的因子程序会有一个方法,它接受一个int并返回一个八进制字符串,然后可以打印出来。
  • 为什么有些变量具有描述性名称,有些变量具有不同名称?代码的作者是故意试图混淆读者吗?或者他们根本没有仔细考虑过它?
  • 为什么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;
    }

我在行中添加了一些数字,以便更容易编写说明。

基本上,循环执行此操作(上面的行对应于下面的点)。

  1. 只要我们有一个要转换的号码(即我们还没有完成),循环。
  2. 找出最低有效数字,这是除以8后的余数,由remainder operator%处理,将该数字存储到下一个位置的数组中。
  3. 除以8以除去最低有效数字并将所有其他数字向上移动
  4. 然后循环回来。

    然而,由于我们基本上找到了从最右侧到左侧的所有数字,所以最后的循环以相反的顺序将它们写回。

    作为对读者的练习,如果您:

    ,请尝试弄清楚问题中的代码如何表现
    • 输入负数
    • 输入0

    (提示,它没有正常运行,但Convert.ToString确实如此)

答案 2 :(得分:0)

使用数组是因为它们在while循环的每个交互中计算每个数字。 (例如){0,6,1}

程序的最后一部分是打印每个数字,从数组中的最后一项开始,然后移到第一项。在这种情况下,它会打印出来: 160