다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Objectiive-C 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 C  언어용으로 민들어 두었던 소스 조립제법(Horner의 방법) 예제 for C and Ch 를 아주 조금 수정한 것이다. 수정한 부분은 #include를 #import로 바꾸고, 또

        #import  <Foundation/Foundation.h>

를 추가했을 뿐이다. 만일 Foundation.h 를 수입(import)하지 않으면, calloc, free, atof, exit 에러가 발생한다.

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

  1. /*
  2.  *  Filename: testSyntheticDivisionMain.m
  3.  *
  4.  *  Purpose:  Find the quotient and remainder when some polynomial is
  5.  *            divided by a monic polynomial of the first degree.
  6.  *
  7.  *  Compile:  Click Ctr;+F11 on Dec-C++ 
  8.  *
  9.  *  Execute:  testSyntheticDivision -2 1 3 3 1
  10.  */
  11. #import <Foundation/Foundation.h>
  12. #import <stdio.h>
  13. #import <string.h>
  14. #import <math.h>
  15. #import <memory.h>
  16. void print(char str[]) {
  17.     printf("%s", str);
  18. }
  19. void println(char str[]) {
  20.     printf("%s\n", str);
  21. }
  22. // 사용법 표시
  23. void printUsage() {
  24.      println("사용법: testSyntheticDivision [수] [피제식의 계수들]");
  25.      println("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.");
  26. }
  27. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  28. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  29. char *simplify(double v, int width) {
  30.     int n, len;
  31.     static char t[] = "                               ";
  32.     char tmp[] = "                               ";
  33.     sprintf(t, "%g", v);
  34.     n = strlen(t);
  35.     if ((n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0'))
  36.         t[n-2] = '\0';
  37.     len = strlen(t);
  38.     strcpy(tmp, t);
  39.     if (len < width) {
  40.         strncpy(t, "               ", width - len);
  41.         t[width - len] = '\0';
  42.         strcat(t, tmp);
  43.     }
  44.     return (char *) t;
  45. }
  46. // 다항식을 내림차순의 문자열로 반환하는 함수
  47. // 반환된 문자열은 동적 메모리에 존재하므로.
  48. // 사용 후 반드시 해제(free)하여야 한다.
  49. char *toPolyString(double c[], int size) {
  50.     int SIZE = size;
  51.     int i;
  52.     static char t[300];
  53.     char tmp[80];
  54.     char *pc = simplify(c[0], -1);
  55.     char *pci;
  56.     if (SIZE > 2) {
  57.         if (strlen(pc) == 1 && pc[0] == '1')
  58.             sprintf(t,  "x^%d", SIZE - 1);
  59.         else if (strlen(pc) == 2 && pc[0] == '-' && pc[1] == '1')
  60.             sprintf(t,  "-x^%d", SIZE - 1);
  61.         else
  62.             sprintf(t,  "%s x^%d", simplify(c[0], -1), SIZE - 1);
  63.     }
  64.     else if (SIZE == 2) {
  65.         if (strlen(pc) == 1 && pc[0] == '1')
  66.             strcpy(t,  "x");
  67.         else if (strlen(pc) == 2 && pc[0] == '-' && pc[1] == '1')
  68.             strcpy(t,  "-x");
  69.         else
  70.             sprintf(t,  "%s x", simplify(c[0], -1));
  71.     }
  72.     else if (SIZE == 1) {
  73.         sprintf(t,  "%s", simplify(c[0], -1));
  74.     }
  75.     for (i = 1; i < SIZE; i++) {
  76.         pci = simplify(c[i], -1);
  77.         if (SIZE - 1 - i > 1) {
  78.             if (c[i] > 0.0) {
  79.                 if (strlen(pci) == 1 && pci[0] == '1') {
  80.                     sprintf(tmp,  " + x^%d", SIZE - 1 - i);
  81.                     strcat(t, tmp);
  82.                 }
  83.                 else {
  84.                     sprintf(tmp,  " + %s x^%d", simplify(c[i], -1), SIZE - 1 - i);
  85.                     strcat(t, tmp);
  86.                 }
  87.             }
  88.             else if (c[i] < 0.0) {
  89.                 if (strlen(pci) == 2 && pci[0] == '-' && pci[1] == '1') {
  90.                     sprintf(tmp,  " - x^%d", SIZE - 1 - i);
  91.                     strcat(t, tmp);
  92.                 }
  93.                 else {
  94.                     sprintf(tmp,  " - %s x^%d", simplify(fabs(c[i]), -1), SIZE - 1 - i);
  95.                     strcat(t, tmp);
  96.                 }
  97.             }
  98.         }
  99.         else if (SIZE - 1 - i == 1) {
  100.             if (c[i] > 0.0) {
  101.                 if (strlen(pci) == 1 && pci[0] == '1') {
  102.                     strcat(t, " + x");
  103.                 }
  104.                 else {
  105.                     sprintf(tmp,  " + %s x", simplify(c[i], -1));
  106.                     strcat(t, tmp);
  107.                 }
  108.             }
  109.             else if (c[i] < 0.0) {
  110.                 if (strlen(pci) == 2 && pci[0] == '-' && pci[1] == '1') {
  111.                     strcat(t, " - x");
  112.                 }
  113.                 else {
  114.                     sprintf(tmp,  " - %s x", simplify(fabs(c[i]), -1));
  115.                     strcat(t, tmp);
  116.                 }
  117.             }
  118.         }
  119.         else if (SIZE - 1 - i == 0) {
  120.             if (c[i] > 0.0) {
  121.                 sprintf(tmp,  " + %s", simplify(c[i], -1));
  122.                 strcat(t, tmp);
  123.             }
  124.             else if (c[i] < 0.0) {
  125.                 sprintf(tmp,  " - %s", simplify(fabs(c[i]), -1));
  126.                 strcat(t, tmp);
  127.             }
  128.         }
  129.     }
  130.     return (char *) t;
  131. }
  132. // 다향식 나눗셈 결과를
  133. //     (피제식) = (제식)(몫) + (나마지)
  134. // 형태로 출력
  135. void printDivisionResult(double a, double c[], double b[], int size) {
  136.     int SIZE = size;
  137.     int i;
  138.     double *pTmpPoly;
  139.     double r;
  140.     double monic[] = { 1.0, 0.0 };
  141.     print("  ");
  142.     print(toPolyString(c, SIZE));
  143.     println("");
  144.     print("    = ( ");
  145.     monic[1] = -a;
  146.     print(toPolyString(  monic, 2 ));
  147.     print(" )");
  148.     pTmpPoly = (double *)  calloc(SIZE - 1, sizeof(double));
  149.     for (i = 0; i < SIZE - 1; i++) {
  150.         pTmpPoly[i] = b[i];
  151.     }
  152.     print("( ");
  153.     print(toPolyString(pTmpPoly, SIZE - 1));
  154.     print(" )");
  155.     free(pTmpPoly);
  156.     r = b[SIZE - 1];
  157.     if (r > 0.0) {
  158.         print(" + ");
  159.         print(simplify(r, -1));
  160.     }
  161.     else if (r < 0.0) {
  162.         print(" - ");
  163.         print(simplify(fabs(r), -1));
  164.     }
  165.     println("");
  166. }
  167. // 조립제법 계산표 출력 함수
  168. void printSyntheticTable(double a, double c[], double s[], double q[], int size) {
  169.     int SIZE = size;
  170.     int i;
  171.     print("       | ");
  172.     print(simplify(c[0], 6));
  173.     for (i = 1; i < SIZE; i++) {
  174.         print("  ");
  175.         print(simplify(c[i], 6));
  176.     }
  177.     println("");
  178.     print(simplify(a, 6));
  179.     print(" | ");
  180.     print("        ");
  181.     print(simplify(s[1], 6));
  182.     for (i = 2; i < SIZE; i++) {
  183.         print("  ");
  184.         print(simplify(s[i], 6));
  185.     }
  186.     println("");
  187.     print("       |-");
  188.     for (i = 0; i < SIZE; i++) {
  189.         print("--------");
  190.     }
  191.     println("");
  192.     print("         ");
  193.     print(simplify(q[0], 6));
  194.     for (i = 1; i < SIZE; i++) {
  195.         print("  ");
  196.         print(simplify(q[i], 6));
  197.     }
  198.     println("");
  199. }
  200. // C/C++/Ch/Objective-C 언어의 실행 시작 지점
  201. int main(int argc, char *argv[]) {
  202.     int i;
  203.     int SIZE = argc - 2;
  204.     double a, c[15], s[15], b[15];
  205.     if (argc < 4) {
  206.         printUsage();
  207.         exit(1);
  208.     }
  209.     //////////////////////////////////////////////////////
  210.     // 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  211.     // 제식은 x -  a
  212.     a = atof(argv[1]);
  213.     for (i = 0; i < SIZE; i++) {
  214.         c[i] = atof(argv[i + 2]);
  215.     }
  216.     //////////////////////////////////////////////////////
  217.     // 조립제법의 주요 부분
  218.     s[0] = 0.0;
  219.     b[0] = c[0];
  220.     for (i = 1; i < SIZE; i++) {
  221.         s[i] = b[i-1]*a;
  222.         b[i] = c[i] + s[i];
  223.     }
  224.     //////////////////////////////////////////////////////
  225.     // 몫의 계수와 나머지를 출력한다.
  226.     print("몫의 계수는 ");
  227.     for (i = 0; i < SIZE - 2; i++) {
  228.         print(simplify(b[i], -1));
  229.         print(", ");
  230.     }
  231.     print(simplify(b[SIZE - 2], -1));
  232.     print(" 이고, 나머지는 ");
  233.     print(simplify(b[SIZE - 1], -1));
  234.     println(" 이다.");
  235.     println("");
  236.     //////////////////////////////////////////////////////
  237.     // 조립제법 표를 출력한다.
  238.     printSyntheticTable(a, c, s, b, SIZE);
  239.     println("");
  240.     //////////////////////////////////////////////////////
  241.     // (피제식) = (제식) x (몫) + (나머지)
  242.     printDivisionResult(a, c, b, SIZE);
  243.     return 0;
  244. }




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


실행> testSyntheticDivision 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 14 이다.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



 

Posted by Scripter
,


다음은 C용으로 만들어 둔 소스파일 testForFor.c(참조: 80컬럼 컨솔에 19단표 출력하기 예제 for C )를 Objective-C용 소스로 고친 것이다. 고쳐진 내용은 #import 부근 뿐이다. 특히

        #import <Foundation/Foundation.h>

가 중요하다.
스트링을 처리하고 전달하기 위해 메모리 할당(allocation)과 해제(free)를 하면서 동적 메모리(dynamic memory)를 이용하고 있다.

  1. /*
  2.  *  Filename: testForForMain.m
  3.  *
  4.  *  Compile:  Click Ctrl+F11 on Dev-C++
  5.  *
  6.  *  Execute:  testForFor
  7.  *
  8.  *  Date:  2012. 4. 30.
  9.  */
  10. #import <Foundation/Foundation.h>
  11. #import <stdio.h>
  12. #import <string.h>
  13. #import <memory.h>
  14. // 매개변수 dan으로 지정된 한 단의 결과를 매개변수 t로 전달한다.
  15. // 중요!! t로 전달된 메모리는 사용 후 반드시 해제(free)하여야 한다.
  16. void getDan(char *t[19], int dan) {
  17.     char sa[10], sb[10], sval[10];
  18.     int j;
  19.     // t[0], ... , t[18]에 각각 동적 메모리를 할당한다.
  20.     for (j = 0; j < 19; j++) {
  21.         t[j] = (char *) calloc(21, sizeof(char));
  22.     }
  23.     for (j = 0; j < 19; j++) {
  24.         sprintf(sa, "%d", dan);
  25.         if (strlen(sa) < 2)
  26.             sprintf(sa, " %d", dan);
  27.         sprintf(sb, "%d", j + 1);
  28.         if (strlen(sb) < 2)
  29.             sprintf(sb, " %d", j + 1);
  30.         sprintf(sval, "%d", dan*(j + 1));
  31.         if (strlen(sval) < 2)
  32.             sprintf(sval, "  %d", dan*(j + 1));
  33.         else if (strlen(sval) < 3)
  34.             sprintf(sval, " %d", dan*(j + 1));
  35.         strcpy(t[j], sa);
  36.         strcat(t[j], " x ");
  37.         strcat(t[j], sb);
  38.         strcat(t[j], " = ");
  39.         strcat(t[j], sval);
  40.     }
  41. }
  42. // 19단표를 모두 80컬럼 컨솔에 출력한다.
  43. void printAllNineteenDan() {
  44.     int d[4] = { 2, 7, 11, 16 };      // 각 줄단위 블럭의 첫단
  45.     int counter[4] = { 5, 4, 5, 4 };  // 각 줄단위 블럭에 속한 단의 개수
  46.     char *lines[19];
  47.     char *v[19];
  48.     int i, j, k;
  49.     char arr[18][19][21];
  50.     for (i = 2; i < 20; i++) {
  51.         getDan(v, i);
  52.         for (j = 0; j < 19; j++) {
  53.             strcpy(arr[i - 2][j], v[j]);
  54.         }
  55.     }
  56.     // lines[0], ... , lines[18]에 각각 동적 메모리를 할당한다.
  57.     for (j = 0; j < 19; j++) {
  58.         lines[j] = (char *) malloc(81 * sizeof(char));
  59.     }
  60.     for (k = 0; k < (sizeof(d)/sizeof(int)); k++) {
  61.         // 80 바이트 길이의 한 줄씩 완성
  62.         for (i = 0; i < 19; i++) {
  63.             strcpy(lines[i], arr[d[k]-2][i]);
  64.             for (j = 1; j < counter[k]; j++) {
  65.                 strcat(lines[i], "   ");
  66.                 strcat(lines[i], arr[d[k]-2+j][i]);
  67.             }
  68.         }
  69.         // 80 바이트 길이의 한 줄씩 출력
  70.         for (i = 0; i < 19; i++) {
  71.             printf("%s\n", lines[i]);
  72.         }
  73.         printf("\n");
  74.     }
  75.     // lines[0], ... , lines[18]로 할당받은 모든 동적 메모리를 해제한다.
  76.     for (j = 0; j < 19; j++) {
  77.         free(lines[j]);
  78.     }
  79.     // v[0], ... , v[18]로 할당받은 모든 동적 메모리를 해제한다.
  80.     for (j = 0; j < 19; j++) {
  81.         free(v[j]);
  82.     }
  83. }
  84. // Objective-C 언어의 main 함수 : 실행 시작 지점
  85. int main(void) {
  86.     printAllNineteenDan();    // 객체에 속하는 메소드 printDan()을 호출한다.
  87.     return 0;
  88. }


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

실행> testForFor

 2 x  1 =   2    3 x  1 =   3    4 x  1 =   4    5 x  1 =   5    6 x  1 =   6
 2 x  2 =   4    3 x  2 =   6    4 x  2 =   8    5 x  2 =  10    6 x  2 =  12
 2 x  3 =   6    3 x  3 =   9    4 x  3 =  12    5 x  3 =  15    6 x  3 =  18
 2 x  4 =   8    3 x  4 =  12    4 x  4 =  16    5 x  4 =  20    6 x  4 =  24
 2 x  5 =  10    3 x  5 =  15    4 x  5 =  20    5 x  5 =  25    6 x  5 =  30
 2 x  6 =  12    3 x  6 =  18    4 x  6 =  24    5 x  6 =  30    6 x  6 =  36
 2 x  7 =  14    3 x  7 =  21    4 x  7 =  28    5 x  7 =  35    6 x  7 =  42
 2 x  8 =  16    3 x  8 =  24    4 x  8 =  32    5 x  8 =  40    6 x  8 =  48
 2 x  9 =  18    3 x  9 =  27    4 x  9 =  36    5 x  9 =  45    6 x  9 =  54
 2 x 10 =  20    3 x 10 =  30    4 x 10 =  40    5 x 10 =  50    6 x 10 =  60
 2 x 11 =  22    3 x 11 =  33    4 x 11 =  44    5 x 11 =  55    6 x 11 =  66
 2 x 12 =  24    3 x 12 =  36    4 x 12 =  48    5 x 12 =  60    6 x 12 =  72
 2 x 13 =  26    3 x 13 =  39    4 x 13 =  52    5 x 13 =  65    6 x 13 =  78
 2 x 14 =  28    3 x 14 =  42    4 x 14 =  56    5 x 14 =  70    6 x 14 =  84
 2 x 15 =  30    3 x 15 =  45    4 x 15 =  60    5 x 15 =  75    6 x 15 =  90
 2 x 16 =  32    3 x 16 =  48    4 x 16 =  64    5 x 16 =  80    6 x 16 =  96
 2 x 17 =  34    3 x 17 =  51    4 x 17 =  68    5 x 17 =  85    6 x 17 = 102
 2 x 18 =  36    3 x 18 =  54    4 x 18 =  72    5 x 18 =  90    6 x 18 = 108
 2 x 19 =  38    3 x 19 =  57    4 x 19 =  76    5 x 19 =  95    6 x 19 = 114

 7 x  1 =   7    8 x  1 =   8    9 x  1 =   9   10 x  1 =  10
 7 x  2 =  14    8 x  2 =  16    9 x  2 =  18   10 x  2 =  20
 7 x  3 =  21    8 x  3 =  24    9 x  3 =  27   10 x  3 =  30
 7 x  4 =  28    8 x  4 =  32    9 x  4 =  36   10 x  4 =  40
 7 x  5 =  35    8 x  5 =  40    9 x  5 =  45   10 x  5 =  50
 7 x  6 =  42    8 x  6 =  48    9 x  6 =  54   10 x  6 =  60
 7 x  7 =  49    8 x  7 =  56    9 x  7 =  63   10 x  7 =  70
 7 x  8 =  56    8 x  8 =  64    9 x  8 =  72   10 x  8 =  80
 7 x  9 =  63    8 x  9 =  72    9 x  9 =  81   10 x  9 =  90
 7 x 10 =  70    8 x 10 =  80    9 x 10 =  90   10 x 10 = 100
 7 x 11 =  77    8 x 11 =  88    9 x 11 =  99   10 x 11 = 110
 7 x 12 =  84    8 x 12 =  96    9 x 12 = 108   10 x 12 = 120
 7 x 13 =  91    8 x 13 = 104    9 x 13 = 117   10 x 13 = 130
 7 x 14 =  98    8 x 14 = 112    9 x 14 = 126   10 x 14 = 140
 7 x 15 = 105    8 x 15 = 120    9 x 15 = 135   10 x 15 = 150
 7 x 16 = 112    8 x 16 = 128    9 x 16 = 144   10 x 16 = 160
 7 x 17 = 119    8 x 17 = 136    9 x 17 = 153   10 x 17 = 170
 7 x 18 = 126    8 x 18 = 144    9 x 18 = 162   10 x 18 = 180
 7 x 19 = 133    8 x 19 = 152    9 x 19 = 171   10 x 19 = 190

11 x  1 =  11   12 x  1 =  12   13 x  1 =  13   14 x  1 =  14   15 x  1 =  15
11 x  2 =  22   12 x  2 =  24   13 x  2 =  26   14 x  2 =  28   15 x  2 =  30
11 x  3 =  33   12 x  3 =  36   13 x  3 =  39   14 x  3 =  42   15 x  3 =  45
11 x  4 =  44   12 x  4 =  48   13 x  4 =  52   14 x  4 =  56   15 x  4 =  60
11 x  5 =  55   12 x  5 =  60   13 x  5 =  65   14 x  5 =  70   15 x  5 =  75
11 x  6 =  66   12 x  6 =  72   13 x  6 =  78   14 x  6 =  84   15 x  6 =  90
11 x  7 =  77   12 x  7 =  84   13 x  7 =  91   14 x  7 =  98   15 x  7 = 105
11 x  8 =  88   12 x  8 =  96   13 x  8 = 104   14 x  8 = 112   15 x  8 = 120
11 x  9 =  99   12 x  9 = 108   13 x  9 = 117   14 x  9 = 126   15 x  9 = 135
11 x 10 = 110   12 x 10 = 120   13 x 10 = 130   14 x 10 = 140   15 x 10 = 150
11 x 11 = 121   12 x 11 = 132   13 x 11 = 143   14 x 11 = 154   15 x 11 = 165
11 x 12 = 132   12 x 12 = 144   13 x 12 = 156   14 x 12 = 168   15 x 12 = 180
11 x 13 = 143   12 x 13 = 156   13 x 13 = 169   14 x 13 = 182   15 x 13 = 195
11 x 14 = 154   12 x 14 = 168   13 x 14 = 182   14 x 14 = 196   15 x 14 = 210
11 x 15 = 165   12 x 15 = 180   13 x 15 = 195   14 x 15 = 210   15 x 15 = 225
11 x 16 = 176   12 x 16 = 192   13 x 16 = 208   14 x 16 = 224   15 x 16 = 240
11 x 17 = 187   12 x 17 = 204   13 x 17 = 221   14 x 17 = 238   15 x 17 = 255
11 x 18 = 198   12 x 18 = 216   13 x 18 = 234   14 x 18 = 252   15 x 18 = 270
11 x 19 = 209   12 x 19 = 228   13 x 19 = 247   14 x 19 = 266   15 x 19 = 285

16 x  1 =  16   17 x  1 =  17   18 x  1 =  18   19 x  1 =  19
16 x  2 =  32   17 x  2 =  34   18 x  2 =  36   19 x  2 =  38
16 x  3 =  48   17 x  3 =  51   18 x  3 =  54   19 x  3 =  57
16 x  4 =  64   17 x  4 =  68   18 x  4 =  72   19 x  4 =  76
16 x  5 =  80   17 x  5 =  85   18 x  5 =  90   19 x  5 =  95
16 x  6 =  96   17 x  6 = 102   18 x  6 = 108   19 x  6 = 114
16 x  7 = 112   17 x  7 = 119   18 x  7 = 126   19 x  7 = 133
16 x  8 = 128   17 x  8 = 136   18 x  8 = 144   19 x  8 = 152
16 x  9 = 144   17 x  9 = 153   18 x  9 = 162   19 x  9 = 171
16 x 10 = 160   17 x 10 = 170   18 x 10 = 180   19 x 10 = 190
16 x 11 = 176   17 x 11 = 187   18 x 11 = 198   19 x 11 = 209
16 x 12 = 192   17 x 12 = 204   18 x 12 = 216   19 x 12 = 228
16 x 13 = 208   17 x 13 = 221   18 x 13 = 234   19 x 13 = 247
16 x 14 = 224   17 x 14 = 238   18 x 14 = 252   19 x 14 = 266
16 x 15 = 240   17 x 15 = 255   18 x 15 = 270   19 x 15 = 285
16 x 16 = 256   17 x 16 = 272   18 x 16 = 288   19 x 16 = 304
16 x 17 = 272   17 x 17 = 289   18 x 17 = 306   19 x 17 = 323
16 x 18 = 288   17 x 18 = 306   18 x 18 = 324   19 x 18 = 342
16 x 19 = 304   17 x 19 = 323   18 x 19 = 342   19 x 19 = 361



 

Posted by Scripter
,

소스 파일명: testWhileMain.m

  1. /*
  2.  * Filename: testWhileMain.cm
  3.  *
  4.  * Purpose:  Example using the while loop syntax
  5.  *               while ....
  6.  *
  7.  * Execute:  testWhile -200 300
  8. */
  9. #import <Foundation/Foundation.h>  // strtol, abs, exit 등을 위해 필요
  10. #import <stdio.h>
  11. #import <string.h>
  12. #import <math.h>
  13. // 사용법 표시
  14. void printUsage() {
  15.     printf("Using: testWhile [integer1] [integer2]\n");
  16.     printf("This finds the greatest common divisor of the given two integers.\n");
  17. }
  18. int main(int argc, char *argv[]) {
  19.     long val1, val2;
  20.     long a, b, q, r, gcd;
  21.     if (argc != 3) {
  22.         printUsage();
  23.         exit(1);
  24.     }
  25.     // 명령행 인자의 두 스트링을 가져와서
  26.     // 긴정수(long) 타입으로 변환하여
  27.     // 변수 val1과 val2에 저장한다.
  28.    val1 = strtol(argv[1], NULL, 10);    /// val1 = atoi(argv[1]);
  29.    val2 = strtol(argv[2], NULL, 10);    /// val2 = atoi(argv[2]);
  30.     // a는 |val1|, |val2| 중 큰 값
  31.     a = abs(val1);
  32.     b = abs(val2);
  33.     if (a < b) {
  34.         a = abs(val2);
  35.         b = abs(val1);
  36.     }
  37.     if (b == 0L) {
  38.         printf("GCD(%ld, %ld) = %ld\n", val1, val2, a);
  39.         exit(0);
  40.     }
  41.     // -------------------------------------------
  42.     // Euclidean 알고리즘의 시작
  43.     //
  44.     // a를 b로 나누어 몫은 q에, 나머지는 r에 저장
  45.     q = a / b;
  46.     r = a % b;
  47.     // Euclidean 알고리즘의 반복 (나머지 r이 0이 될 때 까지)
  48.     while (r != 0L) {
  49.         a = b;
  50.          b = r;
  51.         q = a / b;
  52.         r = a % b;
  53.     }
  54.     // 나머지가 0이면 그 때 나눈 수(제수) b가 최대공약수(GCD)이다.
  55.     gcd = b;
  56.     // 최대공약수(GCD)를 출력한다.
  57.     printf("GCD(%ld, %ld) = %ld\n", val1, val2, gcd);
  58.     return 0;
  59. }



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

실행:

Command> testWhile
Using: testWhile [integer1] [integer2]
This finds the greatest common divisor of the given two integers.

Command> testWhile 200 -300
GCD(200, -300) = 100

Command> testWhile 0 -300
GCD(0, -300) = 300

Command> testWhile 20 -125
GCD(20, -125) = 5

Command> testWhile 121 66
GCD(121, 66) = 11

Command> testWhile -111 -37
GCD(-111, -37) = 37

Posted by Scripter
,

소스 파일명: testIfMain.m

  1. #import <stdio.h>
  2. #import <stdlib.h>
  3. // 사용법 표시 함수
  4. void printUsing() {
  5.     printf("Using: testIf [number]\n");
  6.     printf("This determines whether the number is positive or not.\n");
  7. }
  8. // main 함수
  9. int main(int argc, char *argv[]) {
  10.     float val;
  11.     if (argc != 2) {
  12.         printUsing();
  13.         exit(1);
  14.         return 1;
  15.     }
  16.     // 명령행 인자의 스트링을 가져와서
  17.     // 배정밀도 부동소수점수로 변환하여
  18.     // 변수 val에 저장한다.
  19.     val = atof(argv[1]);
  20.     // 변수 val에 저장된 값이 양수인지 음수인지 0인지를
  21.     // 판단하는 if...else... 조건문
  22.     if (val > 0.0)
  23.         printf("%g is a positive number.\n", val);
  24.     else if (val < 0.0)
  25.         printf("%g is a negative number.\n", val);
  26.     else
  27.         printf("%g is zero.\n", val);
  28.     return 0;
  29. }


컴파일은 Dev-C++ 에서

실행> testIf
Using: testIf [number]
This determines whether the number is positive or not.

실행> testIf 1.234
1.234 is a positive number.

실행> testIf -1.234
-1.234 is a negative number.

실행> testIf 0
0 is zero.

Posted by Scripter
,

컴파일은 Dev-C++ 에서

소스 파일명: testArgumentsMain.m

  1. #import <Foundation/Foundation.h> // NSLog 사용을 위해
  2. #import <stdio.h>   // printf 함수 사용을 위해
  3. #import <string.h>    // atof 함수 사용을 위해
  4. // argc는 명령행 인자 개수, argv는 명령행 인자 문자열의 배열
  5. int main(int argc, const char *argv[]) {
  6.     int i;
  7.     double sum = 0.0;    // 초기화
  8.     // 명령행 인자(command-line argument) 개수 출력
  9.     printf("Count of arguments: %d\n", argc);
  10.     for (i = 0; i < argc; i++) {
  11.         // C 스트링을 배정밀도 부동소수점수로 변환하여 누적
  12.         sum += atof(argv[i]);
  13.     }
  14.     // 배정밀도 부동소수점수 값을 %g로 출력
  15.     printf("The sum of arguments is %g\n", sum);
  16.     // 배정밀도 부동소수점수 값을 %lg로 출력
  17.     NSLog(@"The sum of arguments is %lg\n", sum);
  18.     system("PAUSE");    // 키보드 입력 대기
  19.     return 0;
  20. }

 


실행> TestArguments 1 2 3 4
Count of arguments: 5
The sum of arguments is 10
TestArguments[2456] The sum of arguments is 10

실행> TestArguments 1 2 3 4.2
Count of arguments: 5
The sum of arguments is 10.2
TestArguments[5180] The sum of arguments is 10.2


 

Posted by Scripter
,

GNUStep 이 설치되었다면 헤더 파일 Foundation.h 를 수입(import)하였겠지만,
GNUStep 이 설치되지 않아 헤더 파일 Object.h 를 수입(import)하였다.


헤더 파일 HelloWorld.h
#import <Objc/Object.h>

@interface HelloWorld : Object
-(void) sayHello;
@end


구현 파일 HelloWorld.m
#import <stdio.h>
#import <Objc/Object.h>
#import "HelloWorld.h"

@implementation HelloWorld
-(void) sayHello {
    printf("Hello, world!\nThis was created by the Objective-C language.\n");
}
@end


실행부 파일 main.m
/*
 * Filename: main.m
 *
 *  Compile: gcc -v -o HelloWorld HelloWorld.m main.m -lobjc
 *  Execute: ./HelloWorld
 *
 *     Date: 2011. 8. 4.
 *   Author: phk
 */

#import <stdio.h>
#import <Objc/Object.h>
#import "HelloWorld.h"

int main() {
    id obj = [HelloWorld alloc];
    [obj sayHello];
    return 0;
}


컴파일하기
$ gcc -v -o HelloWorld HelloWorld.m main.m -lobjc


실행하기
 $ ./HelloWorld
Hello, world!
This was created by the Objective-C language.



Posted by Scripter
,
긴 자리 정수(BigInt) 게산이 가능한 ObjectiveC 언어로 작성된 소스를 작성하고 컴파일한다.

컴파일은 Mac OS X 10.6.x 의 명령줄(커맨드 라인)에서 gcc 로 한다.

   우선  http://www.santsys.com/code/display?folder=Objective-C&file=BigInt.h 에서 헤더 파일 BigInt.h 및구현 파일 BigInt.m 을 구해야 한다.
 
    그리고 BigInt.h 의 째 줄
#define MAX_LENGTH 70
을 
#define MAX_LENGTH 640
로 수정한다.


  아래의 소스는 300^2048 (300의 2048승)  까지 계산이 가능함을 보여준다. 

main.m 파일의 내용
/*
 * Filename: main.m
 *
 *  Compile: gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=c99
 *        Or gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=gnu99
 *
 *    Date: 2011. 8. 4.
 *  Author: phk
 */

#import <Foundation/Foundation.h>
#import <Foundation/NSString.h>
#import <stdio.h>
#import "BigInt.h"

int main( int argc, const char *argv[] ) {
    // create a new instance
    BigInt *x = [[BigInt alloc] initWithInt: 100];
    BigInt *y = [[BigInt alloc] initWithInt: 200];
    BigInt *z = [[BigInt alloc] init];
 
    [x initWithInt: 100];
    [y initWithInt: 200];
    x = [x add: y];
    z = [z add: x];
    z = [z multiply: z];  // z = 300^2
    z = [z multiply: z];  // z = 300^4
    z = [z multiply: z];  // z = 300^8
    z = [z multiply: z];  // z = 300^16
    z = [z multiply: z];  // z = 300^32
    z = [z multiply: z];  // z = 300^64
    z = [z multiply: z];  // z = 300^128
    z = [z multiply: z];  // z = 300^256
    z = [z multiply: z];  // z = 300^512
    z = [z multiply: z];  // z = 300^1024
    z = [z multiply: z];  // z = 300^2048
    // z = [z multiply: z];  // z = 300^4096

    // print it
    NSLog( @"x = %@\n", [x toStringWithRadix: 10] );
    NSLog( @"z = %@\n", [z toStringWithRadix: 10] );
    NSLog( @"The digits of z are %d\n", [[z toStringWithRadix: 10] length] );

    // free memory
    [z release];
    [y release];
    [x release];

    return 0;
}


컴파일하기

컴파일은 세개의 파일 BigInt.h, BigInt.m,  main.m  을 모두 동일한 폴더에 저장하고, 그 폴더에서 다음의 gcc 컴파일 명령을 내린다.
 

$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=c99
또는
$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main -std=gnu99

위에서 옵션 -std=c99 (또는 -std=gnu99)를 사용한 이유는 구현 파일 BigInt.m 에

    for (int i = 0; ... ; ... ) {
     ..........
    }

처럼 int i 의 선언이 구문 중간 중간에 있기 때문이다.

    int i;
    for (i = 0; ... ; ... ) {
     ..........
    }

처럼 int i 선언을 밖으로 뽑아내도 되지만 그러자면 구현 파일 BigInt.m 을 여러 곳 수정해야 하기 때문에 번거롭다.  이런 때는 컴파일 옵션 -std=c99(또는 -std-gnu99) 을 사용하는 것이 편리하다.

만일 이 옵션을 생략하여 명령

$ gcc -fobjc-gc-only -framework Foundation BigInt.m main.m -o main
으로 컴파일하면 에러 메세지

BigInt.m: In function ‘-[BigInt initWithBigInt:]’:
BigInt.m:129: error: ‘for’ loop initial declaration used outside C99 mode
...........................
......................... 

 
를 만난다. 

 


실행하기
$ ./main
2011-08-04 20:42:51.809 main[5267:903] x = 300
2011-08-04 20:42:52.077 main[5267:903] z = 13942147270623679146873528796701570723260623211399818675976228428320324826739932742348
50024760182945480272076581245800069562691222247613756153589976812373494337854015847291
06693395255281491169142017082115307947771801954704567433211464560639140944673635364155
01669338920161359403898468691617862370257835219063625177603974210138485147431108373510
28779931312121969626954646544698167192029706192523430266460141324855483079358472609004
41555694943498191955672798596377459777392636575523873495086339994375985976543710570091
43823325722842052959455745735960972363978751956762143499995484338210048940092499596190
40232593243010479659177831242751628805145427355281522289274838413728448102554703994718
41348890379437250393401562476664019972812975660227449988177768002661436897984534184331
07995039930675681806131094808453498537466120327843659034923143107156940238942976892218
04858389687649685235712612880380643104425852839332564045727486066401513073768002507254
27496845607662821346676098703361000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000
The digits of z are 5074

Posted by Scripter
,