使用数组十进制到二进制/十六进制

时间:2014-11-23 19:46:50

标签: c++ decimal converter

我的c ++程序的十六进制部分遇到了问题。当我使用十六进制开关时,没有任何返回。也出于某种原因我的二进制转换有一个领先的0我似乎无法摆脱。

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <array>
using namespace std;
void binary(int, int);
void hex(int, int);
int _tmain(int argc, _TCHAR* argv[])
{
int numb, base;
cout << "Enter a decimel number : ";
cin >> numb;
cout << "Enter a base you want number switched to: ";
cin >> base;
switch (base){
case 2: binary(numb, base); break;
case 8: break;
case 16: hex(numb, base); break;
default: break;
    }
}
void binary(int numb, int base)
{
    int bin[32] = { 0 };
    int i = 0;
    do
    {
        bin[i] = numb%base;
        numb = numb / base;
        i++;
    } while (numb != 0);
    cout << "\n";

    while (i >= 0){
        cout << bin[i];
        i--;
    }
    cout << endl << endl;
}
void hex(int numb, int base){
    int i;
    int hex[10] = { 0 };
    for (i=0; i > 10; i++){
        hex[i] = numb%base;
        numb = numb / base;
        for (i; i > 0; i--)
        {
            if (hex[i] >= 10)
            {
                switch (hex[i]){
                case 10: cout << "A"; break;
                case 11: cout << "B"; break;
                case 12: cout << "C"; break;
                case 13: cout << "D"; break;
                case 14: cout << "E"; break;
                case 15: cout << "F"; break;
                default: break;
                }
            }
            cout << hex[i];
        }
    }
    cout << endl;
}

1 个答案:

答案 0 :(得分:0)

binary

问题出在第一个循环之后,i比最后一个索引大一个。例如,假设您输入1:输入do...while循环,数字1放入数组索引0,然后i递增到1

然后,在第二个循环中,打印索引10。您可以通过在进入此循环之前递减i来解决此问题:

i--;
while (i >= 0){...}

你应该做这样的事情,因为如果你最终使用所有32数字,你会尝试访问bin[32],程序可能会崩溃或输出乱码。

hex

第一个循环的条件是无限的:

for (i = 0; i >= 0; i++){...}

它应与binary中的条件相同:

for (i = 0; numb != 0; i++){...}

但是你还没有完成,因为我注意到你的印刷中也有一个错误:

if (hex[i] >= 10)
{
    switch (hex[i])
    {
        case 10:
            cout << "A";
            break;
        ...
    }
}
cout << hex[i];

如果hex[i]大于或等于10,则会打印两次,一次为十六进制字母,一次为十进制数字。要解决此问题,您可以在交换机中使用continue代替break(跳过第二次打印),或使用else

if (hex[i] >= 10)
{
    switch (hex[i])
    {
        case 10:
            cout << "A";
            break;
        ...
    }
}
else
{
    cout << hex[i];
}

您还需要进行与binary中相同的更正:

// decrementing i before entering the loop
//   vvv
for (i--; i >= 0; i--){...}

Your revision不正确,hex不应该有嵌套循环。这很好before,只是我已经指出的更正。