다음 소스 코드는 http://www.daniweb.com/code/snippet808.html 에서 볼 수 있는 (주어진 범위 안에서) 소수(prime number, 북한 용어로는 씨수) 찾기 C++ 소스 코드이다.
 

  1. # include<iostream.h>
  2. # include<math.h>
  3. void main()
  4. {
  5.     int flag=0;
  6.     unsigned long l, h, temp;
  7.     cout<<"Enter the lower limit:"; cin>>l;
  8.     cout<<"Enter the higher limit:"; cin>>h;
  9.     if(l%2==0)
  10.     {
  11.          if(l==2) cout<<"2\t";
  12.          l++; //taking only odd no
  13.     }
  14.      for(;l<=h;l+=2, flag=0)
  15.      {
  16.           temp=sqrt(l);
  17.           if(temp%2==0) temp++; //taking only odd no
  18.           for(; temp>2; temp--)
  19.          {
  20.              if(l%temp==0)
  21.              {
  22.                  flag=1;
  23.                  break;
  24.               }
  25.          }
  26.          if(flag==0) cout<<l<<"\t";
  27.     }
  28. }

우선 위의 코드를 파이썬 소스 코드 처럼 들여쓰기 규칙을 엄격히 적용하여 아래 처럼 재작성하였다.


  1. #include <iostream.h>
  2. # include <math.h>
  3. void main() {
  4.     int flag = 0;
  5.     unsigned long l, h, temp;
  6.     cout << "Enter the lower limit: ";
  7.     cin >> l;
  8.     cout << "Enter the upper limit: ";
  9.     cin >> h;
  10.     if (l % 2 == 0) {
  11.          if (l == 2)
  12.              cout << "2\t";
  13.          l++;    //  Taking only odd numbers.
  14.     }
  15.     for (; l <= h; l += 2, flag = 0) {
  16.         temp = sqrt(l);
  17.         if (temp % 2 == 0)
  18.            temp++;    //  Taking only odd numbers.
  19.         for (; temp > 2; temp--) {
  20.            if (l % temp == 0) {
  21.                flag = 1;
  22.                break;
  23.            }
  24.        }
  25.        if (flag == 0)
  26.            cout << l << "\t";
  27.     }
  28. }

하지만 아직 표준 C++에 맞지 않으므로 더 고쳐 보았다.

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. void main() {
  5.     int flag = 0;
  6.     unsigned long l, h, temp;
  7.     cout << "Enter the lower limit: ";
  8.     cin >> l;
  9.     cout << "Enter the upper limit: ";
  10.     cin >> h;
  11.     if (l % 2 == 0) {
  12.          if (l == 2)
  13.              cout << "2\t";
  14.          l++;    //  Taking only odd numbers.
  15.     }
  16.     for (; l <= h; l += 2, flag = 0) {
  17.         temp = sqrt(l);
  18.         if (temp % 2 == 0)
  19.            temp++;    //  Taking only odd numbers.
  20.         for (; temp > 2; temp--) {
  21.            if (l % temp == 0) {
  22.                flag = 1;
  23.                break;
  24.            }
  25.        }
  26.        if (flag == 0)
  27.            cout << l << "\t";
  28.     }
  29. }

이제 컴파일도 잘 되고 실행도 잘 될 것이다.
그러나 중요한 것은 알고리즘이다. 즉 소수인지 아닌지 확인하는 과정이 최적화되어 있느냐의 문제이다. 위의 소소 코드에서 27~32째 줄의 for 반복문 부분을 살펴보자,

            for (; temp > 2; temp--) {
               if (l % temp == 0) {
                   flag = 1;
                   break;
               }
          }

예를 들어 l =  3*1999993 = 5999979 인 경우 sqrt(5999979) ≒ 2449.5 이므로,
for 반복문을 시작하면서 temp = 2995 되고 t = 3 이 될 때 까지 무려 1496번을 반복하게 된다.
이 반복문 안의 나눗셈 과정  l % temp 부분을 l % 3 부터 시작하여 l % 5, l % 7, l % 9 ... 이런 식으로 증가시키면서 반복하는 과정으로 진행한다면, l =  3*1999993 = 5999979 인 경우 ㅣ% 3 = 0 이므로 더 이상 반복하지 않고 바로 반복문을 탈출하고 5999979는 소수가 아니라고 판정내린다.

이런 이유로 인하여, 위 소스 코드를 리팩토링하여 다음 처럼 수정하였다.


  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. void main() {
  5.     int flag = 0;
  6.     unsigned long l, h, j, temp;
  7.     cout << "Enter the lower limit: ";
  8.     cin >> l;
  9.     cout << "Enter the upper limit: ";
  10.     cin >> h;
  11.     if (l % 2 == 0) {
  12.          if (l == 2)
  13.              cout << "2\t";
  14.          l++;    //  Taking only odd numbers.
  15.     }
  16.     for (; l <= h; l += 2, flag = 0) {
  17.         temp = sqrt(l);
  18.         if (temp % 2 == 0)
  19.            temp++;    //  Taking only odd numbers.
  20.         for (j = 3L; j <= temp; j += 2L) {
  21.            if (l % j == 0L) {
  22.                flag = 1;
  23.                break;
  24.            }
  25.        }
  26.        if (flag == 0)
  27.            cout << l << "\t";
  28.     }
  29. }


 
