进制转换器
关于进制转换器设计思路:
十进制转二、八、十六进制,一个函数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 ****