'소프트웨어/C++'에 해당되는 글 77건

  1. 2007.03.10 C++ 언어 강의 노트 - 이론 / 실습 (기초 부터 끝까지)
  2. 2007.03.10 [2005년 기말] 정리
  3. 2007.03.10 [2005년 기말 10번] 사전 정렬 - 문자열
  4. 2007.03.10 [2005년 기말 9번] 직육면체 도형 면적 / 부피 구하기 - 클래스 / 상속
  5. 2007.03.09 [2005년 기말 8번] 직원 급여 관리 - 이중 포인터 / 클래스 / 생성자 / inline / 동적 배열 생성
  6. 2007.03.09 [2005년 기말 7번] 자소 분석 - 문자열 제어
  7. 2007.03.09 [2005년 기말 6번] 성적 / 평점 / 등급 / 학점 계산 - 조건문
  8. 2007.03.09 [2005년 기말 5번] 표준편차 구하기 - 벡터 / 수학함수
  9. 2007.03.09 [2005년 기말 4번] 문자열 역순 출력 - 동적 할당 / 문자열 출력
  10. 2007.03.09 [2005년 기말 3번] 시간 계산 - 나머지 / 초 계산 / 시각
  11. 2007.03.09 [2005년 기말 2번] 문자열 출력 - 길이 비교
  12. 2007.03.09 [2005년 기말 1번] 성적 처리 - 동적 할당 / vector STL
  13. 2007.03.08 [2005년 중간] 정리
  14. 2007.03.08 [2005년 중간 10번] 학생 정보 입력 - 클래스 / 동적 할당 / 생성자
  15. 2007.03.08 [2005년 중간 9번] 직육면체 겉넓이 / 부피 - 클래스 / 생성자
  16. 2007.03.08 [2005년 중간 8번] 시 분 초 하루에 남은 시간과 남을 시간 출력 - 단순 계산
  17. 2007.03.07 [2005년 중간 7번] 벡터 자료형 정렬 및 처리 - STL vector
  18. 2007.03.07 [2005년 중간 6번] 최대 공약수 / 최소 공배수 - 반복문 / 나머지
  19. 2007.03.07 [2005년 중간 5번] 숫자 쉼표 단위 맞춤 출력 - 글자수 이해
  20. 2007.03.06 [2005년 중간 4번] 난수 확률 생성 - 난수 생성
  21. 2007.03.06 [2005년 중간 3번] 환률 원화 변환 및 계산 - 나머지
  22. 2007.03.06 [2005년 중간 2번] 9의 배수 출력 - while 반복문
  23. 2007.03.06 [2005년 중간 1번] 달러대 원화 환률 환산 - 나머지
  24. 2007.03.05 [2004년 기말] 정리
  25. 2007.03.05 [2004년 기말 17번] 구구단 출력 - 파일 출력
  26. 2007.03.05 [2004년 기말 16번] 텍스트 파일 출력 - 파일 출력
  27. 2007.03.05 [2004년 기말 15번] 배열 연산 - 포인터 / 행렬
  28. 2007.03.05 [2004년 기말 14번] 반올림 출력 - fabs 함수
  29. 2007.03.05 [2004년 기말 13번] 난수 확률 - 특정 범위 난수 출력
  30. 2007.03.05 [2004년 기말 12번] 공약수 / 최대공약수 - 나머지



  C 에 이어서 C++ 입니다. 따로 공부 하시는게 의외로 상성 효과로 많은 도움이 되실겁니다. 처음부터 약간 객체지향적인 코딩 부분이 있기 때문에 생각을 다른 시각에서 보셔야 합니다. C 에서도 그랬지만 이렇게 작동한다는 객체, 도구로 보셔야 합니다. C 문법을 지녔지만 하는 기능과 역활은 전혀 새로울수 있습니다.

  저작권 공지 : 이 강의 노트의 저작권은  고려대학교 신호처리연구실에 있습니다. 그러니 원저작자의 허락없이 무단으로 짜집기하시거나 자기가 만들었다고 살짝 바꿔서 우기시면 안 됩니다;
http://signal.korea.ac.kr/~ychlee 에서 받았습니다.
Posted by 카켈



  문제가 새로운게 많았습니다. 조금 난해한 부분도 있었지만 슬기롭게 해낸거 같습니다. 2004년 까지만 해도 크게 차이가 없었는데 2005년 부터는 확실히 무언가 달라지고 있다는 것을 느꼈습니다. 비록 이게 마지막 시험이라 아쉽지만 이번학기에 나올 객체 시험 문제에 대해 기대하고 있습니다. 방학때 다시 C++ 언어를 새로 공부 할수 있을거 같군요. 클래스를 상속까지 진보 시켰으며 포인터 연산자에 대해 새롭게 알았습니다.
 
  저작권 공지
  문제/해답 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com
  교육용을 목적으로 자유롭게 쓰실수 있습니다.
Posted by 카켈




목적
  - 문자열에서 사전정렬을 이해한다.

문제

사용자 삽입 이미지

코드

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

using namespace std;

int main(void)
{
 char sIn[4][255] = {0};
 char sSwap[255] = {0};
 char cBuf = ' ';
 long lSwap = 0;
 long lValue[4] = {0};
 int i, j;
 i = j = 0;

 while(i < 4)
 {
  cout << i + 1 << "번째 문자열 입력 : ";
  cin.getline(sIn[i],255);

  while(cBuf != 0)
  {
   cBuf = sIn[i][j];

   if(cBuf != ' ')
   {
   
    if(islower(cBuf))
    {
     lValue[i] = (int)cBuf - 60;
     break;

    }

    if(isupper(cBuf))
    {
     lValue[i] = (int)cBuf - 55;
     break;

    }

    if(isdigit(cBuf))
    {
     lValue[i] = (int)cBuf - 48;
     break;
    }

   }
 
   j++;
  }
 
  cBuf = ' ';

  j = 0;
  i++;

 }

 i = 0;
 j = 0;
 
 while(i < 4)
 {
  j = i;
  while(j < 4)
  {
   if(lValue[i] < lValue[j])
   {
    lSwap = lValue[j];
    lValue[j] = lValue[i];
    lValue[i] = lSwap;

    strcpy(sSwap, sIn[i]);
    strcpy(sIn[i], sIn[j]);
    strcpy(sIn[j], sSwap);

   }

   j++;
 
  }

  i++;
 }

 i = 0;
 cout << endl << "크기순으로 정렬된 문자열 : " << endl;
 while(i<4)
 {
  cout << sIn[i] << endl;
  i++;

 }
 

 return 0;
}

