728x90
함수(function)
: 하나의 특별한 작업을 수행하기 위해 독립적으로 작성한 프로그램
- 프로그램을 구성하는 기본적인 구성요소
함수의 특징
- 함수는 서로 구별되는 이름을 가지고 있다.
- 함수는 특정한 작업을 수행한다.
- 함수는 입력을 받을 수 있고 수행 결과를 반환할 수 있다.
함수의 장점
- 함수를 사용하면 코드가 중복되는 것을 막을 수 있다.
- 한번 작성된 함수는 여러 번 재사용할 수 있다.
- 체계적으로 모듈화가 가능하며 유지보수가 용이하다.
라이브러리 함수
- 표준 함수 라이브러리 함수는 미리 정의가 된 함수이다.
- 함수가 정의되어 있는 파일들을 코드 시작전에 미리 포함시켜주어야한다.
- 보통 #include 를 이용해 헤더파일을 포함하는 형식으로 사용한다.
사용자 정의 함수
returnType functionName ([parameter, ...]) {
}
- return Type
- 함수를 호출해서 처리 후 그 결과를 외부에 넘겨줄 수 있다.
- 외부로 제공되는 이 값을 반환 값이라고 하고 이의 데이터 타입을 return Type이라 한다.
- 반환되는 값이 없으면 void를 사용한다.
- functionName
- 프로그래머가 지정한 함수의 이름을 말한다.
- 보통 기능을 이름으로 표현한다.
- parameter
- 함수를 호출하여 작업을 수행할 때 제공되는 값을 이야기 한다.
- 반드시 자료형과 변수명을 각각 기술해야한다.
main() 함수의 파라미터 이용하기
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Main_Function\n");
printf("매개변수의 개수 : argc = %d\n", argc);
for (int i = 0; i < argc; i++)
{
printf("argv[%d] = %s\n", i, argv[i]);
}
}
🌟 main()도 사용자 정의 함수이다!
다만 프로그램의 시작이 main()에서 시작되도록 설정된 것 뿐!
💡
- argc : 파라미터의 개수
- argv : 실질적인 파라미터 배열
└ (argv[0]은 무조건 실행 프로그램의 경로명이 들어간다.)
💡 *argv[] 형태로 사용하는 이유
: 2차원 배열을 사용해서 파라미터로 받은 문자열에서 문자 각각을 이용할 수 있다.
EX.
argv[2] = "Hello World!";
argv[2][0] = 'H';
argv[2][1] = 'e';
함수 정의
함수헤더(function header) 와 함수몸체(function body 로 구성
[반환형] [함수명](매개변수) //함수헤더(function header)부분
{
printf("Hello World!");
} // {} 중괄호로 묶인 부분 : 함수몸체(function body)부분
함수 선언
(함수 원형(function prototyping))
- 함수 정의 이전에 함수를 호출해야할 때 이용
- 컴파일러에게 함수에 대하여 미리 알리는 것
- 함수 선언 시에는 매개변수의 자료형만 적고 매개변수의 명은 적지않아도 된다.
- 함수를 많이 선언해야할 경우 헤더파일에 정의하여 헤더파일을 포함하여 사용하는 경우가 많다.
함수 호출
- 반환값이 없는 경우 : 함수명(입력데이터)
- 반환값이 있는 경우 : 변수명 = 함수명(입력데이터)
- 입력데이터(매개변수)는 함수 선언시 변수의 개수와 동일해야하며 없을 수도 있다.
- 함수 정의의 목적이다.
매개변수와 반환값
- 매개변수(파라미터(parameter)) : 함수에서 작업을 처리하는데 필요한 데이터
- 매개변수의 데이터 타입을 각각 설정해야한다.
- 반환값이 있는 경우 함수명 앞에 데이터 타입을 지정한다.
- 반환값은 하나만 지정할 수 있으며 return [값] 형식으로 선언
- return 실행 수 함수호출 종료
💡 매개변수(parameter) = 인수(argument)
🌟함수의 반환값이 없는 경우 void 형을 사용한다.
- void 의 의미는 '정해지지 않은' 자료형이다!
└ 자료형이 없는 걸 의미하진 않는다.
- 소수 판별 프로그램
#include <stdio.h>
int is_prime(int n)
{
int divisors = 0, x;
for (x = 1; x <= n; x++)
{
if (n % x == 0)
divisors++;
}
return (divisors == 2);
}
int main()
{
int n, result;
printf("정수를 입력하시오: ");
scanf("%d", &n);
result = is_prime(n);
if (result == 1)
printf("%d은 소수입니다.\n", n);
else
printf("%d은 소수가 아닙니다.\n", n);
return 0;
}
- 에라토스테네스의 체를 이용한 소수 개수 판별 프로그램
#include <stdio.h>
int Sieve_of_Eratosthenes(int n)
{
for (int i = n - 1; i >= 2; i--){
if (n % i == 0)
return 0;
}
return 1;
}
int main()
{
int count_prime = 0;
for(int i = 2; i <= 12345; i++){
Sieve_of_Eratosthenes(i) ? count_prime++ : count_prime;
}
printf("2 ~ 12345 사이에 소수는 %d개 있습니다.\n", count_prime);
return 0;
}
💡 에라토스테네스의 체 : 에라토스테네스가 고안한 소수 판별법
- 팩토리얼 구현 프로그램
#include <stdio.h>
//최대 범위 표현을 위한 데이터 타입 unsigned long long
unsigned long long Pactorial(int n)
{
if (n == 0) return 1;
return n * Pactorial(n - 1);
}
int main()
{
printf("25! = %lld\n", Pactorial(25));
return 0;
}
- 로또 번호 생성 프로그램
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX 45
int main(void)
{
int i;
srand((unsigned)time(NULL));
for (i = 0; i < 6; i++)
printf("%d ", 1 + rand() % MAX);
//rand 함수 범위가 0부터 시작이므로 +1을 해주어 0 반환 방지
return 0;
}
💡rand() 함수
- <stdlib.h> 헤더 내에 포함
- 0부터 RAND_MAX(32767) 사이 랜덤 숫자 반환
- 컴파일 시, 값이 고정되므로 여러번 실행해도 동일한 값 반환
💡 scrand() 함수
- <stdlib.h> 헤더 내에 포함
- 매개변수로 seed 값을 전달 받아, 랜덤 숫자 반환
- time() 함수를 사용하여 프로그램 실행시마다 랜덤 숫자 반환 가능
💡 time() 함수
- <time.h> 헤더 내에 포함
- UCT 기준 1970년 1월 1일 0시 0분 0초 부터 경과된 시간을 초(sec)로 반환
728x90
// time()함수 내부 구현 구조체
struct tm {
int tm_sec; // 초
int tm_min; // 분
int tm_hour; // 시
int tm_mday; // 일
int tm_mon; // 월
int tm_year; // 년(1900년부터)
int tm_wday; // 요일
int tm_yday; // 통산 일수 [0~365]
};
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
728x90
'🧑💻 Language > C·C++' 카테고리의 다른 글
[C 이론] 10. 배열 (0) | 2021.05.26 |
---|---|
[C 이론] 9. 함수와 변수 (0) | 2021.05.13 |
[C 이론] 7. 반복문 (0) | 2021.05.03 |
[C 이론] 6. 조건문 (0) | 2021.05.03 |
[C 이론] 5. 수식과 연산자 (0) | 2021.05.03 |