进制转换器

进制转换器

关于进制转换器设计思路:

十进制转二、八、十六进制,一个函数decToN ( )就能解决。

二进制转换为其他进制:bin2dec() 先转为十进制,再用函数 decToN ( )转其他进制。

八进制转换为其他进制:oct2dec ( ) 先转为十进制,再用函数decToN ( )转其他进制。

十六进制转换为其他进制:hex2dec ( ) 先转为十进制,再用函数 decToN ( ) 转其他进制。

第一步:设置输入格式是 n 进制;

第二步:检验输入数是否规范,本例未写;

第三步:一次性计算,转换,输出二、八、十、十六进制计算结果。

//以下是源码:

//***** 进制转换器 *****************************

// 本代码是用简单的 C 语言写的,用 MySpringC

// v2.7 编译调试通过。可以 VB6, VC, Java 改写。

// 编译人:张纯叔(micelu@126.com )

//************************************************

Canvas cs ; //画布,绘制界面

string fname ; //filename 贴底图

int context; //canvasProc 触控设置

int obj;

int id;

int event; //canvasProc

int nn ; //输入n进制设置

int dec, sd ; //传入十进制数, sd 保持原输入

string bin, oct, hex ; //二、八进制,十六进制

int N; //N=2,8,16进制

string hx$ ; //N进制值字符表

int i, j, kn, k ; //计算

double m ; //计算,输入

string output$; //输出结果

int nlen ; //Len 字节数

string get, a ; //get$ stringinput , a$ 计算

string ss ; //output

main(){

setDisplay (1); //图形界面显示

setTitle("进制转换器");

cs.SetBackground(120,120,120);

cs.Active(); //界面活动

cs.SetProc (context, mycanvasProc); //触控

nn=10 ; //预设置10进制输入

draw_interface () ; //绘制启动界面

while (){ }

}//main ()

//关于界面设计,我喜欢自己绘制自定义界面。

//方法很简单,开一个无框 form,用画布canvas或picturebox作为绘画载体,就可发挥你的想象力,发扬你的艺术细胞,挥洒你的青春。可加载艺术背景底图,可透明显示。再在上面搞些标签、按钮、题标,设置热点区,加功能设置就行了。

//功能应用设置在热区mousemove(), mouseclick (), click (),screen touch。

draw_interface (){

//一个界面设计,多种功能设置,各进制输入选项切换,转换计算按钮设置,界面触控热点区设置,更新计算结果输出。

//二个要点:一是绘制启动界面,二是更新输出

fname="/storage/emulated/0/jiac.jpg";

cs.DrawBitmap(fname,0,0); //加底图

//Bitmap (),用于加底图。可不加。

cs.SetFillMode (1); //0不填色,1填色

cs.SetColor (125,250,250,250); //框线

cs.DrawRect (10,0, 710, 290);

cs.DrawRect (10,300, 710, 700);

//绘制上四个 nn 进制输入 选择项

cs.SetColor (55,200,200,200);

for (i=0; i<4; i++){

cs.DrawRect (i*160+45,90, i*160+180, 140); }

cs.SetColor (155,0,200,250);

if (nn==2) cs.DrawRect (45,90, 180, 140);

if (nn==8) cs.DrawRect (205,90, 340, 140);

if (nn==10) cs.DrawRect (365,90, 500, 140);

if (nn==16) cs.DrawRect (525,90, 660, 140);

cs.SetColor (255,0,100,250);

cs.SetTextSize (34) ;

cs.DrawText ("输入设置:", 45,70 );

cs.SetColor (255,0,0,250);

cs.SetTextSize (28) ;

cs.DrawText ("二进制 ", 70,125);

cs.DrawText ("八进制 ", 230,125);

cs.DrawText ("十进制 ", 390,125);

cs.DrawText ("十六进制 ", 535,125);

//画按钮

cs.SetColor (255,250,200,0);

cs.DrawRect (198, 178, 500, 260);

cs.DrawCircle (198,219, 41) ;

cs.DrawCircle (498,219, 41) ;

cs.SetColor (255,0,190,250);

cs.DrawRect (200, 180, 500, 260);

cs.DrawCircle (200,220, 40) ;

cs.DrawCircle (500,220, 40) ;

cs.SetTextSize (42) ;

cs.SetTextStyle (1);

cs.SetStrokeWidth(1);

ss="输入 > 转换 " ;

cs.SetColor (255,0,0,0);

cs.DrawText (ss , 254,237);

cs.SetColor (255,0,250,0);

cs.DrawText (ss , 250,233);

cs.SetFillMode (0); //0不填色,1填色

cs.SetColor (255,250,150,0);

cs.DrawText (ss , 250,233);

cs.SetFillMode (1); //0不填色,1填色

cs.SetColor (255,160,0,0); //退出按钮

cs.DrawRect (630, 0, 680, 40);

cs.SetColor (255,250,250,250);

cs.SetTextSize (30) ;

cs.DrawText ("X ", 645,30);

cs.SetFillMode (0);//0不填色,1填色

cs.SetColor (255,200,0,0); //输入选项框线

cs.DrawRect (45,90, 180, 140);

cs.DrawRect (205,90, 340, 140);

cs.DrawRect (365,90, 500, 140);

cs.DrawRect (525,90, 660, 140);

cs.SetColor (255,250,250,0); //区框线

cs.DrawRect (10,0, 710, 290);

cs.DrawRect (10,300, 710, 700);

//show result 更新计算结果

cs.SetFillMode (1);//0不填色,1填色

cs.SetTextStyle (0);

cs.SetColor (155,200,200,200); //结果输出条

for (i=0; i<4; i++){

cs.DrawRect (40,i*90+350, 680, i*90+400); }

cs.SetColor (255,0,0,250);

cs.SetTextSize (28) ;

cs.DrawText ("二进制: ", 40,340);

cs.DrawText ("八进制: ", 40,430);

cs.DrawText ("十进制: ", 40,520);

cs.DrawText ("十六进制: ", 40,610);

//显示计算结果,更新计算结果

cs.SetColor (255,200,0,0);

ss="Bin = "+bin ;

cs.DrawText (ss, 45,385);

ss="Oct = "+oct ;

cs.DrawText (ss, 45,475);

ss="Dec = "+intToString (dec) ;

cs.DrawText (ss, 45,565);

ss="Hex = "+hex ;

cs.DrawText (ss, 45,655);

cs.Update ();

}//draw_interfacs ()

