首页 > 解决方案 > 十进制、八进制和十六进制数的计算器

问题描述

我想制作一个能够用十进制数计算并且能够以它们各自的二进制、八进制或十六进制表示形式返回十进制值的计算器。

到目前为止,在 main 方法中程序读取命令行,我可以通过两种方式调用程序。

第一种方法是使用 3 个值:

“编号 1”“操作员”“编号 2”。

第二种方法是使用 4 个值:

“希望输出的数字系统”“number1”“运算符”“number2”。

对于希望的数字系统,输出 b 代表二进制,o 代表八进制,h 代表十六进制。在这两种方式中,用户都应该能够为输入 number1 和 number2 输入十进制、八进制和十六进制数。

#include "zahlen.h"
#include <stdio.h>
#include "stringTOint.h"   

int main(int argc, char *argv[]) {
    char o,op,sx[DIGITS+1],sy[DIGITS+1],sz[DIGITS+1];
    int x,y,z;
    char flag_x,flag_y;

    /* 1) Read Commandline */
    if (argc != 4 && argc != 5) {
        printf("Aufruf: %s -o <x> <op> <y> \n",argv[0]);
        return 1;
    } else if(argc == 4) {
        x = stringTOint(argv[1]);
        op = argv[2][0];
        y = stringTOint(argv[3]);
    } else if(argc == 5) {
        o = argv[1][0];
        x = stringTOint(argv[2]);
        op = argv[3][0];
        y = stringTOint(argv[4]);
        if(o != 'b' && o != 'o' && o != 'h') {
            printf("Wrong Operation\n");
            return 1;
        }
    }

    /* 2) Solve the equation */
    if(argc==4) {
        printf("solve: %s %c %s \n", argv[1], op, argv[3]);
        z = solve(x, op, y);
    } else if(argc==5) {
        printf("solve: %s %c %s \n", argv[2], op, argv[4]);
        z = solve(x, op, y);
    }

    /* 3) Calculate the Representation of the wished Numeral System */
    switch(o) {
        case 'b':
            intTObinaer(x, sx);
            intTObinaer(y, sy);
            intTObinaer(z, sz);
            break;

        case 'o':
            intTOoctal(x,sx);
            intTOoctal(y,sy);
            intTOoctal(z,sz);
            break;

        case 'h':
            intTOhexal(x,sx);
            intTOhexal(y,sy);
            intTOhexal(z,sz);
            break;

        default:
            intTObinaer(x, sx);
            intTObinaer(y, sy);
            intTObinaer(z, sz);
            break;
    }

    /* 4) Return the results */
    printf("\n  %s %d\n%c %s %d\n= %s %d\n", sx,x,op,sy,y,sz,z);

    return 0;
}

方法 intTObinaer、intTOoctal 和 intTOhexal 仅以十进制数除以基数不同。

intTObinaer(int i, char str[]) {
    unsigned int zahl = i;
    int j;

    /* Fill Array with zeros */
    int x = 0;
    for (x; x < DIGITS+1; x++) {
        str[x] = '0';
    }

    /*Calculate the Binary representation of the given Decimal integer */
    for (j = DIGITS-1; j > 0; j--) {
        /* This base gets changed to 8 or 16 for octal and hexal representation */
        str[j] = (char) (zahl % 2) + '0';
        zahl = zahl / 2;
        if (zahl == 0) {
            break;
        }
    }

    /* Set the end of the Array */
    str[DIGITS] = '\0';
}

实际方程在求解方法中得到求解,其中 number1 和 number2 的正确操作由 switchcase 选择,其中不同的情况可以通过用户在两个数字之间输入的字符操作来选择。

#include <stdio.h>

int solve(int x, char op, int y) {
    int ergebnis = 0;
    switch(op) {
        case '+':
            ergebnis = x + y;
            break;

        case '-':
            ergebnis = x - y;
            break;

        case '*':
            ergebnis = x * y;
            break;

        case '/':
            ergebnis = x / y;
            break;

        case '&':
            ergebnis = x & y;
            break;

        case '|':
            ergebnis = x | y;
            break;

        default:
            printf("Wrong input\n");
    }

    return ergebnis;
}

我现在的问题是由于用户应该能够输入不同的数字系统(例如十进制、八进制或十六进制),我如何识别不同的数字系统然后将它们转换为十进制以便我可以计算结果。之后,必须将这些十进制数字转换回用户想要的所需数字系统。

标签: cbinaryhexoctal

解决方案


看起来您只需要添加两行即可:

#include "stdlib.h"

#define stringTOint(arg) ((int)strtol(arg,NULL,0))

或者更好的是,stringTOint()用相应的调用替换那些调用strtol()(当然还要添加#include)。

strtol()使用与 C 文字相同的前缀:0对于八进制,0x对于十六进制,没有前缀是十进制。


推荐阅读