数据结构实验:将十进制数转成其它进制,C语言实现

在Visual Studio调试通过
代码:
#define _CRT_SECURE_NO_WARNINGS
//十进制整数转化为R进制整数算法
#include <stdlib.h>
#include<stdio.h>
#define MAXSIZE 100

typedef struct {
	int data[MAXSIZE];
	int top;
}SeqStack, *PSeqStack;


float X;
int R;
void NumConvert(int X, int R);
PSeqStack Init_SeqStack(PSeqStack S);
int Empty_SeqStack(PSeqStack S);
int Push_SeqStack(PSeqStack S, int x);
int Pop_SeqStack(PSeqStack S, int * x);
int GetTop_SeqStack(PSeqStack S, int * x);
void Destroy_SeqStack(PSeqStack *S);
void Judge(PSeqStack S);
void InputX();
void InputR();
void DisplayStack(PSeqStack S);//定义



int main()
{
	//float X;
	//int R;
	InputX();
	InputR();
	NumConvert(X, R);
	system("pause");
	return 0;
}

/***************************函数*******************************/
void NumConvert(int X, int R)//X为十进制整数 R是要转换成的进制
{
	int Nega_X, t;//x可能为负数,需要转换成正数
	PSeqStack S;
	S = (PSeqStack)malloc(sizeof(SeqStack));
	//SeqStack &S;
	Init_SeqStack(S);

	if (R <= 10)
	{
		if (X < 0)
		{
			Nega_X = -X;

			while (Nega_X != 0)
			{
				t = Nega_X%R;
				Push_SeqStack(S, t);
				Nega_X = Nega_X / R;
			}
			Push_SeqStack(S, 1);//-数符号位为1
		}
		else if (X >= 0)
		{
			while (X != 0)
			{
				t = X%R;
				Push_SeqStack(S, t);
				X = X / R;
			}
			Push_SeqStack(S, 0);
		}
		DisplayStack(S);
		Destroy_SeqStack(&S);
	}
	else if (R = 16)
	{
		if (X < 0)
		{
			Nega_X = X;
			while (Nega_X)
			{
				t = Nega_X%R;
				Push_SeqStack(S, t);
				Nega_X = Nega_X / R;
			}
			Push_SeqStack(S, 1);
		}
		else if (X >= 0)
		{
			while (X)
			{
				t = X%R;
				Push_SeqStack(S, t);
				X = X / R;
			}
			Push_SeqStack(S, 0);
		}
		Judge(S);
		Destroy_SeqStack(&S);
	}
	//else {
	//	printf("请输入正确的进制数!!\n");
	//	InputR();
	//}
}

//初始化栈
#pragma region 初始化
PSeqStack Init_SeqStack(PSeqStack S)
{
	//PSeqStack S;//指向顺序栈的指针
	
	if (S) {
		S->top = NULL;
	}
	return S;
}
#pragma endregion


//判空
int Empty_SeqStack(PSeqStack S)
{
	if (-1 == S->top) {
		return 1;
	}
	else {
		return 0;
	}
}

//入栈
int Push_SeqStack(PSeqStack S, int x)
{
	if (S->top == MAXSIZE - 1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top] = x;
		return 1;
	}
}

//出栈
int Pop_SeqStack(PSeqStack S, int * x)
{/*删除栈顶元素并保存在*x  */
	if (Empty_SeqStack(S))
	{
		return 0;
	}
	else
	{
		*x = S->data[S->top];
		S->top--;
		return 1;
	}
}

//取栈顶元素
int GetTop_SeqStack(PSeqStack S, int * x)
{
	if (Empty_SeqStack(S))//!=0  即为空
	{
		return 0;
	}
	else {
		*x = S->data[S->top];
		return 1;
	}
}

//销毁栈
void Destroy_SeqStack(PSeqStack *S)
{
	if (*S)
		free(*S);
	*S = NULL;
	return;
}

//判断16进制 
void Judge(PSeqStack S)
{
	int i;
	printf("输出为(左边第一位为符号位)\n");
	for (i = S->top; i > 0; i--)
	{
		
		switch (S->data[i])
		{
		case 10:printf("A");
			break;
		case 11:printf("B");
			break;
		case 12:printf("C");
			break;
		case 13:printf("D");
			break;
		case 14:printf("E");
			break;
		case 15:printf("F");
			break;
		default:printf("%d", S->data[i]);
			break;
		}
	}
}

//输入
void InputX()
{

	printf("请输入一个十进制整数:\n");
	scanf("%f", &X);
	while (X != (int)X)
	{
		printf("你输入的不是整数!!\n");
		InputX();
	}
	//X = (int)X;
}
void InputR()
{
	printf("\n请输入希望转成的进制数:\n");
	scanf("%d", &R);
	while (R > 10 && R>16)
	{
		printf("关于大于10的进制中只支持小于等于16进制!请重新输入:\n");
		scanf("%d", &R);
	}
}

//输出
void DisplayStack(PSeqStack S)
{
	int i;
	printf("%d 进制输出为(左边第一位为符号位,0为正):\n",R);
	for (i = S->top; i > 0; i--)
	{
		printf("%d", S->data[i]);
	}
}


你可能感兴趣的:(数据结构,栈,进制转换)