C 이론(12)

Hi Beck·2023년 5월 20일

TIL-Language(C & C++)

목록 보기
15/34

1.형식지정자 속 숫자가 들어갈 때
'%숫자d'는 입력한 숫자만큼 출력되는 자릿수라는 뜻임
예로 들어 %2d는 d까지 포함해서 두자리 출력임
d가 한자리 숫자나 문자라면 공백한칸 d한칸 이렇게되는거고 만약 d가 두자리 숫자나 문자라면 공백없이 두자리로 출력되는 것이다.

2.절차지향 언어는 코드를 타고 쭉 내려오다가 함수호출문을 만나면 해당 함수 안으로 들어가 타고 내려오는 언어임

3.요즘은 기능이 여러개 있는 코드를 프로그램으로 어긴다는 점에서 메인함수에 많은 기능이 있는만큼 코드 덩어리가 많을 것이다.
그래서 메인함수 하나에 모든 기능을 넣을 순 없다.

메인함수는 처음으로 실행되는 함수고 다른 기능들은 메인함수 그 안에서 함수를 호출하고 그 호출한 함수 안에서 또 다른 함수를 호출하고 이런식으로 프로그램을 전개해나가는 것이다.

4.모듈화 = 함수화 = 독립되어있는 프로그램의 일부분
= 프로그램에서 하나의 기능을 담당 = 부품의 하나로 보기

5.함수(function): 특정한 작업을 수행하는 독립적인 부분
함수 호출(function call): 함수를 호출하여 사용하는 것
함수는 입력을 받으며 출력을 생성한다.

중요한건 함수를 정의한 것만으로는 아무일 일어나지않는다!
함수를 호출해야만 그때 함수정의문 안 코드가 실행이 되어 일이 일어나는것이다.

6.함수 정의문에서 반환형 함수명 입력형(=매개변수) 밑 중괄호 안에 있는 것을 '함수의몸체'라고 표현한다.

함수 해석(우에서 좌로)
-> "지정한 자료형의 매게변수(입력값)를 받아와서 무언가(함수명)를 지정한 자료형(반환값)으로 반환한다."

반환형이 있으면 항상 return이 존재함
return의 형태는 다양하다.(식 혹은 수를 써줄 수 있음)

*반환형이 void일땐 return이 없어도된다.(단, 있으면 안된다는 소리는 아님. void여도 return이 있을 수도 있다.이 경우는 값을 반환하는 목적이 아닌 함수를 끝낼려는 목적으로 사용하는 경우다.코드를 중단하거나 뒤에 있는 코드를 실행하고 싶지않을때 사용한다.사용법은 return;만 친다.)

입력값받을때 꼭 한개가 아닌 다수를 받을 수 있다.
(여긴 변수선언이나 변수 초기화가 안들어가고 단순히 값만 받는거니깐 주의하기)

7.함수를 사용할려면 호출해야되고 함수호출은 함수명(); 이렇게 쓴다.()안에는 매게변수가 있으면 써주고 없으면 놔두고하는 식으로 쓰고 해당 함수가 반환형까지 정의했다면 함수호출 앞에 받는 반환값도 써주기

Ex) 함수정의문
int square(int n)
라는 정의문이 있을때

main
n = square( );

이렇게 호출문이 쓰이는 것임

*반환값을 선언해놓고 반환값을 받아오지않는 경우도 있다.
이 경우는 크게 의미가 없는 경우여서 skip
근데 내가 코드를 짤 때는 호출하는곳에서 반환형 선언하고 return도 받는데 반환값을 받아오지않는것은 코드 잘못 짠 것이다.안쓸거면 반환값 선언시 void로
(남들이 무의미한데 유의미한 값으로 오해해서 가져다쓸수도있기에 조심하자)

8.인수: 매개변수로 쓰이는 수를 인수라 함(함수호출문에 들어감)
매개변수 : 인수를 받을 타입을 지칭함(함수정의문에 들어감)

ex) i = max(2, 3);라는 함수호출문이 있으면 2하고 3은 인수다.그리고 호출된 함수의 정의문이 int max(int x,int y);로 있으면 여기서 int x와 int y의 자료형 타입이 매개변수다.

인수자리엔 수가 들어갈 수도 있고 변수가 들어갈 수 있다.
매개변수자리엔 무조건 변수만 들어가야된다.

9.함수원형(=펑션 프로토타입, =함수 선언만 일단 해놓기)
컴파일러에게 함수에 대하여 미리 알려주는 것

