사용자 정의 함수

 

① 예제 1

  • 여기서 맨 아래의 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 라는 함수가 정의되어있음을 알려줘야 한다.

※ 누군가는 cough 함수를 어떻게 정의했는지 궁금해 할 수 있지만 적어도 여러분은 전혀 알 필요가 없다는 것! 그냥 누군가가 구현해 준 기능을 그대로 활용해서 여러분에게 더 흥미로운 프로그램을 만들면 됩니다.

 

 

② 예제 2

* 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에서 무조건 한 번은 먼저 수행하게 해준다.

 

 

중첩 루프

마리오 게임에서 흔히 보는 것 처럼 화면에 여러 개의 이미지를 가로나 세로로 여러 개 이어서 출력하고 싶으면 어떻게 해야 할까? 아래 코드처럼 for 루프를 사용할 수 있다.

 

 

for 루프

  • 먼저 int n; 으로 정수 값을 갖는 변수 n을 정의
  • 그리고 do{ …}while()을 이용해서 while( )의 조건이 만족할때 까지 get_int 함수로 사용자가 입력값을 받아 n에 저장
  • do{ }while()을 사용하면 조건과 상관없이 최소한 한 번은 { }안의 내용을 실행할 수 있다.
  • for 루프를 두 번 중첩해서 돌면서 “#”을 출력
  • 첫 번째 루프에서는 변수 i를 기준으로 n번 반복하고, 그 안의 내부 루프에서는 변수 j를 기준으로 n번 반복
  • 내부 루프에서는 “#”을 출력하고, 내부 루프가 끝날 때마다 줄바꿈을 수행
  • 따라서 최종적으로는 가로가 n개, 세로가 n개인 “#”이 출력된다.

 

하드웨어의 한계

컴퓨터는 RAM(랜덤 액세스 메모리)이라는 물리적 저장장치를 포함하고 있다. 우리가 작성한 프로그램은 구동 중에 RAM에 저장되는데, RAM은 유한한 크기의 비트만 저장할 수 있기 때문에 때때로 부정확한 결과를 내기도 한다.

 

① 부동 소수점 부정확성

 

아래와 같이 실수 x, y를 인자로 받아 x 나누기 y를 하는 프로그램이 있다고 해보자.

나눈 결과를 소수점 50자리까지 출력하기로 하고, x에 1을, y에 10을 입력하면 아래와 같은 결과가 나온다.

정확한 결과는 0.1이 되어야 하지만, float 에서 저장 가능한 비트 수가 유한하기 때문에 다소 부정확한 결과를 내게 되는 것

 

 

② 정수 오버플로우

 

비슷한 오류로, 1부터 시작하여 2를 계속해서 곱하여 출력하는 아래와 같은 프로그램이 있다고 해보자.

우리가 변수 i를 int로 저장하기 때문에, 2를 계속 곱하다가 int 타입이 저장할 수 있는 수를 넘은 이후에는 아래와 같은 에러와 함께  0이 출력될 것이다.

정수를 계속 키우는 프로그램에서 10억을 넘기자 앞으로 넘어갈 1의 자리가 없어진 것!  int에서는 32개의 비트가 다였기 때문이다. 그 이상의 숫자는 저장할 수 없어서 오류가 발생한다.

 

 

 Q) 오버플로우 문제를 방지하기 위해선 어떻게 해야할까?

 

      1. 메모리 할당량을 늘린다.

      2. 할당한 메모리값을 초과하기 전에 초기화하는 프로그래밍을 한다.

      What else...? 

 


출처 : https://www.boostcourse.org/cs112/lecture/119010/?isDesc=false 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

+ Recent posts