밑수(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()는 매개 변수에 따라 오류가 발생할 소지를 가진 부실한 함수임. 오류를 유발하는 잘못된 값을 걸러내는 장치를 가지고 있어야 함.
매개변수가 음수인 경우 -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;
}
참조 매개 변수를 이용하여 계산한 값을 리턴하고, 함수의 리턴 값은 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;
}