第二次博客作业: 函数+进制转换器v1.0beta

一.程序的运行截图

 

 

 十六进制对二进制八进制的转换可以通过6选项后进行1.2选项实现。

二.函数以及其对应的功能

 

#include<stdio.h>
#include<math.h>

void mune()
{
    printf("----------------------------\n");
    printf("进制转换\n");
    printf("1、十进制转换二进制\n");
    printf("2、十进制转换八进制\n");
    printf("3、十进制转换十六进制\n");
    printf("4、二进制转换十进制\n");
    printf("5、八进制转换十进制\n");
    printf("6、十六进制转换十进制\n");
    printf("0、    退     出\n");
    printf("----------------------------\n");
}

void TenToTwo()
{
    int num, c, i = 0, g;
    int n = 2;
    int a[32];
    printf("输入一个整数:");
    scanf_s("%d", &num);
    g = num;
    if (num < 0)
        num = -num;
    while (num > 0)
    {
        c = (num % n);
        a[i] = c;
        num = num / n;
        i++;
    }
    printf("十进制数转换成二进制数是:");
    if (g == 0)
          printf("0");
    if (g < 0)
        printf("-");
    for (i--; i >= 0; i--)           //将数组倒序输出
        printf("%d", a[i]);
    printf("\n");
}

void TenToEight()
{
    int num, c, i = 0,g;
    int n = 8;
    int a[32];
    printf("输入一个整数:");
    scanf_s("%d", &num);
    g = num;
    if (num < 0)
        num = -num;
    while (num > 0)
    {
        c = (num % n);
        a[i] = c;
        num = num / n;
        i++;
    }
    printf("十进制数转换成八进制数是:");
    if (g ==0)
        printf("0");
    if (g < 0)
        printf("-");
    for (i--; i >= 0; i--)           //将数组倒序输出
        printf("%d", a[i]);
    printf("\n");
}

void TenToSixteen()
{
    char ai[] = "0123456789ABCDEF";
    char h[16];
    int i = 0;
    int j = 0;
    int num = 0, g;
    printf("输入一个整数:");
    scanf_s("%d", &num);
    g = num;
    if (num < 0)
        num = -num;
    while (num)
    {
        h[i++] = ai[num % 16];   //对十进制数求余并最终与h数组中的字符匹配
        num = num / 16;
    }
    printf("十进制数转换成十六进制数是:");
    if (g < 0)
        printf("-");
    for (j = i - 1; j >= 0; --j)
        printf("%c", h[j]);
    printf("\n");
}

void TwoToTen()
{
    long long n;
    int sum = 0, i = 0, m,count=0;
    printf("输入一个二进制数: ");
    scanf_s("%lld", &n);
    while (n != 0)
    {     m = n % 10;
        if (m > 1||m<-1)
        count++;
        n /= 10;
        sum += m * pow(2, i);
        ++i;
    }
    if (count != 0)
    {
    
        printf("输入错误!\n");
        return TwoToTen();
    }
    else
        printf("二进制数转换为十进制为 %d\n",sum);
}

void EightToTen()
{
    int n,;
    int sum = 0, i = 0, m,count=0;
    printf("输入一个八进制数: ");
    scanf_s("%d", &n);
    while (n != 0)
    {
        m = n % 10;
        if (m > 7||m<-7)
        count++;
        n /= 10;
        sum += m * pow(8, i);
        ++i;
    }
    if (count != 0)
    {
        printf("输入错误!\n");
        return EightToTen();
    } 
    else
        printf("八进制数转换为十进制为 %d\n", sum);
}

void SixteenToTen()
{
    char s[50], a[50];
    printf("输入一个十六进制数:");
    scanf_s("%s", s);
    int t, i, count = 0, j = 0;
    long sum = 0;
    if (s[0] == '-') 
    {
        for (i = 0;s[i];i++)
        {
            a[i] = s[i + 1];
        }
        for (i = 0;s[i];i++) 
        {
            s[i] = a[i];
        }
        j = 1;
    }
    for (i = 0;s[i];i++) 
    {
        if (s[i] > 'F')
            count++;
    }
    if (count == 0)
    {
        
        for (i = 0;s[i];i++) 
        {
            if (s[i] <= '9')
                t = s[i] - '0';
            else
                t = s[i] - 'A' + 10;
            sum = sum * 16 + t;
        }
        printf("十六进制数转换为十进制为:");    
        if (j == 1) 
        {
            printf("-");
        }
        printf("%d\n",sum);
    }
    else 
    {
        printf("输入错误!");
        return SixteenToTen();
    }
    printf("\n");
}

