목적
  - 소수와 약수를 출력한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

bool isPrime(int aIn)
{
 int i = 2;
 while(i < aIn)
 {
  if(aIn % i == 0) return false;
  i++;
 }

 return true;
}

int main(void)
{
 int i, iIn;
 i = iIn = 0;
 
 while( !(iIn > 100 && iIn < 200) )
 {
  cout << "100 ~ 200 사이의 정수값을 입력하세요 : ";
  cin >> iIn;

 }

 if(isPrime(iIn))
 {
  cout << "입력한 정수 " << iIn << " 는 소수 입니다.";
 }

 else
 {
  i = 1;
  cout << "입력한 정수 " << iIn << " 는 다음과 같은 약수를  가지고 있습니다." << endl;
  while(i < iIn)
  {
   if(iIn % i == 0) cout << i << " ";
   i++;
  }


 }

 cout << endl;

 return 0;
}


해설
  - 이전 문제와 다른 알고리듬으로 소수를 출력했습니다.
  - iostream 에서는 C 와 달리 bool 형 변수(false / true) 가 존재 합니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 소수 출력과 합을 구할줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iStart = 50;
 const int iEnd = 100;
 int iPrime, iTotal;
 int i = 2;
 iPrime = iTotal = 0;
 
 cout << "50 과 100사이에 존재하는 소수들 : ";

 while(iStart <= iEnd)
 {
  while(i < iStart)
  {
   if ( iStart % i == 0 )
   {
    iPrime = 0;
    i++;
    break;
   }

   else
   {
    iPrime = 1;
    i++;

   }

  }

  if(iPrime == 1)
  {
   cout << iStart << " ";
   iTotal += iStart;

  }

  iPrime = 0;
  i = 2;
  iStart++;

 }

 cout << endl << "50 과 100사이에 존재하는 소수들의 합 : " << iTotal << endl;

 return 0;
}


해설
  - 여러가지 알고리듬으로 풀수 있습니다. 재귀 호출을 시도하여 출력할려 했으나 실패하여 단순한 반복 알고리듬으로 대체 되었습니다. 이전 문제들을 보시고 쓸만한 소수 알고리듬을 익혀 주시기 바랍니다.

참고
  - 유사 문제


Posted by 카켈




목적
  - iostream 에서 16진수 8진수 출력을 익힌다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iIn = 0;
 cout << " 양의 정수를 하나 입력하세요 : ";
 cin >> iIn;
 cout << "10진 표현 : " << iIn << endl;
 cout << " 8진 표현 : 0" << oct << iIn << endl;
 cout << "16진 표현 : 0x" << hex << iIn << endl;

 return 0;
}


해설
  - 스트림에 dec/oct/hex 연산자(플래그 : flag)를 삽입(cin : <<)/추출(cout : >>) 하면 해당 숫자 자료형이 8진수/16진수가 됩니다.
  - 0/0x 는 8진수/16진수 구별하기 위해서 만든 접두어 입니다.

참고
  - http://user.chollian.net/~relay/main_soft/document/c_c++.htm : iomanip.h 부분에 있습니다.



Posted by 카켈




목적
  - 수학함수를 이용할줄 안다.
문제
사용자 삽입 이미지
코드

#include <iostream>
#include <cmath>

using namespace std;

int main(void)
{
 float faIn[3] = {0};
 float fTotal = 0.0;
 int i = 0;
 cout << "실수값 세 개를 입력하세요 : ";
 cin >> faIn[0] >> faIn[1] >> faIn[2];
 
 while(i<3)
 {
  cout << "│" << faIn[i] << "│ 의 제곱근 : " << sqrt(faIn[i] >= 0 ? faIn[i] : -1 * faIn[i] )<< endl;
  fTotal += sqrt(faIn[i] >= 0 ? faIn[i] : -1 * faIn[i] );
  i++;
 }

 cout << endl << "제곱근들의 합 : " << fTotal << endl;

 return 0;
}


해설
  - 절대값을 단순하게 조건문으로 구현했습니다.

