본문 바로가기

프로그래밍 언어/C, C++

[Hackerrank] 30. Cpp exception handling

30. Cpp exception handling

[ 난이도: Medium | 분야: Debugging ]

1. 과제

이번 챌린지에서는, 제공된 모든 테스트 파일들을 성공적으로 실행해야 한다.

std::invalid_argument 예외를 적절히 다루도록 코드를 수정해야 한다.

더 구체적으로, 주어진 process_input 함수를 수정해야 한다.

이 함수는 정수 n을 인자로 받고 아래의 일들을 수행한다:

1. 이 함수는 largest_proper_divisor(n) 함수를 호출한다.

2. 만약 예외가 발생하지 않고 값을 반환한다면, 이 값은 result=d로 단일 줄로 출력된다.

3. 다르게, 만약 std::invalid_argument 예외를 발생시킨다면 예외를 설명하는 문구를 단일 줄에 출력한다.

4. 마지마긍로, 예외가 발생하는지 발생하는지 상관하지 않고 이 함수는 이전의 출력들을 출력한 후 단일줄에 returning control flow to caler를 출력한다.

코드의 질을 높이도록, process_input 함수의 몸통에 returnig control flow to caller를 출력하는 코드를 넣어라.

수정한 함수는 탬플릿 코드의 잠겨있는 부분에서 여러 가지 케이스들로 검증된다.

입력 형식

입력은 코드 탬플릿의 잠겨 있는 부분에서 알아서 읽는다. 입력에는 오직 단일 줄로 정수 n이 들어 있고, 이 값은 process_input으로 전달된다.

 

제약 사항

n은 0보다 크거나 같고 100보다 작거나 같다

 

출력 형식

위에서 설명한 내용을 process_input에서 출력한다.

 

입력 예시0

0

 

출력 예시0

largest proper divisor is not defined for n=0
returning control flow to caller

 

설명0

첫 번째 샘플에서, n=0이고 largest_proper_divisor(0)를 호출하며 예외가 발생한다.

이 경우 process_input 함수가 두 줄을 출력한다.

첫 번째 줄은 예외 상황을 출력하고, 두 번째 줄은 returning control flow to caller를 출력한다.

 

입력 예시1

9

 

출력 예시1

result = 3
returning control flow to caller

 

설명1

첫 번째 샘플에서 n=9이고 largest_proper_divisor(9)를 호출한다. 이 경우 예외가 발생하지 않으면서 3을 결과로 반환한다.

이 경우, process_input은 두 줄을 출력한다. 첫 번째 줄은 result=3을 두 번째 줄은 returning control flow to caller를 출력한다.

#include <iostream>
#include <stdexcept>

using namespace std;

int largest_proper_divisor(int n) {
    if (n == 0) {
        throw invalid_argument("largest proper divisor is not defined for n=0");
    }
    if (n == 1) {
        throw invalid_argument("largest proper divisor is not defined for n=1");
    }
    for (int i = n/2; i >= 1; --i) {
        if (n % i == 0) {
            return i;
        }
    }
    return -1; // will never happen
}

void process_input(int n) {
    int d = largest_proper_divisor(n);
    cout << "result=" << d << endl;
}


int main() {
    int n;
    cin >> n;
    process_input(n);
    return 0;
}
더보기

정답

#include <iostream>
#include <stdexcept>

using namespace std;

int largest_proper_divisor(int n) {
    if (n == 0) {
        throw invalid_argument("largest proper divisor is not defined for n=0");
    }
    if (n == 1) {
        throw invalid_argument("largest proper divisor is not defined for n=1");
    }
    for (int i = n/2; i >= 1; --i) {
        if (n % i == 0) {
            return i;
        }
    }
    return -1; // will never happen
}

void process_input(int n) {
    try {
        int d = largest_proper_divisor(n);
        cout << "result=" << d << endl;
    }
    catch (invalid_argument& e) {
        cout << e.what() << endl;
    }
    cout << "returning control flow to caller" << endl;
}


int main() {
    int n;
    cin >> n;
    process_input(n);
    return 0;
}

 

 

 

 

 

©️Hackerrank. All Rights Reserved.