다음은  대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Objective-C 소스 코드이다. 이 소스는 C 언어 용으로 만들어 두었던 것을 아주 조금 수정한 것이다.

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


메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환을 하는 핵심 함수 convertAtoI()와 convertItoA()의 소스가 자체 제작되어 포함되어 있다. 이를 이용하는 부분은 154~155째 줄에 있는

         val = convertAtoI(s, srcRdx);
         convertItoA((char *) ret, val, destRdx);

이다. 지원되는 진법은 2진법에서 36진법 까지이다.



  1. /*
  2.  *  Filename: convertRadixMain.m
  3.  *            Convert radix in a interactive mode.
  4.  *
  5.  *  Compile: Click Ctrl_F11
  6.  *  Execute: convertRadix
  7.  *
  8.  *      Date:  2012/04/30
  9.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  10.  */
  11. #import <Foundation/Foundation.h>  // for exit()
  12. #import <stdio.h>
  13. #import <string.h>
  14. #import <math.h>
  15. #define MAX_BUF 300
  16. // enum { FALSE, TRUE };   // defined already in Objective-C
  17. struct _TOKEN {
  18.     char a[81];
  19.     char b[81];
  20. };
  21. void println(char s[]) {
  22.     printf("%s\n", s);
  23. }
  24. void print(char s[]) {
  25.     printf("%s", s);
  26. }
  27. void printUsage() {
  28.     println("Usage: convertRadix");
  29.     println("Convert radix in a interactive mode, where the maximum radix is 36.");
  30. }
  31. void printAbout() {
  32.     println("    About: Convert radix in a interactive mode.");
  33. }
  34. void printMainMenu() {
  35.     println("  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it");
  36. }
  37. void printMainPrompt() {
  38.     print("  Prompt> ");
  39. }
  40. void printSubMenu(int srcRadix, int destRadix) {
  41.     char sbuf[MAX_BUF];
  42.     sprintf(sbuf, "    Convert Radix_%d to Radix_%d", srcRadix, destRadix);
  43.     println(sbuf);
  44.     println("    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit");
  45. }
  46. void printSubPrompt() {
  47.     print("    Input Value>> ");
  48. }
  49. char BASE36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  50. void convertItoA(char *pstr, long num, int radix) {
  51.     char tmp[2];
  52.     char ret[MAX_BUF];
  53.     char arr[MAX_BUF];
  54.     long q, r;
  55.     int i, n;
  56.     int isNegative = FALSE;
  57.     if (num < 0L) {
  58.         isNegative = TRUE;
  59.         num = -num;
  60.     }
  61.     arr[0] = '\0';
  62.     q = num;
  63.     r = 0L;
  64.     while (q >= (long) radix) {
  65.         r = q % (long) radix;
  66.         q = q / (long) radix;
  67.         tmp[0] = BASE36[r];
  68.         tmp[1] = '\0';
  69.         strcat(arr, tmp);
  70.     }
  71.     tmp[0] = BASE36[q];
  72.     tmp[1] = '\0';
  73.     strcat(arr, tmp);
  74.     if (isNegative) {
  75.         strcat(arr, "-");
  76.     }
  77.     n = strlen(arr);
  78.     for (i = 0; i < n; i++) {
  79.         ret[i] = arr[n - i - 1];
  80.     }
  81.     ret[n] = '\0';
  82.     strcpy(pstr, (char *) ret);
  83. }
  84. long convertAtoI(const char *pstr, int radix) {
  85.     long ret = 0L;
  86.     char arr[MAX_BUF];
  87.     long q, r;
  88.     int isNegative = FALSE;
  89.     int len = strlen(pstr);
  90.     char c;
  91.     int i;
  92.     long val;
  93.     c = pstr[0];
  94.     if (c == '-') {
  95.         isNegative = TRUE;
  96.     }
  97.     else if (c >= '0' && c <= '9') {
  98.         ret = (long) (c - '0');
  99.     }
  100.     else if (c >= 'A' && c <= 'Z') {
  101.         ret = (long) (c - 'A') + 10L;
  102.     }
  103.     else if (c >= 'a' && c <= 'z') {
  104.         ret = (long) (c - 'a') + 10L;
  105.     }
  106.     if (ret >= (long) radix) {
  107.         println("        Invalid character!");
  108.         return ret;
  109.     }
  110.     for (i = 1; i < len; i++) {
  111.         c = pstr[i];
  112.         ret *= radix;
  113.         if (c >= '0' && c <= '9') {
  114.             val = (long) (c - '0');
  115.         }
  116.         else if (c >= 'A' && c <= 'Z') {
  117.             val = (long) (c - 'A') + 10L;
  118.         }
  119.         else if (c >= 'a' && c <= 'z') {
  120.             val = (long) (c - 'a') + 10L;
  121.         }
  122.         if (val >= (long) radix) {
  123.             println("        Invalid character!");
  124.             return ret;
  125.         }
  126.         ret += val;
  127.     }
  128.     return ret;
  129. }
  130. void convertRadix(char *pstr, char s[],  int srcRdx, int destRdx) {
  131.     long val;
  132.     char ret[MAX_BUF];
  133.     val = convertAtoI(s, srcRdx);
  134.     convertItoA((char *) ret, val, destRdx);
  135.     strcpy(pstr, ret);
  136. }
  137. void readLine(char *pdata) {
  138.     scanf("%s", pdata);
  139. }
  140. void readTwo(struct _TOKEN *ptoken) {
  141.     scanf("%s", ptoken->a);
  142.     scanf("%s", ptoken->b);
  143. }
  144. void tokenize(struct _TOKEN *ptoken, const char *line, char c) {
  145.     int len = strlen(line);
  146.     int i;
  147.     int from, to;
  148.     i = 0;
  149.     while (line[i] != c) {
  150.         i++;
  151.     }
  152.     from = i;
  153.     while (line[i] == c) {
  154.         i++;
  155.     }
  156.     to = i;
  157.     strncpy(ptoken->a, line, to - from);
  158.     ptoken->a[to - from] = '\0';
  159.     while (line[i] != c) {
  160.         i++;
  161.     }
  162.     from = i;
  163.     while (line[i] == c) {
  164.         i++;
  165.     }
  166.     to = i;
  167.     strncpy(ptoken->b, line, to - from);
  168.     ptoken->b[to - from] = '\0';
  169. }
  170. void doConvert(int srcRadix, int destRadix) {
  171.     char sbuf[MAX_BUF];
  172.     char line[MAX_BUF];
  173.     char cmd[MAX_BUF];
  174.     char srcStr[MAX_BUF], destStr[MAX_BUF];
  175.     long tmp;
  176.     println("");
  177.     printSubMenu(srcRadix, destRadix);
  178.     do {
  179.         printSubPrompt();
  180.         readLine((char *)cmd);
  181.         while (strlen(cmd) <= 0) {
  182.             readLine((char *)cmd);
  183.         }
  184.         if (strcmp("main()", cmd) == 0) {
  185.             return;
  186.         }
  187.         else if (strcmp("exit()", cmd) == 0 || strcmp("quit()", cmd) == 0) {
  188.             exit(0);
  189.         }
  190.         tmp = convertAtoI(cmd, srcRadix);
  191.         strcpy(srcStr, cmd);
  192.         convertRadix(destStr, srcStr, srcRadix, destRadix);
  193.         sprintf(sbuf, "        ( %s )_%d   --->   ( %s )_%d", srcStr, srcRadix, destStr, destRadix);
  194.         println(sbuf);
  195.         println("");
  196.     } while (TRUE);
  197. }
  198. void doStart() {
  199.     char line[MAX_BUF];
  200.     char cmd[MAX_BUF];
  201.     int srcRadix = 10, destRadix = 10;
  202.     char srcStr[MAX_BUF], destStr[MAX_BUF];
  203.     struct _TOKEN st;
  204.     int onlyOnce = TRUE;
  205.     do {
  206.         println("");
  207.         if (onlyOnce) {
  208.             println("  The supported maximum radix is 36.");
  209.             onlyOnce = FALSE;
  210.         }
  211.         printMainMenu();
  212.         printMainPrompt();
  213.         readLine((char *)cmd);
  214.         while (strlen(cmd) <= 0) {
  215.             readLine((char *)cmd);
  216.         }
  217.         if (strstr("qQxX", cmd) != NULL && strlen(cmd) == 1) {
  218.             exit(0);
  219.         }
  220.         else if (strstr("aA", cmd) != NULL && strlen(cmd) == 1) {
  221.             printAbout();
  222.         }
  223.         else if (strstr("sS", cmd) != NULL && strlen(cmd) == 1) {
  224.             print("  Input the source and target radices (say, 16 2): ");
  225.             readTwo((struct _TOKEN *) &st);
  226.             srcRadix = convertAtoI(st.a, 10);
  227.             destRadix = convertAtoI(st.b, 10);
  228.             doConvert(srcRadix, destRadix);
  229.         }
  230.     } while (TRUE);
  231. }
  232. void main(int argc, char *argv[]) {
  233.     if (argc > 1 && strcmp("-h", argv[1]) == 0) {
  234.         printUsage();
  235.         exit(1);
  236.     }
  237.     doStart();
  238. }




컴파일은 Dev-C++ 개발 도구에서 Ctrl+F11 클릭

실행> convertRadix

  The supported maximum radix is 36.
  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 8 16

    Convert Radix_8 to Radix_16
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 1234
        ( 1234 )_8   --->   ( 29C )_16

    Input Value>> main()

  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 16 8

    Convert Radix_16 to Radix_8
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 29c
        ( 29c )_16   --->   ( 1234 )_8

    Input Value>> exit()



Posted by Scripter
,