if(faIn[i] >=)
 { faIn[i] = faIn[i]; }
  else { faIn[i] = - faIn[i]; }

  - 이 방식 말고 정수형은 abs(faIn[i]) 실수는 fabs(faIn[i])) 쓰면 됩니다. 정수형 abs 함수를 실수 인수에다 넣으면 소숫점이 잘려 나가므로 엉뚱한 결과가 나옵니다.

  - '│' 문자는 'ㅂ' 을 치고 난뒤에 바로 한자를 누르면 선택 창이 나옵니다.

참고
  - math.h / cmath 함수를 쓴 문제

Posted by 카켈




  2003년 C++ 실기 기말고사입니다. 중간 부터 할려고 했었는데 실수로 2문제를 먼저 풀어서 그냥 풀자는 의미에서 기말을 다 풀었습니다.  iostream/cout/cin 같은 C++ 만의 고유한 부분을 최대한 쓸려고 노력했습니다. 클래스 부분은 여기서 간단하게 보고 넘어 가기엔 중요도가 크기 때문에 따로 공부 하시기 바랍니다. C++ 기초를 너머 객체지향프로그래밍을 공부하시는데 도움이 되시기 바랍니다.

  저작권 표기
  문제/해답 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com
  교육용을 목적으로 자유롭게 사용이 가능합니다.

Posted by 카켈



목적
  - 반올림을 C에 적용 시키고 이해한다.

문제

사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 float fIn = 0;

 while(1)
 {
  cout << "실수값 하나를 입력하세요 : ";
  cin >> fIn;
 
  if(fIn == 0) break;
  cout << fIn << " 의 반올림한 값은 " <<
   ((fIn - (int)fIn) >= 0.5 ? (int)fIn + 1 : (int)fIn) << " 입니다." << endl << endl;

 
 }

 return 0;
}

해설
  - 실수형 자료를 정수형 변환(캐스팅)을 하면 소숫점이 지워 집니다. 이를 이용하여 차를 구해 0.5 이상이면 정수형 변환한 값에다가 1을 더한 값을 아니면 변환된 값만 출력합니다.
 - while 문으로 무한 반복을 수행하다가 0 이 입력되면 break 로 탈출하여 종료 합니다.

참고
  - 유사 문제 : 형변환 활용

Posted by 카켈



목적
  - 재귀 호출(Recursive call)을 익힌다.
문제
사용자 삽입 이미지
풀이

#include <iostream>

using namespace std;

long l_Recursive(long aIn)
{ return aIn + (aIn < 456 ? l_Recursive(aIn + 1) : 0); }

int main(void)
{ cout << "123부터 456 까지의 합 : " << l_Recursive(123) << endl; return 0; }

해설
  - 재귀 호출은 그 원리를 이해하면 정말 효율적인 코딩이 가능합니다.
  - 자기 자신을 계속 호출하되 리턴 값이 계속 누적 되기 때문에 무한 반복에서 빠져 나갈수 있는 조건만 갖추면 원하는 범위 내에서 계속 연산을 할수 있습니다.

  - 이 경우 455 전 까지만 계속 다음 숫자를 호출 합니다. 123 에서 시작하라고 하니 결국은

123 + l_Resursive(124)
123 + 124 + l_Resursive(125)
... (계속 반복)
123 + 124 + 125 + 126 + ... l_Resursive(454)
123 + 124 + 125 + 126 + ... 455 + l_Resursive(455)
123 + 124 + 125 + 126 + ... 456 + 0

이렇게 되어 원하는 값인 123 + 124 + ... + 455 + 456 = 96693 이렇게 됩니다.

  - 스택 방식으로 되어 있기 때문에 시스템 프로그래밍 공부 하시는 분들에게 유익한 함수 입니다. 나중에 어셈블러 공부 하실일 있으면 미리 익혀 두시면 참 도움이 될 겁니다.

참고

  - http://www.winapi.co.kr/clec/cpp2/16-2-1.htm : 재귀호출


Posted by 카켈



