두 번째 블로그 공원 일. 2019년 11월 8일

A. 프로그램 실행 샷

II. 기능 소개

1. 함수 선언

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
void two(int n);//输入二进制数
void eight(int n);//输入八进制数
void ten(int n);//输入十进制数
void sixteen(int n);//输入十六进制数
void two_to_eight(char num[1000]);//把二进制转换为八进制
void two_to_ten(char num[1000]);//把二进制转换为十进制
void two_to_sixteen(char num[1000]);//把二进制转换为十六进制 
void eight_to_two(char num[1000]);//把八进制转二进制
void eight_to_ten(char num[1000]);//把八进制转十进制
void eight_to_sixteen(char num[1000]);//把八进制转十六进制
void ten_to_two(char num[1000]);//把十进制转二进制
void ten_to_eight(char num[1000]);//把十进制转八进制
void ten_to_sixteen(char num[1000]);//把十进制转十六进制
void sixteen_to_two(char num[1000]);//把十六进制转二进制
void sixteen_to_eight(char num[1000]);//把十六进制转八进制
void sixteen_to_ten(char num[1000]);//把十六进制转十进制
bool judge(int n, char num[1000]);//判断输入的数是否符合
int mypow(int x, int cnt);

주제 자체의 제한 수준을 감안할 때, 더 잘 진수의 전환으로, 우리는 함수의 합성을 호출하여 더 많은 기능, 거의 전체 프로그램을 정의로 입력하기 위해, 각 소수를 할 복잡 할 수있다.

2. 심판 함수

//裁判
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;
    }
}

진수에 따르면, 각각의 숫자는 그렇지 않으면 탐색의 끝에서 true를 반환하고, 부적합의 수를 발견하면, 즉시 false를 반환 입력을 통과 할 것으로 보인다. 이 기능은 심판이 아니라 int로 반환을 사용할 수있는 활용 부울 값이 true를 반환 그것을 사용하는 것이 비교적 간단 때문 true와 false 0.

3. 지수 함수

   //指数 
int mypow(int x, int cnt)
{
    int sum = 1;
    for (int idx = 0; idx < cnt; idx++)sum *= x;
    return sum;
}

소수 나중에 사용 변환 간단한 지수 함수.

4. 이진 입력 변환

//二进制
void two(int n)
{
    char str[1000];
    printf("请输入您的数字:");
    scanf("%s", str);
    if (!judge(n, str))printf("ERROR\n");
    else
    {
        two_to_eight(str);
        two_to_ten(str);
        two_to_sixteen(str);
    }
}

첫 번째는 바이너리 입력 기능은 바이너리 내가 숫자이 질문을 모두 촬영 한 있도록 충족 바이너리와 각 밴드의 전환을 위해이 질문에 불쾌한 장소, 우리는 단순히이 항목의 형식 제어 완료를 사용할 수 있다고 할 수있다 방법의 배열에 저장된다.

심판이 false를 반환하는 경우 전화 번호를 입력 할 수있는 프롬프트에 따르면, 그렇지 않으면, 세 진수 변환 함수를 호출, 실수를하라는 메시지가 표시됩니다.

void two_to_eight(char num[1000])//把二进制转换为八进制
{
    int str[1000];
    int ans = 1;
    int cnt = 0, sum = 0;
    memset(str, 0, sizeof(str));
    for (int idx = strlen(num) - 1; idx >= 0; idx--)
    {
        cnt++;
        sum = sum + (num[idx] - 48) * mypow(2, cnt - 1);
        if (cnt == 3)
        {
            str[ans++] = sum;
            sum = 0;
            cnt = 0;
        }
    }
    if (sum)str[ans++] = sum;
    printf("八进制:   ");
    for (int idx = ans; idx >= 1; idx--)printf("%d", str[idx]);
    printf("\n");
}
void two_to_ten(char num[1000])//把二进制转换为十进制
{
    int str[1000];
    int sum = 0;
    memset(str, 0, sizeof(str));
    for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
    {
        sum = sum + (num[i] - 48) * mypow(2, idx);
    }
    printf("十进制:   ");
    printf("%d", sum);
    printf("\n");
}
void two_to_sixteen(char num[1000])//把二进制转换为十六进制 
{
    char str[1000];
    int ans = 1;
    int cnt = 0, sum = 0;
    memset(str, 0, sizeof(str));
    for (int idx = strlen(num) - 1; idx >= 0; idx--)
    {
        cnt++;
        sum = sum + (num[idx] - 48) * mypow(2, cnt - 1);
        if (cnt == 4)
        {
            if (sum == 10)str[ans++] = 'A';
            else if (sum == 11)str[ans++] = 'B';
            else if (sum == 12)str[ans++] = 'C';
            else if (sum == 13)str[ans++] = 'D';
            else if (sum == 14)str[ans++] = 'E';
            else if (sum == 15)str[ans++] = 'F';
            else str[ans++] = sum + 48;
            sum = 0;
            cnt = 0;
        }
    }
    if (sum) str[ans++] = sum + 48;
    printf("十六进制: ");
    printf("OX");
    for (int idx = ans - 1; idx >= 1; idx--)printf("%c", str[idx]);
    printf("\n");
}

