Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

12시간 형식을 24시간 형식으로 변환하는 C++ 프로그램

이 글에서는 12시간제(AM/PM)로 표현된 시간을 24시간제 형식으로 변환하는 C++ 프로그램을 다룹니다. 오전과 오후를 구분하는 조건 처리 방법과 함께, setw()setfill()을 활용해 시·분·초를 항상 두 자리로 출력하는 방법까지 살펴봅니다.

변환 알고리즘

12시간제를 24시간제로 바꿀 때의 핵심 규칙은 다음과 같습니다.

  • 오후(pm)이고 시간이 12보다 작은 경우 → 시간에 12를 더합니다. (예: 오후 1시 → 13시)
  • 오후(pm) 12시인 경우 → 정오이므로 12를 그대로 사용합니다.
  • 오전(am)이고 시간이 12보다 작은 경우 → 시간을 그대로 사용합니다.
  • 오전(am) 12시인 경우 → 자정이므로 00으로 바꾸어 출력합니다.

am/pm 외의 값이 입력되면 "Wrong choice"(잘못된 선택)라는 메시지를 출력하도록 처리합니다.

의사 코드

Begin
    In main(),
    If median = pm
        If hours < 12
            시간에 12를 더한 후 24시간 형식으로 출력
        Else if hours == 12
            12를 그대로 두고 24시간 형식으로 출력
    Else if median = am
        If hours < 12
            시간을 그대로 두고 24시간 형식으로 출력
        Else if hours == 12
            00으로 바꾸어 24시간 형식으로 출력
    Else
        잘못된 입력 메시지 출력
End

예제 코드

#include <iostream>
#include <string.h>
#include <iomanip>
using namespace std;

int main() {
    int hours, minutes, seconds, h1, m1, s1;
    char median[10];

    cout << "Enter hours, minutes, seconds:";
    cin >> hours;
    cin >> minutes;
    cin >> seconds;
    cout << "Enter median:";
    cin >> median;

    // setw() : 출력 필드 너비 지정, setfill() : 빈 자리를 채울 문자 지정
    cout << "Time in 12 hour format:"
         << setfill('0') << setw(2) << hours << ":"
         << setfill('0') << setw(2) << minutes << ":"
         << setfill('0') << setw(2) << seconds << median << endl;

    if (strcmp(median, "pm") == 0) {   // strcmp() : 두 문자열이 같으면 0 반환
        if (hours < 12) {
            h1 = hours + 12;
            m1 = minutes;
            s1 = seconds;
            cout << "Time in 24 hour format:"
                 << setfill('0') << setw(2) << h1 << ":"
                 << setfill('0') << setw(2) << m1 << ":"
                 << setfill('0') << setw(2) << s1;
        } else if (hours == 12) {
            h1 = 12;
            m1 = minutes;
            s1 = seconds;
            cout << "Time in 24 hour format:"
                 << setfill('0') << setw(2) << h1 << ":"
                 << setfill('0') << setw(2) << m1 << ":"
                 << setfill('0') << setw(2) << s1;
        }
    } else if (strcmp(median, "am") == 0) {
        if (hours < 12) {
            h1 = hours;
            m1 = minutes;
            s1 = seconds;
            cout << "Time in 24 hour format:"
                 << setfill('0') << setw(2) << h1 << ":"
                 << setfill('0') << setw(2) << m1 << ":"
                 << setfill('0') << setw(2) << s1;
        } else if (hours == 12) {
            m1 = minutes;
            s1 = seconds;
            cout << "Time in 24 hour format:00:"
                 << setfill('0') << setw(2) << m1 << ":"
                 << setfill('0') << setw(2) << s1;
        }
    } else {
        cout << "Wrong choice";
    }
    return 0;
}

코드 설명

  • strcmp(median, "pm") : 두 문자열이 일치하면 0을 반환하므로, 이를 이용해 오전/오후 여부를 판별합니다.
  • setw(2) : 출력 필드의 너비를 2자리로 지정합니다.
  • setfill('0') : 남는 자리를 '0'으로 채워 07, 02처럼 항상 두 자리로 표시됩니다.
  • 조건 비교 시 대입 연산자 =가 아닌 비교 연산자 ==를 사용해야 한다는 점에 유의하세요. =를 쓰면 조건이 항상 참이 되어 논리 오류가 발생할 수 있습니다.

실행 결과

Enter hours, minutes, seconds:12 07 06
Enter median:pm
Time in 12 hour format:12:07:06pm
Time in 24 hour format:12:07:06

Enter hours, minutes, seconds:01 02 30
Enter median:pm
Time in 12 hour format:01:02:30pm
Time in 24 hour format:13:02:30

Enter hours, minutes, seconds:10 10 03
Enter median:am
Time in 12 hour format:10:10:03am
Time in 24 hour format:10:10:03

Enter hours, minutes, seconds:12 02 04
Enter median:am
Time in 12 hour format:12:02:04am
Time in 24 hour format:00:02:04

실행 결과에서 볼 수 있듯이, 오후 1시는 13시로 변환되고 오전 12시는 00시로 출력됩니다. 이 프로그램의 원리를 응용하면 문자열로 입력받은 시간 파싱, 반대 방향(24시간제 → 12시간제) 변환 등으로도 손쉽게 확장할 수 있습니다.