C 언어에서 소프트웨어 개발 방법론을 적용해 실제 문제를 해결하는 과정은 문제 정의 → 분석 → 설계(알고리즘) → 구현 → 테스트의 단계를 거칩니다. 이 글에서는 대표적인 예제인 '이차방정식의 근 구하기'를 통해 각 단계를 하나씩 살펴보겠습니다.
문제 정의
- 이차방정식 ax² + bx + c = 0 의 두 근을 구합니다.
- 이차방정식은 항상 두 개의 근(실근 또는 허근)을 가집니다.
분석
프로그램에 필요한 입력과 출력은 다음과 같이 정의할 수 있습니다.
- 입력(Input) — 계수 a, b, c의 값
- 출력(Output) — 두 근 r1, r2의 값
풀이 공식
이차방정식의 근은 근의 공식을 사용하여 계산합니다.
r1 = (-b + √(b² − 4ac)) / 2a
r2 = (-b − √(b² − 4ac)) / 2a
여기서 b² − 4ac 를 판별식(discriminant)이라 하며, 이 값의 부호에 따라 근의 성질이 결정됩니다.
설계 (알고리즘)
- 시작한다.
- a, b, c 값을 입력받는다.
- 판별식 d = b² − 4ac 를 계산한다.
- d > 0 이면 (서로 다른 두 실근)
- r1 = (-b + √d) / (2×a)
- r2 = (-b − √d) / (2×a)
- r1, r2를 출력한다.
- d = 0 이면 (중근)
- r1 = r2 = -b / (2×a) 로 계산한다.
- r1, r2를 출력한다.
- d < 0 이면 '근은 허수(imaginary)'라고 출력한다.
- 종료한다.
구현 코드
위 알고리즘을 C 언어로 구현한 코드입니다.
#include <stdio.h>
#include <math.h>
int main() {
float a, b, c, r1, r2, d;
printf("enter the values of a b c");
scanf("%f %f %f", &a, &b, &c);
d = b * b - 4 * a * c;
if (d > 0) {
/* 서로 다른 두 실근 */
r1 = (-b + sqrt(d)) / (2 * a);
r2 = (-b - sqrt(d)) / (2 * a);
printf("The real roots = %f %f\n", r1, r2);
}
else if (d == 0) {
/* 중근 */
r1 = -b / (2 * a);
r2 = -b / (2 * a);
printf("roots are equal = %f %f\n", r1, r2);
}
else {
/* 허근 */
printf("Roots are imaginary\n");
}
return 0;
}코드 설명
math.h헤더는 제곱근을 계산하는sqrt()함수를 사용하기 위해 포함합니다.- 판별식 d를 먼저 계산한 뒤, if-else if-else 구문으로 세 가지 경우를 나누어 처리합니다.
- d가 음수이면 제곱근을 실수 범위에서 구할 수 없으므로 '허근'임을 알려줍니다.
테스트
세 가지 대표적인 경우에 대해 프로그램을 실행한 결과입니다.
Case 1: enter the values of a b c: 1 4 3
r1 = -1
r2 = -3
Case 2: enter the values of a b c: 1 2 1
r1 = -1
r2 = -1
Case 3: enter the values of a b c: 1 1 4
Roots are imaginary- Case 1 (x² + 4x + 3): 판별식이 양수이므로 서로 다른 두 실근 -1과 -3이 출력됩니다.
- Case 2 (x² + 2x + 1): 판별식이 0이므로 중근 -1이 출력됩니다.
- Case 3 (x² + x + 4): 판별식이 음수이므로 근이 허수임을 출력합니다.
이처럼 소프트웨어 개발 방법론의 각 단계를 체계적으로 적용하면, 복잡한 수학 문제도 명확하고 오류 없는 C 프로그램으로 구현할 수 있습니다.