Делая сумму с символом - PullRequest
0 голосов
/ 05 июня 2019
#include <iostream>
#include <cstring>

using namespace std;

int test(char[], int);
void decal(char[], int n);

int main()
{
    char a[10], b[10], c[10];
    int valid;
    do {
        cout << "Insert first number (maximum 5 chars hexa):" << endl;
        cin >> a;
        valid = test(a, strlen(a));
        if(!valid)
            cout << "Error." << endl;
    } while (!valid);
    cout << "First number: " << a << endl;
    decalez(a, strlen(a));
    cout << "First number after insert: " << a << endl;
    do {
        cout << "Insert 2nd number (maximum 5 chars hexa):" << endl;
        cin >> b;
        valid = test(b, strlen(b));
        if(!valid)
            cout << "Error." << endl;
    } while (!valid);
    decalez(b, strlen(b));
    cout << "2nd number after insert: " << b << endl;
    add(a, b);  //  Calculating c
    cout << "Result: " << c << endl;
    return 0;
}

int test(char x[], int n)
{
    if(n > 5)
        return 0;  //  Too many numbers
    for(int i = 0; i < n; i++)
    {
        if(x[i] <48 || (x[i] > 57 &&
            x[i] < 65) || (x[i] > 70 && x[i] < 97) || x[i] >
            102)
            return 0;  
        }
    return 1;
}

void decal(char x[], int n)
{
    int i, nz;
    x[5] = '\0';
    nz = 5 - strlen(x); 
    if(nz > 0) {
        for(i = 0; i < n; i++)
            x[5 - i- 1] = x[n-i-1];
    }

    for(i = 0; i < nz; i++)
        x[i] = '0';
}

Мне дали этот школьный проект по созданию шестнадцатеричного калькулятора. Учитель сделал нам следующий код. Обязательно

Моя проблема - пустое дополнение. Как можно добавить символ? Я знаю, что есть более простые способы сделать шестнадцатеричный калькулятор, но мы должны использовать этот код. Итак, как я могу написать сумму что-то вроде 1cec + bec = 28d8 в гекса?

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Предполагая существование этих функций

// Convert hexadecimal string 'number' into an integer.
int fromHex(const char* number);

// Convert 'number' to hexadecimal in 'result', assuming that the result will fit.
void toHex(int number, char* result);

, вы можете написать add следующим образом:

void add(const char* hex_a, const char* hex_b, char* hex_c)
{
    int a = fromHex(hex_a);
    int b = fromHex(hex_b);
    toHex(a + b, hex_c);
}

Реализация функций преобразования, оставленных в качестве упражнения.

0 голосов
/ 05 июня 2019

Вот пример того, как вы можете добавить шестнадцатеричные числа. Этот упрощенный код обтекает 5-значное переполнение.

#include <iostream>
#include <exception>
#include <cstring>

using std::cout;
using std::endl;

struct BadDigit : public std::exception { };

int hexToDec( const char c ) {

    if ( c >= '0' && c <= '9' ) {
        return c -'0';
    }
    else if( c>= 'A' && c<='F') {
        return c - 'A' + 10;
    }
    else if ( c >= 'a' && c<='f' ) {
        return c - 'a' + 10;
    }
    else {
        throw BadDigit();
    }
}

char decToHex( int d ) {
    if ( d >= 0 && d <= 9 ) {
        return d + '0';
    }
    else if ( d >= 10 && d <= 15 ) {
        return d - 10 + 'A';
    }
    else {
        throw BadDigit();
    }
}

void add( const char *a, const char *b, char *s )
{
    int rem = 0;
    for (int i = 4; i >= 0; i-- ) {
        int ai = hexToDec(a[i]);
        int bi = hexToDec(b[i]);
        int ri = ai + bi + rem;
        s[i] = decToHex( ri % 16 );
        rem = ri / 16;
    }
}

int main()
{
    const char *hex1 = "effff";
    const char *hex2 = "00001";
    char result[7];
    try {
        add(hex1, hex2, result);
    }
    catch (std::exception& e) {
        cout << "Exception: " << e.what() << endl;
        return 1;
    }
    cout << hex1 << " + " << hex2 << " = " << result << endl;
    return 0;
}
0 голосов
/ 05 июня 2019

Вы можете объявить два шестнадцатеричных числа в C ++

 int a = 0x934;//any hex value,the 0x indicates that integer is in base 16
 int b = 0x30A;
 int c = a+b;
 cout<<c<<endl;//will print the answer in decimal
 printf("%u\n",c);//prints the answer in hex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...