一.运行截图
(1)这是输入正确时的转换

(2)当输入的选项不在选项范围时会提示无效选项且不会退出,而是可以继续选择。

(3)当输入的数字不是所需进制数时会提示错误,并且可以重新输入正确的数字。

(由于其他操作均相同,就不一一列出所有进制转换及错误提示)
二.函数介绍
1.函数声明
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> void Er(); //将二进制数转换为其他三种进制数 void Ba(); //将八进制数转换为其他三种进制数 void Shi(); //将十进制数转换为其他三种进制数 void Shiliu();//将十六进制数转换为其他三种进制数
2.各个进制转换的函数
void Er(){//将二进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum=0;
input:
printf("请输入您需要转换的二进制数:\n");
scanf("%s",str);
length=strlen(str); //length为字符长度
for(i=length-1;i>=0;i--){
if(str[i]!='0' && str[i]!='1'){
printf("Error\n");
printf("请输入正确的二进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice :
printf("1.八进制 2.十进制 3.十六进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0;i>=0;i--,j++){ //将输入的数转换为十进制数
sum += (str[i]-'0') * pow(2,j);
}
if(b==1){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Ba(){//将八进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum;
input:
printf("请输入您需要转换的八进制数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0' || str[i]>'7'){
printf("请输入正确的八进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice:
printf("1.二进制 2.十进制 3.十六进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数
sum += (str[i]-'0') * pow(8,j);
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shi(){//将十进制数转换为其他三种进制数
char str[100];
int b,i,length,sum;
input:
printf("请输入您需要转换的十进制数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0'||str[i]>'9'){
printf("请输入正确的十进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice :
printf("1.二进制 2.八进制 3.十六进制\n");
scanf("%d",&b);
for(i=0,sum=0;i<length;i++){ //将输入的数转换为十进制数
sum= sum*10+(str[i]-'0');
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shiliu(){//将十六进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum;
input:
printf("请输入您要转换的十六进制的数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0' || (str[i]>'9' && str[i]<'A') || (str[i]>'F' && str[i]<'a')|| (str[i]>'f')){
printf("请输入正确的十六进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice:
printf("1.二进制 2.八进制 3.十进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数
if(str[i]>='0' && str[i]<='9'){
str[i] = str[i]-'0';
}else if(str[i]>='A' && str[i]<='F'){
str[i] = str[i]-'A'+10;
}else if(str[i]>='a' && str[i]<='f'){
str[i] = str[i]-'a'+10;
}
sum += (str[i]) * pow(16,j);
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else if(b==3){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
都先将输入的数字转换为十进制,再利用itoa函数将其转换为所需进制。
3.main函数展示
int main(){
int a;
printf(" 进制转化器\n");
printf(" 请选择您要输入的进制\n");
select:
printf(" 1.二进制 2.八进制 3.十进制 4.十六进制\n");
scanf("%d",&a);
if(a==1)
{
Er();
}else if(a==2){
Ba();
}else if(a==3){
Shi();
}else if(a==4){
Shiliu();
}else{
printf("无效选项\n");
goto select;
}
return 0;
}
三.思维导图

四.问题及解决过程
1.刚开始准备把二进制转换为八进制,二进制转换为十进制,二进制转换为十六进制...一共十二个进制转换调用函数写出来,但尝试后发现操作繁琐且容易出错,于是就把所有输入的数都转换为十进制数,再进行后面的转换,这样一来不仅省事了很多而且代码清晰明了。
2.在将输入的数转换为十进制数时,由于智商有限,就百度了相关函数,了解了其定义及用法。
五.代码互评
1913杨涛的代码
void Numchange(int m, int b)//将10进制数转化为任意进制数
{
int n = m;
int count = 0;
if (m == 0) printf("0");
while (n != 0)
{
n = n / b;
count++;
}
int number;
for (int i = count; i >= 1; i--)
{
number = m / (int)pow(b, i - 1);
if (number < 10) {
printf("%d", number);
}
else {
printf("%c", number + 55);
}
m = m % (int)pow(b, i - 1);
}
}
看到他这个傲娇的将十进制数转换为任意进制数的代码,我惊了,代码简洁明了,功能强大。我也是将输入的数转换为十进制再进制下一步的转换,要逐一列出需要转换的代码,相对来说繁琐了很多,我应该像杨涛学习,灵活运用函数,提高效率。
六.总结
1.收获:通过上网查询学到了许多新函数的使用,对进制转换更加熟练了,修改了很多次后,我知道了代码精简的意义,扩宽了我的思维,让我体会到了代码的实用性。
2.我对于函数的理解:每个函数都是具有独立功能的模块。利用函数,可以方便实现程序的模块化,同时使整个程序的组织,编写,阅读,调试,修改更加方便,使程序更清晰。同时,同一个函数可以被一个或多个函数调用任意多次。就减少了同样代码的多次编写。