数制度转换

一、问题描述:

二、设计思路:

   十六进制是由0~F这一组固定的数字来表示的,采用的是字符数组来储存,输入输出都是字符形式存在,所以我们要写函数把字符转换为数字char_to_num,或者把数组转换为字符num_to_char,来实现字符与对应字符之间的转换

   为了节省测试时间,我们需要测试多组数据,可以尝试设一个循环结束标志flag,并赋初值为1,在主函数内把所有的输入输出语句都写在while(flag)里面,scanf("%d",&flag)写在最后让测试者自己输入flag为1还是0,是否继续测试

    写char_to_num函数时,由于进制的特性,我们要分为两种情况来讨论,第一种情况是(ch>='0'&&ch<='9')此时是数字字符的形式,我们要将它转化为数字可以利用数字字符之间的差值,这里我们返回 return ch-'0' 代表该数字字符与’0‘数字字符之间的差值。第二种情况是(ch>'9')此时是字母字符的形式如A,B......Z,我们要将它转化为数字仍然用该数字字符之间的差值,不一样的是我们返回 return ch-'A'+10 代表数字字符与10的差值,但是我们还得加上10以前的值,才是ch现在所表示的数字

    写num_to_char函数时,同样分两种情况讨论,情况一(ch>=0&&ch<=9)此时代表0~9的数字,我们要把数字转化为字符,需要用强制转化return(char)('0'+num-0)这里相当于该数字的差值加了’0‘的ASCII码值48,然后强制转换为字符型。情况二(ch>9)此时要把大于9的 数字转换为字符return (char)('A'+num-10) 这里相当于该数字与10的差加上'A'的ASCII码值65,然后强制转换为字符型

    其他数转换为十进制数函数 long source_to_decimal(char temp[ ],int source)。source代表原来的数制,decimal代表要求的十进制数,我们先从数学上看看怎么转换,我画个草图,纯手工,见谅。我举一个二进制1111转换为十进制15的例子

 

很明显是按权对应相乘后再相加,代码就靠诸君自己琢磨了

     十进制数转换为其他进制函数int decimal_to_object(char temp[ ],long decimal,int object)。object代表目标数制,我仍然举例说明,把十进制数15转化为二进制数1111

 把十进制数不断的与原来的进制求余,得到的余数存在数组里面,剩下的十进制数继续与原来的进制求余直到原来的十进制数为0,不要忘记把最后一个字符的下一个位置置为'\0'作为字符串结束的标志。这样做有一个问题,由余数组成的新数制数与余数的顺序是反的,所以我们需要逆序输出,采用函数void output(char temp[ ],int length),length是之前int decimal_to_object(char temp[ ],long decimal,int object)函数返回的 i 的值

三、程序流程图:

 

 

四、代码实现:

复制代码
#include<stdio.h>
#define a 101/*最大允许字符串长度*/

int char_to_num(char ch);/*返回字符对应的数字*/
int num_to_char(int num);/*返回数字对应的字符*/
long source_to_decimal(char temp[],int other);/*返回由原数转换成的十进制数*/
int decimal_to_object(char temp[],long decimal_num,int object);/*返回转换成目标数制后字符数组的长度*/
void output(char temp[],int length);/*将字符数字逆序打印*/
int main()
{
    int source;/*存储原来的数制*/
    int object;/*储存目标数制*/
    int length;/*存储转换成目标数制后字符数组的长度*/
    long decimal_num;/*储存转换成的十进制数*/
    char temp[a];/*存储待转换的数*/
    int flag=1;/*退出程序标志,循环标准*/
    while(flag)/*当flag为真时,循环继续*/
    {
        
        printf("转换前的数是:");
            scanf("%s",temp);
        printf("转换前的数制是:");
            scanf("%d",&source);
        printf("转换后的数制是:");
            scanf("%d",&object);
        printf("转换后的数是:");
        decimal_num=source_to_decimal(temp,source);
        length=decimal_to_object(temp,decimal_num,object);
        output(temp,length);
        printf("继续请输入1,否则输入0:");
        scanf("%d",&flag);
        
    }
    return 0;
}
int char_to_num(char ch)//将字符转换为数字
{
    if(ch>='0'&&ch<='9')
        return ch-'0';/*数字字符转换为数字*/
    else
        return ch-'A'+10;/*字母字符转换为数字*/
}
int num_to_char(int num)
{
    if(num>=0&&num<=9)
        return (char)('0'+num-0);
    else
        return (char)('A'+num-10);
}
long source_to_decimal(char temp[],int source)
    {
        long decimal_num=0;
        int length;
        int i;
        for(i=0;temp[i]!='\0';i++);//遍历数组有效字符的个数
        length=i;//找对最后的个数
        for(i=0;i<length;i++)
            decimal_num=(decimal_num*source)+char_to_num(temp[i]);
        return decimal_num;
    }
int decimal_to_object(char temp[],long decimal_num,int object)
    {
        int i=0;
        while(decimal_num)
        {
            temp[i]=num_to_char(decimal_num%object);
            decimal_num=decimal_num/object;
            i++;
        }
        temp[i]='\0';
        return i;
    }
    void output(char temp[],int length)
  {
    int i;
    for(i=length-1;i>=0;i--)
        printf("%c",temp[i]);
    printf("\n");
  }
    
    
    
    
    
    
    
复制代码

 

 这个进制转换全部都是自己手敲的,太累了,花了两个晚自习,自己敲了三遍,能学到东西,完全搞懂进制转换也是不亏

posted @   软件拓荒人  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示