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]!='\0';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("\n"); 
    }
        if(m==2){
            if(SUM<=127&&SUM>=-127)
            {
            printf("b1\n");
            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("\n"); 
            }    
            if(SUM==128){
            printf("10000000\n");
            }
            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("\n"); 
            }
        }        
    }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("\n"); 
                }
    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("\n"); 
        }
        if(SUM==-128){
            printf("10000000\n");
        }
        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"); 
        }
    }
    }
    }

 

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

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

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

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

     其余见radix函数。

四.main函数展示

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

 

 

五.思维导图

 

 

 六.遇到的问题

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

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

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

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

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

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

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

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

七.代码互评(郭其松)

 

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

 

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

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

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

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

八.总结

(1)收获

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

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

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

 

(2)对函数的认识

 

 

 

 

 函数是工具。

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-11-10 01:29  漆靖  阅读(732)  评论(0编辑  收藏  举报

导航