해설
  - 코드가 약간 비효율적입니다.
  - 문제를 제대로 이해하시면 상당히 쉽습니다. 사전정렬을 하되 소문자 > 대문자 > 숫자 그룹별로 숫자가 크며, 사전순으로 알파벳 순서가지날수록 값이 커집니다. 이 숫자를 각 문자열의 첫째 글자만  맞춰서 문자열을 내림차순으로 맞춥니다.

  - 문제를 이해하지 못해서 값을 더하면 엉뚱한 결과가 나옵니다.
  - 예제에서 'V' > 'M' > 'I' > 'H' 이라서 순서가 실행결과 처럼 나왔습니다.
  - 첫째 글자가 검출되면 계산후 값을 저장하고 break로 탈출합니다.

참고
  - 해답에는 vector 알고리듬을 쓰던데 크게 차이는 없습니다.
  - 유사 문제 검색

Posted by 카켈



목적
  - 클래스의 상속에 대해서 이해하고 활용한다.

문제

사용자 삽입 이미지

코드







해설
  - 이전 문제의 업그레이드 판으로 상속에 대해서 이해를 하셔야지 풀수 있는 문제입니다.
  - 상속은 ThreeD -> Cubic 으로 되는데 protected 된 자료형과 public 으로 된 자료형을 상속 받습니다.
  - 상속 받은 클래스의 객체가 초기화 될때 부모 클래스에서 자동으로 생성자를 실행하기 위해 상속 클래스에 : [부모 클래스의 생성자 함수] 를 써줍니다. 그러면 리턴되어 자식 클래스에서도 똑같이 적용이 됩니다.

  - 셋다 0이 아닐때 수행되며 셋중 하나가 0이 되면 종료되는 판정문이 있습니다.
  - 이전에 생성된 객체는 그다지 중요하지 않기 때문에 1차원 포인터로 객체를 마구 찍을수 있게 했습니다.

참고
  - 상속은 처음 나온 문제 입니다.
  - 예제 코드 보고 이해하기엔 참고 해야할 사항들이 많습니다. 처음 보시는 분들은 클래스의 다른 정보들도 같이 이해하시기 바랍니다.
  - http://winapi.co.kr/clec/cpp3/29-1-2.htm : 상속의 예
  - 이전 문제
Posted by 카켈



목적
  - 배열을 동적으로 생성시키고 클래스에다가 적용시킨다.
  - inline 함수에 대해 이해한다.
  - 생성자를 활용한다.
  - 이중 포인터에 대한 이해를 한다.

문제

사용자 삽입 이미지

코드


해설
  - 복사 생성사는 매너(?) 상 넣었습니다. 포인터 맴버 변수를 가진 클래스에서는 언제 쓰일지 모르기 때문에 써주시는게 예상치 못한 오류를 막는데 도움이 될수 있습니다.

  - inline 함수들만 정의 되어 있어서 굳이 Employee.cpp 파일을 작성할 필요가 없습니다. Employee.h 에서 다 정의 했습니다.

  - 코드에 해설이 주석으로 직접적으로 쓰여져 있습니다.

  - 이번엔 이중 포인터라는 중요한 개념을 익혔습니다. 일차포인터 배열은 가리키는 주소가 스택에 있기 때문에 그 크기가 변할수 없지만 이중포인터로 이차원으로 선언했을때에는 가리키는 주소가 힙에 저장되기 때문에 배열의 크기가 코드상에서 동적으로 지정이 가능합니다. 중요한 조언을 주신 선배님께 감사드립니다.

  - cin 으로 엔터키를 입력하면 엔터 값이 버퍼에 남아 있기 때문에 cin.getline 을 해버리면 넘어가버리는 문제가 있었습니다. cin.ignore(1,'\n') 버퍼에서 값을 가져올때 첫번째 '\n' (줄내림) 까지 값을 무시하고 받는다고 명령을 넣고 다음 키 입력 getline 함수를 이용하여 저장을 할수 있습니다.

  - 동적 배열을 구현할수 있지만 사용자 정의된 클래스에서는 약간 복잡해집니다. 따라서 MFC 나 STL 에서 동적 배열을 구현하는 자료형을 제공합니다.

  - inline 함수는 일반함수의 개념보다 매크로의 개념이 강합니다. 해당 함수가 호출되었을때 inline으로 저장이된 구문이 함수를 호출한 코드에서 복사/붙여넣기 처럼 그 자리에서 실행을 합니다. 원래 함수는 호출 -> 현재 상태 저장 -> 복귀값 저장 -> 처리 -> 이전 상태 복귀 -> 리턴값과 함께 이전 상태로 복귀 이런 식으로 가는데, inline 함수는 코드 호출 -> 치환 -> 수행 -> 리턴값 이런식으로 간단하게 수행됩니다. 수행 시간이 짧아지는 장점과 동시에 코드가 그떄 그때 붙어버리는 바람에 커져버리는 단점이 있습니다. 구조체나 클래스 처럼 마지막에 } 하면서 세미콜론을 잊지 마시기 바랍니다. 정의의 마지막에는 꼭 필요합니다.


참고
  - http://www.winapi.co.kr/clec/cpp1/10-4-1.htm 
: 이중 포인터
  - http://www.winapi.co.kr/clec/cpp2/19-1-2.htm
 : 동적 배열
  - http://www.borlandforum.com/impboard/impboard.dll?action=read&db=component&no=441

    : 구조체를 동적 배열로 관리할 수 있는 클래스 - 동적 배열 응용 예
  - 유사 문제 검색
Posted by 카켈




목적
  - 문자열을 동적 할당으로 입력받아 자소를 비교 한다.

문제

사용자 삽입 이미지
코드

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

using namespace std;

int main(void)

