第二次博客作业

南楼画角 提交于 2019-12-04 04:43:01

一.运行截图

 (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.我对于函数的理解:每个函数都是具有独立功能的模块。利用函数,可以方便实现程序的模块化,同时使整个程序的组织,编写,阅读,调试,修改更加方便,使程序更清晰。同时,同一个函数可以被一个或多个函数调用任意多次。就减少了同样代码的多次编写。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!