运用C语言进行数制转换。实现十进制数据向N(2、8或16) 进制数据的转换。 要求: 1) 利用顺序栈或链栈,写一个函数实现以上数制转换; 2) 设计一个主函数进行测试;
时间: 2024-11-10 18:24:54 浏览: 48
在C语言中,我们可以创建一个函数来实现十进制数向二进制、八进制或十六进制的转换。这里我们使用顺序栈(数组栈)来进行转换,因为顺序栈实现简单,适合较小规模的转换。以下是一个简单的示例:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STACK_SIZE 50 // 栈的最大容量
typedef struct {
int data[MAX_STACK_SIZE];
int top;
} Stack;
// 初始化栈
void init(Stack* s) {
s->top = -1;
}
// 入栈操作
void push(Stack* s, int value) {
if (s->top < MAX_STACK_SIZE - 1) {
s->data[++s->top] = value;
} else {
printf("Stack overflow!\n");
}
}
// 出栈操作
int pop(Stack* s) {
if (s->top >= 0) {
return s->data[s->top--];
} else {
return -1; // 如果栈为空,返回-1
}
}
// 十进制转其他进制
char* decimal_to_base(Stack* s, char base[]) {
int num = pop(s);
int len = strlen(base);
while (num > 0) {
base[len++] = num % base[0] + '0'; // 对于二进制('0'-'1')或八进制('0'-'7')
base[len - 1] += 'A' - 10; // 对于十六进制('A'-'F')
num /= base[0]; // 更新数字
}
// 倒置字符串
base[len] = '\0';
reverse_string(base, len);
return base;
}
// 反转字符串
void reverse_string(char* str, int len) {
int start = 0, end = len - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
// 主函数
int main() {
Stack stack;
init(&stack);
int decimal_num = 12345; // 测试数字
char base[] = "ABCDEF"; // 十六进制字符集
push(&stack, decimal_num / base[0]); // 转换每一位并入栈
char result[100] = {0};
result = decimal_to_base(&stack, result); // 转换整个数
printf("Decimal to %s: %s\n", base, result);
return 0;
}
```
这个程序首先将十进制数分解成一个个位,然后将每个位的值入栈,再从栈中依次取出每一位,按照指定基数转换成相应字符,并存储到结果字符串中。
注意:这个示例仅适用于单次转换,并且没有处理负数和超出范围的情况。实际应用中,可能需要添加错误检查和更复杂的逻辑。
阅读全文