다음은  대화형 모드(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
,

다음은  이차방정식 x^2 - x - 1  = 0 의 양의 근 즉 황금비율(golden ratio)을 구하는 C 애플리케이션 소스이다. 황금비율을 구하는 비례방정식은   1 : x = x : (x+1) 이며, 이를 이차방정식으로 표현한 것이 x^2 - x - 1  = 0 이다.

See:  Golden ratio - Sajun.org

아래의 소스파일은 C  언어용으로 민들어 두었던 소스 황금비율(golden ratio) 구하기 withfC and Ch 를 아주 조금 수정한 것이다. 수정한 부분은 #include를 #import로 바꾸고, 또

        #import  <Foundation/Foundation.h>

를 추가하고, 또 double 타입의 부동소수점수를 출력하기위한 printf 포맷에 %lf 대신 %g를 사용하역다. (만일 Foundation.h 를 수입(import)하지 않으면, exit 에러가 발생한다.)

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

  1. /*
  2.  *  Filename: testGoldenRatioMain.m
  3.  *    황금률(즉, 이차방정식 x^2 - x - 1  = 0 의 양의 근)을 계산한다.
  4.  *
  5.  *   Compile: Click Ctrl+F11
  6.  *
  7.  *   Execute: testGoldenRatio
  8.  *
  9.  *      Date:  2012/04/30
  10.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  11.  */
  12. #import <Foundation/Foundation.h>   // for exit()
  13. #import <stdio.h>
  14. #import <string.h>
  15. #import <math.h>
  16. typedef struct _PAIR {
  17.     double x1;
  18.     double x2;
  19. } PAIR;
  20. void printUsing() {
  21.     printf("Using: testGoldenRatio [-h|-help]\n");
  22.     printf("This calculates the value of the golden ratio.\n");
  23. }
  24. // 이차방정식 a x^2 + b x + c  = 0 의 근을 구한다.
  25. PAIR *findQuadraticRoot(double a, double b, double c) {
  26.     static PAIR zeros;
  27.     if (a == 0.0) {
  28.         fprintf(stderr, "Since the highest coefficient is zero, the given equation is not a quadratic equation.\n");
  29.         exit(1);
  30.     }
  31.     else if (b*b - 4*a*c < 0.0) {
  32.         fprintf(stderr, "Since the discriminant %f is negative, the given equation has no real root.\b", b*b - 4*a*c);
  33.     exit(1);
  34.     }
  35.     zeros.x1 = (-b + sqrt(b*b - 4*a*c)) / (2.0 * a);
  36.     zeros.x2 = (-b - sqrt(b*b - 4*a*c)) / (2.0 * a);
  37.     return (PAIR *)&zeros;
  38. }
  39. void main(int argc, const char *argv[]) {
  40.     PAIR *values;
  41.     double x1, x2;
  42.     if (argc > 1 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-help") == 0)) {
  43.         printUsing();
  44.         exit(1);
  45.     }
  46.     values = findQuadraticRoot(1.0, -1.0, -1.0);
  47.     x1 = values->x1;
  48.     x2 = values->x2;
  49.     if (x1 >= x2) {
  50.        // neither %lg nor %lf, but %g or %f for Object-C
  51.         printf("The bigger root is %g, \n", x1);
  52.         printf("and the less root is %g.\n", x2);
  53.     }
  54.     else {
  55.        // neither %lg nor %lf, but %g or %f for Object-C
  56.         printf("The bigger root is %g, \n", x2);
  57.         printf("and the less root is %g.\n", x1);
  58.     }
  59. }



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

실행> testGoldenRatio
The bigger root is 1.61803,
and the less root is -0.618034.



Posted by Scripter
,

현재 시각을 컨솔에 보여주는 간단한 애플리케이션의 Objective-C 언어 소스 코드이다.
UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다.
* UTC(Universal Time  Coordinated, 협정세계시, 協定世界時)

아래의 소스파일은 C  언어용으로 민들어 두었던 소스 현재 시각 알아내기 for C and Ch 를 아주 조금 수정한 것이다. 수정한 부분은 #include를 #import로 바꾸고, 또

        #import  <Foundation/Foundation.h>

를 추가했을 뿐이다. 이 소스에서는 이 수입 구문이 없어도 된다.

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


  1. /*
  2.  *  Filename: testCTimeMain.m
  3.  *
  4.  *  Compile: Click Ctrl+F11 on Dev-C++ IDE
  5.  *
  6.  *  Execute: testCTime
  7.  */
  8. #import <Foundation/Foundation.h>
  9. #import <stdio.h>
  10. #import <time.h>
  11. char weekNames[7][3] = {
  12.  "일", "월", "화", "수", "목", "금", "토"
  13. };
  14. int main() {
  15.    time_t timer;
  16.     struct tm *t;
  17.     timer = time(NULL); // 현재 시각을 초 단위로 얻기
  18.     t = localtime(&timer); // 초 단위의 시간을 분리하여 구조체에 넣기
  19.     // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
  20.     printf("UTC: %d초\n", timer);
  21.     // 현재 시각 표시: 200x년 x월 xx일 (x요일) xx시 xx분 xx초
  22.     printf("%d년 %d월 %d일 (%s요일) ", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, seekNames[t->tm_wday]);
  23.     printf("%d시 %d분 %d초\n", t->tm_hour, t->tm_min, t->tm_sec);
  24.     // t->tm_yday의 값: 1월 1일은 0, 1월 2일은 1
  25.     printf("올해 몇 번째 날: %d, ", 1 + t->tm_yday);
  26.     // t->tm_isdst의 값: 0 이면 서머타임 없음
  27.     printf("서머타임 적용 여부: %s\n", (t->tm_isdst == 0) ? "안함" : "함");
  28.     return 0;
  29. }



컴파일은 Ctrl+F11 클릭

실행> testCTime
UTC: 1335787722초
2012년 4월 30일 (월요일) 21시 8분 42초
올해 몇 번째 날: 121, 서머타임 적용 여부: 안함


Posted by Scripter
,

우선 위키피디아에서 소개하는 MPFR의 설명을 보자

GNU MPFR (for GNU Multiple Precision Floating-Point Reliably[1]) is a portable C library for arbitrary-precision binary floating-point computation with correct rounding, based on GNU Multi-Precision Library.

 

  또 다음은 MPFR 홈페이지에서 소개하는 MPFR의 의미이다.

The main goal of MPFR is to provide a library for multiple-precision floating-point computation which is both efficient and has a well-defined semantics. It copies the good ideas from the ANSI/IEEE-754 standard for double-precision floating-point arithmetic (53-bit significand).

 

GMP는 자리수가 긴 정수 계산을 하기 위한 라이브러리이지만, MPFR은 (IEEE-754의 한계를 넘어) 소소점 이하의 자리수를 원하는 만큼 충분히 확보하여 (유효숫자의 길이가 매우 긴) 소수점수를 계산하기 위한 라이브러리이다.


MPFR을 설치하자면 먼저 GMP가 설치되어 있어야 한다. MPFR의 현재 안정 버전은 3.1,0(2011년 10월 3일 출시)이다. MPFR을 설치하기 위해 GMP 4.1.0 이상이면 되지만, 가급적 GMP 4.2.3 이상을 추천한다. 

MPFR 소스의 압축파일을 내려받아서 압축 해제하고, 그 해제된 디렉로리로 가서

       $ ./configure --prefix=설치될경로 --with-gmp=이미설치된GMP리이브러리의경로

       (예: ./configure --prefix=/usr/local --with-gmp=/usr/local )

       (다른 예: ./configure --prefix=/usr/local --with-gmp-lib=/usr/local/lib --with-gmp-include=/usr/local/include )

       $ make 

       $ make check

       $ sudo make install

의 순서로 설치한다.


다음 소스 코드는 MPFR의 설치 테스트를 하기 위한 간단한 예제(오일러의 초월수 e를 계산하는 예제)이다.

C 언어에서 MPFR 라이브러리를 사용하기 위해서는 헤더 파일 gmp.h와 mpfr.h를 인클루드한다.
컴파일할 때는 반드시 컴파일 옵션 -lmpfr(또는 -lmpfr -lgmp)를 주어야 한다.
또 컴파일 옵션 -o testMPFR 을 준 것은 생성될 실행파일명을 testMPFR로 하라는 의미이다.
이 옵션을 생략하면 생성되는 실행파일명이 a.out(단, cygwin의 경우에는 a.exe)이다.

mpfr_set_d 함수는 mpfr_t 타입의 소수점수에 double 타입의 부동소수점수를 대입하는 함수이고,
mpfr_mul_ui 함수는 mpfr_t 타입의 소수점수에 unsigned long 타입의 정수를 곱하여 대입하는 함수이고,
mpfr_add 함수는 mpfr_t 타입의 소수점수에 mpfr_t 타입의 소수점수를 합아려 대입하는 함수이고,
mpfr_div 함수는 mpfr_t 타입의 소수점수에 mpfr_t 타입의 소수점수를 나누어 대입하는 함수이다.

mpfr_init2 함수는 mpfr_t 타입의 소수점수 변수를 초기화 하는 함수이다. (초기화된 값은 0.0)

       mpfr_init2(t, 200);

또 mpfr_out_str 함수는 첫번째 인수에 지정된 출력장치에 주어진 ASCIZ 문자열을 두번째 인수에 주어진 적당한 진법(이 예에서는 10)을 적용하여 네번째 인수에 주어진 mpfr_t 타입의 소수점수(이 예에서는 s)를 출력하는 함수이다.


  1. // Filename: testMPFR.c
  2. //
  3. //     See: http://www.mpfr.org/sample.html
  4. //
  5. // Compile: gcc -o testMPFR testMPFR.c -lmpfr
  6. //      Or: gcc -o testMPFR testMPFR.c -lmpfr -lgmp
  7. // ExecuteL ./testMPFR
  8. #include <stdio.h>
  9. #include <gmp.h>
  10. #include <mpfr.h>
  11. int main (void)
  12. {
  13.   unsigned int i;
  14.   mpfr_t s, t, u;
  15.   mpfr_init2 (t, 200);
  16.   mpfr_set_d (t, 1.0, GMP_RNDD);
  17.   mpfr_init2 (s, 200);
  18.   mpfr_set_d (s, 1.0, GMP_RNDD);
  19.   mpfr_init2 (u, 200);
  20.   for (i = 1; i <= 100; i++)
  21.     {
  22.       mpfr_mul_ui (t, t, i, GMP_RNDU);
  23.       mpfr_set_d (u, 1.0, GMP_RNDD);
  24.       mpfr_div (u, u, t, GMP_RNDD);
  25.       mpfr_add (s, s, u, GMP_RNDD);
  26.     }
  27.   printf ("Sum is ");
  28.   mpfr_out_str (stdout, 10, 0, s, GMP_RNDD);
  29.   putchar ('\n');
  30.   mpfr_clear (s);
  31.   mpfr_clear (t);
  32.   mpfr_clear (u);
  33.   return 0;
  34. }
  35. /*
  36. Output:
  37. Sum is 2.7182818284590452353602874713526624977572470936999595749669131
  38. */


컴파일> gcc -o testMPFR testMPFR.c -lmpfr -lgmp

실행> ./testMPFR
2.7182818284590452353602874713526624977572470936999595749669131




Posted by Scripter
,

다항식 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
,

C 언어에서 long long 타입은 (부호가 있는) 64비트 정수 타입입니다.

win32 환경이라도 long long 타입을 C 언어에서 쓸 수 있습니다.

아래의 소스는

    Visual C++ 2010 Express

    Dev-C++

    LCC 컴파일러  또는  LCC-win32 컴파일러

   GCC 컴파일러

   TCC (Tiny-CC) 컴파일러

중 하나면 컴파일하여 실행시킬 수 있습니다.

 

TCC 로는 -run 옵션을 사용하여

    프롬프트>   tcc -run testLongLong.c

하면 (실행 파일 만들지 않고) 소스를 직접 실행시킬 수 있습니다.

 

 

// Filename: testLongLong_001.c
//
// Compile & Link: gcc -o  testComplexISOC99_002  testLongLong_001.c
// Execute: ./tesLongLong_001
//
// Or
//
// Compile & Link: cl testLongLong_001.c
// Execute: testLongLong_001
//
// Or
//
// Compile & Link: lc testLongLong_001.c
// Execute: testLongLong_001
//
// Or
//
// Compile: lcc -o testLongLong_001.obj testLongLong_001.c
// Link: lcclnk testLongLong_001.obj
// Execute: tesLongLong_001


#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
 long long a = 1000000000L;
 long long b = 1000000000L;
 char buf[100];

    printf("a * b = %lld * %lld = %lld\n", a, b, a*b);

    sprintf(buf, "%lld", a*b);
    printf("strlen(a * b) = strlen(%lld) = %d\n", a*b, strlen(buf));

    return 0;
}

/*
-------------------
Result of execution:
-------------------
a * b = 1000000000 * 1000000000 = 1000000000000000000
strlen(a * b) = strlen(1000000000000000000) = 19
*/

 

 

 

Posted by Scripter
,