{
 char sIn[255] = {0};
 int i, iAlpha, iSpace, iSpecial, iMoum;
 i = iAlpha = iSpace = iSpecial = iMoum = 0;
 char cBuf;
 char* sString = NULL;

 cout << "문자열 입력 : ";
 cin.getline(sIn,255);

 sString = new char[strlen(sIn) + 1];
 strcpy(sString, sIn);

 while(sString[i] != 0)
 {
  if(isalpha(sString[i]))
   iAlpha++;

  if(isspace(sString[i]))
   iSpace++;

  if(ispunct(sString[i]))
   iSpecial++;
 
  cBuf = tolower(sString[i]);

  if(cBuf == 'a' || cBuf == 'e' || cBuf == 'i' || cBuf == 'o'
   || cBuf == 'u')
   iMoum++;

  i++;

 }

 cout << "문자열의 길이 : " << strlen(sString) << endl;
 cout << "알파벳문자 개수 : " << iAlpha << endl;
 cout << "공백문자   개수 : " << iSpace << endl;
 cout << "특수문자   개수 : " << iSpecial << endl;
 cout << "모음의     개수 : " << iMoum << endl;

 return 0;
}



해설
  - 문자별료 배열 포인터를 지정 하여 자소별로 접근할수 있게 했습니다.
  - A E I O U / a e i o u 는 소문자로 일괄적으로 비교하여 비교하게 했습니다.

참고
  - 유사 문제 검색

Posted by 카켈




목적
  - 문자열을 받아 판단하여 조건문을 실행하게 한다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>

using namespace std;

int main(void)
{
 int i, iCurriculum, iScr;
 float fTotal, fScrTotal;
 char sGrade[2] = {0};
 i = 1;
 fTotal = fScrTotal = iCurriculum = 0.0;

 cout << "수강과목 수 : ";
 cin >> iCurriculum;

 while(i<= iCurriculum)
 {
  cout << i << "번째 과목 학점과 등급 : ";
  cin >> iScr >> sGrade;

  if(!strcmp(sGrade,"A+"))
   fTotal += 4.5 * iScr;

  if(!strcmp(sGrade,"A"))
   fTotal += 4.0 * iScr;

  if(!strcmp(sGrade,"B+"))
   fTotal += 3.5 * iScr;

  if(!strcmp(sGrade,"B"))
   fTotal += 3.0 * iScr;

  if(!strcmp(sGrade,"C+"))
   fTotal += 2.5 * iScr;

  if(!strcmp(sGrade,"C"))
   fTotal += 2.0 * iScr;

  if(!strcmp(sGrade,"D+"))
   fTotal += 1.5 * iScr;

  if(!strcmp(sGrade,"D"))
   fTotal += 1.0 * iScr;

  fScrTotal += iScr;
  i++;

 }

 cout << "이번학기 학점 : " << fTotal / fScrTotal << endl;

 return 0;
}

해설
  - F 학점은 fTotal 더하지 않기 때문에 판정을 하지 않아도 문제 없습니다.
  - 다중 if 문으로 else 없이 써도 한 루프에 하나의 if 만 걸리기 때문에 문제 없이 작동할수 있습니다.
  - float 형으로 선언하여 소숫점 계산을 할수 있습니다.
  - 문자형 이나 기타 단순 비교용 == 연산자로 sGrade == "A+" 이렇게 될거 같지만 문자열에 대한 비교는 이 연산자로는 되지 않습니다. 대신 strcmp 함수를 쓰면 가능합니다.

참고
  -유사 문제 검색

Posted by 카켈





목적
  - 벡터를 이해하고 수학 공식에 적용 시켜 문제를 해결한다.

문제
사용자 삽입 이미지

  - (수정) 실행결과는 아래와 같습니다.
사용자 삽입 이미지


코드

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main(void)
{
 vector<double> stlVector;
 vector<double>::iterator pVec;
 double dIn, dTotal, dAvg, dVar;
 dIn = dTotal = dAvg = dVar = 0.0;

 cout << "실수 값 입력(입력종료:0) : ";
 cin >> dIn;

 while( dIn != 0 )
 {
  stlVector.push_back(dIn);
  cin >> dIn;
 }

 for(pVec = stlVector.begin(); pVec != stlVector.end(); pVec++)
  dTotal += *pVec;

 dAvg = dTotal / (int)stlVector.size();
 dTotal = 0;

 for(pVec = stlVector.begin(); pVec != stlVector.end(); pVec++)
  dTotal += (*pVec - dAvg) * (*pVec - dAvg);
// pow((*pVec - dAvg), 2) 를 써도 됩니다.

 dVar = sqrt(dTotal / (double)stlVector.size());

 cout << "평    균 : " << dAvg << endl;
 cout << "표준편차 : " << dVar << endl;

 return 0;
}



해설
  - 표준 편차를 구하는 식은  아래와 같습니다.

사용자 삽입 이미지

  - pVec 는 vector STL 자료형을 가리키는 포인터 역할을 합니다.
  - 제가 잘못한거 같아서 여러번 검산을 거친 끝에 저 값이 맞는 것을 확인 했습니다.

   + 1차 확인 : Microsoft Excel 2003

  - MS-Excel 에서 표준편차를 구하는 함수는 여러가지가 있습니다. stdev stdevp ... 중에서 이번 공식에 맞는 식은 stdevp 이였습니다.

사용자 삽입 이미지

위 계산 값을 저장하여 첨부에 넣었습니다.



  - 각 함수의 차이

사용자 삽입 이미지

STDEVP 함수 : 원하는 식입니다.

사용자 삽입 이미지

STDEV 함수 : 항의 갯수가 하나 줄어듭니다. (표본차이)


 - STDEV 함수는 인수들을 모집단의 표본으로 간주합니다. 데이터 집합이 모집단 전체를 나타내면 STDEVP 함수를 사용하여 표준 편차를 계산해야 합니다. (Microsoft EXCEL 도움말 인용)

   + 2차 확인 : Matlab 7.1

사용자 삽입 이미지


std 함수를 쓰면, Microsoft Excel 과 같은 결과를 얻습니다.


참고
  - 결과가 이상할 경우 3자(엑셀은 편리합니다.) 툴을 써서 검증하면 편리할수 있습니다.
  - 유사 문제 검색
