函数+进制转换器v1.0beta

1.运行截图

输入正确时结果如下,其他转换运行结果类似,就不多贴图了。

输入不符合规范时:

2.额外扩展

如果输入错误格式,则重新输入,而不是结束程序从头再来。
运行结果如上图。

3.函数

(1)二进制转其他


void tr2(int option2)
{
    int input = 0, i;
    char in[80];
A:
    scanf("%s", in);
    for (i=0; i<strlen(in); i++)    /*判断是否为二进制数*/
    {
        if (in[i] != '0' && in[i] != '1')
        {
            printf("请重新输入二进制数:");
            goto A;
        }
    }
    for (i=0; i<strlen(in); i++)
    {
        input = input*10 + (in[i] - '0');
    }
    switch (option2)    /*根据选择结果分配给不同的转换函数*/
    {
        case 1:
            transform_2_8(input);
            break;
        case 2:
            printf("转换结果:%d
", transform_2_10(input));
            break;
        case 3:
            transform_2_16(input);
            break;
    }
}

void transform_2_8(int n)
{
    int sum = transform_2_10(n);
    printf("转换结果:%o
", sum);
}

int transform_2_10(int n)
{
    int result = 0, i = 0;
    while (n > 0)
    {
        result += (n%10) * pow(2, i);
        n /= 10;
        i++;
    }
    return result;
}

void transform_2_16(int n)
{
    int sum = transform_2_10(n);
    printf("转换结果:%x
", sum);
}

(2)八进制转其他


void tr8(int option2)
{
    int input = 0, i;
    char in[80];
A:
    scanf("%s", in);
    for (i=0; i<strlen(in); i++)    /*判断是否为八进制数*/
    {
        if (in[i] < '0' || in[i] > '7')
        {
            printf("请重新输入八进制数:");
            goto A;
        }
    }
    for (i=0; i<strlen(in); i++)
    {
        input = input*10 + (in[i] - '0');
    }
    switch (option2)    /*根据选择结果分配给不同的转换函数*/
    {
        case 1:
            transform_8_2(input);
            break;
        case 2:
            printf("转换结果:%d
", transform_8_10(input));
            break;
        case 3:
            transform_8_16(input);
            break;
    }
}
void transform_8_2(int n)
{
    transform_10_2( transform_8_10(n) );
}
int transform_8_10(int n)
{
    int result = 0, i = 0;
    while (n > 0)
    {
        result += (n%10) * pow(8, i);
        n /= 10;
        i++;
    }
    return result;
}
void transform_8_16(int n)
{
    printf("转换结果:%x
", transform_8_10(n));
}

(3)十进制转其他

void tr10(int option2)
{
    int input = 0, i;
    char in[80];
A:
    scanf("%s", in);
    for (i=0; i<strlen(in); i++)    /*判断是否为十进制数*/
    {
        if (in[i] < '0' || in[i] > '9')
        {
            printf("请重新输入十进制数:");
            goto A;
        }
    }
    for (i=0; i<strlen(in); i++)
    {
        input = input*10 + (in[i] - '0');
    }
    switch (option2)    /*根据选择结果分配给不同的转换函数*/
    {
        case 1:
            transform_10_2(input);
            break;
        case 2:
            transform_10_8(input);
            break;
        case 3:
            transform_10_16(input);
            break;
    }
}
void transform_10_2(int n)
{
    int num[80], count = 0;
    int i;
    for (i=0; n>0; i++)
    {
        num[i] = n % 2;
        n /= 2;
        count++;
    }
    for (i=count-1; i>=0; i--)
    {
        printf("%d", num[i]);
    }
    printf("
");
}
void transform_10_8(int n)
{
    printf("转换结果:%o
", n);
}
void transform_10_16(int n)
{
    printf("转换结果:%x
", n);
}

(4)十六进制转其他


void tr16(int option2)
{
    int i;
    char in[80];
A:
    scanf("%s", in);
    for (i=0; i<strlen(in); i++)    /*判断是否为十六进制数*/
    {
        if ( (in[i] < '0') || ( in[i] > '9' && in[i] < 'A')
            || (in[i] > 'F' && in[i] < 'a') || in[i] > 'f' )
        {
            printf("请重新输入十六进制数:");
            goto A;
        }
    }
    switch (option2)    /*根据选择结果分配给不同的转换函数*/
    {
        case 1:
            transform_16_2(in);
            break;
        case 2:
            transform_16_8(in);
            break;
        case 3:
            printf("转换结果:%d
", transform_16_10(in));
            break;
    }
}
void transform_16_2(char *s)
{
    transform_10_2( transform_16_10(s) );
}
void transform_16_8(char *s)
{
    printf("转换结果:%o
", transform_16_10(s));
}
int transform_16_10(char *s)
{
    int i, sum = 0;
    for (i=strlen(s)-1; i>=0; i--)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            sum += (s[i]-'0') * pow(16, strlen(s)-i-1);
        }
        else if (s[i] >= 'a' && s[i] <= 'f')
        {
            sum += (s[i]-'a'+10) * pow(16, strlen(s)-i-1);
        }
        else if (s[i] >= 'A' && s[i] <= 'F')
        {
            sum += (s[i]-'A'+10) * pow(16, strlen(s)-i-1);
        }
    }
    return sum;
}

4.main函数

代码比较多就干脆写了多个.c文件和一个头文件,这样视觉上比较清楚。

文件名

头文件


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

void transform_2_8(int n);
int transform_2_10(int n);
void transform_2_16(int n);

void transform_8_2(int n);
int transform_8_10(int n);
void transform_8_16(int n);

void transform_10_2(int n);
void transform_10_8(int n);
void transform_10_16(int n);

void transform_16_2(char *s);
void transform_16_8(char *s);
int transform_16_10(char *s);

main函数

#include "Header.h"
#include "tr2.c"
#include "tr8.c"
#include "tr10.c"
#include "tr16.c"

int main()
{
    int option1, option2;
    printf("输入的进制类型为:
");
A:
    printf("[1]二进制  [2]八进制  [3]十进制  [4]十六进制
");
    scanf("%d", &option1);
    switch (option1)
    {
        case 1:
            printf("想要转换成?
");
        A1:
            printf("[1]八进制  [2]十进制  [3]十六进制
");
            scanf("%d", &option2);
            if (option2 != 1 && option2 != 2 && option2 != 3)
            {
                printf("输入错误!重新输入想转换成什么类型:
");
                goto A1;
            }
            printf("输入:");
            tr2(option2);
            break;
        case 2:
            printf("想要转换成?
");
        A2:
            printf("[1]二进制  [2]十进制  [3]十六进制
");
            scanf("%d", &option2);
            if (option2 != 1 && option2 != 2 && option2 != 3)
           {
               printf("输入错误!重新输入想转换成什么类型:
");
               goto A2;
           }
            printf("输入:");
            tr8(option2);
            break;
        case 3:
            printf("想要转换成?
");
        A3:
            printf("[1]二进制  [2]八进制  [3]十六进制
");
            scanf("%d", &option2);
            if (option2 != 1 && option2 != 2 && option2 != 3)
           {
               printf("输入错误!重新输入想转换成什么类型:
");
               goto A3;
           }
            printf("输入:");
            tr10(option2);
            break;
        case 4:
            printf("想要转换成?
");
        A4:
            printf("[1]二进制  [2]八进制  [3]十进制
");
            scanf("%d", &option2);
            if (option2 != 1 && option2 != 2 && option2 != 3)
           {
               printf("输入错误!重新输入想转换成什么类型:
");
               goto A4;
           }
            printf("输入:");
            tr16(option2);
            break;
        default:
            printf("输入错误!重新输入的进制类型为:
");
            goto A;
    }
    return 0;
}

5.函数关系图

6.问题

(1)判断输入的数是否符合规范,本来想取余一位一位判断,发现十六进制有字母不能这样子,想了一下决定全都改用输入字符串然后再进行后续操作。
(2)想往函数中传入字符串,发现不知道怎么传,通过翻书和百度后找到解决方法。例如:void a( char *s)
(3)代码敲了一半,突然想起来有格式控制输入输出,就把可以用这个的都改了,简化一下代码。(总共300行左右)(这个不知道算不算问题...)

7.代码互评

void shier (int n)
{
    printf("十进制转换为二进制
");
    printf("答案是:");
    a(n);
}
int a(int n)
{
    if(n==1||n==0){
        printf("%d",n);
    }else {
        a(n/2);
        printf("%d",n%2);
    }
    return 0;
}

这位同学十进制转二进制用了递归函数,代码更简洁清楚,值得学习。因为十进制转二进制是用十进制数除以2取余数,取出来的余数要倒序输出才是正确答案,所以我用了数组,把余数一个个存到数组里,然后从数组末尾输出,这样显得比较麻烦,还是用递归比较好,可以直接从末尾输出。

8.收获

(1)更加了解了不同进制间的转换是如何进行的。
(2)第一次尝试把程序文件分为多个程序文件模块写一个程序,对大程序构成有个初步的了解。

9.理解

(1)函数可以使代码看起来更清晰易懂,增加可读性。
(2)遇到错误时改写程序也相对方便,直接在函数中更改即可,不用担心误改到main函数的其他代码。

原文地址:https://www.cnblogs.com/wzt392217419/p/11824298.html