다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Objective-C 소스 코드이다.
소스 내용은 C 언어 용이나 거의 마찬가지이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- /*
- * Filename: makeDivisionTable.m
- *
- * Purpose: Make a division table in a handy written form.
- *
- * On Dev-C++ IDE,
- * Compile: Click Ctrl_F11
- * Execute: makeDivisionTable 12345 32
- * makeDivisionTable 500210 61
- *
- * On Cygwin or Linux,
- * Compile: gcc -v -o makeDivisionTable makeDivisionTable.m -lobjc
- * Execute: ./makeDivisionTable 12345 32
- * ./makeDivisionTable 500210 61
- *
- * Date: 2012/05/01
- * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- */
- #import <Foundation/Foundation.h>
- // #import <Objc/Object.h>
- #import <stdio.h>
- #import <string.h>
- #import <math.h>
- #import <memory.h>
- // enum { FALSE, TRUE }; not required for Dev-C++
- void println(char s[]) {
- printf("%s\n", s);
- }
- void print(char s[]) {
- printf("%s", s);
- }
- void printUsage() {
- // println("Using: makeDivisionTable [numerator] [denominator]");
- // println("Make a division table in a handy written form.");
- println("사용법: makeDivisionTable [피제수] [제수]");
- println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
- }
- // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
- // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
- char *simplify(double v, int width) {
- int n, len;
- static char t[] = " ";
- char tmp[] = " ";
- sprintf(t, "%g", v);
- n = strlen(t);
- if ((n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0'))
- t[n-2] = '\0';
- len = strlen(t);
- strcpy(tmp, t);
- if (len < width) {
- strncpy(t, " ", width - len);
- t[width - len] = '\0';
- strcat(t, tmp);
- }
- return (char *) t;
- }
- // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
- void getSuffix(char *buf, long v) {
- long t = v % 10L;
- char suffix[3];
- char tbuf[2];
- char suf[2][3] = { "은", "는"};
- strcpy(suffix, suf[0]);
- sprintf(tbuf, "%d", t);
- if (strchr("2459", tbuf[0]) != NULL) {
- strcpy(suffix, suf[1]);
- }
- strcpy(buf, suffix);
- }
- long makeTable(long numer, long denom, long quotient) {
- char sbuf[81];
- char strNumer[40];
- char strDenom[40];
- char strQuotient[40];
- char strTmpR[40];
- char whiteChars[] = " ";
- char underbarChars[] = "_________________________________________________________________________________";
- char barChars[] = "---------------------------------------------------------------------------------";
- char offsetSpaces[81];
- char biasSpaces[81];
- char spaces[81];
- char uline[81];
- char sline[81];
- int i;
- int lenN;
- int lenD;
- int lenQ;
- int offsetLeft;
- int bias;
- long tmpR;
- long tmpSub;
- char oneDigit;
- sprintf(strNumer, "%ld", numer);
- sprintf(strDenom, "%ld", denom);
- sprintf(strQuotient, "%ld", quotient);
- lenN = strlen(strNumer);
- lenD = strlen(strDenom);
- lenQ = strlen(strQuotient);
- offsetLeft = 3 + lenD + 3;
- bias = lenN - lenQ;
- strncpy(offsetSpaces, whiteChars, offsetLeft);
- offsetSpaces[offsetLeft] = '\0';
- strncpy(biasSpaces, whiteChars, bias);
- biasSpaces[bias] = '\0';
- strncpy(uline, underbarChars, lenN + 2);
- uline[lenN + 2] = '\0';
- strncpy(sline, barChars, lenN);
- sline[lenN] = '\0';
- printf("%s%s%ld\n", offsetSpaces, biasSpaces, quotient);
- sprintf(sbuf, offsetSpaces);
- sbuf[offsetLeft - 2] = '\0';
- printf("%s%s\n", sbuf, uline);
- printf(" %s ) %s", strDenom, strNumer);
- strncpy(strTmpR, strNumer, bias + 1);
- strTmpR[bias + 1] = '\0';
- tmpR = atoi(strTmpR);
- tmpSub = 0L;
- for (i = 0; i < lenQ; i++) {
- if (strQuotient[i] == '0') {
- if (i + 1 < lenQ) {
- oneDigit = strNumer[bias + i + 1];
- printf("%c", oneDigit);
- sprintf(sbuf, "%c", oneDigit);
- strcat(strTmpR, sbuf);
- tmpR = atoi(strTmpR);
- }
- }
- else {
- println("");
- tmpSub = (long)(strQuotient[i] - '0') * denom;
- printf("%s%s\n", offsetSpaces, simplify(tmpSub, bias + i + 1));
- printf("%s%s\n", offsetSpaces, sline);
- tmpR = tmpR - tmpSub;
- if (tmpR == 0L && i + 1 < lenQ) {
- strncpy(sbuf, whiteChars, bias + i + 1);
- sbuf[bias + i + 1] = '\0';
- printf("%s%s", offsetSpaces, sbuf);
- }
- else {
- printf("%s%s", offsetSpaces, simplify(tmpR, bias + i + 1));
- }
- sprintf(strTmpR, "%ld", tmpR);
- if (i + 1 < lenQ) {
- oneDigit = strNumer[bias + i + 1];
- printf("%c", oneDigit);
- sprintf(sbuf, "%c", oneDigit);
- strcat(strTmpR, sbuf);
- tmpR = atoi(strTmpR);
- }
- }
- }
- println("");
- return tmpR;
- }
- // C/C++/Ch/Objective-C 언어의 실행 시작 지점
- int main(int argc, char *argv[]) {
- int i;
- int SIZE = argc - 2;
- long a, b, q, r, k;
- char mbuf[3];
- if (argc < 3) {
- printUsage();
- exit(1);
- }
- a = atoi(argv[1]);
- b = atoi(argv[2]);
- if (a <= 0L) {
- printf("피제수: %ld\n", a);
- println("피제수는 양의 정수라야 합니다.");
- exit(1);
- }
- if (b <= 0L) {
- printf("제수: %ld\n", b);
- println("제수는 양의 정수라야 합니다.");
- exit(1);
- }
- q = a / b;
- r = a % b;
- printf("나눗셈 %ld ÷ %ld 의 결과: ", a, b);
- printf("몫: %ld, ", q);
- printf("나머지: %ld\n", r);
- println("");
- k = makeTable(a, b, q);
- if (k == r) {
- printf("\n나머지: %ld\n", k);
- }
- if (k == 0L) {
- printf("%ld = %ld x %ld\n", a, b, q);
- getSuffix(mbuf, a);
- printf("%ld%s %ld의 배수(mupltiple)이다.\n", a, mbuf, b);
- getSuffix(mbuf, b);
- printf("%ld%s %ld의 약수(divisor)이다.\n", b, mbuf, a);
- }
- else {
- getSuffix(mbuf, a);
- printf("%ld = %ld x %ld + %ld\n", a, b, q, r);
- printf("%ld%s %ld의 배수(mupltiple)가 아니다.\n", a, mbuf, b);
- }
- return 0;
- }
실행> makeDivisionTable 500210 61
나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10
8200
________
61 ) 500210
488
------
122
122
------
10
나머지: 10
500210 = 61 x 8200 + 10
500210은 61의 배수(mupltiple)가 아니다.
'프로그래밍 > Objective-C' 카테고리의 다른 글
스트링 배열 정렬(sorting)하기 with Objective-C (0) | 2012.05.02 |
---|---|
손으로 계산하는 긴자리 곱셈표 만들기 with Objective-C (0) | 2012.05.01 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Objective-C (0) | 2012.05.01 |
7비트 ASCII 코드표 만들기 예제 with Objective-C (0) | 2012.05.01 |
진법(radix) 표 만들기 예제 with Objective-C (0) | 2012.05.01 |