Algorithms/C, C++

Function

esmJK 2019. 10. 13. 02:50

자주 쓰는 기능이 있다면 함수로 만들어 모듈화를 해야 한다. 이 것이 간결하고 유지보수가 쉬운 프로그램을 만들기 위한 가장 첫 번째 단계이다. 함수를 만든다는 것은 여러 명령들의 집합을 만들어 묶는 것과 같다. 수학에서의 함수를 생각하면 쉽다. 아래와 같이 함수에 인풋을 전달하면 정해놓은 지시대로 인풋의 데이터를 처리해 아웃풋을 낸다. 

 

Input -----(함수 안에 프로그래머가 정의한 지시들) ----> Ouput

 

나중에 나아가서 프로그램을 짜는 것에 능숙해진다는 것은, 함수와 클래스를 어떻게 짤 것인지, 즉 아키텍쳐를 빨리 생각해내는 능력이라고 한다. 그 단계까지 최대한 빨리 갈 수 있도록 얼른 공부해야겠다! 

 

주의할 것들 

함수는 단 하나의 기능을 수행하도록 하는 것이 좋다. 

함수를 호출하면 CPU 사용권이 호출당한 함수로 (피호출 함수)

피 호출 함수가 끝나면 CPU사용권이 다시 호출 함수로

 

Visual C 는 One-Pass Compiler 이기 때문에 소스코드를 한 번만 보고 컴파일을 끝낸다. 따라서 A가 B보다 먼저 나와야 B가 A를 호출할 수 있다. 단, 함수 원형을 먼저 선언하면 문제되지 않는다. 

 

C언어는 대소문자에 민감(Case_Sensitive)

함수명이 너무 길면 코드를 짤 때 불편 

 

 

함수의 원형 (생성) 

함수의 원형을 선언하는 것은 '컴파일러에 이런 함수가 있으니 알아둬!' 라고 통보하는 것과 같다.

int square(int m); 
int square_add(int, int);

위와 같이 함수의 원형을 선언한다. 정의하고 호출하는 법은 다음과 같다. 

이제 용어들을 정의하자면, 형식인자는 함수를 정의할 때 인풋으로 어떤 형의 값이 들어가는 지 정한다. 매개변수는 인풋과 같으며, 함수를 호출 할 때 괄호 안에 들어가는 값을 실질인자라 한다. 

 

 

함수의 생성과 리턴값 

원형을 통보하지 않고도 바로 생성해버리는 방법이 있다. 그러나, main 함수 위에 존재해야 main함수가 돌아갈 때 오류가 나지 않게 된다. 예제를 보면 바로 이해가 갈 것이다. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//Adds two numbers after receiving them through the function
int add(int f, int s) {
	int total;
	total = f + s; 
	return total; 
}

int main() {
	int first, second, sum; 
	printf("Enter two input integers");
	scanf("%d%d", &first, &second);
	sum = add(first, second);
	printf("The result is %d\n", sum);

	system("pause");
	return 0; 
}

add 함수 마지막에 보면 return 이라는 단어(예약어이다)가 보일 것이다. 함수에서 어떤 아웃풋을 낼 지 결정하는 함수이다.

 

sum = add(first, second) 은 sum 이라는 변수에다가 함수에 first, second를 넣어서 나온 값을 대입하라는 뜻이다. 따라서  sum 의 형과 add 함수의 리턴값이 같아야 한다. 함수를 처음 선언할 때 다음과 같이 함수 앞에 int 를 붙인 이유는

 

int add( 생략 ) 

 

add 함수의 리턴값을 정하기 위해서이다.

 

주석을 사용한 정석적인 프로그래밍

다음과 같이 프로그램 단위, 함수 단위, 블록단위로 주석을 달아놔야 나중에 편하다. 

 

 

 

함수와 헤더

헤더파일을 이용해 함수묶음 파일을 호출할 수 있다. 이는 이후에 다룰 것이다.

 

다음은 표준편차를 구하는 함수를 이용한 예제이다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

/*표준편차를 구하는 프로그램
표준편차를 구하는 공식은 a, b, c 의 입력이 있을 때 avg 가 a, b, c의 평균이라 하면,
(avg - a)^2 + (avg - b)^2 + (avg - c)^2 이다

*/


//평균값 구하는 함수
double average(double a, double b, double c) {
	int dAverageOutput;
	dAverageOutput = (a + b + c) / 3;

	return (dAverageOutput);
}

//표준편차 구하는 함수
double std_deviation(double a, double b, double c) {
	double dAverageInput, dStdDeviationOutput;

	//평균값 함수를 호출해 저장
	dAverageInput = average(a, b, c);

	//평균편차 공식
	dStdDeviationOutput = (pow((dAverageInput - a), 2) + pow((dAverageInput - b), 2) + pow((dAverageInput - c), 2)) / 3.0;

	return dStdDeviationOutput;
}


int main() {
	double dInputA, dInputB, dInputC;
	printf("Enter three real numbers\n");

	//값 입력 double 형의 형식지정자는 %lf
	scanf("%lf %lf %lf", &dInputA, &dInputB, &dInputC);

	printf("The standard deviation is %lf\n", std_deviation(dInputA, dInputB, dInputC));

	system("pause");
	return 0;
}

 

원래 iOS프로그래밍과 같은 응용개발을 더 많이 하다 보니 C로 코드를 짤 때에는 타입 변환할 때 자꾸 실수해 첫 컴파일에서 쓰레기값이 나온다. 실수가 쉽게 고쳐지지 않는 걸 보니 아직 갈길이 멀다,, 

 

** 여담이지만 헤더 파일과 .c 파일은 *lib, dll파일인 더 큰 단위로 묶인다. 나중에 새로 개발목적으로 산 하드웨어를 사용하고 싶으면 하드웨어 회사에서는 개발자를 위한 인터페이스도 제공하기 때문에 *lib, *dll 파일과 코드 예제를 담당자에게 받으면 된다. 

'Algorithms > C, C++' 카테고리의 다른 글

C++ 자주 쓰이는 기능 요약  (0) 2021.01.06
Overflow / Underflow  (0) 2019.10.09
Type Casting (형변환)  (0) 2019.10.05
#문법 - 전처리기  (0) 2019.08.19
#오류 - 쓰기용으로 열 수 없습니다  (0) 2019.08.19