'소프트웨어'에 해당되는 글 190건

  1. 2007.03.08 [2005년 중간 10번] 학생 정보 입력 - 클래스 / 동적 할당 / 생성자
  2. 2007.03.08 [2005년 중간 9번] 직육면체 겉넓이 / 부피 - 클래스 / 생성자
  3. 2007.03.08 [2005년 중간 8번] 시 분 초 하루에 남은 시간과 남을 시간 출력 - 단순 계산
  4. 2007.03.07 [2005년 중간 7번] 벡터 자료형 정렬 및 처리 - STL vector
  5. 2007.03.07 [2005년 중간 6번] 최대 공약수 / 최소 공배수 - 반복문 / 나머지
  6. 2007.03.07 [2005년 중간 5번] 숫자 쉼표 단위 맞춤 출력 - 글자수 이해
  7. 2007.03.06 [2005년 중간 4번] 난수 확률 생성 - 난수 생성
  8. 2007.03.06 [2005년 중간 3번] 환률 원화 변환 및 계산 - 나머지
  9. 2007.03.06 [2005년 중간 2번] 9의 배수 출력 - while 반복문
  10. 2007.03.06 [2005년 중간 1번] 달러대 원화 환률 환산 - 나머지
  11. 2007.03.05 [2004년 기말] 정리
  12. 2007.03.05 [2004년 기말 17번] 구구단 출력 - 파일 출력
  13. 2007.03.05 [2004년 기말 16번] 텍스트 파일 출력 - 파일 출력
  14. 2007.03.05 [2004년 기말 15번] 배열 연산 - 포인터 / 행렬
  15. 2007.03.05 [2004년 기말 14번] 반올림 출력 - fabs 함수
  16. 2007.03.05 [2004년 기말 13번] 난수 확률 - 특정 범위 난수 출력
  17. 2007.03.05 [2004년 기말 12번] 공약수 / 최대공약수 - 나머지
  18. 2007.03.04 [2004년 기말 11번] 삼각형 넓이 - 클래스 / 생성자
  19. 2007.03.04 [2004년 기말 10번] 3의 배수 출력 - 재귀호출
  20. 2007.02.28 [2004년 기말 9번] 커맨드라인(명령줄) 인수 평균 구하기 - 인수 받아 계산
  21. 2007.02.28 [2004년 기말 8번] 문자열 입력후 속성 출력 - 문자 속성
  22. 2007.02.28 [2004년 기말 7번] 대소문자 관계 없이 문자 구분 - 문자비교
  23. 2007.02.28 [2004년 기말 6번] 문자열 입력 / 대소문자 변환 - 글자 속성
  24. 2007.02.28 [2004년 기말 5번] 난수 구간 평균 - 난수 / 조건문
  25. 2007.02.28 [2004년 기말 4번] 숫자 맞추기 - 난수 생성
  26. 2007.02.28 [2004년 기말 3번] 도형 넓이 구하기 - 정보 입력
  27. 2007.02.28 [2004년 기말 2번] 정수 사이 홀수 값 출력 - 조건 반복문
  28. 2007.02.28 [2004년 기말 1번] 학과 / 학번 / 이름 받아 출력 - 클래스
  29. 2007.02.28 [2004년 중간] 정리
  30. 2007.02.28 [2004년 중간 11번] 문자열 정렬 / 문자 속성 - 다중 반복문 / 속성 함수




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

문제

사용자 삽입 이미지

코드




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

  - 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 카켈



목적
  - 클래스와 생성자에 대해 이해한다.

문제

사용자 삽입 이미지
 
코드

 





해설

  - 생성자는 public 형 함수로 클래스 이름으로 선언되며 인수는 괄호 안에 원하는 형식을 넣어 쓰면됩니다.
  - 위 코드에서는 생성자가 3개이며 overloading(오버로딩) 방식으로 중첩선언 되었습니다.
  - 첫번째 생성자는 생성(인스턴스화)시 인수가 하나도 없을때 이며 두번째는 순서만 있을때 세번쨰는 길이와 순서가 있을때 입니다. 이 코드에서는 세번째 생성자만 쓰여졌습니다.
  - length() 맴버 함수는 private 형으로 선언되어 있는 길이값들을 계산하여 빗변의 길이를 출력하는 함수 입니다. public 형으로 되어 있기 때문에 main() 함수 내에 맴버를 바로 호출할수 있습니다.

