c언어 사용자 정의 함수 이용하여 문제 풀기(생일 축하 메시지 보내기, 정수 입력 함수(get_integer()) 사용하기, 정수의 합 계산(add()) 함수 사용하기, 팩토리얼 계산하기, 온도 변환하기(화씨 -> 섭씨 or 섭씨 -> 화씨), 수학적 조합 계산하기, 소수 찾기, 동전 던지기 게임, 자동차 경주 프로그램 만들기, 불규칙하게 점찍어보기, 나무 높이 측정하기, 삼각함수 그리기, 실수 계산기 프로그램 만들기)
네 안녕하세요, 이번 포스팅에서는 사용자 지정 함수를 이용하여 여러 가지 문제들을 풀어보며 코딩 실력을 늘리는 시간을 가져보려 합니다.
사용자 지정 함수는 코딩을 더 쉽고 간결하게 만들어주는 만큼 정말 중요합니다.
그럼 지금부터 시작해보도록 하겠습니다.
1. 생일 축하 메시지 보내기
제일 먼저 해볼 실습입니다.
생일 축하 메세지를 보내는 함수를 만들어서 출력을 해볼 겁니다.
바로 코드를 작성해보도록 하겠습니다.
#include <stdio.h>
int main()
{
HappyBirthday();
return 0;
}
void HappyBirthday()
{
printf("생일 축하 합니다!\n");
printf("생일 축하 합니다!\n");
printf("사랑하는 00의\n");
printf("생일 축하 합니다~\n");
}
이렇게 작성을 해봤습니다.
이 함수는 굳이 돌려받을 값이 없어도 되기 때문에 void로 선언했습니다.
그럼 결과를 보도록 하겠습니다.
생일 축하 합니다!
생일 축하 합니다!
사랑하는 00의
생일 축하 합니다~
이렇게 결과가 잘 나오는 것을 볼 수가 있습니다.
2. 정수를 입력받는 get_integer() 함수 작성하기
이번에는 정수값을 입력받을 수 있는 사용자 지정 함수를 작성을 해보도록 하겠습니다.
사실 이건 그냥 코드를 작성을 해도 되지만,
실제로 우리가 프로그램을 개발을 할 때는 아무리 간단한 것이라 할 지라도 사용자 지정 함수를 정의하여 씁니다.
그럼 한 번 작성을 해보도록 하겠습니다.
int get_integer()
{
int val;
printf("정수를 입력하세요 : ");
scanf("%d", &val);
return val;
}
이렇게 작성을 할 수가 있습니다.
2 - 1. 정수의 합을 계산하는 add() 함수 작성하기
위의 예제만 써서는 뭔가를 할 수 있는 것이 없습니다.
그래서 정수의 합을 구하는 사용자 정의 함수도 하나 만들어보겠습니다.
이렇게 두 개 이상의 사용자 정의 함수를 넣어서 조합을 할 수도 있습니다.
그럼 바로 보여드리도록 하겠습니다.
#include <stdio.h>
int main()
{
int a = get_integer();
int b = get_integer();
int sum = add(a, b);
printf("두 수의 합은 %d입니다.\n", sum);
return 0;
}
int get_integer()
{
int val;
printf("정수를 입력하세요 : ");
scanf("%d", &val);
return val;
}
int add(int a, int b)
{
return a + b;
}
이렇게 작성을 한 번 해봤습니다.
그럼 결과도 한 번 보여드리도록 하겠습니다.
정수를 입력하세요 : 4
정수를 입력하세요 : 6
두 수의 합은 10입니다.
이렇게 결과도 잘 나오는 것을 볼 수가 있습니다.
3. 팩토리얼 계산하는 함수 만들기
이번에는 팩토리얼을 계산하는 함수를 만들어보도록 하겠습니다.
팩토리얼 계산을 하기 위해서는 반복문을 써야 합니다.
그럼 바로 보여드리도록 하겠습니다.
#include <stdio.h>
int main()
{
int num;
printf("알고 싶은 팩토리얼의 값을 입력하세요 : ");
scanf("%d", &num);
printf("%d!의 값은 %d입니다.\n", num, factorial(num));
return 0;
}
int factorial(int num1)
{
long result = 1;
for(int i = 1; i <= num1; i++)
{
result *= i;
}
return result;
}
이렇게 한 번 작성을 해봤습니다.
그리고 사용자 정의 함수는 printf() 함수 안에서도 쓸 수 있으니 , 알아두면 좋습니다.
그럼 결과를 한 번 보도록 하겠습니다.
알고 싶은 팩토리얼의 값을 입력하세요 : 6
6!의 값은 720입니다.
결과도 잘 나오는 것을 볼 수가 있습니다.
4. 온도 변환하기(섭씨 -> 화씨, 화씨 -> 섭씨)
이번에는 온도를 변환하는 사용자 정의 함수를 한 번 만들어보겠습니다.
선택 옵션에 따라서 각각 섭씨를 화씨로, 화씨를 섭씨로 변환시키는 것을 한 번에 만들어보겠습니다.
그럼 바로 코드를 작성해보도록 하겠습니다.
#include <stdio.h>
void chooseOptions()
{
printf(" 'c' 섭씨 온도에서 화씨 온도로 변환해줍니다.\n");
printf(" 'f' 화씨 온도에서 섭씨 온도로 변환해줍니다.\n");
printf(" 'q' 종료 버튼입니다.\n");
}
double C2F(double c_temp)
{
return 9.0 / 5.0 * c_temp + 32;
}
double F2C(double f_temp)
{
return (f_temp - 32) * 5.0 / 9.0;
}
int main()
{
char choice;
double temp;
while(1)
{
chooseOptions();
printf("옵션을 선택하세요 : ");
choice = getchar();
if(choice == 'q')
{
break;
}
else if(choice == 'c')
{
printf("섭씨 온도 : ");
scanf("%lf", &temp);
printf("화씨 온도 : %lf \n", C2F(temp));
}
else if(choice == 'f')
{
printf("화씨 온도 : ");
scanf("%lf", &temp);
printf("섭씨 온도 : %lf \n", F2C(temp));
}
getchar();
}
return 0;
}
이렇게 작성을 했습니다.
항상 이렇게 코드가 길어질 때는 사용자 정의 함수는 위에다 묶거나 밑에다 묶어서 관리를 해주는 것이 깔끔합니다.
그럼 결과를 한 번 보도록 하겠습니다.
'c' 섭씨 온도에서 화씨 온도로 변환해줍니다.
'f' 화씨 온도에서 섭씨 온도로 변환해줍니다.
'q' 종료 버튼입니다.
옵션을 선택하세요 : c
섭씨 온도 : 25
화씨 온도 : 77.000000
'c' 섭씨 온도에서 화씨 온도로 변환해줍니다.
'f' 화씨 온도에서 섭씨 온도로 변환해줍니다.
'q' 종료 버튼입니다.
옵션을 선택하세요 : f
화씨 온도 : 78
섭씨 온도 : 25.555556
'c' 섭씨 온도에서 화씨 온도로 변환해줍니다.
'f' 화씨 온도에서 섭씨 온도로 변환해줍니다.
'q' 종료 버튼입니다.
옵션을 선택하세요 : q
PS C:\Users\사용자명\AppData\Local\Temp>
이렇게 잘 실행이 되고 종료가 되는 것을 볼 수가 있습니다.
5. 조합 계산하기
이번에는 조합 계산을 한 번 해보도록 하겠습니다.
조합 계산이란 경우의 수 계산이랑 비슷합니다.
예를 들어서 5개의 선택지가 있다면 그중에 몇 개를 선택하여 조합을 하는 것입니다.
그래서 이러한 경우에는 중복 조합 식을 이용하여 계산합니다.
중복 조합 식은 이렇게 씁니다.
C(n, r) = r! / (n - r)! * r!
이제 이걸 이용하여 한 번 코드를 짜보도록 하겠습니다.
#include <stdio.h>
int get_integer()
{
int n;
printf("정수를 입력하세요 : ");
scanf("%d", &n);
return n;
}
long factorial(int n)
{
long result = 1;
for(int i = 1; i <= n; i++)
{
result *= i;
return result;
}
}
long combination(int n, int r)
{
return (factorial(n) / (factorial(r) * factorial(n - r)));
}
int main()
{
int a, b;
a = get_integer();
b = get_integer();
printf("C(%d, %d) = %d\n", a, b, combination(a, b));
return 0;
}
이렇게 짤 수가 있고요, 이제 결과도 한 번 보도록 하겠습니다.
정수를 입력하세요 : 4
정수를 입력하세요 : 7
C(4, 7) = 1
결과도 이렇게 잘 나오는 것을 볼 수가 있습니다.
6. 소수 찾기
이번에는 소수를 찾는 프로그램을 한 번 작성해보도록 하겠습니다.
소수는 우리가 흔히 말하는 소수점이 있는 숫자도 소수이지만,
소수는 약수가 1과 자기 자신 뿐인 수를 말하기도 하죠.
그래서 우리가 이전에 만들었던 함수 get_integer()를 활용하여 만들어보도록 하겠습니다.
그럼 바로 보여드리도록 하겠습니다.
#include <stdio.h>
int main()
{
int n, result;
n = get_integer();
if(prime_num(n) == 1)
{
printf("%d는 소수입니다.\n", n);
}
else
{
printf("%d는 소수가 아닙니다.\n", n);
}
return 0;
}
int get_integer(void)
{
int n;
printf("정수를 입력하세요 : ");
scanf("%d", &n);
return n;
}
int prime_num(int n)
{
for(int i = 2; i < n; i++)
{
if(n % i == 0)
{
return 0;
}
}
return 1;
}
이렇게 한 번 작성을 해봤습니다.
여기서 get_integer() 함수는 정수형 자료형을 받을 것이고,
결괏값을 변수 n으로 돌려받아야 하고,
정수형이기 때문에 정수형 자료형으로 돌려받습니다.
그리고 prime_num() 함수는 소수를 찾기 위해서 for문을 돌리는 함수입니다.
그래서 어떤 정수 n을 자기 자신으로 나눴을 때 나머지가 0이라면,
이는 1과 자기 자신 외에 다른 나누어 떨어지는 수가 있다는 것을 의미합니다.
그래서 거짓(0)을 리턴을 받고,
아니라면 참(1)을 리턴 값으로 받습니다.
그리고 이 역시 정수형 자료형으로 돌려받아야 합니다.
그러면 결과를 한 번 보도록 하겠습니다.
//소수일 경우
정수를 입력하세요 : 5
5는 소수입니다.
// 소수가 아닐 경우
정수를 입력하세요 : 4
4는 소수가 아닙니다.
이렇게 결과가 잘 나오는 것을 볼 수가 있습니다.
7. 동전 던지기 게임 만들기
이번에는 간단한 게임을 한 번 만들어보겠습니다.
지금까지 배운 문법들을 이용하면 동전 던지기 게임 같은 간단한 경우의 수 게임도 만들 수 있습니다.
여기에서는 기본 헤더파일 외에 난수 함수와 시간을 다루는 함수를 써야 하므로 <stdlib.h>와 <time.h>를 넣어줄 겁니다.
그럼 바로 시작해보도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int toss_the_coin();
int main()
{
int ts;
int fw = 0;
int bw = 0;
srand((unsigned)time(NULL));
for(ts = 0; ts < 100; ts++)
{
if(toss_the_coin() == 1)
{
fw++;
}
else
{
bw++;
}
}
printf("동전의 앞면은 %d번 나왔고, 뒷면은 %d번 나왔습니다.\n", fw, bw);
return 0;
}
int toss_the_coin()
{
int i = rand() % 2;
if(i == 0)
{
return 0;
}
else
{
return 1;
}
}
이렇게 작성을 했습니다.
이번에는 함수는 하나만 쓰기 때문에 비교적 쉽습니다.
우리는 이번에 여기서 총 100번을 던질 것입니다.
그 전제를 깔고 가겠습니다.
일단 우리가 필요한 함수는 동전을 던지는 것을 세는 함수이기 때문에 함수명을 toss_the_coin()으로 했습니다.
그리고 여기에서 난수 함수를 써줍니다.
동전의 앞면과 뒷면을 표현하기 위해 씁니다.
그래서 0이 나오면 앞면, 1이 나오면 뒷면, 이런 식으로 사용을 할 것입니다.
그리고 이 함수를 main() 함수에 넣어주면 됩니다.
main() 함수에서 선언한 변수는 각각 ts, fw, bw인데, 순서대로 동전을 던지는 수, 앞면, 뒷면입니다.
그럼 결과를 바로 보도록 하겠습니다.
동전의 앞면은 41번 나왔고, 뒷면은 59번 나왔습니다.
결과가 잘 나오는 것을 확인을 할 수가 있습니다.
8. 자동차 경주 프로그램 만들기
이번에는 자동차 경주 프로그램을 한 번 만들어보도록 하겠습니다.
자동차 경주 프로그램에서도 난수를 이용을 하는데요,
이 난수는 정말 많은 곳에 쓰입니다.
특히 이러한 게임 등에서 많이 쓰이는데,
오픈 필드 내에서 몬스터가 출현하는 것도 사실 규칙이 없죠?
이 역시 난수를 이용해서 몬스터의 스폰 시간을 설정을 하는 겁니다.
그래서 이를 이용하여 자동차가 달린 거리를 난수를 이용하여 표현을 한 번 해보도록 하겠습니다.
여기에서는 난수 함수를 사용하고, 시간 함수를 사용하며, 콘솔 입출력 함수 중 하나인 getch() 함수를 시용해야 하므로 conio.h라 하는 콘솔 입출력 함수를 제공해주는 헤더 파일도 사용을 같이 할 겁니다.
그럼 바로 시작해보도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
void dis_car(int car_num, int dis)
{
printf("CAR_NUMBER%d\n", car_num);
for(int i = 0; i < dis / 10; i++)
{
printf("*");
}
printf("\n");
}
int main()
{
int car1_dist = 0, car2_dist = 0;
srand((unsigned)time(NULL));
for(int i = 0; i < 6; i++)
{
car1_dist += rand() % 100;
car2_dist += rand() % 100;
dis_car(1, car1_dist);
dis_car(2, car2_dist);
printf("------------------------\n");
_getch();
}
return 0;
}
이렇게 한 번 작성을 해봤습니다.
여기에서 자동차의 주행 거리는 "*"로 표시를 했습니다.
그럼 결과를 한 번 보도록 하겠습니다.
CAR_NUMBER1
*******
CAR_NUMBER2
****
------------------------
CAR_NUMBER1
**********
CAR_NUMBER2
********
------------------------
CAR_NUMBER1
*****************
CAR_NUMBER2
************
------------------------
CAR_NUMBER1
********************
CAR_NUMBER2
****************
------------------------
CAR_NUMBER1
***********************
CAR_NUMBER2
**************************
------------------------
CAR_NUMBER1
**************************
CAR_NUMBER2
********************************
------------------------
이렇게 난수가 생성하는 범위의 한도까지 다다르면 종료가 됩니다.
9. 불규칙하게 점 그리기
이번에는 화면에다가 불규칙하게 점을 한 번 그려보도록 하겠습니다.
여기에서는 우리가 그래픽을 이용을 해야 하기 때문에 <windows.h>라는 헤더 파일을 사용하도록 하겠습니다.
그럼 바로 작성을 한 번 해보도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int main()
{
int x, y, r, g, b;
HDC hdc;
hdc = GetWindowDC(GetForegroundWindow());
srand((unsigned)time(NULL));
for(int i = 0; i < 10000; i++)
{
x = rand() % 300;
y = rand() % 300;
r = rand() % 256;
g = rand() % 256;
b = rand() % 256;
SetPixel(hdc, x, y, RGB(r, g, b));
}
_getch();
return 0;
}
이렇게 작성을 했습니다.
일단 우리가 그림을 그릴 공간을 얻기 위해 GetWindowDC(GetForegroundWindow()) 함수를 사용을 하여 만들어주고,
픽셀 범위를 정하기 위해서 SetPixel() 함수를 사용을 했습니다.
그럼 결과 화면을 바로 보여드리도록 하겠습니다.
이렇게 rgb로 이루어진 점들이 불규칙하게 찍혀있는 모습을 볼 수가 있습니다.
9. 나무 높이 측정하기
이번에는 나무의 높이를 측정하는 프로그램을 한 번 만들어보도록 하겠습니다.
너무의 높이를 잴 때는 고려해야 하는 요소들이 있습니다.
일단 사람이 나무를 올려다보는 것이고, 사람이 서 있는 곳과 나무 사이의 거리, 그리고 사람이 나무를 올려다보는 각도를 따라 선을 그으면 하나의 직각 삼각형이 이루어지기 때문에 삼각함수를 써야 합니다.
그리고 사람의 키는 나무의 높이에 포함이 되어있기 때문에 잘 이용을 해야 합니다.
그래서 나무의 높이 h를 구하는 식은 이렇게 나옵니다.
h = b + tan(a) * c(h = 나무의 높이, b = 바닥에서 사람의 눈까지의 거리, a = 사람이 나무를 올려다보는 각도, c = 사람과 나무 사이의 거리
이제 이를 가지고서 코드를 짜 보도록 하겠습니다.
#include <stdio.h>
#include <math.h>
int main()
{
double h, dis, t_h, deg, r; // h = 사람의 키, dis = 나무와의 거리, t_h = 나무의 높이, deg = 각도, r = 라디안
printf("나무와의 거리를 입력하세요(m) : ");
scanf("%lf", &dis);
printf("측정자의 키를 입력하세요(m) : ");
scanf("%lf", &h);
printf("나무를 올려다 보는 각도를 입력하세요 : ");
scanf("%lf", °);
r = deg * (3.141592 / 180.0);
t_h = (tan(r) * dis) + h;
printf("나무의 높이는 %lfm 입니다.\n", t_h);
return 0;
}
이렇게 작성을 해봤습니다.
여기에서의 r은 삼각함수를 쓰기 때문에 반지름이 아닌 라디안으로 썼습니다.
그러면 결과를 한 번 보도록 하겠습니다.
나무와의 거리를 입력하세요(m) : 3.5
측정자의 키를 입력하세요(m) : 1.78
나무를 올려다 보는 각도를 입력하세요 : 41
나무의 높이는 4.822503m 입니다.
결과도 문제없이 잘 나옵니다.
10. 삼각함수 그리기
이번에도 그래픽을 이용하여 삼각함수를 그려보도록 하겠습니다.
이번에는 수학적 함수를 그림으로 표현하기 때문에 헤더 파일은 각각 <math.h>, <windows.h>를 추가하여 코드를 작성하겠습니다.
그럼 지금부터 코드를 작성해보도록 하겠습니다.
#include <stdio.h>
#include <math.h>
#include <windows.h>
#define PI 3.141592
double radians(double deg)
{
return PI * deg / 180.0;
}
int main()
{
int deg, x, y;
double r, result;
HWND hwnd = GetForegroundWindow();
HDC hdc = GetWindowDC(hwnd);
MoveToEx(hdc, 30, 200, 0);
LineTo(hdc, 500, 200);
MoveToEx(hdc, 30, 200, 0);
LineTo(hdc, 30, 0);
for (deg = 0; deg <= 360; deg++)
{
result = sin(radians((double)deg));
x = deg + 30;
y = 200 - (int)(100.0 * result);
SetPixel(hdc, x, y, RGB(255, 0, 0));
}
return 0;
}
이렇게 작성을 했습니다.
이건 사인 함수를 그린 건데, 코사인과 탄젠트도 그릴 수 있습니다.
코사인과 탄젠트를 그리고 싶으시면 sin이라 쓰인 부분에 cos를 쓰면 코사인 함수가, tan을 쓰면 탄젠트 함수가 그려집니다.
그럼 결과 화면을 보여드리도록 하겠습니다.
제가 그래프를 그리는 선을 빨간색으로 설정을 했기 때문에 빨간색으로 그려진 것을 볼 수가 있습니다.
11. 실수 계산기 프로그램 만들기
이번에는 실수를 계산하는 계산기를 만들어보도록 하겠습니다.
여기에서 필요한 함수는 정수를 받을 때 쓸 get_integer() 함수,
실수를 받을 때 쓸 get_double() 함수,
문자를 받을 때 쓸 get_char() 함수가 필요합니다.
그럼 바로 작성을 해보 도로고 하겠습니다.
#include <stdio.h>
int get_integer();
double get_double();
char get_char();
int main()
{
double a, b;
a = get_double();
b = get_double();
printf("실수의 합은 %.3lf 입니다.\n", a + b);
return 0;
}
int get_integer()
{
int n;
printf("정수를 입력하세요 : ");
scanf("%d", &n);
return n;
}
double get_double()
{
double n;
printf("실수를 입력하세요 : ");
scanf("%lf", &n);
return n;
}
char get_char()
{
char n;
printf("문자를 입력하세요 : ");
scanf("%c", &n);
return n;
}
이렇게 한 번 작성을 간단하게 해 봤습니다.
if문 등을 쓰면 더 복잡하고 정교히 만들 수 있지만,
그 보다 사용자 지정 함수를 적절히 쓰는 방법을 연습을 해야 하기 때문에 간단하게 썼습니다.
그리고 이들은 전역 함수 선언을 해주지 않으면 컴파일러가 인식을 못하기 때문에 꼭 선언을 해주셔야 합니다.
그럼 결과 화면을 바로 보도록 하겠습니다.
실수를 입력하세요 : 4
실수를 입력하세요 : 9
실수의 합은 13.000 입니다.
결과 화면도 잘 나오는 것을 볼 수 있습니다.
여기까지 사용자 정의 함수에 대하여 알아보는 시간을 가졌는데요,
다음 포스팅부터는 함수와 변수에 대하여 좀 더 깊숙이 파헤쳐보는 시간을 가져보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~
'c언어' 카테고리의 다른 글
c언어 전역 변수 알아보기 (0) | 2022.12.06 |
---|---|
c언어 지역 변수 알아보기 (0) | 2022.12.06 |
c언어 라이브러리 함수(내장 함수) 알아보기 2(수학 함수, 기타 함수) (0) | 2022.12.06 |
c언어 라이브러리 함수(내장 함수) 알아보기 1(난수 함수) (0) | 2022.12.06 |
c언어 함수 원형 이용해 보기 (0) | 2022.12.04 |
댓글