라는 매우 간단한 함수 이진 진수 진수 16 진수로 변환되고, memset 함수 배열은 0으로 초기화에 저장되어있다

<String.h>에서 이진 세자리위한 진수 숫자를 고려하면, I는 카운터 (CNT)를 도입 매 3 이진수는 8 진수로 변환하고, 그 합계는 마지막 8 진수를 얻을 다음, 하나 개 이상의 출력은 정확한 표시를 실현할 진수 0으로 시작 진수 보장

다음 메트릭은 간단한 곱셈의 합이 피곤 비트이며 16 진수 진수 유사한 변형, 모든 수는 10 ~ 15에 네 개의 16 진수, 그리고 당신은에, 마지막으로 ~ F로 변환 할 전면 헥스 플러스 OX를 들면, 출력 16 진수를 나타낸다.

5. 진수 입력 및 전환

//八进制
void eight(int n)
{
    char str[1000];
    printf("请输入您的数字:");
    scanf("%s", str);
    if (!judge(n, str))printf("ERROR\n");
    else
    {
        eight_to_two(str);
        eight_to_ten(str);
        eight_to_sixteen(str);
    }
}
void eight_to_two(char num[1000])//把八进制转二进制
{
    int str[1000];
    memset(str, 0, sizeof(str));
    for (int i = strlen(num) - 1; i >= 0; i--)
    {
        int cnt = 2;
        int number = num[i] - 48;
        do {
            if (number % 2)str[i * 3 + cnt] = 1;
            else str[i * 3 + cnt] = 0;
            cnt--;
            number /= 2;
        } while (number > 0);
    }
    printf("二进制:   ");
    for (int i = 0; i < strlen(num) * 3; i++)
    {
        printf("%d", str[i]);
        if ((i + 1) % 3 == 0)printf(" ");
    }
    printf("\n");
}
void eight_to_ten(char num[1000])//把八进制转十进制
{
    int str[1000];
    int  sum = 0;
    memset(str, 0, sizeof(str));
    for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
    {
        sum = sum + (num[i] - 48) * mypow(8, idx);
    }
    printf("十进制:   ");
    printf("%d", sum);
    printf("\n");
}
void eight_to_sixteen(char num[1000])//把八进制转十六进制
{
    char str[1000];
    int  sum = 0, ans = 0;
    memset(str, 0, sizeof(str));
    for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
    {
        sum = sum + (num[i] - 48) * mypow(8, idx);
    }
    do {
        int number = sum % 16;
        if (number == 10)str[ans++] = 'A';
        else if (number == 11)str[ans++] = 'B';
        else if (number == 12)str[ans++] = 'C';
        else if (number == 13)str[ans++] = 'D';
        else if (number == 14)str[ans++] = 'E';
        else if (number == 15)str[ans++] = 'F';
        else str[ans++] = number + 48;
        sum /= 16;
    } while (sum > 0);
    printf("十六进制: ");
    printf("OX");
    for (int idx = ans - 1; idx >= 0; idx--)printf("%c", str[idx]);
    printf("\n");
}

6. 소수점 변환 입력