참고
  - http://winapi.co.kr/clec/cpp3/26-1-1.htm : 생성자
  - 유사 문제

Posted by 카켈





목적
  - 재귀 호출을 이해한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

void print_3(int aIn)
{
 if(aIn < 1)
  return;

 else
 {
  if(aIn % 3 == 0)
  {
   cout << aIn << " ";
   print_3(--aIn);
  }

  else
  {
   print_3(--aIn);
  }
 }

 return;
}

int main(void)
{
 print_3(50);
 cout << endl;
 return 0;
}

해설
  - aIn < 1 조건을 한 이유는 --aIn 이후 1에서 --aIn 을 하면 0 이 출력되기 때문입니다.
  - 재귀 호출은 효율적이면서도 위험한 결과를 얻을수 있는 코딩입니다. 예전 문제들을 잘 보시기 바랍니다.
  - 배수 구하는건 나머지가 0인 원리를 이용해서 구하면 쉽게 얻을수 있습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 명령줄 인수를 이해한다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char* argv[])
{

 int i = 1;
float fMax, fMin, fBuf;

 if(argc > 6 || argc < 6)
 {
  if(argc < 6)
  {
   cerr << "매개변수 부족" << endl;
   
  }
 
  if(argc > 6)
  {
   cerr << "매개변수 초과" << endl;
  }

  return -1;
 }

 fMax = fMin = fBuf = atof(argv[1]);

 while(i < 6)
 {
fBuf = atof(argv[i]);
fMax = fMax < fBuf ? fBuf : fMax;
fMin = fMin > fBuf ? fBuf : fMin;

  i++;

 }

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

 return 0;
}

해설
  - 명령줄 인수에서 0 은 프로그램을 1 부터 띄워쓰기 단위로 명령줄이 char* (문자열 변수 형태) 배열로 저장 됩니다.
  - 이전 문제들을 잘 참조 하세요

참고
  - 유사 문제
  - 실행 화면은 아래와 같습니다.

사용자 삽입 이미지

Posted by 카켈



목표
  - 문자의 속성을 알고 비교 한다.

문제
사용자 삽입 이미지
코드

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

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 int iCount, iUpper, iLower, iSpace, iEtc, iNumber;
 iCount = iUpper = iLower = iSpace = iEtc = iNumber = 0;

 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn,255,'\n');

 while(sIn[iCount] != 0)
 {
  if(isupper(sIn[iCount]))
   iUpper++;
 
  else
  {
   if(islower(sIn[iCount]))
    iLower++;
   else
   {
    if(isspace(sIn[iCount]))
     iSpace++;
    else
    {
     if(isdigit(sIn[iCount]))
      iNumber++;
     else
      iEtc++;

    }
     
   }
  }

  iCount++;

 }

 cout << "대문자 개수 : " << iUpper << endl;
 cout << "소문자 개수 : " << iLower << endl;
 cout << "숫자의 개수 : " << iNumber << endl;
 cout << "공백의 개수 : " << iSpace << endl;
 cout << "기타문자 수 : " << iEtc << endl;
 cout << "총문자의 수 : " << iCount << endl;


 return 0;
}


해설
  - isdigit 는 숫자인지 아닌지 알아내는 함수 입니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 문자의 속성을 알고 비교 한다.

문제
사용자 삽입 이미지
코드

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

using namespace std;

int main(void)
{
 char sInA[255] = {0};
 char sInB[255] = {0};
 int i = 0;

 cout << "첫번째 문자열 : ";
 cin.getline(sInA, 255, '\n');

 cout << "두번째 문자열 : ";
 cin.getline(sInB, 255, '\n');

 while(sInA[i] != 0 && sInB[i] != 0)
 {
  if(tolower(sInA[i]) != tolower(sInB[i]))
  {
   cout << "두 문자열은 일치하지 않습니다." << endl;
   return -1;
  }

  i++;

 }

 cout << "두 문자열은 일치합니다." << endl;

 return 0;

}


해설
  - 대문자나 / 소문자로만 전부 바꾸어서 비교 하면 됩니다.

참고
  - 유사 문제

Posted by 카켈





목적
  - 문자의 속성을 다룰줄 안다.

문제

사용자 삽입 이미지