//Proc ( ) 是设置canvas画布功能触控热点,与用户互动,功能设置。

mycanvasProc (int context,int obj,int id,int event,float x,float y){

//功能选择热点区域,设置输入n进制

cs.SetFillMode (1);//0不填色,1填色

if (x>45&&x<180&&y>90&&y<140){

nn=2 ;

draw_interface () ; }

if (x>205&&x<340&&y>90&&y<140){

nn=8 ;

draw_interface () ; }

if (x>365&&x<500&&y>90&&y<140){

nn=10 ;

draw_interface () ; }

if (x>525&&x<660&&y>90&&y<140){

nn=16 ;

draw_interface () ; }

//输入转换按钮 > 计算

if (x>170&&x<530&&y>200&&y<280){

//依输入进制 nn 转换 > 计算 > 显示结果

nnInput () ; }

if (x>630&&x<680&&y>0&&y<40){

//程序退出按钮

exit (0); }

cs.Update () ;

}//mycanvas ()

nnInput (){

//四类进制输入 > 计算 > 输出 > 一体完成

if (nn==2){

bin_input () ; }

if (nn==8){

oct_input () ; }

if (nn==10){

dec_Input () ; }

if (nn==16){

hex_input () ; }

draw_interface (); //更新输出

}//nnInput ()

//以下是进制转换函数:

//代码中 print.... 是调试显示,可注释掉

//程序代码少了个输入校验,然而不会因输入字符数字不合格式而中断终止程序,只是计算不正确。

//下面是各类进制转换函数:

decToN (){

// input dec & N , return Bin Oct Hex = output$

//传入十进制整数int dec,一个预设置字符表hx$就可完成三类N进制的转换。N=2, 8, 16

//最大十进制可计算值 2,147,483,647

string hx$ ;

hx$="0123456789ABCDEF" ;

dec=sd ; //保持原数值dec,计算其他进制

print "dec= ", dec ;

output$=" "; //init输出

//开始计算:

while (dec !=0){

//** do calculate until dec=0, return output$

k=dec-dec/N*N ; //k=dec Mod N, k=dec % N

dec=dec/N ; //整除,dec\N

output=subString (hx, k,1)+output$ ; }

//输出结果:

print "转换为", N, "进制" ;

if (N==2) print "输出结果: bin= ", output$ ;

if (N==8) print "输出结果: oct= ", output$ ;

if (N==16) print "输出结果: hex= ", output$ ;

print " ";

//draw text result output$ on interface

if (N==2) bin=output$ ;

if (N==8) oct=output$ ;

if (N==16) hex= output$ ;

dec=sd ; //原输入 dec 还原

}//decToN ()

hex2dec (){

//传入十六进制数转换为十进制数

//传入 string get$ 输出 int dec

nlen=len (get$); //字串长度

dec=0 ; //init 置初值 0

//开始计算 >

for (i=0; i<nlen; i++){

a=subString (get, i, 1);

//字符串转为数值的方法很多,我采用最简单直观的写法,字母大小写都可以。

if (a$=="0") k=0 ;

if (a$=="1") k=1 ;

if (a$=="2") k=2 ;

if (a$=="3") k=3 ;

if (a$=="4") k=4 ;

if (a$=="5") k=5 ;

if (a$=="6") k=6 ;

if (a$=="7") k=7 ;

if (a$=="8") k=8 ;

if (a$=="9") k=9 ;

if (a=="A"\|\|a=="a") k=10 ;

if (a=="B"\|\|a=="b") k=11 ;

if (a=="C"\|\|a=="c") k=12 ;

if (a=="D"\|\|a=="d") k=13 ;

if (a=="E"\|\|a=="e") k=14 ;

if (a=="F"\|\|a=="f") k=15 ;

kn=nlen-i-1 ; //高权位起降幂计算

dec=dec+(int)(k*pow(16,kn)) ; //乘方累加

} // return dec

sd=dec ; //保持原数值dec

}//hex2dec ()

