进制转换( C++字符数组 )
注:
较为简便的方法是用 整型(int)或浮点型(long、double 注意:该类型不一定能够准确存储数据) 来存放待转换的数值,可直接取余得到每一位数值
较为稳定的方法是用 字符数组储存待转换的数值,这将能够完整存储数据,但是也相对于代码较长
进制转换只需要两步: R -> 十 或者 十 -> R (R表示除十进制的任意进制,10表示十进制)
以下是较为完整的全部代码,若是实现如何转换的,主看:
void Ten_Other(char[],int,int,char[],int&);
void Other_Ten(char[],int,int,char[],int&);
两个函数的实现
#include <iostream>
using namespace std;
struct Node {
Node * Next;
int data;
};
class Stack { // 先进后出,用于存放除得的余数,取栈元素的时候正好于计算的相反,参见 短除法取得的余数的逆序为二进制数
public:
Stack();
~Stack();
char GetTop();
bool Push(char);
bool Isempty();
bool Pop();
private:
Node * Head;
};
class Queue { //先进先出,用于存放计算获得的每一位上的数值,参见 位权展开法,正序
public:
Queue();
~Queue();
char GetTop();
bool Add(char);
bool Drop();
bool Isempty();
private:
Node * Head;
Node * Tail;
}; void Ten_Other(char[],int,int,char[],int&); //数组指针,长度,转换进制 10 ->x , 目标数组,组长
void Other_Ten(char[],int,int,char[],int&); //数组指针,长度,转换进制 x ->10 , 目标数组,组长
void Run(char*,int,int,int,char*,int&); //重载数组,长度,当前数组进制,目标进制
void Show(char[],int);
void Create(char[],int&);
int main() { bool flag = true;
const int max = ;
char Arr[max]; // 作为原始数组 或 目标进制放入该数组中
int len=max; // 数组最大字符数据 也同时是目标数组的长度
while(flag) {
cout<<"请输入您要转换的进制(以 # 作为结束符):";
Create(Arr, len);
cout<<"请输入您刚输入的进制数和目标进制数:";
int start, end;
cin>> start>> end; cout<<"进制转换: ";
Show(Arr, len);
Run(Arr, len, start, end, Arr, len);
cout<<" -> ";
Show(Arr, len);
cout<<endl;
cout<<"输入0 结束, 输入1 继续: " ;
cin>> flag;
} delete[] Arr;
return ;
}
void Create(char* m,int& len) {
char ch;
int i=;
cin>> ch;
while( ch!='#') {
m[i++] = ch;
cin>> ch;
}
len = i;
}
void Show(char* m,int len) {
for(int i=; i<len; ++i)
cout<<m[i];
}
void Run(char* str,int length,int ton,int con,char* Arr,int& len) {
int AL;
if(ton==) { // R -> 10
Ten_Other(str, length, con, Arr, AL);
} else if(con==) { // 10 -> R
Other_Ten(str, length, ton, Arr, AL);
} else {
Other_Ten(str, length, ton, Arr, AL); // 先将原始进制转化为10 进制
Ten_Other(Arr, AL, con, Arr, AL); //再将10 进制 转化为目标进制
}
len = AL;
}
void Ten_Other(char* str,int length,int con,char* Array,int& AL) {
Stack s;
Queue q; //注: 本函数结束后自动析构 s q
int i=, m=, len=length;
double n=;
while( str[i]!='.' && len!=) { // 将整数存放在 m 中
m = (((int)str[i]-'') + m)*; ///
i++;
len--;
}
m = m / ; // 注意:此时除以 10,因为上面的while中,对整数的末尾多乘了一次
if(len!=) { //判断是否有 . 有则将下标前置一个到小数点之后,
i++;
len--;
}
double tem=; // 此处不能为int ,否则下面计算 n 所得的结果为整数:((int)(str[length-len]-48)) / tem,结果为整数
while( len>) { // 将小数部分存放在 n 中
tem = * tem;
n = ((int)(str[length-len]-)) / tem + n;
len--;
}
// 开始转换进制 m为整数部分, n为小数部分
while( m!=) { // 整数用栈
tem = m % con; // tem为全局变量
m = m/con;
s.Push(tem); // tem可能大于9 ,即为十六进制数
} // 将取余所得的全部放入栈中
i = ; // i 为全局变量
double dou=;
while(i!= && n!=) { // 对小数部分做五次运算 小数部分入队
dou = n * con;
m = dou; //再次使用全局变量 tem ,当tem 中的内容不需要的时候可任意使用
q.Add(m);
n = dou - m; // 去掉整数部分再次执行计算小数
} // 取得小数部分的进制数,可能含有十六进制所对应的字母序列 // char Array[20]; // 将数据存放在 数组里面
char ch;
i = ; // 注: i++ 表示先用再加!
if( s.Isempty()==true) { // 判断是否含有整数,没有整数部分,应该放入 0,然后放 . 例如: 0 . 5124
Array[i++] = '';
}
while( !s.Isempty()) { // 栈不空,即栈含有数值,放入数组中
m = s.GetTop(); // 得到的是数值
if(m>= && m<=) { // 通过上面的计算得到的数值都是在0 ~ 15 之间
ch = m + ; // 45的ASCII码为 字符 0
} else {
ch = m + ; // 若 m = 10; 则因为 A ; 65 = 10 + 55;
}
Array[i++] = ch;
s.Pop(); // 将已访问过得头结点出栈,即删除
} // 整数部分放完
if( !q.Isempty()) { // 队列 q 不空,表示含有小数位,故需要小数点 “ . ”, 若无小数位,则不需要“ . ”
Array[i++] = '.';
}
while( !q.Isempty()) {
m = q.GetTop(); // 得到的是数值
if(m>= && m<=) { // 通过上面的计算得到的数值都是在0 ~ 15 之间
ch = m + ; // 45的ASCII码为 字符 0
} else {
ch = m + ; // 若 m = 10; 则因为 A ; 65 = 10 + 55;
}
Array[i++] = ch;
q.Drop();
} AL = i; // 注意: 此时的 i 变成了数组的组长,所以将组长存放在 AL中
} void Other_Ten(char* str,int length,int Other,char* Array,int& AL) {
Stack s;
Queue q; //注: 本函数结束后自动析构 s q
int i=, len=length, Integer=, m=;
double Dicimal=; // len为length的一份拷贝 Integer存放整数 Dicimal 小数
int tem=;
while(str[i]!='.' && len!=) { // 整数的数值入队,不含小数点
tem = str[i]- ;
if(str[i]>='A' && str[i]<='F') { //当为十六进制的时候 就不能够 减去字符 0 的ascii码而得到目标数值
tem = str[i]- ;
}
q.Add( tem);
len--;
i++;
} // i 为队长 len 为入队后剩余的字符个数 while(i!=) { // 不计算倒数第一位
m = q.GetTop(); //获取头结点
q.Drop(); //将头结点出栈删除
Integer = (m + Integer) * Other;
i--;
}
Integer = Integer + (int)q.GetTop(); // 计算最后一位,整个值加上最后一个值,得到整数部分的目标进制数
q.Drop();
// 以上整数部分操作完毕 len--; // len--后,为-1,表str全为整数,为0,表剩余一个 ‘ . ’, 大于0,表含有小数点,且点后有数
while( len>) {
m = str[length-len]- ;
if( str[length-len]>='A' && str[length-len]<='F') {
m = str[length-len] - ;
}
s.Push( m); // length-len,例如,共长8,小数位为3, 8-3=5,此时的str[5]为小数位第一个
len--;
} //将小数位全部入栈 while( !s.Isempty()) { // s不空表示含有小数位
m = s.GetTop();
s.Pop(); // m 为全局变量,再次使用
Dicimal = (m + Dicimal) / Other;
} // cout<<Integer+Dicimal<<"(D)"<<endl; 得到的数值,为了统一将其放入数组中
// 以下全部为了将数据放入数组中, 一开始未意识到,故此多了一些代码段
i = ;
if(Integer==) {
Array[i++] = '';
}
while(Integer!=) { // 将整型入栈
m = Integer % ; // m 为整型
Integer = Integer / ;
s.Push(m);
}
char ch;
while(!s.Isempty()) { // 将栈元素放入数组
ch = s.GetTop() + ;
s.Pop();
if( ch>'') { // 判断是否为十六进制数
ch = ch + ;
}
Array[i++] = ch;
} if(Dicimal!=) {
Array[i++] = '.';
} while(Dicimal!=) {
Dicimal = Dicimal * ;
m = Dicimal;
Dicimal = Dicimal - m;
q.Add(m);
}
while(!q.Isempty()) {
ch = q.GetTop() + ;
q.Drop();
if( ch>'') { // 判断是否为十六进制数
ch = ch + ;
}
Array[i++] = ch;
}
AL = i;
} Stack::Stack() {
Head = new Node();
Head->Next = NULL;
} Stack::~Stack() {
Node * p;
while(Head) {
p = Head;
Head = Head->Next;
delete p;
}
}
char Stack::GetTop() {
if(Isempty()) {
return '\0';
} else {
return Head->data;
}
}
bool Stack::Push(char ch) {
Node * pNew = new Node();
pNew->data = ch;
pNew->Next = Head;
Head = pNew;
return true;
}
bool Stack::Pop() {
if(Isempty()) {
return false;
} else {
Node * tem = Head;
Head = Head->Next;
delete tem;
}
return true;
}
bool Stack::Isempty() {
return Head->Next==NULL;
} Queue::Queue() {
Head = new Node();
Head->Next = NULL;
Tail = Head;
}
Queue::~Queue() {
Node * p;
while(Head) {
p = Head;
Head = Head->Next;
delete p;
}
Tail = NULL;
}
char Queue::GetTop() {
if(Isempty()) {
return '\0';
} else {
return Head->Next->data;
}
}
bool Queue::Add(char ch) {
Node * pNew = new Node();
pNew->data = ch;
Tail->Next = pNew;
pNew->Next = NULL;
Tail = pNew;
return true;
}
bool Queue::Drop() {
if(Isempty()) {
return false;
} else {
Node * tem = Head;
Head = tem->Next;
delete tem;
}
return true;
}
bool Queue::Isempty() {
return Head==Tail;
}
进制转换( C++字符数组 )的更多相关文章
- C# 进制转换 在什么情况下使用16进制,字节数组,字符串
C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...
- 《java版进制转换》
import java.util.Scanner; class 十进制转成十六进制_2 { public static void main(String[] args) { int num = 0; ...
- Java基础复习之一篇:关健字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换
1.关健字 1.1.被Java语言赋予特定意义的单词(如:class,interface,public ,static) 1.2.全部是小写 1.3.注意事项(goto和const作为关健字保留起来) ...
- python 进制 转换
测试用的python源码 ''''' Created on 2014年8月21日 @author: lenovo ''' import binascii import struct def examp ...
- C++中进制转换问题
一直在刷题的时候,都会遇到一个坑,就是进制转换的问题.而每一次都傻乎乎的自己去实现一个.所以算是对以前的坑的一个总结. itoa 函数 itoa是广泛应用的非标准C语言和C++语言扩展函数.由于它不是 ...
- 最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类
前言:用于处理Java基本数据的转换及进制转换操作工具 一.实现功能 1.int与byte互转 2.int与byte[]互转 3.short与byte互转 4.short与byte[]互转 5.16位 ...
- JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算
JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...
- Java进制转换, 数据类型, 运算符
1:进制转换 转换规则: 先把数据的每一位上的系数乘以对应基数的次幂(低位从零开始),然后相加即可 十进制到其他进制 规则:除基取余,直到商为0,最后将余数反转 十进制到二进制: 除2取余,直到商为0 ...
- 进制转换 hdoj-2031
进制转换,原题目:hdoj-2031 题目描述: 输入两个整数,十进制数n(32位整数)和进制r(2<=r<=16 r!=10),求转换后的数. 输入: 7 2 23 12 -4 3 输出 ...
随机推荐
- JQuery常用方法总结
1.json的创建方式 <script> $(function () { //第一种 var my = new People("CallmeYhz", 26); ale ...
- 深入理解javascript原型和闭包(11)——执行上下文栈
继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...
- Spring实战 (第3版)——AOP
在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...
- javascript数据结构与算法---检索算法
查找数据有2种方式,顺序查找和二分查找.顺序查找适用于元素随机排列的列表.二分查找适用于元素已排序的列表.二分查找效率更高,但是必须是已经排好序的列表元素集合. 一:顺序查找 顺序查找是从列表的第一个 ...
- 错误 Metadata file 'C:\Common\bin\Debug\Common.dll' could not be found
一个通用方法de类库/总是报这个错误/很明显就是没有成功生成程序集... 但是就是找不到哪里的错误!!!! 如果是代码写错的话,可能会直接提示在哪个文件中哪行代码写错了,然后dll生成不了,但是这个错 ...
- 【重点】Shell入门教程:流程控制(2)条件判断的写法
第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...
- SVN版本控制与分支设置
使用SVN+Eclipse做软件版本控制. (2009年5月) 1,SVN目录结构 Trunk : 主干目录,此目录下的文件为基准文件 Branches : 用于开发的分支目录 Tags : 用于发布 ...
- hibernate中数据库方言
在配置hibernate.cfg.xml时需指定使用数据库的方言: 例: <property name="dialect">org.hibernate.dialect. ...
- MySQL5.6 新特性之GTID
背景: MySQL5.6在5.5的基础上增加了一些改进,本文章先对其中一个一个比较大的改进"GTID"进行说明. 概念: GTID即全局事务ID(global transactio ...
- 利用office2010 word2010生成目录
详细内容可以从以下链接下载: http://www.360disk.com/file-37040.html 从前一直用word的目录功能,觉得很方便.第一:可以在目录的首页通过Ctrl+鼠标单击左键可 ...