brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 13. 2016

배열과 포인터: X-files

이차방정식의 근을 구하는 프로그램, 진실은 저너머에 VII



이차방정식의 근을 구하는 프로그램 iii: 배열 활용    



#include <stdio.h>

#include <ctype.h>

#include <math.h>  

/*

* copyleft ⓛ 2006 - 2017 programmed by Sinclair

*/  

// prototypes  

// 정수형 만을 입력할 함수 input logic 

extern int onlyInt( int *) ;

// 입력 로직을 바꿨다고 나중에 다른 부분에 영향을 주지 않습니다.  


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

int printResult( int, double *, int ) ;  


// 근을 구하는 함수 business logic

int getResult( int *, int) ;  


int main() {  

    int data[3] ;

    register int tag ;  

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

    tag = 0 ;

    while(1004) {

        if( tag++ == 5 ) return -4 ;


         if( onlyInt( data ) ) { // data == &data[0]

            puts("프로그램을 종료합니다.") ;

            return -1 ;

        } // end if  

        if( *data ) break ;

        puts("a값을 0으로 입력하면 계산할 수 없습니다. 다시 입력하세요.") ;

    } // end while  

    if( onlyInt( data+1 ) ) {

        puts("프로그램을 종료합니다.") ;

        return -2 ;

    } // end if

    if( onlyInt( data+2 ) ) {

        puts("프로그램을 종료합니다.") ;

        return -3 ;

    } // end if  

    if( getResult( data , sizeof data / sizeof *data ) ) {

        puts("프로그램 실행에 문제가 있습니다.") ;

        exit(-1) ;

    }

    return 0 ;

} // end main()  


int getResult( int * data , int size ) {

    double result[2] ;

    int discriminant; // 판별식 값

    if( size < 3 ) {

        puts("데이터 넣을 공간이 마이 부족해요~") ;

        return -1 ;

    } // end if  

    result[0] = -b / (2.0 * a) ;

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

        result[1] = result[0] ;

    } // end if

    else { // 실근과 허근일 때 

        result[1] = fabs( sqrt( discriminant > 0 ?

                 discriminant : - discriminant ) / ( 2 * a )) ;

         /*

          *  result[1] = sqrt( discriminant > 0 ?

          *     discriminant : - discriminant ) /
          *                     ( 2 * ( a > 0 ? a : -a )) ;
          */

    } // end else  

    if( printResult( discriminant , result ,
                                      sizeof result / sizoef *result ) ) {

              puts("출력에 문제가 있습니다") ;

               return -2 ;

        } // end if  

    return 0 ;  

} // end getResult()  


int printResult( int d , double * r , int size ) {

    if( size > 2 ) {      

        puts("찍을 데이터를 주세요~") ;

        return -1 ;

    } // end if  

    if( !d ) {

        printf("중근 : %f \n" , r[0]) ;

    } // end if

    else if ( d > 0 ) {

        printf("실근 : %f , %f\n" , r[0] + r[1] , r[0] - r[1]) ;

    } // end else if

    else {

        printf("허근 : %f ± %f i\n" , r[0] , r[1]) ;

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

    } // end else  

    return 0 ;  

} // end printResult()   



어떻습니까? 아주 간단해 보이는 문제일지라도 처음에 시간을 많이 투자해서 설계할 때 생각을 많이 하고 고민해서 제대로 작성했더니 다른 개념들을 접목하기도 쉽지 않습니까? 오늘을 사는 프로그래머가 내일을 생각한다면 반드시 설계에 적절한 시간을 투자하고 제대로 잘해야 합니다. 안 그럼 두고 두고 욕 먹습니다. 욕 먹으면 오래 산다고 하는데 벽에 똥칠할 때까지 사시렵니까?  눼에~ 눼에~









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

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

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

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

매거진의 이전글 문자열 이야기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari