进制转换器

进制转换器
关于进制转换器设计思路:
十进制转二、八、十六进制,一个函数decToN ( )就能解决。


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

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

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


第一步:设置输入格式是 n 进制;
第二步:检验输入数是否规范,本例未写;
第三步:一次性计算,转换,输出二、八、十、十六进制计算结果。

313947f84cdf49d084796182c0557fee.png

c500c3e97a0b4682a606219b1d3c115d.png  

 

//以下是源码:
//*****  进制转换器  *****************************
// 本代码是用简单的 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 ()

c77860598af1403098cd16e338ab3641.png

523547e4bc0f47788778360646ce06a7.png 

ad3e8f6521b84c9f85a495e1817535eb.png 

 

//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 ()

fea5aa87744b4192b0369b0a6fc0acf3.png

 

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 ****

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值