bin2dec (){ //二进制转十进制

//传入二进制数转换为十进制数

//传入 string get$ 输出 int dec

nlen=len (get$); //字串长度

dec=0 ; //init 置初值 0

//开始计算 >

for (i=0; i<nlen; i++){

a=subString (get, i, 1);

//字符串转为数值的方法很多,我采用最简单直观的写法,字母大小写都可以。

if (a$=="0") k=0 ;

if (a$=="1") k=1 ;

kn=nlen-i-1 ; //高权位起降幂计算

dec=dec+(int)(k*pow(2,kn)) ; //乘方累加

} // return dec

sd=dec ; //保持原数值dec

}//bin2dec

oct2dec (){ //八进制转十进制

//传入八进制数转换为十进制数

//传入 string get$ 输出 int dec

nlen=len (get$); //字串长度

dec=0 ; //init 置初值 0

//开始计算 >

for (i=0; i<nlen; i++){

a=subString (get, i, 1);

//字符串转为数值的方法很多,我采用最简单直观的写法,字母大小写都可以。

if (a$=="0") k=0 ;

if (a$=="1") k=1 ;

if (a$=="2") k=2 ;

if (a$=="3") k=3 ;

if (a$=="4") k=4 ;

if (a$=="5") k=5 ;

if (a$=="6") k=6 ;

if (a$=="7") k=7 ;

kn=nlen-i-1 ; //高权位起降幂计算

dec=dec+(int)(k*pow(8,kn)) ; //乘方累加

} // return dec

sd=dec ; //保持原数值dec

}//oct2dec

//以下四类输入转换函数,一个输入,全部转换

hex_input (){

//输入十六进制数转换为10, 2, 8 进制

get$=stringInput (" 输入十六进制数 "," 例: 3ff \n 输入 [ 空 ] 退出 " ) ;

if (get$==" ") {

print "输入为空,请重新输入。 " ; }

print "Input : string= ",get$ ;

hex=get$ ;

hex2dec () ; //开始计算 16转10

//计算结果: return dec

print "输出结果: dec= ", dec ;

print " " ;

N=2 ; decToN () ; //10转2

N=8 ; decToN () ; //10转8

}//test16 ()

oct_input (){

//输入八进制数转换为 10, 2, 16 进制

get$=stringInput (" 输入八进制数 "," 例: 377 \n 输入 [ 空 ] 退出 " ) ;

if (get$==" ") {

print "输入为空,请重新输入。 " ; }

print "Input : string= ",get$ ;

oct=get$ ;

oct2dec () ; //开始计算 8转10

//计算结果: return dec

print "输出结果: dec= ", dec ;

print " " ;

N=2 ; decToN () ; //10转2

N=16 ; decToN () ; //10转16

}//test8 ()

bin_input (){

//输入二进制数转换为 进制

// clearOutput();

get$=stringInput (" 输入二进制数 "," 例: 10110011 \n 输入 [ 空 ] 退出 " ) ;

if (get$==" ") {

print "输入为空,请重新输入。 " ; }

print "Input : string= ",get$ ;

bin=get$ ; //print

bin2dec () ; //开始计算 2转10

//计算结果: return dec

print "输出结果: dec= ", dec ;

print " " ;

N=8 ; decToN () ; //10转8

N=16 ; decToN () ; //10转16

}//test2 ()

dec_Input (){//输入

m=doubleInput (" 输入十进制非负整数 "," 例: 65535 \n 输入 [ 空 ] 退出 " ) ;

clearOutput (); //清屏

if (m==0) {

print "输入为空,请重新输入。 " ; }

dec=(int)(m);

sd=dec ; //保持原输入数值dec

print "Input : 十进制整数 = ", dec;

print " " ;

N=2 ;

decToN () ; //转换

N=8 ;

decToN () ; //转换

N=16 ;

decToN () ; //转换

}//dec_Input ()

//**** End ****

相关推荐
陌小呆^O^9 分钟前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘31 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-40 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan2 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
IU宝2 小时前
C/C++内存管理
java·c语言·c++
qq_459730032 小时前
C 语言面向对象
c语言·开发语言
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
布说在见3 小时前
个人实施工作的一天 —— 繁琐的数据输入与未来的句里录数据
经验分享·实习实施
梅见十柒4 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生