목적
  - 시간의 단위를 이해하고 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>

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




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

문제

사용자 삽입 이미지

코드

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





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

문제
사용자 삽입 이미지

코드

#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>

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



목적
  - 키보드로 원하는 값을 입력 받는다
  - 원하는 값을 화면에 출력한다
  - 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 카켈



1. 목적
  - 나눗셈과 나머지를 이해한다.
  - 시간에 대한 계산을 이해한다.

2. 문제 (점수 : 20 점)
  - 초를 입력 받아 일/시간/분/초 로 분리하여 출력하는 프로그램을 작성하여라.
  - 출력 화면
시간을 초단위로만 입력하세요 : 123456
123456초는 1일 10시간 17분 36초 입니다.
Press any key to continue


3. 이해
  - 시간을 원하는 단위로 맞출수 있는가?
  - 나머지와 나눗셈 연산자를 이해 했는가?

4. 코드
#include <stdio.h>

int main()
{
 long in = 0;
 printf("시간을 초단위로만 입력하세요 : ");
 scanf("%d", &in);

 printf("%d초는 %d일 %d시간 %d분 %d초 입니다.\n", in, in / (3600*24), in % (3600*24) / 3600, in % 3600 / 60  , in % 60);
 
 return 0;
}


5. 해설

  - 기본적인 원리는 하루는 60 초 (=1분) / 3600 초 (=1시간) / 3600 * 24 초 (= 1일)  입니다. 따라서 원하는 시간 단위값을 얻고 싶으면 일수일 경우는 1일에 해당하는 초를 나눈 몫을 쓰면 되고 시간일 경우 초를 일수 로 나눈 나머지를 시간에 해당하는 초로 나누면 됩니다. 마찬가지로 분을 구하고자 한다면 시간에 해당하는 초를 나눈 나머지를 분에 해당하는 초의 크기로 나누면 되며, 초인 경우 같은 방법으로 해도 되나 위의 경우 그 밑 단위가 없으므로 60을 나눈 나머지로 썼습니다.
  - 기초적인 계산이지만 천천히 이해하지 않으면 구현에 애로사항이 있습니다.

6. 참고
 - http://www.winapi.co.kr/clec/cpp1/5-1-1.htm : 연산자
Posted by 카켈



1. 목적
  - 공약수의 개념을 이해한다.

2. 문제 (점수 : 20점)
  - 정수값 세개를 입력 받고 이 수들의 공약수를 찾는 프로그램
  - 특정 제한 없음
  - 출력 화면
정수 값을 입력하세요 : 25 800 450
25, 800, 450 의 공약수 : 1 5 25
Press any key to continue

3. 이해
  - 공약수의 개념을 이해하는가?
  - 나머지의 개념을 이해하는가?

4. 코드

#include <stdio.h>

int main()
{
 int a,b,c,i,max;
 a = b = c = max = 0;
 i = 1;
 
 printf("정수 값을 입력하세요 : ");
 scanf("%d %d %d", &a, &b, &c);

 max = a;
 max = max < b ? b : max;
 max = max < c ? c : max;

 printf("%d, %d, %d 의 공약수 : ", a, b, c);
 while(i <= max)
 {
  if (a % i == 0 && b % i == 0 && c % i == 0) printf("%d ",i);
  i++;
 }

 putchar('\n');
 
 return 0;
}


5. 해설
  - 공약수는 해당 여러 숫자의 공통적으로 나머지가 0이 되는 약수를 의미합니다.
  - 우선 세수의 최대값을 찾고 최대값 까지 나머지가 0이 되는 숫자를 출력하면 됩니다.
  - 0으로 나누면 오류가 생기므로 시작값은 1부터 합니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/5-1-2.htm : 산술 연산자
Posted by 카켈
이전페이지 1 다음페이지