목적
  - 원하는 단위로 나누어 쓸줄 안다.

문제

사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 long lIn;

 cout << "주민등록번호 처음 6자리를 입력하세요 : ";
 cin >> lIn;
 cout << "당신은 " << (lIn / 10000 < 40 ? 2000 + lIn / 10000 : 1900 + lIn / 10000) << "년 "
  << (lIn % 10000) / 100 << "월 "
  << (lIn % 100) << "일에 태어나셨습니다." << endl;

 return 0;

}


해설
 - 초를 입력 받아서 일 / 시 / 분 / 초로 나누는 문제와 유사한 풀이법입니다.
참고
  - 유사 문제

Posted by 카켈




목적
  - 키보드로 실수 값을 배열로 받을 줄 안다.
  - 최대 / 최소값을 찾아 낸다.
  - 삼항 연산자를 쓸 줄 안다.

문제
사용자 삽입 이미지
풀이

#include <iostream>

using namespace std;

int main(void)
{
 float fIn[5] = {0};
 float fMin, fMax;
 int i = 0;
 cout << "다섯개의 실수 값을 입력하세요 : ";
 cin >> fIn[0] >> fIn[1] >> fIn[2] >> fIn[3] >> fIn[4];
 
 fMax = fMin = fIn[0];

 while(i < 5)
 {
  fMax = fMax < fIn[i] ? fIn[i] : fMax;
  fMin = fMin > fIn[i] ? fIn[i] : fMin;
  i++;
 }

 cout << "최소값 : " << fMin << endl << "최대값 : " << fMax << endl;

 return 0;
}

해설
  - C 에서 주욱 보셨으면 크게 어려울 문제는 없습니다.
  - 삼항 연산자는 [조건] ? [참일때] : [거짓일때] 로 위 조건문에 값으로 바꿔지는 간단한 조건식입니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 강제 형변환에 대해 정확한 이해를 가진다.
  - 오버로딩 함수를 작성한다.

문제
사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

 void add(double aA, double aB)
 {
  cout << "add(double, double) 함수가 호출되었습니다." << endl;
  cout << aA << " + " << aB << " = " << aA + aA << endl;
 
  return;
 }

 void add(int aA, int aB)
 {
  cout << "add(int, int) 함수가 호출되었습니다." << endl;
  cout << aA << " + " << aB << " = " << aA + aB << endl;
 
  return;
 }

int main(void)
{
 double dA, dB;
 dA = dB = 0;

 cout << "두 실수를 입력하세요 : ";
 cin >> dA >> dB;
 cout << endl;

 if((int)dA == dA && (int)dB == dB) add((int)dA, (int)dB);
 else add(dA, dB);

 

 return 0;
}

해설
  - 오버로딩 함수는 형식(프로토타입)에 따라 같은 함수명이라도 서로 다른 인수와 다른 출력을 가질수 있게 만들어진 함수 형식입니다. 여러 제약을 완화 하는데 많은 도움을 줍니다.

  - double(배정도 소숫점) 형식에서 int(정수형) 형식으로 강제 형변환(캐스팅)을 하면 소숫점이 떨어져 나가기 때문에 형변환 하기 전과 후의 값 상태를 봐서 함수의 인수를 int 형으로 할 것인지 아니면 double 형으로 할것인지 정하면 됩니다.

참고
  - http://www.winapi.co.kr/clec/cpp1/5-3-4.htm : 캐스트(cast, 형변환) 연산자
  - http://tea815.com.ne.kr/cpp/604.htm : 오버로딩(overloading)

Posted by 카켈





목적
- 문자열을 병합한다.
- 대소문자를 변형 시킨다.
- 동적할당에 대해 이해한다.
- 키보드로 문자열을 받아 출력한다.

문제

사용자 삽입 이미지
풀이

