다음은  대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 C++ 소스 코드이다.
메뉴는 주메뉴 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()의 소스가 자체 제작되어 포함되어 있다. 이를 이용하는 부분은 157~158째 줄에 있는

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

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



  1. /*
  2.  *  Filename: convertRadixCPP.cpp
  3.  *            Convert radix in a interactive mode.
  4.  *
  5.  *  Compile: cl /EHsc convertRadixCPP.cpp
  6.  *  Execute: convertRadixCPP
  7.  *
  8.  *      Date:  2008/03/25
  9.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  10.  */
  11. #include <iostream>
  12. #include <string>
  13. #include <cmath>
  14. using namespace std;
  15. #define MAX_BUF 300
  16. enum { FALSE, TRUE };
  17. struct _TOKEN {
  18.     char a[81];
  19.     char b[81];
  20. };
  21. void println(char s[]) {
  22.     cout << s << endl;
  23. }
  24. void print(char s[]) {
  25.     cout << s;
  26. }
  27. void printUsage() {
  28.     println("Usage: convertRadixCPP");
  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.     char tmp[2];
  86.     long ret = 0L;
  87.     char arr[MAX_BUF];
  88.     long q, r;
  89.     int isNegative = FALSE;
  90.     int len = strlen(pstr);
  91.     char c;
  92.     int i;
  93.     long val;
  94.     c = pstr[0];
  95.     if (c == '-') {
  96.         isNegative = TRUE;
  97.     }
  98.     else if (c >= '0' && c <= '9') {
  99.         ret = (long) (c - '0');
  100.     }
  101.     else if (c >= 'A' && c <= 'Z') {
  102.         ret = (long) (c - 'A') + 10L;
  103.     }
  104.     else if (c >= 'a' && c <= 'z') {
  105.         ret = (long) (c - 'a') + 10L;
  106.     }
  107.     if (ret >= (long) radix) {
  108.         println("        Invalid character!");
  109.         return ret;
  110.     }
  111.     for (i = 1; i < len; i++) {
  112.         c = pstr[i];
  113.         ret *= radix;
  114.         if (c >= '0' && c <= '9') {
  115.             val = (long) (c - '0');
  116.         }
  117.         else if (c >= 'A' && c <= 'Z') {
  118.             val = (long) (c - 'A') + 10L;
  119.         }
  120.         else if (c >= 'a' && c <= 'z') {
  121.             val = (long) (c - 'a') + 10L;
  122.         }
  123.         if (val >= (long) radix) {
  124.             println("        Invalid character!");
  125.             return ret;
  126.         }
  127.         ret += val;
  128.     }
  129.     return ret;
  130. }
  131. void convertRadix(char *pstr, char s[],  int srcRdx, int destRdx) {
  132.     long val;
  133.     char ret[MAX_BUF];
  134.     val = convertAtoI(s, srcRdx);
  135.     convertItoA((char *) ret, val, destRdx);
  136.     strcpy(pstr, ret);
  137. }
  138. void readLine(char *pdata) {
  139.     scanf("%s", pdata);
  140. }
  141. void readTwo(struct _TOKEN *ptoken) {
  142.     scanf("%s", ptoken->a);
  143.     scanf("%s", ptoken->b);
  144. }
  145. void tokenize(struct _TOKEN *ptoken, const char *line, char c) {
  146.     int len = strlen(line);
  147.     int i;
  148.     int from, to;
  149.     i = 0;
  150.     while (line[i] != c) {
  151.         i++;
  152.     }
  153.     from = i;
  154.     while (line[i] == c) {
  155.         i++;
  156.     }
  157.     to = i;
  158.     strncpy(ptoken->a, line, to - from);
  159.     ptoken->a[to - from] = '\0';
  160.     while (line[i] != c) {
  161.         i++;
  162.     }
  163.     from = i;
  164.     while (line[i] == c) {
  165.         i++;
  166.     }
  167.     to = i;
  168.     strncpy(ptoken->b, line, to - from);
  169.     ptoken->b[to - from] = '\0';
  170. }
  171. void doConvert(int srcRadix, int destRadix) {
  172.     char sbuf[MAX_BUF];
  173.     char line[MAX_BUF];
  174.     char cmd[MAX_BUF];
  175.     char srcStr[MAX_BUF], destStr[MAX_BUF];
  176.     long tmp;
  177.     println("");
  178.     printSubMenu(srcRadix, destRadix);
  179.     do {
  180.         printSubPrompt();
  181.         readLine((char *)cmd);
  182.         while (strlen(cmd) <= 0) {
  183.             readLine((char *)cmd);
  184.         }
  185.         if (strcmp("main()", cmd) == 0) {
  186.             return;
  187.         }
  188.         else if (strcmp("exit()", cmd) == 0 || strcmp("quit()", cmd) == 0) {
  189.             exit(0);
  190.         }
  191.         tmp = convertAtoI(cmd, srcRadix);
  192.         strcpy(srcStr, cmd);
  193.         convertRadix(destStr, srcStr, srcRadix, destRadix);
  194.         sprintf(sbuf, "        ( %s )_%d   --->   ( %s )_%d", srcStr, srcRadix, destStr, destRadix);
  195.         println(sbuf);
  196.         println("");
  197.     } while (TRUE);
  198. }
  199. void doStart() {
  200.     char line[MAX_BUF];
  201.     char cmd[MAX_BUF];
  202.     int srcRadix = 10, destRadix = 10;
  203.     char srcStr[MAX_BUF], destStr[MAX_BUF];
  204.     struct _TOKEN st;
  205.     int onlyOnce = TRUE;
  206.     do {
  207.         println("");
  208.         if (onlyOnce) {
  209.             println("  The supported maximum radix is 36.");
  210.             onlyOnce = FALSE;
  211.         }
  212.         printMainMenu();
  213.         printMainPrompt();
  214.         readLine((char *)cmd);
  215.         while (strlen(cmd) <= 0) {
  216.             readLine((char *)cmd);
  217.         }
  218.         if (strstr("qQxX", cmd) != NULL && strlen(cmd) == 1) {
  219.             exit(0);
  220.         }
  221.         else if (strstr("aA", cmd) != NULL && strlen(cmd) == 1) {
  222.             printAbout();
  223.         }
  224.         else if (strstr("sS", cmd) != NULL && strlen(cmd) == 1) {
  225.             print("  Input the source and target radices (say, 16 2): ");
  226.             readTwo((struct _TOKEN *) &st);
  227.             srcRadix = convertAtoI(st.a, 10);
  228.             destRadix = convertAtoI(st.b, 10);
  229.             doConvert(srcRadix, destRadix);
  230.         }
  231.     } while (TRUE);
  232. }
  233. void main(int argc, char *argv[]) {
  234.     if (argc > 1 && strcmp("-h", argv[1]) == 0) {
  235.         printUsage();
  236.         exit(1);
  237.     }
  238.     doStart();
  239. }




컴파일> cl /EHsc convertRadixCPP.cpp

실행> convertRadixCPP

  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): 4 2

    Convert Radix_4 to Radix_2
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 321
        ( 321 )_4   --->   ( 111001 )_2

    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): 2 4

    Convert Radix_2 to Radix_4
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 111001
        ( 111001 )_2   --->   ( 321 )_4

    Input Value>> quit()





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,