第二のブログパークの仕事。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型を返す0、trueとfalseを使用することができますするために利用するブール値がtrueを返します。

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を返した場合、あなたの番号を入力するようにプロンプ​​トによると、あなたはミスを犯すするように求められます、それ以外の場合は、3桁の変換関数を呼び出します。

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

名前の非常に単純な関数は、バイナリ進、10進数および16進数に変換され、memsetを、アレイはゼロに初期化されている、に格納

<string.hの>は、バイナリ、三桁の進数を考えると、私はカウンタcntを導入し、すべての3進数8進数に変換され、合計彼らは最終的に進数を取得するために、その後、0から始まる進確保するための1つの以上の出力は、正しい表示を実現進

次のメトリックが疲れて、進進同様の変換ビット単純な乗算の和であり、すべての数は4進数、10〜15であり、あなたは最終的に、A〜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");
}

前記小数変換入力

//十进制
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");
}

バイナリ変換のこれらのタイプは、単純化の主な機能、機能の比較的多数の確立を達成するために、ほぼ同じです。

特に、私は<のctype.h>機能に進数の入力を使用するユーザによる小文字入力は、16進数の正確な識別を確実にするために、すべて大文字に変換されます。

ショー3 .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のバンドに属しませんあなたはERRORを促し、再入力されます。

IV。マインドマッピング

ファイブ問題と解決策:

質問:私の作業負荷を軽減、代わりに循環用のマクロを使用しての怠惰になりたかったが、後にプログラムがBUG、意志の出力間違った答えを表示さ発見しました。

int idx;

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

ソリューション:私はグローバル変数とマクロを削除したので、間違いを誘発し、グローバル変数バイアスの値が得られ、関数を呼び出すときに私が見つけた、マクロと再利用のグローバル変数のセットです。

VI。コードのピアレビュー

ただ、一部の学生が提出した仕事、私はその機能を見て、私はインスピレーションを感じ、見た目に-1の比較を持っています。

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

必要ではない、実際には、小数点以下の関数に変換を確立している私はあなたが多くのスペースを節約し、10進形式にバイナリの様々なタイプを完璧ことができ、これは素晴らしいアイディアだと感じ、と私はそれぞれのバンドのためでした。

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