#include <iostream>
#include <cstring>
#include <ctype.h>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 int iCount = 0;
 char *cpA, *cpB, *cpC;
 cpA = cpB = cpC = NULL;

 cout << "첫번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');
 cpA = new char[strlen(sIn) + 1];
 strcpy(cpA, sIn);

 cout << "두번째 문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');
 cpB = new char[strlen(sIn) + 1];
 strcpy(cpB, sIn);

 cpC = new char[strlen(cpA) + strlen(cpB) + 1];
 strcpy(cpC, cpA);
 strcat(cpC, cpB);

 cout << "병합된 문자열 : " << cpC << endl;
 cout << "대소문자 변환후 문자열 : ";

 for(iCount = 0; iCount < strlen(cpC); iCount++)
 {
  if(islower(cpC[iCount])) cout << (char)(toupper(cpC[iCount]));
  else cout << (char)tolower(cpC[iCount]);

 }

 cout << endl;

 cout << "순서 뒤바뀐 문자열 : ";
 for(iCount = strlen(cpC) - 1; iCount >= 0; iCount--)
 {
  if(islower(cpC[iCount])) cout << (char)(toupper(cpC[iCount]));
  else cout << (char)tolower(cpC[iCount]);

 }

 cout << endl;

 return 0;
}


해설
  - 메모리를 동적으로 받아 넣기 위해서 문자열 포인터를 썼습니다.
  - new 명령어를 통해 새로운 공간을 받아 넣습니다. 그 크기는 입력 변수에 받은 길이 + 1 [NULL 문자] 입니다.
  - strcat 나 strcpy 에서는 NULL 문자를 붙여 넣거나 복사를 시도하면 연산 오류가 생깁니다.
  - cout 에서는 형에서 비교적 자유롭게 출력이 가능하므로 int 형으로 리턴이 되는 tolower 나 toupper 를 정수로 나오지 않게 하기 위해 char 형으로 강제 형변환 시켰습니다.

참고
  - 구글 검색 : 동적 할당
  - 유사 문제

Posted by 카켈




목적
  - 클래스를 이해하고 외부 함수에서 클래스가 보호하고 있는 변수를 이용할 줄 안다.
  - 생성자를 이해한다.

문제

사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

 class cHexahedron
 {
  public:
   friend int i_Volumn(int, int, int);
   cHexahedron() { iX = iY = iZ = 0; }
   void v_GetValue();
   void v_Print();

  private:
   int iX, iY, iZ;

 };

void cHexahedron::v_GetValue()
{
 int aX, aY, aZ;
 aX = aY = aZ = 0;
 cout << "육면체의 가로, 세로, 높이를 입력하세요 : ";
 cin >> aX >> aY >> aZ;
 iX = aX; iY = aY; iZ = aZ;
 
 return;
 
}

void cHexahedron::v_Print()
{
 cout << "육면체의 부피 : " << i_Volumn(iX, iY, iZ) << endl;
 return;
}

int i_Volumn(int iX, int iY, int iZ)
{ return iX * iY * iZ; }

int main(void)
{
 cHexahedron cHex[3];
 for(int i = 0; i < 3; i++)
 {
  cout << i + 1 << "번째 ";
  cHex[i].v_GetValue();
 }
 
 for(i = 0; i < 3; i++)
 {
  cout << i + 1 << "번째 ";
  cHex[i].v_Print();
 }

 return 0;
}


해설
  - 클래스와 함수 구조입니다.

사용자 삽입 이미지
  -  iX 와 iY, IZ 는 private 로 보호된 맴버 변수 입니다. private 는 클래스의 맴버가 아닌 다른 외부 함수에서 불러다 쓸수 없습니다. 이를 정보 보호 / 은닉이라 하는데 자료의 효율적인 관리를 목적으로 만들어진 것입니다. 예외적으로 friend 함수를 두어 private 맴버라도 불러다 쓸수 있게 합니다. public 영역에서 friend 를 선언하여 남용을 방지 합니다.

  - 맴버 함수에서는 부른 객체 자신을 가리키는 this 객체가 기본적으로 존재 합니다. 이를 생략해서 그냥 iX, iY, iZ 를 써서 쓸수 있지만 이를 표기하여 this.iX this.iY this.iZ 로 쓸수 있습니다. 맴버 함수에서는 자신이 속한 클래스 객체의 맴버 변수를 쓸수 있으므로 private 로 선언된 맴버 변수도 자유롭게 쓸수 있습니다.

  - "i + 1 번째 " 만 따로 출력하여 공통된 부분의 출력부를 최소화 했습니다.