Posted by 카켈




목적
   - 동적 할당을 이해하고 문자열에 적용 시킨다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 char *sString = NULL;
 int i = 0;

 cout << "문자열 입력 : ";
 cin.getline(sIn,255);

 sString = new char[strlen(sIn) + 1];
 strcpy(sString, sIn);

 cout << "공백제외한 역순 출력 :";

 for(i = strlen(sString); i >= 0; i--)
 {
  if (sString[i - 1] != ' ')
   cout << sString[i];
 }
 
 cout << endl;

 sString = NULL;
 delete sString;

 return 0;
}

해설
  - sString 은 시작시 단일 문자를 저장하는 주소를 담는 4바이트 문자형 포인터입니다. sIn 에 값이 들어 오면 길이를 확인하여 동적으로 sString 를 늘려 줍니다. 프로그램 상에서 동적으로 늘렸기 떄문에 마칠때 delete 로 삭제를 해줍니다.

참고
  - 유사 문제 검색
Posted by 카켈





목적
  - 시간의 단위를 이해하고 C++ 에 적용 시킨다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iHour_A, iMin_A, iSec_A, iAddSec, iHour_B, iMin_B, iSec_B;
 iHour_A = iMin_A = iSec_A = iAddSec = iHour_B = iMin_B = iSec_B = 0;

 cout << "현재 시간을 입력 : ";
 cin >> iHour_A >> iMin_A >> iSec_A;

 cout << "추가할 시간(초) : ";
 cin >> iAddSec;

 iHour_B = (iHour_A * 3600 + iMin_A * 60 + iSec_A + iAddSec) / 3600;
 iMin_B = (iHour_A * 3600 + iMin_A * 60 + iSec_A + iAddSec) % 3600 / 60;
 iSec_B = (iHour_A * 3600 + iMin_A * 60 + iSec_A + iAddSec) % 60;

 cout << iHour_A << "시 " << iMin_A << "분 " << iSec_A << "초 부터 "
  << iAddSec <<"초 후 시간 : "
  << iHour_B << "시 " << iMin_B << "분 " << iSec_B << "초" << endl;

 return 0;
}

해설
  - 시간은 전체 초를 3600초로 나누고 분은 전체초를 3600 한 나머지를 60으로 나누고 초는 전체 초를 60으로 나눈 나머지를 구하면 됩니다. 즉 그 단위에 맞는 숫자로 나누면 그 단위에 맞는 숫자가 나오며 그이하의 단위의 값을 구할려면 바로 상위 단위의 동등 숫자를 나눈 나머지를 그 아래 동등 숫자로 나눈 몫을 대입하면 나옵니다.

참고
  - 유사 문제 검색

Posted by 카켈




목적
  - 문자열을 다룰줄 안다.

문제

사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 char sStrA[255] = {0};
 char sStrB[255] = {0};

 cout << "첫번째 문자열 : ";
 cin.getline(sStrA,255);

 cout << "두번째 문자열 : ";
 cin.getline(sStrB,255);
 
 cout << "병합된 문자열 : ";
 if (strlen(sStrA) <= strlen(sStrB))
  cout << sStrA << sStrB << endl;

 else
  cout << sStrB << sStrA << endl;

 return 0;
}



해설
  - 자료의 효율성은 없지만 최대한 편리하게 작성 했습니다.
  - strlen 함수로 문자의 길이를 비교 하고 첫번째 문자열이 두번째 문자열 작거나 같다면 그대로 출력하고 그렇지 않고 두번째 문자열이 더 짧다면 바꿔서 출력하는 알고리듬을 가지고 있습니다.

참고
  - 유사 문제 검색

Posted by 카켈




목적
  - 동적 할당에 대해 이해하고 입력을 받아서 자료를 추가 및 처리 할줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

int main(void)
{
 vector<double> stlVector;
 int i = 0;
 char *sName, *sId;
 char sIn[255] = {0};
 double dIn, dTotal;
 dIn = dTotal = 0.0;
 sName = sId = NULL;

 cout << "학번 : ";
 cin.getline(sIn,255);
 sId = new char[strlen(sIn) + 1];
 strcpy(sId, sIn);

 cout << "이름 : ";
 cin.getline(sIn,255);
 sName = new char[strlen(sIn) + 1];
 strcpy(sName, sIn);

 cout << "네 과목의 성적 : ";
 for(i = 0; i <= 3; i++)
 {
  cin >> dIn;
  stlVector.push_back(dIn);
  dTotal += stlVector[i];

 }
 
 cout << sId << ' ' << sName << " 의 평균 점수는 " << dTotal / i << " 입니다." << endl;
 delete sName, sId;

 return 0;
}

해설
   - vector STL 자료형은 이전 문제에서 자세히 다루었습니다. 참고 하시기 바랍니다.
  - 나머지 부분은 크게 어렵지 않습니다.
  - 문자열 포인터를 생성후 동적으로 입력 받은 글자의 길이만큼 새로 생성하여 추가하는 방식을 썼습니다. 생성 및 삭제에 new / delete 명령어가 쓰입니다.

참고
  - vector STL 다루었던 문제

Posted by 카켈



  2005년 중간고사 모음입니다. 문제의 갯수는 줄었지만 새로운 문제들과 vector STL 로 인해 체감 난이도는 조금 상승했습니다. 제가 많이 부족하다는걸 생각나게 만든 문제들이였습니다. 덕분에 이전 연도 문제들과 달리 많은 고민을 했습니다. 풀었으니 뿌듯하군요.

  저작권 공지
  문제/해답 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com
  교육용을 목적으로 자유롭게 쓰실수 있습니다.
Posted by 카켈




목적
  - 클래스의 생성자를 이해하고 동적으로 생성한다.
  - 복사 생성자에 대해 이해한다.

문제

사용자 삽입 이미지

코드




