/************************************************************************************************
********************************************fuction.cpp******************************************
文件功能:进制转换函数实现
程序员 :周望远
时间 :2009\9\10
备注 :无
版本 :version 1.0
***************************************版权所有,盗版必究****************************************
************************************************************************************************/
#include<iostream>
#include<string>
#include<ctype.h>
#include"Stack.h"
using namespace std;
/*************************************************************************
函数功能:将字符转换为数值
输入参数:字符ch
返回值 :转换后的十进制值
备注 :无
*************************************************************************/
int Ch2Dec(char ch)
{
int temp=0;
if(isalnum(ch)){ //判断是否是数字字符,如果是则转换成相应的数
if(isdigit(ch)) temp=ch-'0'; //是个数字
if(islower(ch)) temp=ch-'a'+10; //是个小写字符
if(isupper(ch)) temp=ch-'A'+10; //是个大写字符
}
else{ //不是字符,返回出错信息
temp=-1;
}
return temp;
}
/*************************************************************************
函数功能:将M进制的数转换为10进制
输入参数:进制M,字符串Mdata和返回值result
返回值 :转换后的十进制
备注 :无
*************************************************************************/
int M2Dec(int M, string & Mdata,double& result)
{
int polarity=1;//默认极性为正
int length=Mdata.length();//待转换字符的长度
int i=0;
int temp;
double decimal=0;
double chushu=1;
//去掉符号
if(Mdata[0]=='-') {
polarity=-1;
i++; //下标加1
}
if(Mdata[0]=='+') i++;//下标加1
result=0;
for(;i<length;i++){
if(Mdata[i]!='.'){
temp=Ch2Dec(Mdata[i]);
if(temp==-1) return -1; //返回出错,停止转换
if(temp>=M) return -1; //转换后的数值大于基数也是错误
result=result*M+temp; //进制转换
}
else{ //小数部分处理
i++;
string xiaoshu=Mdata.substr(i,length-i);
int len=xiaoshu.length();
for( i=len-1;(i>=0)&&(xiaoshu[i]=='0');i--) //除去末尾的0
xiaoshu=xiaoshu.substr(0,xiaoshu.length()-1);
len=xiaoshu.length();
for(i=0;i<len;i++){
temp=Ch2Dec(xiaoshu[i]);
if(temp==-1) return -1; //返回出错,停止转换
if(temp>=M) return -1; //转换后的数值大于基数也是错误
decimal=decimal*M+temp;
chushu*=M;
}
result=decimal/chushu +result;
break;
}
}
result*=polarity;
return 1;
}
/*************************************************************************
函数功能:将10进制的数转换为M进制
输入参数:进制M,数值dec和返回值result
返回值 :转换后的M进制
备注 :利用常规方法实现
*************************************************************************/
void Dec2MString(int M,double dec,string & result)
{
int iter=0;
double decimal=0;
string str;
char Table[]={'0','1','2','3','4','5','6','7', //字符数字转换表
'8','9','A','B','C','D','E','F'};
if(dec<0){
result+='-';
dec*=-1; //转换为正数
}
decimal=dec-(long int)dec ;//小数部分处理
while(dec>0.5){ //停止条件改为0.5是为了消除浮点数在计算机内存储的误差
iter=(long int)dec%M;
dec=(long int)dec/M;
str+=Table[iter];
}
//倒置
int j=str.length()-1;
int i=0;
int temp;
for(;i<j;i++,j--){
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
result+=str;
int loop=0;
temp=0;
if(decimal>1e-6){
result+='.';
while((decimal>1e-6)&&loop<30){
temp=decimal*M;
decimal=decimal*M-temp;
result+=Table[temp];
loop++;
}
}
}
/*************************************************************************
函数功能:将10进制的数转换为M进制
输入参数:进制M,数值dec和返回值result
返回值 :转换后的M进制
备注 :利用数组实现
*************************************************************************/
void Dec2MArray(int M,double dec,char result[])
{
int iter=0;
int i=0;
int j=0;
int length;
int temp;
double decimal=0;
char Table[]={'0','1','2','3','4','5','6','7', //字符数字转换表
'8','9','A','B','C','D','E','F'};
if(dec<0) {
result[i++]='-';
dec*=-1; //转换为正数
}
decimal=dec-(long int)dec ;//小数部分处理
while(dec>0.5){ //停止条件改为0.5是为了消除浮点数在计算机内存储的误差
iter=(long int)dec%M;
dec=(long int )dec/M;
result[i++]=Table[iter];
}
result[i]='\0'; //字符串结束符
length=i;
j=i-1;
if(result[0]=='-')
i=1; //有负号倒置从第二位开始
else
i=0; //否则从第一位开始
while(i<j){ //将数组倒置
temp=result[i];
result[i]=result[j];
result[j]=temp;
i++;
j--;
}
int loop=0;
temp=0;
if(decimal>1e-6){
result[length++]='.';
while((decimal>1e-6)&&loop<30){
temp=decimal*M;
decimal=decimal*M-temp;
result[length++]=Table[temp];
loop++;
}
}
result[length]='\0';
}
/*************************************************************************
函数功能:将10进制的数转换为M进制
输入参数:进制M,数值dec和返回值result
返回值 :转换后的M进制
备注 :利用栈实现
*************************************************************************/
void Dec2MStack(int M,double dec,Stack<char> & result)
{
int iter=0;
int polarity=1;
char Table[]={'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
result.Erase();
int k=0;
int result1[100];
double decimal=0;
if(dec<0){
polarity=-1;
dec*=-1;//转换为正数
}
decimal=dec-(long int)dec ;//小数部分处理
int temp=0;
int loop=0;
if(decimal>1e-6){
result1[k++]='.';
while((decimal>1e-6)&&loop<30){
temp=decimal*M;
decimal=decimal*M-temp;
result1[k++]=Table[temp];
loop++;
}
for(int m=k-1;m>=0;m--)
result.Push(result1[m]);
}
while(dec>0.5){ //停止条件改为0.5是为了消除浮点数在计算机内存储的误差
iter=(long int) dec%M;
dec=(long int )dec/M;
result.Push(Table[iter]);
}
if(polarity==-1) result.Push('-'); //如果为负数则压入负号
}
数据结构课程设计_用栈、数组等解决数制转换问题
3星 · 超过75%的资源 需积分: 15 6 浏览量
2010-06-09
20:35:55
上传
评论 11
收藏 1.84MB RAR 举报
qq349193851
- 粉丝: 0
- 资源: 7
最新资源
- 三次样条插值在C语言如何实现步骤介绍.docx
- SD6084电流模式同步降压转换器固定频率1.5MHz二极管封装SOT23-5
- NokoPrint-wifi蓝牙USB连接打印机[安卓免费App]
- 20211115aMmF9NbS.zip
- 解线性方程组-直接解法:(Gauss)高斯消去法、列主元、全主元 - 北太天元
- MapReduce单词统计 hadoop集群
- 深度学习源码神经网络新闻分类多分类问题ipynb源码带数据集
- 深度学习源码神经网络用预训练的卷积神经网络ipynb源码带数据集
- 深度学习源码神经网络使用词嵌入ipynb源码带数据集
- 深度学习源码神经网络使用LSTM生成文本ipynb源码带数据集
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