다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Objective-C 소스 코드이다.

소스 내용은 C 언어 용이나 거의 마찬가지이다.


나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. /*
  2.  *  Filename: makeDivisionTable.m
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  * On Dev-C++ IDE,
  7.  *  Compile: Click Ctrl_F11
  8.  *  Execute: makeDivisionTable 12345 32
  9.  *           makeDivisionTable 500210 61
  10.  *
  11.  * On Cygwin or Linux,
  12.  *  Compile: gcc -v -o makeDivisionTable makeDivisionTable.m -lobjc
  13.  *  Execute: ./makeDivisionTable 12345 32
  14.  *           ./makeDivisionTable 500210 61
  15.  *          
  16.  *     Date:  2012/05/01
  17.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  18.  */
  19. #import <Foundation/Foundation.h>
  20. // #import <Objc/Object.h>
  21. #import <stdio.h>
  22. #import <string.h>
  23. #import <math.h>
  24. #import <memory.h>
  25. // enum { FALSE, TRUE };  not required for Dev-C++
  26. void println(char s[]) {
  27.     printf("%s\n", s);
  28. }
  29. void print(char s[]) {
  30.     printf("%s", s);
  31. }
  32. void printUsage() {
  33.     // println("Using: makeDivisionTable [numerator] [denominator]");
  34.     // println("Make a division table in a handy written form.");
  35.     println("사용법: makeDivisionTable [피제수] [제수]");
  36.     println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
  37. }
  38. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  39. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  40. char *simplify(double v, int width) {
  41.     int n, len;
  42.     static char t[] = "                               ";
  43.     char tmp[] = "                               ";
  44.     sprintf(t, "%g", v);
  45.     n = strlen(t);
  46.     if ((n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0'))
  47.         t[n-2] = '\0';
  48.     len = strlen(t);
  49.     strcpy(tmp, t);
  50.     if (len < width) {
  51.         strncpy(t, "               ", width - len);
  52.         t[width - len] = '\0';
  53.         strcat(t, tmp);
  54.     }
  55.     return (char *) t;
  56. }
  57. // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
  58. void getSuffix(char *buf, long v) {
  59.     long t = v % 10L;
  60.     char suffix[3];
  61.     char tbuf[2];
  62.     char suf[2][3] = { "은",  "는"};
  63.     strcpy(suffix, suf[0]);
  64.     sprintf(tbuf, "%d", t);
  65.     if (strchr("2459", tbuf[0]) != NULL) {
  66.         strcpy(suffix, suf[1]);
  67.     }
  68.     strcpy(buf, suffix);
  69. }
  70. long makeTable(long numer, long denom, long quotient) {
  71.     char sbuf[81];
  72.     char strNumer[40];
  73.     char strDenom[40];
  74.     char strQuotient[40];
  75.     char strTmpR[40];
  76.     char whiteChars[] = "                                                                                 ";
  77.     char underbarChars[]  = "_________________________________________________________________________________";
  78.     char barChars[]  = "---------------------------------------------------------------------------------";
  79.     char offsetSpaces[81];
  80.     char biasSpaces[81];
  81.     char spaces[81];
  82.     char uline[81];
  83.     char sline[81];
  84.     int i;
  85.     int lenN;
  86.     int lenD;
  87.     int lenQ;
  88.     int offsetLeft;
  89.     int bias;
  90.     long tmpR;
  91.     long tmpSub;
  92.     char oneDigit;
  93.     sprintf(strNumer, "%ld", numer);
  94.     sprintf(strDenom, "%ld", denom);
  95.     sprintf(strQuotient, "%ld", quotient);
  96.     lenN = strlen(strNumer);
  97.     lenD = strlen(strDenom);
  98.     lenQ = strlen(strQuotient);
  99.     offsetLeft = 3 + lenD + 3;
  100.     bias = lenN - lenQ;
  101.     strncpy(offsetSpaces, whiteChars, offsetLeft);
  102.     offsetSpaces[offsetLeft] = '\0';
  103.     strncpy(biasSpaces, whiteChars, bias);
  104.     biasSpaces[bias] = '\0';
  105.     strncpy(uline, underbarChars, lenN + 2);
  106.     uline[lenN + 2] = '\0';
  107.     strncpy(sline, barChars, lenN);
  108.     sline[lenN] = '\0';
  109.     printf("%s%s%ld\n", offsetSpaces, biasSpaces, quotient);
  110.     sprintf(sbuf, offsetSpaces);
  111.     sbuf[offsetLeft - 2] = '\0';
  112.     printf("%s%s\n", sbuf, uline);
  113.     printf("   %s ) %s", strDenom, strNumer);
  114.     strncpy(strTmpR, strNumer, bias + 1);
  115.     strTmpR[bias + 1] = '\0';
  116.     tmpR = atoi(strTmpR);
  117.     tmpSub = 0L;
  118.     for (i = 0; i < lenQ; i++) {
  119.         if (strQuotient[i] == '0') {
  120.             if (i + 1 < lenQ) {
  121.                 oneDigit = strNumer[bias + i + 1];
  122.                 printf("%c", oneDigit);
  123.                 sprintf(sbuf, "%c", oneDigit);
  124.                 strcat(strTmpR, sbuf);
  125.                 tmpR = atoi(strTmpR);
  126.             }
  127.         }
  128.         else {
  129.             println("");
  130.             tmpSub = (long)(strQuotient[i] - '0') * denom;
  131.             printf("%s%s\n", offsetSpaces, simplify(tmpSub, bias + i + 1));
  132.             printf("%s%s\n", offsetSpaces, sline);
  133.             tmpR = tmpR - tmpSub;
  134.             if (tmpR == 0L && i + 1 < lenQ) {
  135.                 strncpy(sbuf, whiteChars, bias + i + 1);
  136.                 sbuf[bias + i + 1] = '\0';
  137.                 printf("%s%s", offsetSpaces, sbuf);
  138.             }
  139.             else {
  140.                 printf("%s%s", offsetSpaces, simplify(tmpR, bias + i + 1));
  141.             }
  142.             sprintf(strTmpR, "%ld", tmpR);
  143.             if (i + 1 < lenQ) {
  144.                 oneDigit = strNumer[bias + i + 1];
  145.                 printf("%c", oneDigit);
  146.                 sprintf(sbuf, "%c", oneDigit);
  147.                 strcat(strTmpR, sbuf);
  148.                 tmpR = atoi(strTmpR);
  149.             }
  150.         }
  151.     }
  152.     println("");
  153.     return tmpR;
  154. }
  155. // C/C++/Ch/Objective-C 언어의 실행 시작 지점
  156. int main(int argc, char *argv[]) {
  157.     int i;
  158.     int SIZE = argc - 2;
  159.     long a, b, q, r, k;
  160.     char mbuf[3];
  161.     if (argc < 3) {
  162.         printUsage();
  163.         exit(1);
  164.     }
  165.     a = atoi(argv[1]);
  166.     b = atoi(argv[2]);
  167.     if (a <= 0L) {
  168.         printf("피제수: %ld\n", a);
  169.         println("피제수는 양의 정수라야 합니다.");
  170.         exit(1);
  171.     }
  172.     if (b <= 0L) {
  173.          printf("제수: %ld\n", b);
  174.          println("제수는 양의 정수라야 합니다.");
  175.          exit(1);
  176.     }
  177.     q = a / b;
  178.     r = a % b;
  179.     printf("나눗셈 %ld ÷ %ld 의 결과: ", a, b);
  180.     printf("몫: %ld, ", q);
  181.     printf("나머지: %ld\n", r);
  182.     println("");
  183.     k = makeTable(a, b, q);
  184.     if (k == r) {
  185.         printf("\n나머지: %ld\n", k);
  186.     }
  187.     if (k == 0L) {
  188.         printf("%ld = %ld x %ld\n", a, b, q);
  189.         getSuffix(mbuf, a);
  190.         printf("%ld%s %ld의 배수(mupltiple)이다.\n", a, mbuf, b);
  191.         getSuffix(mbuf, b);
  192.         printf("%ld%s %ld의 약수(divisor)이다.\n", b, mbuf, a);
  193.     }
  194.     else {
  195.         getSuffix(mbuf, a);
  196.         printf("%ld = %ld x %ld + %ld\n", a, b, q, r);
  197.         printf("%ld%s %ld의 배수(mupltiple)가 아니다.\n", a, mbuf, b);
  198.     }
  199.     return 0;
  200. }



실행> makeDivisionTable 500210 61

나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10

          8200
      ________
   61 ) 500210
        488
        ------
         122
         122
        ------
            10

나머지: 10
500210 = 61 x 8200 + 10
500210은 61의 배수(mupltiple)가 아니다.



 

Posted by Scripter

댓글을 달아 주세요