참고
  - 클래스는 C++ 의 가장 두들어진 객체지향적 특징입니다. C 에서는 극히 일부 기능을 구조체에서 제공하고 있습니다. 클래스는 잠깐 공부하기 보다 아래 페이지에서 자세히 공부 하시는게 이후 C++ 의 클래스를 이해하시는데 도움이 될 것입니다.

  - http://www.winapi.co.kr/clec/cpp4/cpp4.htm : winapi 에서 제공하는 C++ 문법

Posted by 카켈



목적
  - 최소공배수와 최대공약수를 구하기 위한 조건과 반복문 나눗셈 사용을 익힌다.

문제
사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iLCM, iGCD, iStart, iEnd ; // iLCM : 최소공배수 iGCD : 최대공약수
 iA = iB = iLCM = iGCD = iStart = iEnd = 0;

 cout << "두 정수값을 입력하세요 : ";
 cin >> iA >> iB;

 iStart = iA <= iB ? iA : iB;
 iEnd = iA <= iB ? iB : iA;
 iA = iStart;
 iB = iEnd;

 // LCM, GCD 계산
 for(iStart = 1; iStart <= iEnd; iStart++)
  if(iA % iStart == 0 && iB % iStart == 0)
   iGCD = iGCD < iStart ? iStart : iGCD;

 for(iStart = iB; iStart <= iA * iB; iStart++)
  if(iStart % iA == 0 && iStart % iB == 0)
  {
   iLCM = iStart;
   break;
  }
 
 cout << iA << " 과 " << iB << " 의 최대공약수 : " << iGCD << endl;
 cout << iA << " 과 " << iB << " 의 최소공배수 : " << iLCM << endl;

 return 0;
}

해설
  - 최대공약수 : 1에서 큰수까지 1씩 증가하며 가는데 작은수 와 큰수 모두 나머지가 0인 수
  - 최소공배수 : 큰수에서 두수의 곱까지 1씩 증가하는데 그수와 두수 모두의 나머지가 0인 수

참고
  - 유사 문제

Posted by 카켈



목적
  - cmath(math.h) 를 사용 한다.
  - 표준편차와 평균을 계산 한다.

문제

사용자 삽입 이미지

풀이

#include <iostream>
#include <cmath>

using namespace std;

int main(void)
{
 int i, j;
 float fScr[5] = {0};
 float fTotal, fDeviation, fSwap;
 fTotal = fDeviation = fSwap = 0.0;
 i = j = 0;
 
 cout << "다섯개의 실수값을 입력 하여라 : ";
 cin >> fScr[0] >> fScr[1] >> fScr[2] >> fScr[3] >> fScr[4];

 for(i = 0; i < 5; i++)
 {
  for(j = i; j < 5; j++)
  {
   if(fScr[i] < fScr[j])
   {
    fSwap = fScr[j];
    fScr[j] = fScr[i];
    fScr[i] = fSwap;

   }

  }

  fTotal += fScr[i];

 }

 for(i = 0; i < 5; i++)
   fDeviation += pow((fScr[i] - fTotal / 5), 2);

 
 fDeviation = sqrt(fDeviation / 5);


 cout << "크기 순으로 정렬한 결과 : " << fScr[0] << ' ' << fScr[1] << ' ' << fScr[2] << ' ' << fScr[3] << ' ' << fScr[4] << endl;
 cout << "입력된 값의 평균 : " << fTotal / 5 << endl;
 cout << "입력된 값의 표준편차 : " << fDeviation << endl;


 return 0;
}

해설
  - cmath 와 math.h 는 동일한 역할을 합니다.
  - 정렬하면서 합계를 구했습니다.

참고
  - 유사 문제
  - 표준편차 구하기