코드

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

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn,255);

 cout << "입력된 문자열 : " << sIn << endl;
 cout << "변환된 문자열 : ";

 for(int i = 0; i < strlen(sIn); i++)
  cout << (char)(islower(sIn[i]) ? toupper(sIn[i]) : tolower(sIn[i]));
 
 cout << endl;

 return 0;
}



해설
  - cin.getline 에서 세번째 인수는 자동으로 기본값인 '\n' 으로 되어 있습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 난수 생성 및 조건문을 응용한다.

문제
사용자 삽입 이미지

코드

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

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

 float afIn[50] = {0};
 float fTotal = 0;
 int i, iUp, iDown;
 i = iUp = iDown = 0;

 for(i = 0; i < 50; i++)
 {
  afIn[i] = ((rand() % 2001) - 1000) / 1000.0;
  std::cout << afIn[i] << '\t';
  iUp = afIn[i] > 0 ? iUp + 1 : iUp;
  iDown = afIn[i] < 0 ? iDown + 1 : iDown;
  fTotal += afIn[i];

 }

 std::cout << std::endl;
 std::cout << "0 보다 큰 값의 수 : " << iUp << '\n';
 std::cout << "0 보다 작은 값의 수 : " << iDown << '\n';
 std::cout << "난수들의 평균 : " << fTotal / 50 << '\n';

 return 0;
}


해설
  - using namespace std; 를 쓰지 않을때에는 cout 앞에 보시다시피 std:: 라는 것을 붙여 넣으면 됩니다. std::endl 도 마찬가지 입니다.
  - 이전 문제에도 보다 시피 구간내에 난수를 만들어서 계산하는 문제였습니다. 과년도 문제에도 비슷한 유형이 많으니깐 눈여겨 보셔야 할 문제 입니다.
 - 삼항 연산자는 검색하여 찾아 보시기 바랍니다.

참고
  - 유사 문제

Posted by 카켈






목적
  - 난수를 만들어서 추측게임을 만든다.

문제
사용자 삽입 이미지

코드

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

using namespace std;

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

 int i, iRan;
 iRan = i = 0;

 iRan = rand() % 10 + 1;

 while(iRan != i)
 {
  cout << "값을 입력하세요 : ";
  cin >> i;
  if(iRan > i)
   cout << "더 큰 값입니다." << endl << endl;
  if(iRan < i)
   cout << "더 작은 값입니다." << endl << endl;

 }

 if(iRan == i)
  cout << "맞추었습니다." << endl;

 return 0;
}

참고
  - 유사 문제

Posted by 카켈




목적
  - 자료를 입력받아 면적을 계산한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 float fCircle, fTriangleX, fTriangleY, fSquareX, fSquareY;
 fCircle = fTriangleX = fTriangleY = fSquareX = fSquareY = 0.0;

 cout << "원의 반지름 : ";
 cin >> fCircle;

 cout << "삼각형의 밑변과 높이 : ";
 cin >> fTriangleX >> fTriangleY;

 cout << "사각형의 밑변과 높이 : ";
 cin >> fSquareX >> fSquareY;

 cout << endl;

 cout << "원의     면적 : " << fCircle * fCircle * 3.14152 << endl;
 cout << "삼각형의 면적 : " << fTriangleX * fTriangleY / 2.0 << endl;
 cout << "사각형의 면적 : " << fSquareX * fSquareY << endl;

 return 0;
}

해설
  - 크게 문제 될게 없는 단순 입력 및 출력 문제 입니다. 삼각형, 사각형, 원의 넓이는 수학 공식에 그대로 대입했으며 파이는 3.14152 로 했습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 반복문을 수행할 줄 안다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

int main(void)
{
 long lA, lB, lSwap, lTotal, lCount;
 lA = lB = lSwap = lTotal = lCount = 0;

 cout << "두 정수를 입력하세요 : ";
 cin >> lA >> lB;

 if (lA > lB)
 {
  lSwap = lA;
  lA = lB;
  lB = lSwap;

 }

 while(lA <= lB)
 {
  if(lA % 2 == 1)
  {
   lTotal += lA;
   lCount++;
   
  }

  lA++;

 }

 cout << "총합 : " << lTotal << endl;
 cout << "평균 : " << lTotal / lCount << endl;

 return 0;
}

해설
  - 2를 나눠서 1이 남으면 홀수 입니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 클래스를 이해한다.

문제
사용자 삽입 이미지

