void를 입력하고 원하는 함수명(cough)을 적은 뒤 괄호 안에 void를 적는다.
그리고 printf로 cough를 출력하는 코드를 작성한다.
그 후 int main(void) 안에 cough(함수명)를 사용해보면 정의해둔 대로 cough가 3번 출력된다.
하지만 만약 함수를 1개가 아닌 여러개를 만들면 중요한 main 함수가 더 아래로 내려가게 된다.
그럼 main 함수를 위로 올리고 cough 함수를 내려보자.
위와 같이 에러가 발생한다.
나는 main 함수에서 cough( ) 함수를 사용했다.
그런데 cough함수는 아래에 있다.
C는 오래되었고 똑똑하지 않기 때문에 아래에 cough라는 함수가 있을 것이라 생각하지 못하는 것이다.
이 것을 해결하려면 다시 cough함수를 위로 올려야 한다.
void cough(void)를 세미콜론과 함께 위로 올리는 것이다.
마치 이전에 cough를 봤던 것처럼 C를 속이는 방법이다.
cough 함수를 전부 본 적은 없어도 이름은 본적이 있으니 main 함수에 나올 때까지
코드를 계속 읽도록 하는 것이다.
이번에는 cough 함수를 좀 더 다재다능하게 만들어 원하는 횟수만큼 cough를 출력할 수 있도록 해보자.
여기서 맨 아래의 void cough(int n){...} 은 cough 라는 이름의 함수를 우리가 직접 정의한 것이다.
cough( ) 안의 int n 은 함수가 입력값을 받아서 int 형식을 갖는 n이라는 변수에 저장하겠다는 의미이다.
그리고 { } 안의 내용을 보면 n번 동안 cough를 출력하는 for 루프가 있다.
다시 main 함수 안으로 돌아가보면 cough(3) 이라는 한 줄의 코드를 통해서 3이라는 값을
cough 함수에 전달하고, 궁극적으로는 cough를 세 번 출력할 수 있게 되는 것이다.
다만 여기서 main 함수를 우리가 정의한 cough 함수보다 위에 위치시키고 싶다면,
예시에서와 같이 void cough(int n);를 먼저 입력해서 cough 라는 함수가 정의되어있음을
알려줘야 한다.
여기서 get_positive_int 함수는 CS50라이브러리(cs50.h)에 없는 함수이다.
아래 int get_positive_int(void)를 보면 처음 보는 기능이 있다.
이 부분의 논리를 차근차근 확인해 보자.
여기 get_postive_int라는 함수가 있는데 입력을 받지 않았다.
괄호 안에 아무것도 넣을 필요가 없다. 아무 양의 정수나 받으면 된다.
하지만 이 전에 사용했던 get_int나 get_string 함수처럼 어떤 값을 받아와서 변수에 저장하는 것처럼 이 함수가 뭔가를 반환하게 하고 싶다.
그래서 int get_positive_int(void) 파란색 글씨는 void가 아니고 int가 된다.
함수 왼쪽에 있는 단어(파란색)는 출력의 종류를 의미한다.
int get_positive_int(void) 괄호 안의 빨간색 단어(void)는 입력의 종류를 뜻한다.
만약 입출력이 없다면 void를 적어주면 된다.
그리고 int n; 이라고 하는 처음 보는 것이 있다.
컴퓨터에게 n이라고 하는 변수를 달라는 일종의 힌트이다.
그 안에 어떤 값을 저장할지 아직 모르기 때문에 그냥 int n;만 적는 것이다.
아직은 아무것도 할당할 필요가 없다.
그럼 n은 쓰레기 값(Garbage Value)이라고 부르는 값을 가지게 된다.
n에 무엇이 들었는지는 모르지만 중요하지 않다. 나중에 제대로 넣으면 된다.
그 다음 do-while의 루프를 알아보자.
이 불리언 표현 while(n<1); 이 참일때 다음을 수행하라는 뜻이다.
만약 n이 1보다 작다면 계속해서 질문을 반복하는 것이다.
while을 단독으로 사용하면 while의 조건이 참이어야만 수행을 한다.
하지만 do-while은 do에서 무조건 한 번은 먼저 수행하게 해준다.
먼저 int n; 으로 정수 값을 갖는 변수 n을 정의한다.
그리고 do{ …}while( )을 이용해서 while( )의 조건이 만족할때 까지
get_int 함수로 사용자가 입력한 값을 받아 n에 저장한다.
do{ }while( )을 사용하면 조건과 상관없이 최소한 한 번은 { }안의 내용을 실행할 수 있다.
그리고 for 루프를 두 번 중첩해서 돌면서 “#”을 출력한다.
첫 번째 루프에서는 변수 i를 기준으로 n번 반복하고,
그 안의 내부 루프에서는 변수 j를 기준으로 n번 반복한다.
내부 루프에서는 “#”을 출력하고, 내부 루프가 끝날 때마다 줄바꿈을 수행한다.
따라서 최종적으로는 가로가 n개, 세로가 n개인 “#”이 출력된다.
Ref.
Edwith_boost course