사용자 삽입 이미지

Posted by 카켈




목적
  - 함수를 생성할줄 안다.

문제

사용자 삽입 이미지
풀이

#include <iostream>

float add(float,float);
float sub(float,float);
float mul(float,float);
float div(float,float);

using namespace std;

int main(void)
{
 char cOp = 0;
 float fA, fB, fOut;
 fA = fB = fOut = 0.0;

 cout << "연산자 하나와 두 실수 값을 입력하세요 : ";
 cin >> cOp >> fA >> fB;

 switch(cOp)
 {
  case '+':
   fOut = add(fA, fB);
   break;

  case '-':
   fOut = sub(fA, fB);
   break;

  case '*':
   fOut = mul(fA, fB);
   break;

  case '/':
   fOut = div(fA, fB);
   break;

  default:
   break;

 }

 cout << fA << ' ' << cOp << ' ' << fB << " = " << fOut << endl;
 return 0;

}

float add(float fA, float fB)
{ return fA + fB; }

float sub(float fA, float fB)
{ return fA - fB; }

float mul(float fA, float fB)
{ return fA * fB; }

float div(float fA, float fB)
{ return fA / fB; }


해설
  - 부호에 따른 함수를 별도로 실행하게 했습니다.
  - 맨 윗부분의 껍데기 선언부는 prototype 구문으로써 선언후 정의 하는 부분과 형이 틀리지 않게 형 검사(type checking) 과 linked list 같은 정의가 끝나지 않은 자료를 참조 해야할때 쓰여 집니다. 선택사항으로 조건을 충족시켜도 되지 않은 환경이라면 쓰지 않아도 무방합니다.

참고

  - 유사 문제

Posted by 카켈



목적
  - 키보드로 원하는 값을 입력 받는다
  - 원하는 값을 화면에 출력한다
  - while 반복문을 익힌다
  - 나머지를 이해한다.

문제
사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

int main(void)
{
 int iIn, iCount,iDiv3, iDiv5;
 iIn = iDiv3 = iDiv5 = 0;
 iCount = 1; // Div 0 방지

 cout << "100 보다 큰 정수값을 입력하세요 : ";
 cin >> iIn;

 if(iIn < 100)
 {
  cout << "100 보다 작습니다" << endl;
  exit(-1); // 강제 종료

 }

 while(iCount <= iIn)
 {
  iDiv3 = iCount % 3 == 0 ? iDiv3 + 1 : iDiv3;
  iDiv5 = iCount % 5 == 0 ? iDiv5 + 1 : iDiv5;
  iCount++;
 }

 cout << "3으로 나누어 떨어지는 정수의 수 : " << iDiv3 << "개" << endl;
 cout << "5  로 나누어 떨어지는 정수의 수 : " << iDiv5 << "개" << endl;

 return 0;
}

해설
  - % 연산자는 나머지를 계산하는 연산자로써 5 % 3 = 2 입니다.
  - exit 함수는 프로그램을 강제 종료 하는 함수 입니다. 함수를 종료하는 return 과는 조금 차이가 있습니다.

참고
  - 유사 문제 : 나머지 관련 , http://cakel.tistory.com/search/나머지

Posted by 카켈




목적
  - while 반복문을 익힌다.

문제

사용자 삽입 이미지


코드 풀이

#include <iostream>

using namespace std;

int main()
{
 int i, iOut;
 long lTotal = 0;
 i = iOut = 0;

 cout << "정수 값을 입력하세요 : ";
 cin >> i;
 iOut = i;
 
 while(i > 0)
 {
  lTotal = i % 2 == 1 ? lTotal + i : lTotal;
  i--;

 }

 cout << "1 부터 " << iOut << "까지의 홀수 합은 " << lTotal << "입니다." << endl;

 return 0;
}

해설
  - C++ 는 C 보다 더 간소하면서도 더 강력한 기능을 제공합니다. 하위호환성(backward compatibility)도 최대한 지원합니다.
Posted by 카켈
이전페이지 123 다음페이지