앞내용 배운대로는 함수를 정의하고 그 밑에 메인함수안에서 호출하는데 이건 int speed(int x);이렇게 함수 제목만 쓰고 ;붙여서 끝낸후 (이건 그냥 함수 선언만 해준것이다.)아래 메인함수문을 벗어난 그 아래에 함수정의문을 써주는것이다.

함수는 선언을 했으면 꼭 정의까지 해줘야한다!

이 함수원형은 우리가 코드를 메인함수부터 첫줄타고 실행이 되는데 너무 많으면(실제로 함수는 100개 200개가 될 수 있다.그러면 이걸 일일히 정의하면 메인함수가 밑에 멀리 가있게됨)안되니깐 앞에서 이런걸 쓴다고만 목차개념으로 컴파일러에게 알려줄려고 선언문만 써주는 것을 뜻한다.

이렇게 위에 함수원형 써주면 메인이 실행되면서 해당 함수를 만나면 메인 밑에 함수정의문으로 이동해 함수를 실행시키는 구조임

10.비쥬얼 스튜디오에 소스파일말고도 동일명의 해더파일(보통은 해더파일 안에 함수원형이 선언되어있음)을 만들어준 후 이 2개를 엮어서 프로그램을 만드는건데 지금은 간단한 프로그램이라 기존것만 사용하는 것
(언리얼로 치면 언리얼에서 제공되는 플러그인을 쓰는것.포폴만들때는 이 플러그인 자체를 만들어야되는거지 가져다쓰면 남이 만든것 쓰는것 밖에 안된다.)

우리가 printf같은것을 사용자 정의한 적도 없는데 쓸 수 있는 이유는 stdio.h에 선언된 함수원형 덕분이다.근데 얘네 정의한건 어딨냐?그건 stdio.cpp라는 소스파일에 있다.해더만 가져와도 컴퓨터가 알아서 소스파일이랑 연동시켜줘서 해당 정의문 찾아서 동작시켜주는것임.우리는 이 해더파일만으로도 가져와서 쓸 수 있는 것이다.

해더는 왜 많은가?
c언어를 쓰면서 사람들이 하나씩 추가해왔기때문에

11.다중소스프로그램
어느 임의의 해더파일에 함수원형들을 넣으면 이걸 .c나 .cpp 등 여러 소스파일에 동시적으로 인클루드해서 병행 사용할 수 있다.
ex) stdio.h

*사용자가 만든 해더파일을 인클루드할때는 <>가 아니라 ""큰따옴표로 코드 친다.
ex) #include "소스.h"

여러파일에 다 갖다 쓸수 있는건 장점

12.라이브러리
c언어에서 라이브러리를 인클루드해주면 그 안에 있는 함수들을 다 쓸 수 있다.(=플러그인)

13.수학 라이브러리 함수 대표적 3가지
ㄱ.절댓값 반환 함수
abs(int x), fabs(double x)
abs(-9) // 9를 반환
fabs(-3.67) // 3.67을 반환

ㄴ.거듭 제곱 반환 함수
pow(double x, double y)
인수x의 y- 거듭제곱인 x^y을 계산한다
pow( 2.0, 3.0 ); // 8.0을 반환

ㄷ.sqrt(double x)
주어진 수의 제곱근을 구한다. 만약에 음수가 입력되면 오류가 발생한다.
sqrt( 9.0 ); // 3.0을 반환

14.난수 라이브러리
난수 = 랜덤의 수
관련함수
ㄱ.rand()
: stdlib.h에 선언되어있으며,int형 난수를 뱉어주는 함수

srand((unsigned)time(NULL));라는 식이 있는데 c언어의 난수 코드다.
랜덤도 컴퓨터에서 어떤 수학 공식을 통해 뱉어낸다.근데 시간(seed=시간값)기준으로 계산한다.즉 식이 고정되어있기에 같은 시간에서는 결과가 똑같다.즉 난수가 아니다.

그래서 time이란 함수를 써준다.

ㄴ.time
: time.h에 선언되어있으며, 현제 시간 기준으로 계산식을 바꿔달라는 함수이다.현제 시간 내에서 seed를 임의로 바꿔준다.

이걸해도 나오는 수들이 별로 차이가 없어 난수라 하기엔 애매한게 있어 c언어 난수를 안쓴다고한다.

profile
Emotional realizer

0개의 댓글