컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은  0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Objective-C 소스 코드이다. 진법 변환에 필요한 함수

        convertAtoI(string, radix)
        convertItoA(long, radix)

를 C 뭉 Objective-C 코드로 자체 작성하여 사용하였다.

 

다음 소스는  C 언어 용으로 만들어 두었던 진법(radix) 표 만들기 예제 with C and Ch 를 수정한 것이다.

19쩨 줄의 enum { FALSE, TRUE }; 부분은 주석 처리하였는데. Objective-C에서는 TRUE와 FALSE가 이미 정의되어 있기 때문이다.

 

  1. /*
  2.  *  Filename: makeRadixTableMain.m
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Compile: Click Ctrl+F11 on Dev-C++ IDE
  6.  *  Execute: makeRadixTable
  7.  *
  8.  *      Date:  2012/05/01
  9.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  10.  */
  11. #import <Foundation/Foundation.h>
  12. #import <stdio.h>
  13. #import <string.h>
  14. #import <math.h>
  15. #define MAX_BUF 81
  16. // enum { FALSE, TRUE };
  17. void println(char s[]) {
  18.     printf("%s\n", s);
  19. }
  20. void print(char s[]) {
  21.     printf("%s", s);
  22. }
  23. void printUsage() {
  24.     println("Usage: makeRadixTable");
  25.     println("Show the radix table with 10-, 2-, 8-, 16-radices.");
  26. }
  27. char BASE36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  28. void convertItoA(char *pstr, long num, int radix) {
  29.     char tmp[2];
  30.     char ret[MAX_BUF];
  31.     char arr[MAX_BUF];
  32.     long q, r;
  33.     int i, n;
  34.     int isNegative = FALSE;
  35.     if (num < 0L) {
  36.         isNegative = TRUE;
  37.         num = -num;
  38.     }
  39.     arr[0] = '\0';
  40.     q = num;
  41.     r = 0L;
  42.     while (q >= (long) radix) {
  43.         r = q % (long) radix;
  44.         q = q / (long) radix;
  45.         tmp[0] = BASE36[r];
  46.         tmp[1] = '\0';
  47.         strcat(arr, tmp);
  48.     }
  49.     tmp[0] = BASE36[q];
  50.     tmp[1] = '\0';
  51.     strcat(arr, tmp);
  52.     if (isNegative) {
  53.         strcat(arr, "-");
  54.     }
  55.     n = strlen(arr);
  56.     for (i = 0; i < n; i++) {
  57.         ret[i] = arr[n - i - 1];
  58.     }
  59.     ret[n] = '\0';
  60.     strcpy(pstr, (char *) ret);
  61. }
  62. long convertAtoI(const char *pstr, int radix) {
  63.     char tmp[2];
  64.     long ret = 0L;
  65.     char arr[MAX_BUF];
  66.     long q, r;
  67.     int isNegative = FALSE;
  68.     int len = strlen(pstr);
  69.     char c;
  70.     int i;
  71.     long val;
  72.     c = pstr[0];
  73.     if (c == '-') {
  74.        isNegative = TRUE;
  75.     }
  76.     else if (c >= '0' && c <= '9') {
  77.         ret = (long) (c - '0');
  78.     }
  79.     else if (c >= 'A' && c <= 'Z') {
  80.         ret = (long) (c - 'A') + 10L;
  81.     }
  82.     else if (c >= 'a' && c <= 'z') {
  83.         ret = (long) (c - 'a') + 10L;
  84.     }
  85.     if (ret >= (long) radix) {
  86.         println("        Invalid character!");
  87.         return ret;
  88.     }
  89.     for (i = 1; i < len; i++) {
  90.         c = pstr[i];
  91.         ret *= radix;
  92.         if (c >= '0' && c <= '9') {
  93.             val = (long) (c - '0');
  94.         }
  95.         else if (c >= 'A' && c <= 'Z') {
  96.             val = (long) (c - 'A') + 10L;
  97.         }
  98.         else if (c >= 'a' && c <= 'z') {
  99.             val = (long) (c - 'a') + 10L;
  100.         }
  101.         if (val >= (long) radix) {
  102.             println("        Invalid character!");
  103.             return ret;
  104.         }
  105.         ret += val;
  106.     }
  107.     return ret;
  108. }
  109. void makeTable() {
  110.     char sbuf[MAX_BUF];
  111.     char abuf[MAX_BUF/2];
  112.     char tbuf[MAX_BUF/2];
  113.     int i;
  114.     for (i = 0; i < 4; i++) {
  115.         print("+-------");
  116.     }
  117.     print("+");
  118.     println("");
  119.     print("|  Dec");
  120.     print("\t|   Bin");
  121.     print("\t|  Oct");
  122.     print("\t|  Hex  |");
  123.     println("");
  124.     for (i = 0; i < 4; i++) {
  125.         print("+-------");
  126.     }
  127.     print("+");
  128.     println("");
  129.     for (i = 0; i < 16; i++) {
  130.         sprintf(sbuf, "|   %2d", i);
  131.         convertItoA((char *)abuf, (long) i, 2);
  132.         sprintf(tbuf, "\t|  %4s", abuf);
  133.         strcat(sbuf, tbuf);
  134.         convertItoA((char *)abuf, (long) i, 8);
  135.         sprintf(tbuf, "\t|   %2s", abuf);
  136.         strcat(sbuf, tbuf);
  137.         convertItoA((char *)abuf, (long) i, 16);
  138.         sprintf(tbuf, "\t|    %-2s |", abuf);
  139.         strcat(sbuf, tbuf);
  140.         println(sbuf);
  141.     }
  142.     for (i = 0; i < 4; i++) {
  143.         print("+-------");
  144.     }
  145.     print("+");
  146.     println("");
  147. }
  148. void main(int argc, char *argv[]) {
  149.     if (argc > 1 && strcmp("-h", argv[1]) == 0) {
  150.         printUsage();
  151.         exit(1);
  152.     }
  153.     makeTable();
  154. }



컴파일은 Dev-C++에서 Ctrl+F11 클릭

실행> makeRadixTable

+-------+-------+-------+-------+
|  Dec  |   Bin |  Oct  |  Hex  |
+-------+-------+-------+-------+
|    0  |     0 |    0  |    0  |
|    1  |     1 |    1  |    1  |
|    2  |    10 |    2  |    2  |
|    3  |    11 |    3  |    3  |
|    4  |   100 |    4  |    4  |
|    5  |   101 |    5  |    5  |
|    6  |   110 |    6  |    6  |
|    7  |   111 |    7  |    7  |
|    8  |  1000 |   10  |    8  |
|    9  |  1001 |   11  |    9  |
|   10  |  1010 |   12  |    A  |
|   11  |  1011 |   13  |    B  |
|   12  |  1100 |   14  |    C  |
|   13  |  1101 |   15  |    D  |
|   14  |  1110 |   16  |    E  |
|   15  |  1111 |   17  |    F  |
+-------+-------+-------+-------+



 

Posted by Scripter
,