数制度转换
一、问题描述:
二、设计思路:
十六进制是由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"); }
这个进制转换全部都是自己手敲的,太累了,花了两个晚自习,自己敲了三遍,能学到东西,完全搞懂进制转换也是不亏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)