c++ 15-1

BakJeonghyun·2022년 12월 5일
0

전공C++

목록 보기
20/20

예제 13-1 예외 상황에 대한 대처가 없는 프로그램 사례

밑수(base)와 지수부(exponent)를 매개면수로 지수 값을 계산하는 함수 사례이다. 이 함수는 양수 입력만 처리하도록 작성되어 있어 2-3에 대해 1이라고 계산하는 오류를 범하고 있다.

#include <iostream>
using namespace std;

int getExp(int base, int exp) {	// (base=2, exp=3)
	int value=1;
    for(int n=0; n<exp; n++)	// n=0 ~ n=2 -> three times
    	value = value * base;	
        // value=1*2, value=(1*2)*2, value=((1*2)*2)*2
    return value;	// value=((1*2)*2)*2
}

int main() {
	in v = getExp(2,3);	// v = ((1*2)*2)*2 = 8
    cout < "2의 3승은 " << v << "입니다." << endl;
}
#include <iostream>
using namespace std;

int getExp(int base, int exp) {	// (base=2, exp=-3)
	int value=1;
    for(int n=0; n<exp; n++)	// n<exp에 걸려서 반복문 빠져나감.
    	value = value * base;
    return value;	// value = 1
}

int main() {
    int e = getExp(2, -3);	// e = 1
    cout << "2의 -3승은 " << e << "입니다." << endl;
}

--> 수학적으로 틀린 값 도출됨.
--> base나 exp에 음수가 넘어오는 상황에 대처하지 않음. 결과적으로 getExp()는 매개 변수에 따라 오류가 발생할 소지를 가진 부실한 함수임. 오류를 유발하는 잘못된 값을 걸러내는 장치를 가지고 있어야 함.

13-2 if 문과 리턴 값을 이용한 오류 처리

매개변수가 음수인 경우 -1을 리턴하고, 정상적인 계산이 이루어지면 계산된 값을 리턴하도록 작성해보자.

#include <iostream>
using namespace std;

int getExp(int base, int exp) {
	if (base <= 0 || exp <= 0) 
    {
    	return -1;
    }
    
	int value=1;
    for(int n=0; n<exp; n++)
    {
    	value = value * base;
    }
    return value;
}

int main() {
	int v = 0;
    v = getExp(2, 3);
    if (v != -1)
    	cout << "2의 3승은 " << v << "입니다." << endl;
    else
    	cout << "오류. 2의 3승은 " << "계산할 수 없습니다." << endl;
        
        
    int e = 0;
    e = getExp(2, -3);
    if (e != -1)
    	cout << "2의 -3승은 " << e << "입니다." << endl;
    else
    	cout << "오류. 2의 -3승은 " << "계산할 수 없습니다." << endl; 
}

13-3 리턴 값과 참조 매개 변수를 이용한 오류 처리

참조 매개 변수를 이용하여 계산한 값을 리턴하고, 함수의 리턴 값은 true/false로 오류인지 아닌지만 알리도록 수정해보자.

#include <iostream>
using namespace std;

int getExp(int base, int exp, int& ret) {
	if (base <= 0 || exp <= 0) {
    	return false;
    }
    int value = 1;
    for (int n=0; n<exp; n++) {
    	value = value * base;
    }
    ret = value;
  	return true;
}

int main() {
	int v = 0;
    if (getExp(2, 3, v))
    	cout << "2의 3승은 " << v << "입니다." << endl;
    else
    	cout << "오류. 2의 3승은 " << "계산할 수 없습니다." << endl;
        
        
    int e = 0;
    if (getExp(2, -3, e))
    	cout << "2의 -3승은 " << e << "입니다." << endl;
    else
    	cout << "오류. 2의 -3승은 " << "계산할 수 없습니다." << endl; 
}

profile
I just got started a blog.

0개의 댓글