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,8,10(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,8,10(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语言编程中恰当的使用函数,可以让你在编程时思路更清晰,使你的程序排版更整洁,更容易让人读懂。

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

 

 

原文地址:https://www.cnblogs.com/qijing-cy/p/11824177.html

时间: 2024-08-28 08:39:33

2~16进制间任意进制转换器的相关文章

java 的任意进制间转换

直接上代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("十进制转换到其它进制:"); int x = 123 ; String str1 = Integer.toHexString(x) ; ///10进制转换成16进制的字符串 System.out.println(str1); String st

java 的任意进制间转换(很方便)

import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("十进制转换成其它进制:"); int x = 3213; String s1 = Integer.toHexString(x); //将十进制数转换成十六进制数的字符串 System.out.printl

(HDUStep 1.2.6)decimal system(任意进制转十进制)

题目: decimal system Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3622 Accepted Submission(s): 1419   Problem Description As we know , we always use the decimal system in our common life, even us

任意进制转换算法

任意进制转换算法 N年没有写博客,发个进制转换的玩下,支持负数:功能属于简化版的 Convert.ToInt32 ,特点是: 1.任意位,如:0,1(二进制),0...7(八进制),0...9,A...F(16进制),0...N(N进制),或者是:[email protected]#$%^&*(8进制,字符符号),也可以是中文. 2.8 byte 最大长度. 3.C#源码. 最近写markdown格式习惯啦,cnblogs啥时候全改掉算了,别用这个htmleditor算了. 先说明下进制转换的基

任意进制转换简单理解

规则1:任意进制转10进制都是当前位数乘以当前位权重 规则2:N进制转M进制根据前值除/M的值,然后取M进制余数为当前位,小数位就是后乘取整;(基本就是这个思想) 首先,实现任意进制转其他进制,最好先转到10进制在操作比较方便; 目前代码只实现10->36 思想是一样的使用递归计算- -改变除数(/N)和求的余数(/M),然后根据逻辑值对应字符表示就是- -,楼主目前不知道Z以上怎么表示- -所以懵 1 #include <iostream> 2 3 4 void turnto36(in

进制间的相互转换

我们平时计算都是使用十进制数,但是有时候我们需要用到二进制数.十六进制数等.在进制转换中,我们主要需要掌握的是十进制转换成N进制和N进制转换成十进制,而对于任意进制之间的相互转换,例如:P进制转换成R进制. 1.任意进制转十进制: k(n) * 10^(n-1) + k(n-1) * 10^(n-2) + ... + k(2) * 10^1 + k(1) * 10 ^0,其中n代表数字所在的位数,k(n)代表第n位上的数字值 2.十进制转任意进制:        (1)试减法         

Python版任意进制转换

def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d",14:"e",15:"f",16:"g",17:"h",18:"i",19:"j"} new_num_str = "" while num != 0: remai

2~62位任意进制转换(c++)

进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的. 正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜

python中2进制、10进制、16进制等之间的转换

10转2: bin(8) # '0b1000' 2转10: int('1000', 2) # 8 10转16: hex(15) # '0xf' 16转10: int('f', 16) # 15 2进制和16进制中间通过转10进制可以相互转换