해설
  - 이번 문제에선 복사 생성자가 그다지 역할을 하지 않았습니다. 포인터를 쓰기 때문에 의무적으로 적은 거 뿐입니다. 만약 할당 연산자나 복사시 이 생성자는 서로 다른 주소로 자료를 저장하기 위해서 필수적으로 적어 두셔야 합니다.

  - new 로써 동적으로 포인터에 배열을 붙여서 접근을 할수 있습니다. 프로그램 종료시 delete 하여 자원의 낭비를 줄입니다.

  - 마찬가지로 생성시 new 로 문자열을 늘렸기 때문에 소멸시에 delete 로써 문자열을 삭제 합니다. 이는 파괴자(소멸자)에서 그 역할을 할수 있기 기술합니다.

  - CStu[0]->m_ViewProfie() 에서 -> 연산자는 (*CStu[0]).m_ViewProfile() 과 같습니다. 우선순위로 인해 괄호를 넣기가 번거로워서 -> 연산자를 추가했습니다.

참고
  - 객체지향적 프로그래밍은 C++ 기초 다음 단계이므로 차근 차근 공부 하시면 이해하기가 쉽습니다. 구조체를 먼저 이해하시고 클래스를 배우신후 private / public / protect 형 그리고 맴버함수와 변수 생성자와 파괴자 상속과 연산자, 가상함수... 이런식으로 계속 배우시면 됩니다.

  - 유사 문제 검색

Posted by 카켈




목적
  - 수학 공식에 맞는 클래스 자료형과 공식을 C++ 에 적용한다.

문제
사용자 삽입 이미지

코드



해설
  - 생성자(Constructor)는 클래스가 생성시(인스턴스화) 기본적으로 수행하는 구문입니다. 변수를 초기화 하거나 객체를 복사나 할당/생성 될때 수행되며 여러가지 역할을 합니다. 이와 반대 되는게 파괴자(Destructor) 입니다.
  - m_PrintArea() 맴버함수는 넓이를 m_PrintVol() 맴버함수는 부피를 출력합니다.
  - 각각의 맴버변수는 private 형으로 선언 되어있기 때문에 맴버 함수인 m_PrintArea, m_PrintVol, 생성자, 파괴자 외에는 접근할수 없습니다.(정보 은닉)
  - 직육면체 겉넓이는 가로*높이*2 + 가로*세로*2 + 세로*높이*2 이며 부피는 가로*세로*높이 입니다.

참고

 - 유사 문제

Posted by 카켈




목적
  - 특정 조건에 맞는 입력과 계산 및 출력을 한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iHour, iMin, iSec;
 iHour = iMin = iSec = 0;
 cout << "현재 시간 입력(24시간제) : ";
 cin >> iHour >> iMin >> iSec;

 cout << "입력한 시간 : " << iHour << "시 " << iMin << "분 " << iSec << "초" << endl;
 cout << "오늘 흐른 시간 : " << iHour * 3600 + iMin * 60 + iSec << "초" << endl;
 cout << "오늘 남은 시간 : " << 24 * 3600 - (iHour * 3600 + iMin * 60 + iSec) << "초" << endl;

 return 0;
}



해설
  - 하루는 24시간, 1시간은 3600초, 1분은 60초입니다.
  - 하루 전체초 - 현재 시각(초) 로 하면 "오늘 남은 시간"이 나옵니다.

참고
  - 유사 문제

Posted by 카켈





목적

  - STL 를 이해 하고 활용한다.

문제
사용자 삽입 이미지


코드




해설

  + 첫번째 풀이
  - vector STL 자료형은 <vector> 를 include 함으로써 선언할수 있습니다. vector STL 클래스에서 제공하는 맴버 함수는 여러가지가 있습니다.
  - sort 함수는 STL 자료를 정렬 합니다. <algorithm> 에서 선언해서 쓸수 있습니다.

  - find 함수는 STL 자료를 검색하여 해당 위치의 주소를 리턴하는 기능을 가집니다. 마찬가지로<algorithm> 에서 선언해서 쓸수 있습니다.

  - begin() 맴버함수는 해당 자료의 시작부분의 주소를 반환합니다. 마찬가지로 end() 맴버함수는 자료의 끝을 반환하는데 중요한 것은 마지막 자료가 아니라 자료의 끝 주소를 가리킵니다. 따라서 -1 을 하여 마지막 값을 얻을수 있습니다.
  - iterator 맴버함수는 그 자료를 가리키는 일종의 포인터와 같습니다. dereference(역참조)를 할수 있습니다.

  + 두번째 풀이
  - 두번째 프로그램은 동적 할당으로 double 형 배열을 받아서 자료를 입력하고 포인터로 접근하여 원하는 값을 추출하는 내용입니다. typedef 로 double 을 vector 로도 쓸수 있게 만들었기 때문에 동일하다고 보시면 됩니다.

  - STL 의 존재를 모르고 코드를 짠 결과 입니다.
  - 동적 할당은 이전에 많이 풀어 봐서 그렇게 생소하지 않을 것입니다.

  + 세번째 풀이
  - find 함수를 직접 정의해서 사용했습니다.
  - 내부 함수에서 임의의 벡터 STL 을 생성후 거기다가 결과값을 넣고 return 하면 됩니다. 리턴형이 vector<double> 이기 때문에 결과값을 일괄적으로 받아서 할당 받을수 있습니다.
  - aVec.end() 는 그 벡터의 마지막 위치를 가리킵니다. 포인터로 =! 조건을 사용하여 끝까지 접근할수 있게 합니다.


참고
  - 처음 나온 문제 입니다.
  - http://www.msoe.edu/eecs/ce/courseinfo/stl/find.htm : STL find 함수
  - http://www.msoe.edu/eecs/ce/courseinfo/stl/sort.htm : STL sort 알고리듬(함수)
  - http://www.cplusplus.com/reference/stl/vector/ : vector STL
Posted by 카켈



목적
  - 최대 공약수와 최소 공배수를 C++ 에서 구현한다.

문제
사용자 삽입 이미지

  - 실행 결과는 위의 그림이 나오지 않습니다. 최소 공배수가 다릅니다.

사용자 삽입 이미지


