본문 바로가기
Programming/컴퓨터프로그래밍및실습

[컴프실] 제8장: 함수

by Lizardee 2023. 7. 16.
함수가 필요한 이유
  • 동일한 코드가 여러 곳에서 사용된다고 하자.
  • 함수를 작성하면 동일한 코드를 하나로 만들 수 있다.

 

함수의 특징
  • 함수는 특정한 작업을 수행하기 위한 명령어들의 모음이다.
  • 함수는 서로 구별되는 이름을 가지고 있다.
  • 함수는 특정한 작업을 수행한다.
  • 함수는 입력을 받을 수 있고 결과를 반환할 수 있다.

 

함수의 종류
  • 사용자 정의 함수
  • 라이브러리 함수: 기본적으로 제공되는 함수

 

함수의 정의
  • 반환형: 함수가 처리를 종료한 후에 호출되는 곳으로 반환하는 데이터의 종류
  • 함수 이름
//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() 함수는 주어진 명령어를 운영체제에게 전달하여 해당 명령어를 실행하는 기능을 제공합니다.

코드의 동작은 다음과 같습니다:

  1. #include <stdio.h>: 표준 입력/출력 함수를 사용하기 위한 헤더 파일을 포함합니다.
  2. #include <stdlib.h>: system() 함수를 사용하기 위한 헤더 파일을 포함합니다.
  3. int main(void): 프로그램의 시작점인 main 함수를 정의합니다.
  4. system("dir");: system() 함수를 호출하여 "dir"이라는 명령어를 운영체제에게 전달합니다. 이는 Windows 운영체제에서 현재 디렉토리의 파일과 폴더 목록을 보여주는 명령어입니다. 즉, 프로그램 실행 시 현재 디렉토리의 파일과 폴더 목록이 표시됩니다.
  5. printf("아무 키나 치세요\n");: "아무 키나 치세요" 메시지를 출력합니다.
  6. _getch();: _getch() 함수를 사용하여 사용자로부터 어떤 키 입력을 기다립니다. 사용자가 키를 입력하면 프로그램이 진행됩니다.
  7. system("cls");: system() 함수를 호출하여 "cls"라는 명령어를 운영체제에게 전달합니다. 이는 Windows 운영체제에서 현재 터미널 화면을 지우는 명령어입니다. 즉, 현재까지의 출력 결과가 지워지고 깨끗한 터미널 창이 나타납니다.
  8. return 0;: main 함수의 반환값을 0으로 설정하여 프로그램을 성공적으로 종료합니다.

이 프로그램은 실행 시 현재 디렉토리의 파일과 폴더 목록을 보여주고, 사용자가 아무 키나 누르면 터미널 화면이 지워지는 기능을 갖고 있습니다. 사용자에게 명령 프롬프트의 명령어를 실행시키는 간단한 예제로 이해하시면 됩니다.

 

Lab: 시간 맞추기 게임
Lab: 나무 높이 측정
Lab: 삼각함수 그리기
Mini Project: 공학용 계산기 프로그램 작성