【发布时间】:2019-04-29 05:33:29
【问题描述】:
我想制作一个能够用十进制数进行计算并能够以各自的二进制、八进制或十六进制表示形式返回十进制值的计算器。
到目前为止,在 main 方法中程序读取命令行,我可以通过两种方式调用程序。
第一种方法是使用 3 个值:
"number1" "operator" "number2".
第二种方法是使用 4 个值:
“希望输出的数字系统”“number1”“operator”“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;
}
我现在的问题是由于用户应该能够输入不同的数字系统(例如十进制、八进制或十六进制)我如何识别不同的数字系统然后将它们转换为十进制以便我可以计算结果。之后,必须将这些十进制数字转换回用户想要的所需数字系统。
【问题讨论】:
-
如果没有任何指示符,就无法知道像
3这样的数字是属于八进制、十六进制还是十进制。您必须要求用户指定每个输入将在哪个系统中。 -
所以在我的情况下,我会不使用十进制值的前缀,使用零作为八进制数的前缀,使用 0x 作为十六进制数的前缀
-
@Trikalium 输入错误的数字(如
0128、0x12abx)会发生什么? -
如果出现 '0x12abx' 或 '0128' 之类的情况,最好在 stringTOint 转换期间发出警告