컴파일> cl /GX findPrimes.cpp

실행> findPrimes
Enter the lower limit: 200
Enter the upper limit: 500
211     223     227     229     233     239     241     251     257     263
269     271     277     281     283     293     307     311     313     317
331     337     347     349     353     359     367     373     379     383
389     397     401     409     419     421     431     433     439     443
449     457     461     463     467     479     487     491     499



Creative Commons License


Posted by Scripter
,


 

Bjarne Stroustrup

 
C++ 언어는 벨 연구소(Bell Labs)의 Bjarne Stroustrup에 의하여 1983년-1985년 기간에 만들어졌다. C++ 언어는 C 언어의 확장이다. 1983년 이전에 Bjarne Stroustrup는 C 언어에 어떤 특징을 추가하여 이를 "클래스를 지닌 C 언어"라고 불렀다. 그는 그 당시 Simula 언어의 클래스 및 강력한 객체지향 특징과 C 언어의 효율성을 결합하였다. C++ 언어라는 용어는 1983년에 처음 사용되었다.

C++ 언어는 그 첫 릴리즈 발표 이후 상당히 발전되었다. 특히, ARM C++는 에외상황과 템플릿을 추가하였고, ISO C++는 RTTI, 이름 공간(namespaces), 표준 라이브러리(standard library)를 추가하였다.

Bjarne Stroustrup는 벨 연구소로 가기 이전에 캠브릿지 대학교의 컴퓨터 실험실에서 박사 과정 연구를 진행하고 있었다. 벨 연구소의 반은 AT&T 연구소(AT&T Lab)로 바뀌었고, 또 남은 반은 루센 벨 연구소(Lucent Bell labs)로 비뀌었기 때문에, 벨 연구소라는 이름은 지금은 없다.  
 

 

Bjarne Stroustrup


 

C 프로그램 언어와 알골68(Algol68)의 영감


C++ 언어 이전에, 1969-1973 동안에 벨 연구소에서 개발된 C 프로그햄 언어가 있었다. 또한 유닉스(UNIX) OS도 같은 기간에 벨 연구소에서 개발되었다. C 언어는 원래 PDP-11 이라는 컴퓨터 위에서 유닉스 오퍼레이팅 시스템(OS)을 만들고 유지하기 위한 목적으로 데니스 리치(Dennis Ritchie)에 의하여 개발되었다. 그는 1971년에 B 언어에 타입(type)을 추가하여 B 언어를 확장하였다. 그리고 이를 새로운 B(New B)라는 의미로 NB 언어라고 불렀다. 리치는 알골68(Algol68) 언어로 부터 영감의 일부를 받았다. 그는 1972년에 그 컴파일러를 재구성 재작성히여 새 언어를 "C 언어"라고 명명하였다. 유닉스의 90%는 C 언어로 작성되었다. ANSI 위원회는 1983년 부터 C 언어 표준화 프로젝트를 시작하여 1989년에 "1989 ANSI 표준 C(the 1989 ANSI Standard for C)"를 작성하였다. 그 당시에는 매우 많은 C 컴파일러가 있었으며 표준화가 요구되던 때였다.

C 언어는 이식가능한 언어이며, 특정 하드웨어이나 특정 오퍼레이팅 시스템(OS)에 매어 있지 않다. C 언어는 고급언어를 어셈블리 언어의 기능과 결합시켜 주며 이 때문에 때로는 중급언어로 간주되어 욌다. C 언어를 사용하면 한 기종의 컴퓨터를 위해 작성한 소프트웨어를 다른 기종의 컴퓨터에 이식하기가 쉬워진다.


* 이 문서는 Evolution and History of C++ 에 주어진 글을 번역한 것임.


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


Posted by Scripter
,

국제 표준 기구(International Standards Organization, ISO)와 미국 국가 표준 기관(American National Standards Institute, ANSI)은 C++ 프로그래밍 언어의 표준화 작업을 마쳤다(표준 번호: ISO/IEC 14882). 이 표준화 과정에서 가장 중요한 부분의 하나가 바로 「표준 C++ 라이브러리(standard C++ library)」이며, 이 라이브러리는 많은 양의 클래스와 함수들을 제공하고 있다.

ANSI/ISO 표준 C++ 라이브러리는 다음을 포함하고 있다.

  • 많은 양의 데이터 구조와 알고리듬. 특히 이 부분만 따로 「표준 템플릿 라이브러리(standard template library, STL)」라고 부른다.
  • 입출력 스트림
  • locale 기능
  • string 템플릿 클래스
  • complex 템플릿 클래스
  • numeric_limits 템플릿 클래스
  • 메모리 관리 기능
  • Language support 기능
  • 예외 처리(exception handling) 기능
  • 수치 배열용으로 최적화된 valarray 클래스


참고: Standard C++ Library 관련 자료


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

Posted by Scripter
,