进制转换器——章节实验作业
【问题描述】十进制数N和其他d进制数的转换是计算机实现计算的基本问题。通常我们可以使用短除法进行转换,基本原理为:N=(N div d)*d+N mod d(其中:div为整除运算,mod为求余运算)。短除法最先计算得出的余数为进制转换后的低位,最后计算得出的余数为进制转换后的高位,计算顺序和输出顺序相反,而栈具有后进先出的固有特性,致使栈成为程序设计中的有用工具我们。请使用栈的链式存储结构,设计一个程序,解决十进制转换成其他进制的问题。
【基本要求】数制转换计算器
输入任意一个非负十进制整数N,输入将要转换的进制数d,
打印输出与N等值的d进制数。
用户可实时退出程序。
【测试数据】
输入两个整数:十进制数1348和要转换的进制8
输出:十进制转换成的八进制数为2504
输入两个整数:十进制数1348和要转换的进制16
输出:十进制转换成的八进制数为544
输入两个整数:十进制数1348和要转换的进制2
输出:十进制转换成的二进制数为101 0100 0100
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
typedef int ElemType;
typedef struct linknode
{
ElemType data;
struct linknode* next;
}LinkStNode;
void Menu()
{
printf("\t数制转换计算器\n\n");
printf("\t1.转换\t2.退出\n");
}
void InitStack(LinkStNode **s)
{
*s = (LinkStNode*)malloc(sizeof(LinkStNode));
(*s)->next = NULL;
}
void Push(LinkStNode* s, ElemType e)
{
LinkStNode* p;
p = (LinkStNode*)malloc(sizeof(LinkStNode));
p->data = e;
p->next = s->next;
s->next = p;
}
bool Pop(LinkStNode* s, ElemType* e)
{
LinkStNode* p;
p = s->next;
if (p == NULL)
return false;
*e = p->data;
s->next = p->next;
free(p);
return true;
}
void Turn_Scale()
{
int n, temp, j=1, flag=1, i;
ElemType e;
LinkStNode *s;
InitStack(&s); //注意指针传递问题
printf("请输入需要转换进制的数:");
scanf("%d", &e);
printf("请输入转换的进制:");
scanf("%d", &n);
while (flag != 0)
{
flag = e / n;
temp = e % n;
e = flag;
Push(s,temp);
}
printf("转换的%d进制数为:", n);
while (s->next!=NULL)
{
Pop(s, &e);
printf("%d", e);
}
printf("\n输入0结束打印!\n");
scanf("%d", &j);
if (j == 0)
return;
}
int main()
{
int n;
while (1)
{
system("cls");
Menu();
printf("\n请输入相关序号:\n");
scanf("%d", &n);
switch (n)
{
case 1:
Turn_Scale();
break;
case 2:
system("cls");
exit(0);
break;
default:
printf("输入有误!\n");
Sleep(2000);
break;
}
}
return 0;
}
更多推荐
进制转换器——章节实验作业(C语言链栈)
发布评论