1

私は課題に取り組んでおり、部分的に解決しています。現在、正しい出力が得られていますが、逆にのみです。

実装したヘルパー関数は次のとおりです。

char int2char (int radix, int value) {

    char c = '?';

    if ((value >= 0 && value < radix) && (radix <= 36 && radix >= 2)){
        if (value < 10){
            c = value + 48;
        }
        else if (value >= 10 && value < 36) {
            c = value + 55;
        }   
    }

    return c;
}

そして、私が苦労している実際の機能は、これまでのところ次のようになっています。

void int2str (int radix, int value) {

    int result = value % radix;
    int division = value / radix;
    char c;

    c = int2char(radix, result);
    putchar(c);

    while (division > 0) {
        return int2str(radix, division);
    }

}

最初の関数は、10 ~ 35 の数字を 16 進数で表すために使用されます。たとえば、モジュラスが 11 を生成する場合、「B」を出力することになっています。

後方を除いて、これはうまく機能しています!そして、私はそれを逆にする方法を理解できません。最大の問題は、出力として putchar() しか使用できないことです。文字列も配列もありません。

さらに明確にするために、次のように入力すると:

int2str 16 60

出力は「3C」であるはずですが、代わりに「C3」を取得しています。

4

3 に答える 3

2

まず、 が含まれているため、 の使用whileが混乱returnします。それを に置き換えifます。return関数は最後に独自に戻るため、 は不要です。

それが完了したらputchar、再帰呼び出しの後に移動することで、出力を逆にすることができます。

if (division > 0) {
    int2str(radix, division);
}

putchar(c);

補足として、return int2str(radix, division);とにかくこの関数では意味がありません。これはvoid関数であるため、返すものがないためです。これをやりたい場合 (この場合はしません)、次のように言います。

somefunction();
return;

また、 48 と 55 の代わりに'0'andを使用した場合、これはより明確になる可能性があります。'A'

    if (value < 10){
        c = value + '0';
    }
    else if (value >= 10 && value < 36) {
        c = value - 10 + 'A';
    }   
于 2013-09-16T20:43:14.253 に答える
1

resultは最後の桁ですが、最初に印刷しています。return再帰呼び出しから を削除し、 を最後に移動しますputchar。また、whileループはif.

void int2str(int radix, int value) {

    int lastdigit = value % radix;
    int firstdigits = value / radix;

    if (firstdigits) {
        int2str(radix, firstdigits);
    }

    putchar(int2char(radix, lastdigit));

}
于 2013-09-16T20:43:41.847 に答える
0

これを試して

c = int2char(radix, result);

if (division > 0) 
     int2str(radix, division);
putchar(c);

への最後の呼び出しint2strは最初の桁を出力し、最初の呼び出しは最後の桁を出力します。

于 2013-09-16T20:45:30.250 に答える