함수가 필요한 이유
- 동일한 코드가 여러 곳에서 사용된다고 하자.
- 함수를 작성하면 동일한 코드를 하나로 만들 수 있다.
함수의 특징
- 함수는 특정한 작업을 수행하기 위한 명령어들의 모음이다.
- 함수는 서로 구별되는 이름을 가지고 있다.
- 함수는 특정한 작업을 수행한다.
- 함수는 입력을 받을 수 있고 결과를 반환할 수 있다.
함수의 종류
- 사용자 정의 함수
- 라이브러리 함수: 기본적으로 제공되는 함수
함수의 정의
- 반환형: 함수가 처리를 종료한 후에 호출되는 곳으로 반환하는 데이터의 종류
- 함수 이름
//printStars() 함수를 2번 호출하는 프로그램
#include <stdio.h>
void printStars() { //함수 정의
int i = 0;
for (i = 0; i < 10; i++)
printf("*");
printf("\n");
}
int main(void) {
printStars(); //함수 호출
printf("Hello World!\n");
printStars(); //함수 호출
return 0;
}
인수, 매개 변수
- 인수(argument): 호출 프로그램에 의하여 함수에 실제로 전달되는 값
- 매개 변수(parameter): 인수를 전달받는 변수
- 매개 변수가 없는 경우: printStars() || printStars(void)
반환값
- 반환값: 함수가 호출한 곳으로 반환하는 작업의 결괏값
- return 문장 다음에 수식을 쓰면, 수식의 값이 반환된다.
//max() 함수를 호출하여서 사용자가 입력한 값 중에서 더 큰 값을 찾기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int max(x, y) { //함수 정의: int(반환되는 값이 정수이기 때문)
if (x < y)
return y; //return 으로 반환받음
else
return x;
}
int main(void) {
int x, y;
printf("정수 2개를 입력하시오: ");
scanf("%d%d", &x, &y);
int larger;
larger = max(x, y);
printf("더 큰 값은 %d입니다.\n", larger);
return 0;
}
//생일축하 함수
#include <stdio.h>
void happyBirthday() {
printf("생일축하 합니다!\n");
}
int main(void) {
happyBirthday();
happyBirthday();
printf("사랑하는 친구의 ");
happyBirthday();
return 0;
}
//정수의 합을 계산하는 함수
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int get_integer() { //사용자로부터 정수를 입력받는 함수
int x;
printf("정수를 입력하세요: ");
scanf("%d", &x);
return x;
}
int add(x, y) { //두 수의 합을 구하는 함수
return x + y;
}
int main(void) {
int x = get_integer();
int y = get_integer();
int sum = add(x, y);
printf("두 수의 합은 %d입니다.\n", sum);
return 0;
}
//팩토리얼 계산 함수
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int factorial(n) {
int i = 1;
int result = 1;
for (i = 1; i <= n; i++)
result *= i;
return result;
}
int main(void) {
int n;
printf("알고 싶은 팩토리얼의 값은? ");
scanf("%d", &n);
int answer = factorial(n);
printf("%d!의 값은 %d입니다.\n", n, answer);
return 0;
}
Lab: 온도 변환기
/* 섭씨온도를 화씨온도로, 또 그 반대로 변환하는 프로그램 */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void printMenu() {
printf("===================\n");
printf("'c' 섭씨온도에서 화씨온도로 변환\n");
printf("'f' 화씨온도에서 섭씨온도로 변환\n");
printf("'q' 종료\n");
printf("===================\n");
}
double C2F(cTemp) { //섭씨온도에서 화씨온도로 변환
return 9.0 / 5.0 * cTemp + 32;
}
double F2C(fTemp) { //화씨온도에서 섭씨온도로 변환
return (fTemp - 32.0) * 5.0 / 9.0;
}
int main(void) {
char choice;
double temp;
while (1) {
printMenu();
printf("메뉴에서 선택하세요: ");
choice = getchar(); //getchar(): 문자 입력받는 라이브러리 함수
if (choice == 'q')
break; //q를 입력하면 while문을 빠져나감
else if (choice == 'c') {
printf("섭씨온도: ");
scanf("%lf", &temp);
printf("화씨온도: %f\n\n", C2F(temp));
}
else if (choice == 'f') {
printf("화씨온도: ");
scanf("%lf", &temp);
printf("섭씨온도: %f\n\n", F2C(temp));
}
getchar(); //엔터키 문자를 삭제하기 위해서 필요!
}
return 0;
}
- getchar(): 문자 입력받는 라이브러리 함수
- while(1) 작성법!!
Lab: 조합 계산 함수
//조합 계산 함수
//팩토리얼 계산 함수를 이용한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int factorial(n) { //n!를 구하는 함수
int i = 0;
int result = 1;
for (i = 1; i <= n; i++)
result *= i;
return result; //result를 반환함
}
int combination(n, r) { //조합 계산 함수
int result = factorial(n) / (factorial(n - r) * factorial(r));
return result; //result를 반환함
}
int main(void) {
int n, r;
printf("정수를 입력하시오: ");
scanf("%d", &n);
printf("정수를 입력하시오 : ");
scanf("%d", &r);
printf("C(%d, %d) = %d\n", n, r, combination(n, r));
return 0;
}
Lab: 소수 찾기
//주어진 숫자가 소수(prime)인지 결정하는 프로그램
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int IsItPrime(n) { //소수 판별하는 함수
int i = 2;
for (i = 2; i < n; i++) {
if (n % i == 0)
return 0; //0을 반환: 소수가 아니다!
}
return 1; //1을 반환: 소수이다!
}
int get_integer() { //정수 입력받는 함수 (매개변수 없음)
int n;
printf("정수를 입력하시오: ");
scanf("%d", &n);
return n; //n을 입력받고 n을 반환함
}
int main(void) {
while (1) {
int n;
n = get_integer(); //n = get_integer: n 초기화
int answer = IsItPrime(n);
if (answer == 0)
printf("%d는 소수가 아닙니다.\n\n", n);
else
printf("%d는 소수입니다.\n\n", n);
}
return 0;
}
함수 원형
: 함수의 이름, 매개변수, 반환형을 함수가 정의되기 전에 미리 알려주는 것
1) 함수 원형을 사용하지 않는 예제
- 함수 정의가 함수 호출보다 먼저 오면 함수 원형을 정의하지 않아도 된다.
//함수 원형을 사용하지 않는 예제
#include <stdio.h>
int compute_sum(n) { //합을 계산하는 함수
int i;
int result = 0;
for (i = 1; i <= n; i++)
result += i;
return result;
}
int main(void) {
int sum = compute_sum(100);
printf("sum = %d\n", sum);
return 0;
}
Q. 함수 원형을 사용해야 하는 경우와 그렇지 않은 경우에 대해 자세히 설명해줘.
함수 원형(Function Prototype)은 C 프로그래밍 언어에서 함수를 정의하기 전에 함수의 시그니처(함수의 이름, 매개변수의 개수와 자료형, 반환값의 자료형 등)를 먼저 선언하는 것을 말합니다. 함수 원형을 사용하는 이유는 컴파일러에게 함수의 존재를 알리고, 함수 호출 시 올바른 매개변수를 사용하도록 하기 위함입니다. 함수 원형을 사용하면 코드의 가독성을 높이고 오류를 줄이는데 도움이 됩니다.
1. 함수 원형을 사용해야 하는 경우:
- 함수가 여러 파일에서 호출되는 경우: 함수가 여러 파일에 걸쳐 사용될 때, 각 파일에서 함수의 원형을 미리 선언해야 합니다. 이를 통해 컴파일러가 함수 호출 시 함수의 시그니처를 확인할 수 있습니다.
- 함수가 정의되기 전에 호출되는 경우: C 언어에서는 함수가 정의된 위치보다 먼저 호출될 수 없습니다. 하지만 함수 원형을 사용하면 함수가 실제로 정의되기 전에 함수 호출을 선언하여 이 문제를 해결할 수 있습니다.
// 함수 원형 선언
int add(int a, int b);
int main() {
int result = add(3, 5);
printf("결과: %d\n", result);
return 0;
}
// 함수 정의
int add(int a, int b) {
return a + b;
}
2. 함수 원형을 사용하지 않아도 되는 경우:
- 함수가 한 소스 파일 내에서 정의되고 호출되는 경우: 함수가 한 소스 파일에서만 사용되고 호출될 때는 함수 정의가 함수 호출보다 앞에 위치하면 됩니다.
- 함수가 main 함수 바로 아래에 정의되는 경우: main 함수 아래에 함수를 정의하면 컴파일러가 main 함수 내에서 함수를 호출할 때 이미 함수 정의를 알고 있으므로 함수 원형이 필요하지 않습니다.
#include <stdio.h>
// 함수 정의
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
printf("결과: %d\n", result);
return 0;
}
요약하자면, 함수 원형은 함수의 시그니처를 먼저 선언하여 컴파일러에게 함수의 존재를 알리는 역할을 합니다.
함수가 여러 파일에서 사용되거나 함수가 정의되기 전에 호출되는 경우에는 함수 원형을 사용하여야 하며, 그렇지 않은 경우에는 생략할 수 있습니다.
라이브러리 함수
: 컴파일러에서 제공하는 함수
난수(random number) 함수
- 난수(random number): 규칙성없이 임의로 생성되는 수
- rand(): 난수를 생성하는 함수 --> 0 ~ RAND_MAX까지의 난수 생성
//로또 번호 생성하기
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
for (i = 0; i < 6; i++) {
printf("%d ", rand()); //난수 발생: rand()
}
printf("\n");
return 0;
}
//로또 번호 생성하기
//1~45 사이의 수로 제한
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
for (i = 0; i < 6; i++) {
printf("%d ", 1 + rand() % 45); //항상 똑같은 난수가 발생함
}
printf("\n");
return 0;
}
//로또 번호 생성하기
//1~45까지의 수로 제한, 실행할 때마다 다른 난수 발생
#include <stdio.h>
#include <stdlib.h>
#define MAX 45 //상수 선언
int main(void) {
int i;
srand((unsigned)time(NULL)); //현재의 시각을 시드로 사용함
for (i = 0; i < 6; i++) {
printf("%d ", 1 + rand() % MAX);
}
printf("\n");
return 0;
}
Lab: 동전 던지기 게임
//동전 던지기 게임
//동전을 100번 던져서 앞면이 나오는 횟수와 뒷면이 나오는 횟수 출력
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
int front = 0;
int back = 0;
srand((unsigned)time(NULL)); //현재 시각을 시드로 이용하여 시드 설정
for (i = 0; i < 100; i++) {
int a = 1 + rand() % 2; //난수가 1아니면 2가 나오도록 함
if (a == 1) //동전의 앞면
front += 1;
else //동전의 뒷면
back += 1;
}
printf("동전의 앞면: %d\n", front);
printf("동전의 뒷면: %d\n", back);
return 0;
}
Lab: 자동차 게임
//자동차 게임
//난수를 발생시켜 자동차1과 자동차2의 주행거리에 누적한다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
srand((unsigned)time(NULL)); //시간으로 시드 설정
int car1 = 1 + rand() % 100; //난수 발생 범위 제한
int car2 = 1 + rand() % 100;
printf("CAR #1: ");
for (int a = 0; a < car1; a++)
printf("*");
printf("\n");
printf("CAR #2: ");
for (int b = 0; b < car2; b++)
printf("*");
printf("\n");
return 0;
}
표준 라이브러리 함수(수학 함수)
: 수치 계산을 하는 라이브러리 함수
- 헤더파일: #include <math.h>
- double floor(x) //x보다 크지 않은 가장 큰 정수
- double ceil(x) //x보다 작지 않은 가장 작은 정수
- double fabs(x) //실수 x의 절대값
- double pow(a, b) //a^b
- double squrt(a) //루트a
- double cos(x) //코사인
- double sin(x) //사인
- double tan(x) //탄젠트
기타 함수
/* system("...") 예제 */
//운영체제의 명령 프롬프트에게 명령어를 전달해서 실행시키는 함수
#include <stdio.h>
#include <stdlib.h>
int main(void) {
system("dir");
printf("아무 키나 치세요\n");
_getch();
system("cls");
return 0;
}
위의 코드는 C 프로그램에서 system() 함수를 사용하여 운영체제의 명령 프롬프트에게 명령어를 전달해서 실행시키는 예제입니다. system() 함수는 주어진 명령어를 운영체제에게 전달하여 해당 명령어를 실행하는 기능을 제공합니다.
코드의 동작은 다음과 같습니다:
- #include <stdio.h>: 표준 입력/출력 함수를 사용하기 위한 헤더 파일을 포함합니다.
- #include <stdlib.h>: system() 함수를 사용하기 위한 헤더 파일을 포함합니다.
- int main(void): 프로그램의 시작점인 main 함수를 정의합니다.
- system("dir");: system() 함수를 호출하여 "dir"이라는 명령어를 운영체제에게 전달합니다. 이는 Windows 운영체제에서 현재 디렉토리의 파일과 폴더 목록을 보여주는 명령어입니다. 즉, 프로그램 실행 시 현재 디렉토리의 파일과 폴더 목록이 표시됩니다.
- printf("아무 키나 치세요\n");: "아무 키나 치세요" 메시지를 출력합니다.
- _getch();: _getch() 함수를 사용하여 사용자로부터 어떤 키 입력을 기다립니다. 사용자가 키를 입력하면 프로그램이 진행됩니다.
- system("cls");: system() 함수를 호출하여 "cls"라는 명령어를 운영체제에게 전달합니다. 이는 Windows 운영체제에서 현재 터미널 화면을 지우는 명령어입니다. 즉, 현재까지의 출력 결과가 지워지고 깨끗한 터미널 창이 나타납니다.
- return 0;: main 함수의 반환값을 0으로 설정하여 프로그램을 성공적으로 종료합니다.
이 프로그램은 실행 시 현재 디렉토리의 파일과 폴더 목록을 보여주고, 사용자가 아무 키나 누르면 터미널 화면이 지워지는 기능을 갖고 있습니다. 사용자에게 명령 프롬프트의 명령어를 실행시키는 간단한 예제로 이해하시면 됩니다.
Lab: 시간 맞추기 게임
Lab: 나무 높이 측정
Lab: 삼각함수 그리기
Mini Project: 공학용 계산기 프로그램 작성
'Programming > 컴퓨터프로그래밍및실습' 카테고리의 다른 글
[컴프실] 제10장: 배열 (0) | 2023.07.19 |
---|---|
[컴프실] 제9장: 함수와 변수 (0) | 2023.07.17 |
[컴프실] 제7장: 반복문 (0) | 2023.07.11 |
[컴프실] 중간고사 (0) | 2023.07.10 |
[컴프실] 7일차 실습문제 (0) | 2023.07.08 |