int main()
{
    int n = 0;
    int l = 1;
    while (l)
    {
        mune();
        printf("请选择:");
        scanf_s("%d", &n);
        switch (n)
        {
        case 1:TenToTwo();
            break;
        case 2:TenToEight();
            break;
        case 3:TenToSixteen();
            break;
        case 4:TwoToTen();
            break;
        case 5:EightToTen();
            break;
        case 6:SixteenToTen();
            break;
        case 0:
            l = 0;
            break;
        default:
            printf("您的选择错误!!!\n");
            break;
        }
    }
}

 

通过主函数先输出菜单,通过选择进入switch函数的选项,进而调动相对应的函数。因为比较菜,每个进制转换都写了一个函数。

三.思维导图

 四.主要问题
十六进制转换十进制

 

 

 

 

 

 

 四.主要问题
十六进制转换十进制

scanf("%x",&num);
print("%d",&num);

本来这样写没什么毛病,然后看见要求要检查输入的数是不是十六进制的数就给我整懵了。

解决方法:

    char s[50], a[50];
    printf("输入一个十六进制数:");
    scanf_s("%s", s);
    int t, i, count = 0, j = 0;
    long sum = 0;
    if (s[0] == '-')    //判断输入的是不是负数 
    {
        for (i = 0;s[i];i++)
        {
            a[i] = s[i + 1];
        }
        for (i = 0;s[i];i++) 
        {
            s[i] = a[i];       //将字符串前移一位,去掉'-'号
        }
        j = 1;                 //判断条件判断决定后面是否输出'-'号
    }
    for (i = 0;s[i];i++) 
    {
        if (s[i] > 'F')      //判断是否为十六进制数
            count++;
    }
    if (count == 0)         //是十六进制数进入循环
    {
        
        for (i = 0;s[i];i++) 
        {
            if (s[i] <= '9')
                t = s[i] - '0';
            else
                t = s[i] - 'A' + 10;
            sum = sum * 16 + t;
        }
        printf("十六进制数转换为十进制为:");    
        if (j == 1)           //是负数,输出'-'号
        {
            printf("-");
        }
        printf("%d\n",sum);
    }
    else                  //不是十六进制数提醒错误并重新调动该函数
    {
        printf("输入错误!");
        return SixteenToTen();
    }
    printf("\n");

解决方法如上。

五.互评

李永福

//裁判
bool judge(int n, char num[1000])
{
    //二进制判断
    if (n == 2)
    {
        for (int idx = 0; idx < strlen(num); idx++)
            if (num[idx] != '1' && num[idx] != '0')return false;
        return true;
    }
    //八进制判断
    if (n == 8)
    {
        for (int idx = 0; idx < strlen(num); idx++)
            if (num[idx] < 48 || num[idx] > 55)return false;
        return true;
    }
    //十进制判断
    if (n == 10)
    {
        for (int idx = 0; idx < strlen(num); idx++)
            if (num[idx] < 48 || num[idx] > 57)return false;
        return true;
    }
    //十六进制判断
    if (n == 16)
    {
        for (int idx = 0; idx < strlen(num); idx++)
            if (num[idx] < 48 || num[idx] > 70)return false;
        return true;
    }
}

先调用一个函数来判断输入是否正确,让后面的函数编写更为简洁明了。

六.总结

收获:加深了对数组应用的了解,善用if语句来解决检查判断问题。

对函数的理解:将一个大程序分成一个个小程序,降低编写代码的难度,让代码更容易让人看懂。

 

 

 

posted @ 2019-11-06 17:28  烟雨萧煜  阅读(202)  评论(0编辑  收藏  举报