코드





해설
  - 클래스를 사용하여 문제를 풀었습니다.
  - Stu.h Stu.cpp 2004_final_1.cpp 이렇게 구성되어 있으며 클래스내 맴버 구성은 아래와 같습니다.
  - m_Add() 맴버 함수는 맴버 변수에 저장될 자료의 추가를 m_Print() 맴버함수는 맴버 변수를 출력하고 m_Check() 는 y / n 값을 받아 y 이면 종료를 다른 값이면 n 을 받아 리턴하여 반복 할것인지 판정하는 함수 입니다.

  - Visual C++ 에서 프로그램상 클래스를 추가하는 방법입니다. 조금은 복잡하지만 이걸 알아 두면 나중에 복잡한 클래스 코드를 쉽게 구현할수 있습니다.

    Workspace 창에 보면 ClassView 이라는 창이 있습니다. 그곳에서 프로젝트 명을 오른쪽 버튼을 클릭 New Class... 를 선택하세요

사용자 삽입 이미지
 


    클래스의 종류와 이름을 선택하세요 여기서는 Generic Class 만 선택할수 있습니다. 상속이나 기타 다른 설정은 여기서 할 필요 없습니다.

사용자 삽입 이미지

    맴버 함수와 변수를 만들고 선택하세요. m_Add() m_Print() m_Check() 는 외부 main 함수 내에서 쓰기 때문에 public 으로 선언하시고 맴버 변수인 spName, spSid, spDepart 는 맴버 함수들에 의해서만 쓰여질 것이기 때문에 private 로 하시면 됩니다.

사용자 삽입 이미지

사용자 삽입 이미지
   
사용자 삽입 이미지

 코드를 완성하세요. 위에 쓰여진대로 쓰시거나 원하시는 코드를 넣으시면 됩니다. 단 쓰여질 범위는 클래스를 정의하는 cpp 파일에서 하시는게 좋습니다. 기본 마법사 툴에서 그렇게 하게 제공합니다.

사용자 삽입 이미지

    완성된 클래스의 형태입니다. 이렇게 하시면 Stu 라는 객체가 완성이 되는 것입니다.

사용자 삽입 이미지

파일 구조는 아래와 같습니다.
사용자 삽입 이미지

    잊지 마셔야 할 것은 그 함수를 쓰거나 자료형을 쓸려면 꼭 include 시켜줘야 하는 것입니다. 컴파일러는 프로젝트내에 파일이 열려있다는 사실만으로는 그 파일이 필요한지 그 자료형이 필요해서 자동으로 넣어 주지는 않습니다.

참고
  - 유사 문제

Posted by 카켈



  2004년 C++ 중간고사 모음입니다. 이전 문제들을 풀었다면 문제없이 푸실수 있습니다. main 함수에 넣는 매개변수 문제가 좀 많이 있습니다. 그거 외에 특별하게 요구되는 난이도 높은 문제가 없었습니다.

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




목적
  - 매개변수 입력을 익힌다. 원하는 자릿수의 숫자를 출력을 한다.

문제

사용자 삽입 이미지


코드

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

using namespace std;

int main(void)
{
 char sIn[255] = {0};
 char cSwap = 0;
 int iSpc, iCap, iMin;
 iSpc = iCap = iMin = 0;

 cout << "문자열을 입력하세요 : ";
 cin.getline(sIn, 255, '\n');

 cout << "입력된 문자열 : " << sIn << endl;
 for(int i = 0; i < strlen(sIn); i++)
 {
  for(int j = i; j < strlen(sIn); j++)
  {
   if(sIn[i] > sIn[j])
   {
    cSwap = sIn[i];
    sIn[i] = sIn[j];
    sIn[j] = cSwap;

   }

  }

  if(isspace(sIn[i])) iSpc++;
  if(isupper(sIn[i])) iCap++;
  if(islower(sIn[i])) iMin++;

 }

 cout << "정렬된 문자열 : " << sIn << endl;
 cout << "대문자의 수 : " << iCap << endl;
 cout << "소문자의 수 : " << iMin << endl;

 return 0;

}


해설
  - 간단하게 ctype.h 함수로 대/소/공백문자를 계산했습니다.
  - 다중 for 문으로 문자열의 크기를 비교해서 오름차순으로 정렬했습니다.

참고
  - 유사 문제

Posted by 카켈