소스 파일명: testWhileCPP.cpp

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



실행:

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

Command> ch testWhileCPP.ch 200 -300
GCD(200, -300) = 100

Command> ch testWhileCPP.ch 0 -300
GCD(0, -300) = 300

Command> ch testWhileCPP.ch 20 -125
GCD(20, -125) = 5

Command> ch testWhileCPP.ch 121 66
GCD(121, 66) = 11

Command> ch testWhileCPP.ch -111 -37
GCD(-111, -37) = 37





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

C++ 언어는 C언어와 달리 객체지향(obeject oriented) 언어이다.
C++ 언어에서 클래스(class) 라고 하는 것은 C 언어의 구조체(struct) 개념을 확장한 것이다.
C 언어의 구조체(struct)는 자료(데이터)만 가질 수 있지만, C++ 언어의 클래스(class)는 자료 뿐만이 아니라 자료를 핸들링하는 메소드도 가질 수 있다.
메소드란 클래스에 소속된다는 것이 C 언어의 함수와 구별된다.

클래스 변수를 선언험과 동시에 클래스에 속한 자료와 메소드는 동적으로 로딩되어 힙(heap)이라는 메모리에 탑재된다.

C 언어의 구조체 정의 구문 양식:
  struct 구조체명 {
      타입 변수명1;
      타입 변수명2;
          ...........
      타입 변수명n;
};

C++ 언어의 클래스 정의 구문 양식:
  class 클래스명 {
     접근유형1:    // 접근 유형은 public, protected, procate 등
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;

     접근유형2:
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;
};



소스 파일명: forTestObject.cpp
------------------------------[소스 시작]
#include <iostream.h>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();   // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

위의 소스에서 endl 은 C 언어의 개행 문자 "\n"에 해당한다.
컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl forTestObject.cpp

(참고: 에러 없이 컴파일이 순조롭게 끝나면 현재 디렉토리에 forTestObject.obj라는 목적 파일과 forTestObject.exe라는 살행 파일이 존재할 것이다.)

실행> forTestObject
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


확장자명이 cpp인 소스도 (컴파일 과정 없이) Ch에 의하여 직접 실행된다.

Command> ch forTestObject.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


위의 소스는 표준화되기 전의 C++ 소스이다. 1998년에 정해진 C++표준화에 따르면 헤더 파일 포함 구문이

        #include <iostream.h>
        #include <string.h>
        #include <math.h>
        등

으로 부터

        #include <iostream>
        #include <string>
        #include <cmath>
        등

으로 변경되었다. 이렇게 변경해야 표준 C++에서 printf 등을 쓸 수 잇다. 하지만 cout, cin 등은 std::cout, std::cin 등으로 써야 한다. 이것이 불편하다면 헤더 파일 포함(include) 구문이 끝난 후

        using namespace std;

라는 한 줄만 추가하면 된다.
(내부 참고:  C 유저를 위한 C++ 팁 모음)
(상세 외부 참고: 방법: 표준 C++ 프로그램 만들기)
    
다음 소스는 forTestObject.cpp 를 표준 C++에 따라 재작성한 소스이다.


소스 파일명: forTestObject2.cpp
------------------------------[소스 시작]
#include <iostream>

using namespace std;

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl /GX forTestObject2.cpp
   (또는) cl -GX forTestObject2.cpp
   (또는) cl /EHsc forTestObject2.cpp
   (또는) cl -EHsc forTestObject2.cpp

(실행 결과는 위와 같다.)

이 소스도 (컴파일 없이) 직접 Ch로  실행된다.

Command> ch forTestObject2.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



Linux(또는 Unix) 플랫폼에서 gcc나 g++gh 컴파일 하는 경우라면 main 함수만 다음 처럼 수정하면 된다. Linux(또는 Unix) 플랫폼의 경우에는 C++ 소스의 확장명을 보통 cc로 한다. 따라서 소스 파일명을 forTestObject2.cc로 저장하여 컴파일한다.

// main 함수
int main() {
  ForTestObject test;
  test.printDan(2);
  return 0;
}

컴파일> gcc -o forTestObject2 forTestObject2.cc
   (또는) g++ -o forTestObject2 forTestObject2.cc

실행> ./forTestObject2
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



다음 예제는 namespace std 를 사용하지 않은 C++ 소스이다.
이 경우에는 cout, cin, endl 대신에 정규화된 이름 std::cout, std::cin, std:endl을 써야 한다.
(참고: 정규화된 이름을 사용한 다음 소스는 Ch 5.5로는 실행되지 않는다.)

소스 파일명: forTestObject3.cpp
------------------------------[소스 시작]
#include <iostream>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    std:cout << dan << " x " << i << " = " << (dan*i) << std::endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일> cl /GX forTestObject3.cpp
   (또는) cl -GX forTestObject3.cpp
   (또는) cl /EHsc forTestObject3.cpp
   (또는) cl -EHsc forTestObject3.cpp

(실행 결과는 위와 같다.)





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

Ch 언어의 구문을 C/C++의 것과 거의 같다.
Ch 환경에서는 소스를 컴파일 하지 않고 그대로 실행시킨다는
것이 C/C++ 환경과 다를 뿐이다.

C/C++/Ch/Java 언어의 함수 정의 구문 양식은

       type functionName(parameters) {
             block
       }

이다.

또 C/C++/Ch/Java 언어의 for 반복문 양식은

       for (varName = initialValue; condition; replicator) {
             block
       }

이다.



소스 파일명: forTest.ch
------------------------------[소스 시작]
#include <stdio.h>

void printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    printf("%d x %d = %d\n", dan, i, dan*i);
  }
}

int main() {
  printDan(2);
  return 0;
}
------------------------------[소스 끝]

실행> ch forTest.ch
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,