다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 C++ 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- /*
- * Filename: makeDivisionTableCPP.cpp
- *
- * Purpose: Make a division table in a handy written form.
- *
- * Compile: cl /GX makeDivisionTableCPP.cpp
- *
- * Execute: makeDivisionTableCPP 12345 32
- * makeDivisionTableCPP 500210 61
- *
- * Date: 2008/05/15
- * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- */
- #include <iostream>
- #include <string>
- #include <cmath>
- #include <memory>
- using namespace std;
- enum { FALSE, TRUE };
- void println(char s[]) {
- cout << s << endl;
- }
- void print(char s[]) {
- cout << 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 언어의 실행 시작 지점
- 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;
- }
실행> makeDivisionTableCPP 500210 61
나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 나머지: 10 500210 = 61 x 8200 + 10 500210은 61의 배수(mupltiple)가 아니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > C++' 카테고리의 다른 글
STL을 이용한 RPN 계산기 소스 for C++ (0) | 2009.02.07 |
---|---|
C/C++ 프로그래밍 추천 사이트 (0) | 2009.02.07 |
클래스 상속(subclassing) 예제 with C++ (0) | 2008.04.05 |
7비트 ASCII 코드표 만들기 예제 with C++ (0) | 2008.03.31 |
진법(radix) 표 만들기 예제 with C++ (0) | 2008.03.30 |