//十进制
void ten(int n)//输入十进制数
{
    char str[1000];
    printf("请输入您的数字:");
    scanf("%s", str);
    if (!judge(n, str))printf("ERROR\n");
    else
    {
        ten_to_two(str);
        ten_to_eight(str);
        ten_to_sixteen(str);
    }
}
void ten_to_two(char num[1000])//把十进制转二进制
{
    int str[1000];
    memset(str, 0, sizeof(str));
    int cnt = 0, sum = 0;
    for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
    do {
        int number = sum % 2;
        if (number % 2)str[cnt++] = 1;
        else str[cnt++] = 0;
        sum /= 2;
    } while (sum > 0);
    cnt--;
    printf("二进制:   ");
    for (int i = cnt; i >= 0; i--)printf("%d", str[i]);
    printf("\n");
}
void ten_to_eight(char num[1000])//把十进制转八进制
{
    int str[1000];
    int  sum = 0, ans = 0;
    memset(str, 0, sizeof(str));
    for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
    do {
        int number = sum % 8;
        str[ans++] = number;
        sum /= 8;
    } while (sum > 0);
    printf("八进制:   ");
    for (int i = ans; i >= 0; i--)printf("%d", str[i]);
    printf("\n");
}
void ten_to_sixteen(char num[1000])//把十进制转十六进制
{
    char str[1000];
    int  sum = 0, ans = 0;
    memset(str, 0, sizeof(str));
    for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
    do {
        int number = sum % 16;
        if (number == 10)str[ans++] = 'A';
        else if (number == 11)str[ans++] = 'B';
        else if (number == 12)str[ans++] = 'C';
        else if (number == 13)str[ans++] = 'D';
        else if (number == 14)str[ans++] = 'E';
        else if (number == 15)str[ans++] = 'F';
        else str[ans++] = number + 48;
        sum /= 16;
    } while (sum > 0);
    printf("十六进制: ");
    printf("OX");
    for (int idx = ans - 1; idx >= 0; idx--)printf("%c", str[idx]);
    printf("\n");
}

육각 변환을 입력 (7)

//十六进制
void sixteen(int n)//输入十六进制数
{
    char str[1000];
    printf("请输入您的数字:");
    scanf("%s", str);
    for (int i = 0; i < strlen(str); i++)
        if (islower(str[i]))str[i] = toupper(str[i]);
    if (!judge(n, str))printf("ERROR\n");
    else
    {
        sixteen_to_two(str);
        sixteen_to_eight(str);
        sixteen_to_ten(str);
    }
}
void sixteen_to_two(char num[1000])//把十六进制转二进制
{
    int str[1000], number;
    memset(str, 0, sizeof(str));
    for (int i = strlen(num) - 1; i >= 0; i--)
    {
        int cnt = 3;
        if (num[i] == 'A') number = 10;
        else if (num[i] == 'B') number = 11;
        else if (num[i] == 'C') number = 12;
        else if (num[i] == 'D') number = 13;
        else if (num[i] == 'E') number = 14;
        else if (num[i] == 'F') number = 15;
        else number = num[i] - 48;
        do {
            if (number % 2)str[i * 4 + cnt] = 1;
            else str[i * 4 + cnt] = 0;
            cnt--;
            number /= 2;
        } while (number > 0);
    }
    printf("二进制:   ");
    for (int i = 0; i < strlen(num) * 4; i++)
    {
        printf("%d", str[i]);
        if ((i + 1) % 4 == 0)printf(" ");
    }
    printf("\n");
}
void sixteen_to_eight(char num[1000])//把十六进制转八进制
{
    int str[1000];
    int sum = 0, number, ans = 0;
    for (int i = strlen(num) - 1; i >= 0; i--)
    {
        if (num[i] == 'A') number = 10;
        else if (num[i] == 'B') number = 11;
        else if (num[i] == 'C') number = 12;
        else if (num[i] == 'D') number = 13;
        else if (num[i] == 'E') number = 14;
        else if (num[i] == 'F') number = 15;
        else number = num[i] - 48;
        sum = sum + number * mypow(16, strlen(num) - 1 - i);
    }
    do {
        number = sum % 8;
        str[ans++] = number;
        sum /= 8;
    } while (sum > 0);
    ans--;
    printf("八进制:   ");
    printf("0");
    for (int i = ans; i >= 0; i--)printf("%d", str[i]);
    printf("\n");
}
void sixteen_to_ten(char num[1000])//把十六进制转十进制
{
    int sum = 0, number;
    for (int i = strlen(num) - 1; i >= 0; i--)
    {
        if (num[i] == 'A') number = 10;
        else if (num[i] == 'B') number = 11;
        else if (num[i] == 'C') number = 12;
        else if (num[i] == 'D') number = 13;
        else if (num[i] == 'E') number = 14;
        else if (num[i] == 'F') number = 15;
        else number = num[i] - 48;
        sum = sum + number * mypow(16, strlen(num) - 1 - i);
    }
    printf("十进制:   ");
    printf("%d", sum);
    printf("\n");
}