코드

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iC, iGCM, iLCM, iMin, iMax, i;
 iA = iB = iC = iMin = iLCM = iMax = 0;
 i = iGCM = 1;

 cout << "세개의 정수 입력: ";
 cin >> iA >> iB >> iC;

 iMax = iA;
 iMax = iB > iMax ? iB : iMax;
 iMax = iC > iMax ? iC : iMax;

 iMin = iA;
 iMin = iB < iMin ? iB : iMin;
 iMin = iC < iMin ? iC : iMin;

 while(i <= iMin)
 {
  if(iA % i == 0 && iB % i == 0  && iC % i == 0)
   iGCM = iGCM < i ? i : iGCM;
  i++;

 }

 i = iMax;
 while(i <= iA * iB * iC)
 {
  if( i % iA == 0 && i % iB == 0 && i % iC == 0)
  {
   iLCM = i;
   break;
  }

  i++;
 }


 cout << "최대 공약수 : ";
 cout << iGCM << endl;
 cout << "최소 공배수 : ";
 cout << iLCM << endl;

 return 0;
}

해설
  - 최소 공배수는 최대값을 시작으로 세수로 나눈 나머지가 0인 첫번째 수를 최대 공약수는 1부터 최소값까지 나머지가 0인 최대값을 구하면 됩니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 문자열을 이해하여 정확한 출력을 할줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

bool isComma(char* aIn)
{
 while(*aIn != 0)
 {
  if( *aIn == ',')
   return true;
  aIn++;

 }

 return false;
}

void vPrint_Num(char* aIn)
{
 int i = 0;

 if(isComma(aIn))
 {
  i = 0;
  while(aIn[i] != 0)
  {
   if(aIn[i] != ',') cout << aIn[i];
   i++;

  }
   
 
 }

 else
 {
  i = strlen(aIn);
  while(i > 0)
  {
   if(i % 3 == 0) cout << ','; // 글자를 찍기전에 남은 표시 자리수가 3의 배수이면 쉼표 출력
   cout << aIn[strlen(aIn) - i];
   i--;

  }

 }


}

int main(void)
{
 char sIn[255] = {0};
 int i = 0;
 cout << "콤마(,)로 구분하여 1000보다 큰 수 입력 : ";
 cin >> sIn;

 cout << "입력한 수 : ";
 vPrint_Num(sIn);

 cout << endl << endl << "정수를 입력하세요 : ";
 cin >> sIn;

 vPrint_Num(sIn);
 cout << endl;

 return 0;

}

해설
  - bool isComma(char*) 함수는 문자열을 받아서 그 중에 쉼표가 있으면 true 를 없다면 false 를 반환합니다.
  - 쉼표를 만들어 출력하는 내용은 주석을 참조 하시기 바랍니다. (방향이 반대로 시작하되 출력은 정식으로 하여 쉼표 출력을 위한 자릿수를 맞춤니다.

참고
  - 유사 문제
  - Visual basic 에서는 쉼표 숫자 입력을 함수로 이용 하여 계산할수 있습니다.

예제 코드

    Value = Val(Format("1,234", "####")) + 11
    MsgBox Format(Value, "#,###")


사용자 삽입 이미지

출력 화면, 엑셀의 VBA 를 이용했습니다.
Posted by 카켈




목적
  -  특정 범위의 단위 정수 난수를 생성할줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
 int i50, i60, i70, i80, i90, i, iRand;
 i50 = i60 = i70 = i80 = i90 = i = iRand = 0;

 srand((unsigned)time(0));
 rand();

 cout << "생성된 난수 :" << endl;

 while( i < 100)
 {
  iRand = rand() % 5;
  switch(iRand)
  {
   case 0:
    i50++;
    break;

   case 1:
    i60++;
    break;

   case 2:
    i70++;
    break;

   case 3:
    i80++;
    break;

   case 4:
    i90++;
    break;

   default:
    break;

  }

  cout << (iRand + 5) * 10 << "  ";
  i++;

 }

 cout << "50이 생성될 확률 : " << i50 << endl
  << "60이 생성될 확률 : " << i60 << endl
  << "70이 생성될 확률 : " << i70 << endl
  << "80이 생성될 확률 : " << i80 << endl
  << "90이 생성될 확률 : " << i90 << endl;

 return 0;
}

해설
  - 예전 문제에서 범위만 바꾸어서 나온 것입니다. 0부터 시작하는 정수에서 확률을 계산해도 결과는 같다는 것을 이용했습니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 나머지 연산자를 이해한다.
  - 어느 부분에서 어떤 몫과 나머지가 필요한지 역할을 이해한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

#define DOLLAR2WON 1048 // DOLLAR2WON 은 환률을 변환하기 위한 단순 매크로

using namespace std;

int main(void)
{
 double dDollar, dDol2Won, dWon2Dol, dChargeDol;
 dDollar = dDol2Won = dWon2Dol = dChargeDol = 0.0;
 long lWon = 0;

 /*
 dDollar : 입력받는 달러 값
 dDol2Won : 입력받은 달러가 원화로 변한 값
 lWon : 입력받는 원화 값
 dWon2Dol : 입력받은 원화가 달러화로 변한 값
 dChargeDol : 거스름돈 달러

 원화는 달러화로 우선변환합니다.

 */


 cout << "물건 값(달러): ";
 cin >> dDollar;

 cout << "받은 돈(원화): ";
 cin >> lWon;

 dDol2Won = dDollar * DOLLAR2WON;

 while(dDol2Won >= lWon)
 {
  cout << "물건값이 모자름. 다시 입력: ";
  cin >> lWon;

 }

 dWon2Dol = (lWon - dDol2Won) / DOLLAR2WON;
 dChargeDol =  (long)(dWon2Dol * 10) / 10.0;

 cout << "거스름돈: " << dChargeDol << "달러" << endl;
 cout << "거스름돈의 개수" << endl;
 cout << "  * Dollar : " << (int)dChargeDol << "장" << endl;
 cout << "  * Quarter : " << (int)((dChargeDol - (int)dChargeDol) / 0.25) << "개" << endl;
 cout << "  * Cent : " << (int)((dChargeDol - (int)dChargeDol) * 100) % 25 << "개" << endl;

 /*
 달러 - 달러 : 소숫점 버림 = 센트 부분 (0.0 ~ 0.99)
 센트 % 25 는  쿼터 인데  위 식에서 0 ~ 99 가 아니고 0.0 ~ 0.99 까지 이므로 0.25
 로 나누면 몫은 쿼터고 나머지는 센트
 센트를 구하는 과정에서 나머지 연산자는 정수형에만 적용되므로 * 100 하여 소숫점을 강제로 올린후에
 int 형으로 강제 형변환하여 나머지 연산을 적용

 예상 계산치
 10.9 => 10 달러 90센트 => 10달러 3쿼터 15센트

 실제 계산값
 10.9 => 10 + 0.9 => 10 + 0.75 (0.25 * 3) + 0.15 (나머지 0.6 * 0.25)

 시분초를 계산하는 문제를 잘 풀어 보시기 바랍니다.

 */
 
 return 0;
}

