C++十进制数转换成其他进制数
zzqth 2012-03-22 04:59:06 /***************************************************************************************
* File Name : stack.h *
* Created by (Author, Date ) : 张志强 2012/03/21 *
* Description : 定义常量、类 *
***************************************************************************************/
#ifndef DECIMALSWITCH_H
#define DECIMALSWITCH_H
#define STACK_INIT_SIZE 100//栈的初始大小
#define STACKINCREMENT 10 //当栈为满的时候,再次申请空间的增量
#define R 2 //转换成的进制数
typedef char SElemType; //栈内元素类型
using namespace std;
class Stack
{
public:
bool InitStack();//初始化栈
bool PushStack(SElemType &element);//把元素element放进栈中
bool PopStack(SElemType &element);//取出栈顶元素
void DestroyStack();//销毁栈
void PrintStack(int &iTemp);//打印栈内元素
private:
SElemType *piBase;//栈底指针
SElemType *piTop; //栈顶指针
int iStackSize; //栈的大小
};
#endif
/***************************************************************************************
* File Name : stack.cpp *
* Created by (Author, Date ) : 张志强 2012/03/21 *
* Description : 定义函数IniStack, PushStack, PopStack, PrintStack, DestroyStack *
***************************************************************************************/
#include <iostream>
#include <cstdlib>
#include "stack.h"
using namespace std;
/******************************************************************************
*Function Name : InitStack
* Description : 初始化栈,使栈顶指针和栈底指针都指向栈底
* Date : 2012/03/21
* Parameter : 无
* Return Code : bool 申请空间失败时返回false,否则返回true
* Author : 张志强
******************************************************************************/
bool Stack::InitStack()
{
piBase = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (NULL == piBase)
{
cout << "assign memory error!"
<< endl;
return false;
}
piTop = piBase;
iStackSize = STACK_INIT_SIZE;
return true;
}
/******************************************************************************
*Function Name : PushStack
* Description : 先判断栈是否满,在把数据存入栈中
* Date : 2012/03/21
* Parameter : 参数element
* Return Code : bool 当栈满时,申请空间失败时返回false,否则正常运行返回true
* Author : 张志强
******************************************************************************/
bool Stack::PushStack(SElemType &element)
{
if (piTop-piBase >= iStackSize)
{
piBase = (SElemType *)realloc(piBase, (iStackSize+STACKINCREMENT)*sizeof(SElemType));
if (NULL == piBase)
{
cout << "assign memory error!"
<< endl;
return false;
}
piTop = piBase +iStackSize;
iStackSize = iStackSize+STACKINCREMENT;
}
*piTop = element;
piTop++;
return true;
}
/******************************************************************************
*Function Name : PopStack
* Description : 先判断栈是否为空,为空返回false,否则取出栈顶元素,使栈顶
指针向下移动,返回true
* Date : 2012/03/21
* Parameter : 参数element 把取出的元素存入element中
* Return Code : bool 当栈为空时,返回false,否则正常运行返回true
* Author : 张志强
******************************************************************************/
bool Stack::PopStack(SElemType &element)
{
if (piTop == piBase)
{
cout << "Stack is empty!"
<< endl;
return false;
}
piTop--;
element = *piTop;
return true;
}
/******************************************************************************
*Function Name : DestroyStack
* Description : 释放栈申请的空间,使栈顶指针和栈底指针指向NULL
* Date : 2012/03/21
* Parameter : 无
* Return Code : void
* Author : 张志强
******************************************************************************/
void Stack::DestroyStack()
{
free(piBase);
piBase = piTop = NULL;
return;
}
/******************************************************************************
*Function Name : PrintStack
* Description : 利用函数PopStack取出栈顶元素并输出
* Date : 2012/03/21
* Parameter : 参数iTemp存储十进制数
* Return Code : void
* Author : 张志强
******************************************************************************/
void Stack::PrintStack(int &iTemp)
{
int iNum = iTemp;
SElemType element;
cout << "10进制数"
<< iNum
<< "转换成"
<< R
<< "进制为:";
while (piTop != piBase)
{
PopStack(element);
cout << element;
}
cout << endl;
return;
}
/***************************************************************************************
* File Name : conversion.h *
* Created by (Author, Date ) : 张志强 2012/03/21 *
* Description : 声明普通函数 *
***************************************************************************************/
#ifndef CONVERSION_H
#define CONVERSION_H
bool conversion(Stack &sTemp, int &iTemp);//把数iTemp转换成相应进制数,并存储在sTemp中
#endif
/***************************************************************************************
* File Name : conversion.cpp *
* Created by (Author, Date ) : 张志强 2012/03/21 *
* Description : 定义函数conversion函数 *
***************************************************************************************/
#include <iostream>
#include "stack.h"
/******************************************************************************
*Function Name : conversion
* Description : 把数iTemp转换成R进制数,依次对每个R进制数存入栈中
* Date : 2012/03/21
* Parameter : 参数sTemp为栈,参数iTemp为输入的十进制数
* Return Code : bool,当栈满时再次申请空间时,申请失败返回false,否则返回true
* Author : 张志强
******************************************************************************/
bool conversion(Stack &sTemp, int &iTemp)
{
Stack &s = sTemp;
int iNum = iTemp, iNumR;
bool iFlag;
char iPushElement;
while (iNum)
{
iNumR = iNum%R;
if (iNumR < 10)
{
iPushElement = iNumR+'0';
iFlag = s.PushStack(iPushElement);
}
else
{
iPushElement = iNumR-10+'A';
iFlag = s.PushStack(iPushElement);
}
if (!iFlag)
{
return false;
}
iNum = iNum/R;
}
return true;
}
/***************************************************************************************
* File Name : main.cpp *
* Created by (Author, Date ) : 张志强 2012/03/21 *
* Description : 十进制转R进制,要求:1.1<R<36, 2.定义堆栈(链表、数组均可)类,实现 *
3.R进制0,1,2,3,4,5,6,7,8,9,A,B,C,...(R-1) *
***************************************************************************************/
#include <iostream>
#include "stack.h"
#include "conversion.h"
int main(void)
{
int iNum;//存储输入的十进制数
bool iFlag;//存储函数返回值,用于判断申请空间是否成功
Stack sObject;
iFlag = sObject.InitStack();
if (!iFlag)//判断申请空间是否成功
{
return 1;
}
std::cout << "请输入十进制数:";
std::cin >> iNum;
if (iNum < 0)//输入的数值是否合法
{
std::cout << "input error!"
<< std::endl;
return 1;
}
iFlag = conversion(sObject, iNum);
if (!iFlag)//判断当栈满时,再次申请空间时是否成功
{
return 1;
}
sObject.PrintStack(iNum);
sObject.DestroyStack();
return 0;
}