zoukankan      html  css  js  c++  java
  • 2~16进制间任意进制转换器

    一.程序运行截图(仅列举部分)

    正数:

    (1)10->8

    (连续五次不输入程序会自动结束哦)

     

    (2)10->2


    (3)16->10

    (4)8->16

     负数:

    (1)10->2

    (2)10->2

    (3)8->16

     二.扩展功能

    1.可以识别正负数并输出,当输出为二进制时会自动将其补为有符号位的八位或十六位。

    2.能在2至16所有进制间任意转换;

    3输入错误时会报错并让你重新输入;

    4.加了一个没卵用的随机数来使最后一句话随机输出。

    三.介绍函数及其使用的全局变量对应的功能和作用

    (1)radix函数

    int radix(int n,char x[],int count)
    {
    
        int i;
        for(i=0;i<count;i++){
            if(n!=2&&n!=3&&n!=4&&n!=5&&n!=6&&n!=7&&n!=8&&n!=9&&n!=10&&n!=11&&n!=12&&n!=13&&n!=14&&n!=15&&n!=16)
            return 1;
            if(x[i]>='a'&&x[i]<='f')
            x[i]-=87;
            if(x[i]>='0'&&x[i]<='9')
            x[i]-=48;
            if(x[i]>=n)return 1;
    
        }
        return 0;
    }

    函数功能:判断使用者输入的数和其输入的该数的进制是否匹配。

    全局变量:n(存放使用者输入的进制)

         x[](逐个字符逐个字符存放使用者输入的数)

         count(统计使用者输入数的位数)

    (2)luanqibazao函数

    int luangqibazao(char x[],int count)
    {
            int i,flag;
            flag=count;
        for(i=0;i<count;i++){
            if(x[i]>='a'&&x[i]<='f')
            flag--;
            if(x[i]>='0'&&x[i]<='9')
            flag--;    
        }
        if(flag==0)
        return 0;
        return 1;
    }

    函数功能:判断使用者输入的数是不是一些乱七八糟的东西(如asd、123g、???>之类的)

    全局变量:见radix函数中全局变量的介绍。

    (3)change_函数

    void change_(int n,char b[],int m,int count,int fu)
    {    
        int i,j,k=0,num,sum=0,d,SUM,lan,len;
        char c[1001];
        
        for(i=0;b[i]!='';i++)
        {
            if(b[i]>='0'&&b[i]<='9')
                num=b[i]-'0';
            else
                num=b[i]-'a'+10;
            sum=sum*n+num;
        }
        SUM=sum;
        while(sum)
        {
            d=sum%m;
            c[k++]="0123456789abcdef"[d];
            sum/=m;
        }
        len=strlen(c);
        if(fu==0){
            if(m!=2){
        for(i=k-1;i>=0;i--)
        {
            if(c[i]>='0'&&c[i]<='9')
                printf("%d",c[i]-'0');
            else
                printf("%c",c[i]);
        }
        printf("
    "); 
        }
            if(m==2){
                if(SUM<=127&&SUM>=-127)
                {
                printf("b1
    ");
                lan=8-len;
                for(i=0;i<lan;i++)
                printf("0");
                for(i=k-1;i>=0;i--)
                {
                    if(c[i]>='0'&&c[i]<='9')
                    printf("%d",c[i]-'0');
                    else
                    printf("%c",c[i]);
                }
        printf("
    "); 
                }    
                if(SUM==128){
                printf("10000000
    ");
                }
                if(SUM<-128||SUM>128){
                lan=16-len;
                for(i=0;i<lan+3;i++)
                printf("0");
                for(i=k-1;i>=0;i--)
                {
                if(c[i]>='0'&&c[i]<='9')
                printf("%d",c[i]-'0');
                else
                printf("%c",c[i]);
                }
                printf("
    "); 
                }
            }        
        }else{
            if(m!=2){    
            printf("-");
            for(i=k-1;i>=0;i--)
            {    
                if(c[i]>='0'&&c[i]<='9')
                printf("%d",c[i]-'0');
                else
                printf("%c",c[i]);
            }
        printf("
    "); 
                    }
        if(m==2){
            if(SUM<=127&&SUM>=-127){
                lan=7-len;
                printf("1");
                for(i=0;i<lan;i++)
                printf("0");
                for(i=k-1;i>=0;i--)
            {
            if(c[i]>='0'&&c[i]<='9')
                printf("%d",c[i]-'0');
            else
                printf("%c",c[i]);
            }
        printf("
    "); 
            }
            if(SUM==-128){
                printf("10000000
    ");
            }
            if(SUM<-128||SUM>128){
                lan=15-len;
                printf("1");
                for(i=0;i<lan+3;i++)
                printf("0");
                for(i=k-1;i>=0;i--)
        {
            if(c[i]>='0'&&c[i]<='9')
                printf("%d",c[i]-'0');
            else
                printf("%c",c[i]);
        }
                printf("
    "); 
            }
        }
        }
        }

    函数功能将输入的数由n进制转化为十进制,在把十进制按需求转化为m进制。

    全局变量:b[ ](由字符型数组x[]转化而来的字符串数组,用于简化n进制转化为十进制的计算)

         fu (用于判断输入数的正负,来决定change_函数的执行分支)

         m (存放使用者想要转化的进制)

         其余见radix函数。

    四.main函数展示

    int main()
    {
        printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>卍进制转换器卍<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ");
        printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    ");
        printf("                                        PS:只能进行二~十六进制间任意转换哦!
    "); 
        printf("                                    再PS:输出的二进制的首位是符号位哦!(+-128除外)
    "); 
        printf("***********************************************************************************************************************
    ");
        int m, i, count =0,n,flag=0,joy,fu=0,len;
        srand((unsigned) (time(NULL)));
        joy=rand()%4;
        int wrong = 0;
        static char x[1000],ch,b[1001];
        L:count=0;
        do
        {
            printf("输入你要转换的数吧!0.<
    ");
            for (i = 0; i < 1000; i++)
            {
                scanf("%c", &x[i]);
                if (x[i] == '
    ')
                {
                    wrong++;
                    break;
                }
                count++;
        }
            if(count!=0)break; 
            if (wrong == 3)
                printf("快点输入啦!
    ");
            if (wrong == 4)
                printf(">.<再不输入我就退出了╯^╰
    ");
            if (wrong == 5){ 
                printf("
    ");
                return 0;} 
        }
        while (count == 0);
        if(x[0]=='-'){
            for(i=1;i<count;i++)
            x[i-1]=x[i];
            count--;
            fu=1;
        }
        for(i=0;i<count;i++){
            if(x[i]>='A'&&x[i]<='F'){
                x[i]=x[i]+32;
            }
        }
        for(i=0;i<count;i++){
            if(luangqibazao(x,count)){
                printf("你这输的啥啊,重输一遍吧
    ");
                goto L;
            }
            for(i=0;i<count;i++)
            b[i]=x[i];
            b[i]='';
    }
        wrong = 0;
        printf("那你这个数是啥进制的呢?
    ");
        scanf("%d", &n);
        ch=getchar();
            if(n!=2&&n!=3&&n!=4&&n!=5&&n!=6&&n!=7&&n!=8&&n!=9&&n!=10&&n!=11&&n!=12&&n!=13&&n!=14&&n!=15&&n!=16){
            printf("标题啊标题,你不看标题就开始输入了吗?(?`^′?)?
    ");
            wrong++;
            flag=1;
            }
        while(radix(n,x,count))
        {
            if(wrong==2||flag==0)printf("你这进制写错了吧?再检查看看呗!
    ");
            if(wrong==3)printf("还是不对啊
    ");
            if(wrong==4)printf("唉又错了!你走点心啊!
    ");
            if(wrong==5)printf("你是认真的吗?
    ");
            if(wrong>5)printf("。。。。。。。。。。。。。。
    ");
            printf("重新输入一遍吧!>.0
    ");
                    if(scanf("%d", &n)!=-1){
                getchar();
                goto H;
            }
            H:wrong++;
        };
        wrong=0;
        printf("你想把它变成什么进制呢?
    ");
        scanf("%d",&m);
        while(m!=2&&m!=3&&m!=4&&m!=5&&m!=6&&m!=7&&m!=8&&m!=9&&m!=10&&m!=11&&m!=12&&m!=13&&m!=14&&m!=15&&m!=16){
            if(wrong==0)printf("你要的进制我转换不了啦!
    ");
            if(wrong==1)printf("真的转换不了啦!
    ");
            if(wrong==2)printf("哎呀我说不行就不行啦!!!
    ");
            if(wrong==3)printf("╭(╯^╰)╮你怎么就不信呢....
    ");
            if(wrong>3)printf("...............
    ");
            printf("重新输入一遍吧!>.0
    ");
            m=0;
            if(scanf("%d", &m)!=-1){
                getchar();
                goto M;
            }
            M:wrong++;
        };
        printf("当当当!转换成功ω/:");
        change_(n,b,m,count,fu);
        if(joy==0)
        printf("哼哼哼≧ω≦,没想到我这么快吧?
    ");
        if(joy==1)
        printf("啊哈哈哈哈哈哈>0<这也太简单了吧!
    ");
        if(joy==2) 
        printf("这么简单的题目,真无趣( > c < )
    ");
        if(joy==3)
        printf("嘿嘿嘿,怎么样,快夸夸我吧?>.<
    ");
    }

    五.思维导图

     六.遇到的问题

    1.问题:在if函数括号内使用&&,发现程序运行始终不进入该if函数。

    解决方案:上网仔细查询了&&、||、!、|、&等符号用法,发现是错将||用成了&&,更改后问题解决。

    2.问题:在void函数内部定义了一个较大数组,编译无错误也无警告,其他地方也正常,但该函数就是没有输出。

    解决方案:百度后了解到,函数则定义大数组易导致栈溢出,将该数组定义到主函数后,问题解决。

    3.制作的判断是否输入错误的程序在第一次输入错误后,第二次必定正确。

    解决方案:仔细检查后发现是一个重要标识数据未清零,设置清零程序后问题解决。

    4.问题:输入一个%d的数后,后面的scanf("%c",&a)自动跳过,以百分号d输出a得到10。

    解决方案:百度后得知是因为前一个输入完成的回车键 被下一个scanf读取,在前一个后加 ch=getchar();后问题解决。

    七.代码互评(郭其松)

        if (judge2,810(a, n))
                {
                    printf("该数字的二进制数为:");
                    chageeverything(changeten(a, n), 2);
                    printf("
    ");
                    printf("该数字的十进制数为:%d
    ", changeten(a, n));
                    printf("该数字的十六进制数为:");
                    chageeverything(changeten(a, n), 16);
                    break;
                }

    这个程序我一眼望过去以为是递归,不过仔细一看发现他是把一个函数作为另一个函数的参数,这种方法我还是第一次接触。

    显然这样写可以在一定程度上使主程序变得简洁明了,而且,整体来说,他主程序的排版和我的相比看起来要更舒服一些,没有凌乱的感觉。这值得我学习。

            if (judge2,810(a, n))
                {
                    printf("该数字的八进制数为:");
                    chageeverything(changeten(a, n), 8);
                    printf("
    ");
                    printf("该数字的十进制数为:%d
    ", changeten(a, n));
                    printf("该数字的十六进制数为:");
                    chageeverything(changeten(a, n), 16);
                    break;
                }
                else
                {
                    printf("您输入的数不符合要求哦,请重新输入
    感谢您的使用");
                    break;
                }
            }

    不过在输入错误后,他的程序似乎并不能返回让用户重新输入,这点我应该做得要更好一些

    八.总结

    (1)收获

    增强了通过百度解决问题的能力

    对数组、字符串、字符有了更深刻的了解。

    对C语言中的逻辑字符有了更深刻的认识。

    (2)对函数的认识

     函数是工具。

    在C语言编程中恰当的使用函数,可以让你在编程时思路更清晰,使你的程序排版更整洁,更容易让人读懂。

    熟练的、正确的使用这个工具,能让你的编程之路更加轻松。

     

     

  • 相关阅读:
    Shell 同时读取多个文件
    Shell 进度条效果的一个实现
    在 CentOS7 上安装 Tomcat9
    Redis原子计数器incr,防止并发请求
    .Net高并发解决思路
    Redis windows服务器配置可远程连接
    Lambda表达式和For循环使用需要注意的一个地方
    C#多线程和线程池
    MongoDb 物理位置应用实现
    Android Studio3.0 配置AndroidAnnotation注解框架
  • 原文地址:https://www.cnblogs.com/qijing-cy/p/11824177.html
Copyright © 2011-2022 走看看