이진 변환의 이러한 유형을 간단히 주요 기능 함수 비교적 많은 수의 설정을 달성하기 위해, 거의 동일하다.

특히, 나는 기능 16 진수 입력을 사용 <ctype.h>는 사용자가 소문자 문자 입력은 16 진수의 정확한 식별을 보장하기 위해, 모두 대문자로 변환.

쇼 세 .main 기능

int main()
{
    int n;
    while (1)
    {
        printf("请选择您所要输入的进制:");
        scanf("%d", &n);
        if (!n) break;
        switch (n)
        {
        case 2:two(n); break;
        case 8:eight(n); break;
        case 10:ten(n); break;
        case 16:sixteen(n); break;
        default:printf("ERROR\n"); break;
        }
        printf("-------------------------------\n");
    }
    return 0;
}

사용자 0 종료 동시에, 사용자가 입력 한 숫자에 따라 이진 입력 전환 페이지를 입력 할 들어가는 경우에만 잠시 무한 루프를 수행 할 수 2,8,10,16의 밴드에 속하지 않는 당신은 오류 메시지가 표시 및 재 입력됩니다.

IV. 마인드 매핑

다섯 문제 및 해결 방법 :

질문 : 대신 순환을 위해 매크로를 사용하는 게으른 내 부하를 줄일 싶었지만, 나중에 프로그램이 BUG, ​​의지 출력 잘못된 답을 표시 발견했다.

int idx;

#define myfor(n) for(idx = 0;idx<n;idx++)

해결 방법 : 내가 전역 변수와 매크로를 삭제, 그래서 실수를 트리거, 전역 변수 바이어스의 값의 결과로, 함수를 호출 할 때 내가 찾은 매크로 및 재사용의 전역 변수의 집합입니다.

VI. 코드 동료 검토

그냥 일부 학생들이 제출 한 작품, 내가 그 기능 보았다, 나는 영감의 느낌, 모습에 - 하나의 비교가 있습니다.

1. 네트워크 1913 타오

int Tennum(char a[],int b)//将输入的数字转换为10进制数
{
    int len, i, num;
    int sum = 0;
    len = strlen(a);//求字符长度
    for (i = 0; i < len; i++) 
    {
        if (a[i] >= '0' && a[i] <= '9')
        {
            num = a[i] - '0';
        }
        else if (a[i] >= 'A' && a[i] <= 'F')
        {
            num = a[i] - 'A' + 10;
        }
        sum = sum * b + num;
    }
    return sum;
}

난 당신이 공간을 많이 절약 진수 형식 이진의 다양한 유형을 완벽하게 할 수 있습니다, 이것은 좋은 아이디어라고 생각하고, 나는 각 밴드에 대한 사실 필요가 없습니다, 소수점 함수에 대한 변환을 설립했다.

2. 네트워크 1914 린 Jieying

int binaryconversion(int number){
 if(number/2==0){
     return number%2;
 }
 else{
     return number%2+binaryconversion(number/2)*10;
 }
}

재귀 밝은 반점, 내 코드가 조금 성가신을 보이지만, 많은 수를 처리 할 때, 재귀, 다음 가능성이 스택 것, 원래의 내 자신의 바이너리 변환에 비해이 방식으로 작성 될 수 이해했다 오버 플로우, 나는 그것이 잘못된 값이 약 6 자리 숫자를 입력하는 것입니다 얻을 것이다 시도했다.

3. 네트워크 1913 첸 하뉴

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");
}

아주 좋은 생각, 방법 플레이 테이블을 사용하여 간결 완성 진수 변환입니다.

VII. 요약

1. 수확이 : 코드를 제출 한 학생에 비해, 내가 조금 성가신을 쓰고,이에, 나는 동시에 작업이이 과정에서 완료, 훌륭한 아이디어를 알게 심화 내 응용 프로그램 바이너리 변환뿐만 아니라, 프로그램을 달성하기 위해 기본적인 통화 기능에 의존, 거의 수행 등의 주요 기능과 같은 몇 가지 흥미로운 아이디어를 시도

2 이해 : 자체 코드를 만들기 위해 존재하는 기능이 더 명확하고 사람들이 자신의 좋은 이름을 복용의 함수로 프로그램을 읽기 쉽게보고, 옳은, 당신은 당신의 코드를보다 간결하게, 더 재미있게 만들 수 있습니다.

추천

출처www.cnblogs.com/JMU718/p/11817188.html