进制转换器——章节实验作业


【问题描述】十进制数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语言链栈)