関数card_convr のように、配列の先頭側に下位桁を格納するのではなく、上位桁を格納するように変更した以下の関数を作成せよ。 int card_conv (unsigned x , int n , char d []); |
/* 演習2-4 整数を2進数~36進数へと基数変換を行う */ #include <stdio.h> #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0) /*--- 整数値xをn進数に変換して配列dに下位桁から格納 ---*/ int card_conv(unsigned x, int n, char d[]) { char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; int digits = 0; /* 変換後の桁数 */ if (x == 0) /* 0であれば */ d[digits++] = dchar[0]; /* 変換後も0 */ else while (x) { d[digits++] = dchar[x % n]; /* nで割った剰余を格納 */ x /= n; } for (i = 0; i < digits / 2; i++) swap(char, d[i], d[digits - i - 1]); return (digits); } int main(void) { int i; unsigned no; /* 変換する整数 */ int cd; /* 基数 */ int dno; /* 変換後の桁数 */ char cno[100]; /* 変換後の各桁を格納する文字の配列 */ int retry; /* もう一度? */ do { printf("正の整数値を入力してください:"); scanf("%u", &no); do { printf("何進数に変換しますか(2-36):"); scanf("%d", &cd); } while (cd < 2 || cd > 36); dno = card_conv(no, cd, cno); /* noをcd進数に変換 */ printf("%d進数では", cd); for (i = 0; i < dno; i++) /* 上位桁から順に表示 */ printf("%c", cno[i]); printf("です。\n"); printf("もう一度しますか(1…はい/0…いいえ):"); scanf("%d", &retry); } while (retry == 1); return (0); }