brunch
매거진 Sinclair

배열과 포인터: X-files

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

by Sinclair



이차방정식의 근을 구하는 프로그램 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

keyword