해설
  - 코드에 있는 참고 주석을 확인하세요
  - 이전 문제와 초를 일/시/분/초 로 나누는 문제를 잘 푸시면 이 문제를 쉽게 이해하실수 있습니다. 나머지는 정수형 자료에만 적용이 된다는 점을 명심하시고 형변환을 하시기 바랍니다. 이때 자료 손실을 주의 하시기 바랍니다.

참고
  - 유사 문제

Posted by 카켈




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

문제

사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int i = 123;
 cout << "123와 45사이에 존재하는 9의 배수 : " << endl;
 
 while(i >= 45)
  if(--i % 9 == 0) cout << i << " ";

 return 0;
}

해설
- --i 단항연산자를 통해 1이 빼지고 나서 값을 비교하여 출력합니다. i-- 이면 비교후 1이 빠지므로 값이 맞더라도 1이 적게 출력 됩니다.
- 배수는 원하는 배수로 나누어 나머지가 0이 되는 경우를 말합니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 나머지 연산자를 이해한다.

문제

사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 double dDollar, dWon = 0.0;
 cout << "돈을 달러로 입력하세요: ";
 cin >> dDollar;

 dWon = dDollar * 1048;

 cout << "미화 " << dDollar << "달러는" << endl;
 cout << "원화로 " << (long)dWon / 10000 << "만 " << ((long)dWon % 10000) / 1000 << "천 "
  << ((long)dWon % 1000) / 100 << "백 " << ((long)dWon % 100) / 10 << "십 " << (long)dWon % 10 << "원입니다."
  << endl;

 return 0;
}



해설
  - 나머지 연산자는 정수형 자료형에만 적용되므로 double 형에서 형변환하여 나머지를 적용시킬수 있습니다.

참고
  - 유사 문제
Posted by 카켈




  2004년 C++ 기말고사 모음입니다. 파일 관리 부분이 추가되었으며 보너스 문제 때문인지 문제량이 많습니다. 난이도가 특별히 어려운것은 없습니다.

  저작권 공지
  문제/해답 : http://signal.korea.ac.kr/~ychlee
  코드 : http://cakel.tistory.com
  교육용을 목적으로 자유롭게 쓰실수 있습니다.

Posted by 카켈



목적
  - 파일 출력을 이해한다.

문제
사용자 삽입 이미지

코드

#include <fstream>

using namespace std;

int main(void)
{
 fstream fOut("gugudan.txt",ios::out);
 int i = 2;
 int j = 1;

 fOut << "==========================================================" << endl;
 fOut << "                            구구단" << endl;
 fOut << "==========================================================" << endl;

 for(i = 2; i <= 9; i = i + 4)
 {
  for(j = 1; j <=9; j++)
   fOut << i << " * " << j << " = " << i * j
    << '\t' << i + 1 << " * " << j << " = " << (i+1) * j
    << '\t' << i + 2 << " * " << j << " = " << (i+2) * j
    << '\t' << i + 3 << " * " << j << " = " << (i+3) * j << endl;

  fOut << "==========================================================" << endl;

 }

 fOut.close();

 return 0;
}

해설
  - for 문에서 {} 치지 않은 문장은 한문장에서 반복을 계속한다고 보시면 됩니다.
  - 다중 for 문이므로 두번째 for 문을 한문장만 반복 수행후 아래 문장의 fOut << "=== ... 구문을 수행합니다.

참고
  - 구구단 유사문제
  - 파일 출력

Posted by 카켈



목적
  - 파일 입출력 객체를 이해한다.

문제
사용자 삽입 이미지

코드

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

using namespace std;

int main(void)
{
 char cBuf;
 ifstream fIn("file1.txt", ios::in);
 ofstream fOut("file2.txt", ios::out);
 
 if(!fIn)
 {
  cerr << "file1.txt 파일이 없습니다." << endl;
  return -1;
 }


 while(fIn.get(cBuf))
 {
  if(isalpha(cBuf) || cBuf == '\n')
  {
   fOut.put(cBuf);
  }

 }

 fOut.close();
 fIn.close();
 
 return 0;
}

해설
  - fstream 객체는 파일의 입출력을 담당하는 객체입니다. 객체 생성(인스턴스화)시 생성자에 인수로 파일과 옵션을 넣을수 있습니다.
  - fstream 객체는 iostream 객체를 상속 받았기 때문에 iostream 에서 쓰는 맴버 함수 일부를 쓸수 있습니다.

참고
  - http://www.winapi.co.kr/clec/cpp4/36-1-4.htm : fstream 객체

Posted by 카켈



