2015년 1월 6일 화요일

[C언어] 함수의 네가지 기본형태에 대한 이해


 Add(), ShowAddResult(), ReadNum(), HowToUseThisProg()
각각 반환과 인자전달의 유무가 다른 네개 형태의 사용법에 대한 코딩이다.
이렇게 작성하면 반환 값? 인자전달? 이라는 의문이 들 수도 있는데,

 인자란 함수 사용시에 사용하는 값, 반환 값은 일반적으로 함수내의 결과 값을 의미한다고 할 수 있다. 
 다른 말로하면, Add함수에서 int(정수) 형태의 num1과 num2 의 값을 받아들여 그것으로 함수가 갖는 계산을 한다고 할 수 있다. 물론 함수마다 어떤 계산일지는 다르겠지만,
 Add 에 한해서는 num1+num2의 계산이다. return num1+num2; 라고 되어있는데, 더하기와 동시에 그 값을 반환; 즉, Result =Add(int num1,int num2); 라고할 때 Result 값은 num1, num2 의 합이 되는 것이다. 더 쉽게 Result= Add(3,4); 라고 하면 Result 값에 3과 4의 합; 7을 Result에 대입하는 것이다.

 반환 값이 없는 경우에는 대표적인 경우가 ShowAddResult()처럼 함수내의 printf()함수가 있는 경우이다. printf()자체가 모니터로 반환한다는 의미로 볼 수 있다. (*깊이 들어가면 printf()함수는 글자열의 길이를 반환값으로 갖는 함수이다. 그 말은 즉, ShowAddResult()를 반환이 가능한 함수로 만들고 return printf(); 할 경우 문자열의 길이 값을 반환 하게도 만들 수 있다는 의미이다.) 괄호안의 말은 깊이 이해하지 않아도 되며, 이 문제를 쓴 저자는 함수를 간단히 설명하기 위해 사용한 것이므로, 인자만 받아서 반환하지 않는 함수로 사용할 수 있구나... 하고 이해하면 된다.

 세번 째의 ReadNum() 함수를 보면, 반환 값만 있다. ReadNum(); 이라고 선언한 것이 scanf("%d",&num); 을 간단히 하기위한 장치라고 할 수 있다. 물론 ReadNum()으로만 선언만 하면 결과 값을 컴퓨터에서만 가질 뿐 이걸 이용하기 위해서는 그림과 같이 num1=ReadNum(); 식으로 사용하면 ReadNum() scanf로 입력받은 값을 num1에 저장한다.

 마지막으로, HowToUseThisProg() 함수는 인자(입력)도 반환(출력)도 없다. 무엇인가 기본적으로 모니터상으로 보여주고 싶은 문구가 있을경우 printf("블라블라블라 \n"); 의 형태로 사용할 수도 있지만, HowToUseThisProg(); 선언만으로 같은 결과를 도출할 수 있다니 얼마나 간편하겠는가. (문자의 길이부터) 물론 함수선언이 차지하는 공간이 있긴 할테지..

 예제를 거의 가져온데다가 내 생각을 덧붙인 것 뿐이지만, C언어에서는 함수가 시작이고 끝이고 심지어 int main() 메인 함수또한 함수인 모든 함수 형태이므로 함수는 정말정말정말 중요해서, 블로그 글에 게시한다. 항상 4가지가 있다는 것을 기억하자.
 1. 인자와 반환 값이 있는경우        example)    Add()
 2. 인자는 있고 반환값이 없는경우                   ShowAddResult()
 3. 인자는 없고 반환값이 있는경우                   ReadNum()
 4. 인자도 반환값도 없는경우                          HowToUseThisProg()

References  <열혈C프로그래밍> -윤성우 저 오렌지미디어  214page SmartAddFunc.c




[C언어] if ~else if 문의 switch case 문 변화

문제는 
if(n>=0 && n<10) printf("0이상 10미만\n");
else if(n>=10 && n<20) printf("10이상 20미만\n");
else if(n>=20 && n<30) printf("20이상 30미만\n");
else printf("30이상\n");

의 형태의 if...else if 문을 억지로 switch case문으로 바꿔보라는 이야기 였다.
case 문의 특성상 범위조절이 아닌 값을 의미하므로 나의 경우는 위의 그림과 같이 일일히 자연수 case 를 전부 넣었지만 솔루션은 이 방법이 아니였다. 
 물론 나의 코드 작성 방법에도 문제가 있는데, 입력받은 값이 (물론 정수로 선언하긴 하였지만) float형태(소수형태) 일 경우 가 성립하지 않을 수 있다는 것이다.

 솔루션에서는 switch(n/10)으로 10으로 나누어 문제를 해결했다.
10으로 나눌경우 정수형 선언이기에 나머지가 떨어져 나가므로, 
복잡하게 안하고, 주석처럼 case 0: case 1: case 2: default: 만으로 해결 할 수 있게 된다.

참조한 책은 200p 문제 08-3 윤성우 저자의 <열혈 C프로그래밍> 오렌지미디어. 이다.
정말 C프로그래밍 책에서 추천할 만 하며, 생각해볼 수 있게 잘쓰여진 좋은 책이다. 2학년때 사서 현재까지 붙잡고 있지만, 열심히 하자는 마음가짐에 C기초를 단단히 잡고 싶어 다시 시작 하였다. 
 굉장히 빠른 스피드로 진행해 나가다가, 이문제에서 막혀서 블로그에 글을 올린다. 나중에도 기억하고 싶어서.