c - 十进制、八进制和十六进制数的计算器
问题描述
我想制作一个能够用十进制数计算并且能够以它们各自的二进制、八进制或十六进制表示形式返回十进制值的计算器。
到目前为止,在 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;
}
我现在的问题是由于用户应该能够输入不同的数字系统(例如十进制、八进制或十六进制),我如何识别不同的数字系统然后将它们转换为十进制以便我可以计算结果。之后,必须将这些十进制数字转换回用户想要的所需数字系统。
解决方案
看起来您只需要添加两行即可:
#include "stdlib.h"
#define stringTOint(arg) ((int)strtol(arg,NULL,0))
或者更好的是,stringTOint()
用相应的调用替换那些调用strtol()
(当然还要添加#include)。
strtol()
使用与 C 文字相同的前缀:0
对于八进制,0x
对于十六进制,没有前缀是十进制。
推荐阅读
- azure - Cosmos DB 高额查询费用
- python - 如何将函数链接到 Tkinter 中的按钮?
- node.js - 尝试安装 VueJs 项目时来自 fsevents 的普通错误
- python - 如何从 csv 文件的列中提取某些字符串?
- javascript - 将数据传递给Vue中的模态不起作用
- wordpress - 如何在 Wordpress 中添加两个自定义帖子类型的两个小部件
- assembly - 将值从寄存器存储到内存中的问题,ARM 32位
- css - 样式化的组件填充 MUI 网格内的 div 高度
- linux-kernel - IOMMU 如何通过 DMA 取消映射来自不同外设的 IOVA
- sms - 华为 Cdma 调制解调器,如何通过 C# App 或 AT 命令发送短信