• 进制转换器


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

  • 相关阅读:
    设计模式面试问题总结
    嵌入式Linux与树莓派相关练习
    Linux常用命令
    分页请求时避免二次请求
    老板说我最近飘了,都敢用 MySQL 实现分布式锁了
    设计模式学习笔记 - 适配器模式
    【Git】git仓库的 .git 下各个目录注释
    1.【小迪安全学习笔记】基础入门-概念名词
    hadoop宕机的处理方法
    Google Sign In error 12500
  • 原文地址:https://blog.csdn.net/baidu_41801770/article/details/139407635