목적
  - 행렬 연산을 C 와 연관시키고 포인터를 활용하여 배열을 쉽게 접근한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int aiMatrixA[2][3] = {0};
 int aiMatrixB[2][3] = {0};
 int aiIn[6] = {0};
 int *pMatrixA, *pMatrixB, i;
 pMatrixA = pMatrixB = 0;
 i = 0;

 pMatrixA = &aiMatrixA[0][0];
 pMatrixB = &aiMatrixB[0][0];


 cout << "첫번째 행렬의 각 원소의 6개를 입력하세요 : ";
 while(i<6)
 {
  cin >> aiIn[i];
  *pMatrixA = aiIn[i];
  i++;
  pMatrixA++;

 }

 i = 0;

 cout << "두번째 행렬의 각 원소의 6개를 입력하세요 : ";

 while(i<6)
 {
  cin >> aiIn[i];
  *pMatrixB = aiIn[i];
  i++;
  pMatrixB++;

 }

 i = 0;
 pMatrixA = &aiMatrixA[0][0];
 pMatrixB = &aiMatrixB[0][0];

 
 cout << "x = " << endl << '\t';
 
 while(i < 3)
 {
  cout << *pMatrixA << "  ";
  pMatrixA++;
  i++;

 }

 cout << endl << '\t';

 while(i < 6)
 {
  cout << *pMatrixA << "  ";
  pMatrixA++;
  i++;

 }

 i = 0;
 cout << endl << "y = " << endl << '\t';

 while(i < 3)
 {
  cout << *pMatrixB << "  ";
  pMatrixB++;
  i++;

 }

 cout << endl << '\t';

 while(i < 6)
 {
  cout << *pMatrixB << "  ";
  pMatrixB++;
  i++;

 }

 i = 0;
 pMatrixA = &aiMatrixA[0][0];
 pMatrixB = &aiMatrixB[0][0];

 
 cout << endl << "x + y  = " << endl << '\t';

  while(i < 3)
 {
  cout << *pMatrixA + *pMatrixB << "  ";
  pMatrixA++;
  pMatrixB++;
  i++;

 }

 cout << endl << '\t';

 while(i < 6)
 {
  cout << *pMatrixA + *pMatrixB << "  ";
  pMatrixA++;
  pMatrixB++;
  i++;

 }

 cout << endl;

 return 0;
}

해설
  - 포인터는 주소를 가리키므로 해당 행렬의 첫번째 번지를 가리키게 합니다. 포인터 값을 +1 한다는 것은 해당 주소형인 int 형의 자료크기 만큼 이동하므로 행렬에서 옆 원소로 이동하며 by 줄(행)이 끝이 나면 다음 줄(열)로 이동합니다.
  - 포인터에 * 가 붙은것은 참조 하라는 뜻으로 해당 주소에 저장된 값을 불러 냅니다. 6칸읜 셀(원소가 각각 aiMatrixA 와 aiMatrixB 로 저장되어 있습니다. 포인터로 한 원소씩 접근할수 있게 했습니다.
  - 행렬이 저장된 구조와 포인터가 접근하는 방식에 대해 이해하면 코드 풀이가 한결 쉬워집니다.

참고
  - http://reduck.uos.ac.kr/entry/전산물리-포인터-이용하기 : 더 쉬운 예제
  - 구글 검색

Posted by 카켈




목적
  - 반올림을 수학적으로 이해하고 C 에다가 적용시킨다.

문제
사용자 삽입 이미지

코드

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

using namespace std;

int main(void)
{
 double dIn, dPoint;
 dIn = 1.0;
 dPoint = 0.0;
 long lNat = 0;
 
 while(dIn != 0)
 {
   cout << "실수값을 하나 입력하세요 : ";
   cin >> dIn;

  if(dIn != 0)
  {

   lNat = dIn < 0 ? -fabs(dIn) : fabs(dIn);
   dPoint = dIn - lNat;
   
   cout << dIn << "의 반올림값 : ";
   if(fabs(dPoint) >= 0.5)
    (lNat = dIn < 0 ? lNat - 1 : lNat + 1);

   cout << lNat << endl;
 
  }
 }

 return 0;
}

해설
  - fabs() 함수는 절대값을 구하되 소숫점 까지 받아서 출력할수 있습니다.
  - 부호를 비교해서 0 보다 작을때 음의 부호를 계산할때 -1을 하여 반올림 할수 있습니다.
  - 0.5 보다 크거나 같으면 음일때는 -1 양일때는 +1 을 하며 계산후 소숫점아래는 버립니다.
  - 0 이 되면 판정을 하지 안하고 종료하게 했습니다.

참고

  - 유사 문제

Posted by 카켈



목적
  - 난수를 만들고 생성 확률을 계산한다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main(void)
{
 srand((unsigned)time(0));
 rand();

 int iRand, i10, i20, i30, i40, i50, i;
 iRand = i10 = i20 = i30 = i40 = i50 = i = 0;

 while(i <= 100)
 {
  iRand = rand() % 5 + 1;
 
  switch(iRand)
  {
   case 1:
    i10++;
    break;

   case 2:
    i20++;
    break;

   case 3:
    i30++;
    break;

   case 4:
    i40++;
    break;

   case 5:
    i50++;
    break;

   default:
    break;

  }

  cout << iRand * 10 << "  ";
  i++;

 }

 cout << endl << endl << "10이 나올 확률 : " << i10 / 100.0 << endl;
 cout << "20이 나올 확률 : " << i20 / 100.0 << endl;
 cout << "30이 나올 확률 : " << i30 / 100.0 << endl;
 cout << "40이 나올 확률 : " << i40 / 100.0 << endl;
 cout << "50이 나올 확률 : " << i50 / 100.0 << endl;

 return 0;
}

해설
  - rand() % 5 을 통해 0 부터 4까지 + 1 을 통해 1 부터 6까지 출력합니다.
  - switch-case 문으로 확률을 더하고 출력은 10배를 하여 원하는 값을 만들어 냅니다.
  - 10 ~ 50 가 10의 단위로 나올 확률과 1 ~ 5 가 나올 확률은 동일합니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 최대공약수와 공약수의 원리를 이해하고 C 에 적용시킨다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 int iA, iB, iC, iMin, iMax, i, iGCM;
 iA = iB = iC = iMin = iMax = iGCM = 0;
 i = 1;

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

 iMin = iMax = iA;
 iMin = iMin > iB ? iB : iMin;
 iMin = iMin > iC ? iC : iMin;

 iMax = iMax < iB ? iB : iMax;
 iMax = iMax < iC ? iC : iMax;

 cout << "약수 : ";
 while(i <= iMin)
 {
  if(iMin % i == 0)
   cout << i << " ";

  i++;
 }

 i = 1;
 cout << endl << "최대공약수 : ";

 while(i <= iMax)
 {
  if(iA % i == 0 && iB % i == 0 && iC % i == 0)
   iGCM = iGCM < i ? i : iGCM;

  i++;
 }

 cout << iGCM << endl;

 return 0;
}

해설
  - 최대 공약수는 최대값까지 공통적으로 나머지가 0인 수의 최대값을 구하면 됩니다.
  - 공약수는 전부 나눠서 나머지가 0인 값을 출력하면 됩니다.

참고
  - 유사 문제

Posted by 카켈
이전페이지 123 다음페이지