brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 07. 2016

함수와 표준 I/O

내가 그의 이름을 불러 주었을 때 V





이차방정식의 근을 구하는 프로그램 i


이제 드디어 이차방정식의 근을 구하는 프로그램을 작성해 보겠습니다.


실행 조건과 알고리즘 기억나죠? 여러분들이 직접 작성해 보고 한번 비교해 보길 바랍니다. main() 함수 하나로 작성하기는 쉽지만 쉬운 것만 하다 보면 문제 해결 능력은 향상되지 않습니다.  


(선행 조건)       

a. 정수형 a, b, c값 만을 입력 받는다.

b. 판별식 d = b2 – 4 ac

c. 근의 공식 판별식
     d가 0이면 중근, X = -b / 2a
     d가 0보다 크면 실근 X = (-b±√d )/ 2a
     d가 0보다 작으면 허근 X = (-b±√-di)/ 2a (허근도 구할 겁니다.)


(작업 순서)       

1. 사용 변수를 초기화 한다.

2. a, b, c값을 정수 형으로 입력 받는다.

3. a값이 0인지 확인(∵ a값이 0이면 일차방정식이잖아요. 안 그래요?)

4. a값이 0이면 다시 입력 후 3)으로 0이 아니면 다음으로

5. 판별식 d를 구한다.

6. d가 0이면 중근을 구하고 d가 0보다 크면 실근, 0보다 작으면 허근을 구한다.

7. 근을 출력한다.

* 필요에 따라 반복 한다.



필요한 주요 함수들



 

#include <stdio.h>

#include <math.h>  

/*

* copyleft (l) 2006 - 2017 programmed by Sinclair

*/   


//정수형 세개를 입력할 함수 input logic

int inputData( int * , int * , int * ) ;  


//결과를 출력할 함수 presentation logic

int printResult( int , double , double ) ;  


//근을 구하는 함수 business logic

int getResult(int , int , int ) ;  


int main() {

    int aValue , bValue , cValue ;  

    puts("정수형 세 개를 입력하시면 이차방정식의 근을 구합니다.") ;  

    inputData( &aValue , &bValue , &cValue ) ;  

    if( !aValue ) {

        puts("a 값이 0이면 근을 구할 수 없습니다. 프로그램을 종료합니다.") ;

        return 1 ;

    } // end if  

    getResult( aValue , bValue , cValue ) ;

    return 0 ;

} // end main()   


int inputData( int * a , int * b , int * c ) {  

    scanf("%d %d %d" , a , b , c ) ;

    return 0 ;  

} // end inputData()   


int getResult( int a , int b , int c ) {  

    double result1 , result2 ;

    int discriminant; // 판별식 값 

    result1 = -b / (2.0 * a) ; // 언제나 실수부

    if(!(discriminant = b * b – 4 * a * c)) { // 중근일 때

        result2 = result1 ;

    } // end if

    else { // 실근과 허근일 때

        result2 = sqrt( discriminant > 0 ? discriminant :
                                          -discriminant )
                                          / ( 2 * abs(a) ) ;

    } // end else

    printResult( discriminant , result1 , result2 ) ;  

    return discriminant ;  

} // end getResult()   


int printResult( int d , double r1 , double r2 ) {

    if( !d ) {

        printf("중근 : %f \n" , r1 ) ;

    } // end if

    else if ( d > 0 ) {

        printf("실근 : %f , %f\n" , r1 + r2 , r1 - r2 ) ;

    } // end else if

    else {

        printf("허근 : %f ± %f i\n" , r1 , r2 ) ;

        // 결국 허근은 i를 붙이는 일 아니겠습니까?

    } // end else  

    return 0 ;  

} // end printResult()    




이것 말고도 작성하는 방법은 무한히 많습니다. 여러분들이 작성한 것과 다르다고 절대 틀린 것이 아닙니다. 프로그래밍을 배우는 좋은 방법들 중 하나는 바로 다른 사람들의 프로그램을 읽고 분석하는 일입니다. 부디 도움이 됐기를 바랍니다.  




scanf()함수는 몇 가지 문제점이 있습니다. 개인적으로 scanf()함수는 가급적 사용하지 않습니다.

첫 번째 일단 데이터를 판별 못 합니다. 정수형만 입력 받고 싶지만 실제 문자열이나 실수형을 입력해 보면 문제점을 알 수 있습니다.

두 번째 scanf() 함수는 앞에서 확인한대로 buffering문제도 가지고 있습니다.



이런 문제점을 생각하며 이차방정식의 근을 구하는 프로그램에서 scanf()함수를 사용하지 않는 방법으로 수정해보길 바랍니다. Sinclair의 소스는 다음 글에 있습니다. 부디 먼저 스스로 코딩 해 보길... 제발~ 百聞이 不如一見이지만 百見은 不如一打입니다. 게다가 百打는 不如一行이라고 하죠? 




행하지 않는 믿음은 죽은 믿음 이라고 성경은 말하고 있습니다.

지금 당장 해 보세요. 내일은 너무 늦습니다.













C언어 및 기타 프로그래밍 관련 질문은 오픈 카톡으로

group talk - https://is.gd/yourc

1:1 talk - https://is.gd/aboutc

#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍  #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language

매거진의 이전글 제어문과 반복문
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari