< 31강. 함수를 만들어보자!! >
#include <stdio.h>
// main이라는 함수를 정의했다.
// printf 함수는 stdio.h에 포함되어 있다.
// 함수 안에 있는 것은 "매개변수"
int main() {
printf("Hello");
}
# 아이템 구매해보기.
#include <stdio.h>
int main() {
int itemCnt = 0;
int money = 100;
// 아이템을 산다.
itemCnt++;
money -= 10;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
* 결과 :
아이템을 구매했습니다.
아이템 개수 : 1
잔액 : 90
Program ended with exit code: 0
아이템 가격이 바뀔 때 마다, 새로 일일이 바꿔줘야하는 번거로움이 발생한다! 그래서 함수를 사용해서 변수의 값을 설정할 수 있도록 하는 것이다!
함수를 만들어보자!
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
// 함수 선언
void buyItem(){
itemCnt++;
money -= 10;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
int main() {
buyItem();
// 아이템을 산다.
buyItem();
}
void로 함수를 선언한다! 함수 이름은 기능을 명시해주도록 설정!
매개변수란도 채워보자. 아이템의 가격이 시시각각 바뀔 때를 반영하기 위함이다!
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
// 함수 선언
void buyItem(){
itemCnt++;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
int main() {
cost = 30;
buyItem();
// 아이템을 산다.
cost = 50;
buyItem();
}
지역변수 cost의 값이 다르기에 각기 다르게 적용되어서 결과가 도출된다.
아이템을 구매했습니다.
아이템 개수 : 1
잔액 : 70
아이템을 구매했습니다.
아이템 개수 : 2
잔액 : 20
Program ended with exit code: 0
더 간단하게 만들 수도 있다!
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
// 함수 선언
// 매개변수 설정!
void buyItem(int cost){
itemCnt++;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
int main() {
buyItem(30);
// 아이템을 산다.
buyItem(50);
}
아예 매개변수로 설정을 해준다! 이렇게 되면 함수내에서 값을 넣어주면 더 간단하게 사용할 수 있다. 결과는 위와 똑같다! ( 쉼표로 구분하여 매개변수를 추가할 수 있다)
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
// 함수 선언
// 매개변수 설정!
void buyItem(int cost, int cnt){
itemCnt += cnt;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
int main() {
buyItem(30,5);
// 아이템을 산다.
buyItem(50,7);
}
아이템을 구매했습니다. 아이템 개수 : 5 잔액 : 70 아이템을 구매했습니다. 아이템 개수 : 12 잔액 : 20 Program ended with exit code: 0
매개 변수는 원하는 만큼 설정해서 사용하면 된다.
< 32강. 함수의 반환 >
return에 대해서 알아보자!
#include <stdio.h>
// 2개의 매개변수의 합을 반환
// void는 반환 값이 없다는 것을 반영
// 반환값이 정수라면 int (반환값의 형을 먼저 적어주는 것!)
int plus(int a, int b){
return a + b;
}
int main(){
int sum = plus(3,5);
printf("%d\n",sum);
}
출력이 정수형이라 int로 함수를 선언!
return을 없애면 "값을 반환해야 합니다!" 라는 에러를 출력함!
main에 return이 없다면(명시하지 않았다면) 자동으로 0을 리턴한다. ( 끝에 써줘도 되고, 안써줘도 되고! )
int noMeaning(){
printf("first\n");
return 1;
printf("second\n");
return 2;
}
// 퍼스트가 먼저 출력되고 1을 반환하게됨, 그 밑은 실행되지 않음. 함수에서 return을 만나게 되면 어떤 위치라도 함수가 종료되게 된다!
int main(){
int a ;
a = noMeaning();
printf("반환된 값 : %d\n",a);
}
void noMeaning(){
printf("first\n");
return;
printf("second\n");
return;
}
// 퍼스트가 먼저 출력되고 1을 반환하게됨, 그 밑은 실행되지 않음. 함수에서 return을 만나게 되면 어떤 위치라도 함수가 종료되게 된다!
int main(){
noMeaning();
}
void의 경우는 return;만 적어주면 된다! first만 출력하고 종료되게 된다.
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
// 함수 선언
// 매개변수 설정!
void buyItem(int cost, int cnt){
if (money >= cost){
itemCnt += cnt;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
}
else{
printf("잔액이 부족합니다. \n");
}
}
int main() {
buyItem(3000,5);
// 아이템을 산다.
buyItem(50,7);
}
조건문 넣어주기 !
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
int result;
// 함수 선언
// 매개변수 설정!
int buyItem(int cost, int cnt){
if (money >= cost){
itemCnt += cnt;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
return 0;
}
else{
printf("잔액이 부족합니다. \n");
return -1;
}
}
int main() {
int result;
result = buyItem(3000,5);
// 아이템을 산다.
if (result == -1){
printf("돈이 부족하시군요! \n");
}
buyItem(50,7);
}
잔액이 부족합니다.
돈이 부족하시군요!
아이템을 구매했습니다.
아이템 개수 : 7
잔액 : 50
#include <stdio.h>
// 밖에다가 선언해줘야 함
// = 전역 변수 (내부에 선언된 변수는 지역변수!)
int itemCnt = 0;
int money = 100;
int cost;
// 함수 선언
// 매개변수 설정!
int buyItem(int cost, int cnt){
// 잔액이 부족할 때만 -1을 반환하고 즉시 함수를 종료!
if (money < cost) return -1;
itemCnt += cnt;
money -= cost;
printf("아이템을 구매했습니다.\n");
printf("아이템 개수 : %d\n",itemCnt);
printf("잔액 : %d\n",money);
return 0;
}
int main() {
int result;
result = buyItem(3000,5);
// 아이템을 산다.
if (result == -1){
printf("돈이 부족하시군요! \n");
}
buyItem(50,7);
}
return을 쓰면 굳이 else를 안써도 된다는 장점이 있다!
< 33강. call-by-value와 call-by-reference >
값에 의한 호출, 참조에 의한 호출! 영어가 더 간편한듯!
#include <stdio.h>
void swap(int x,int y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
int a = 2;
int b = 3;
// 값을 서로 바꾸고 싶을 때!
// a의 값을 잠시 다른 곳에다가 저장시킴
swap(a,b);
printf("a = %d, b = %d\n",a,b);
}
tmp에 저장시켜주는 것.
이를 값만 넘겨준다고 해서 "call-by-value"라고 함!
포인터를 사용하면 주솟값을 바꾸는 것이기 때문에,
#include <stdio.h>
void swap(int *x,int *y){
int tmp = *x;
*x = *y;
*y = tmp;
}
int main(){
int a = 2;
int b = 3;
// 값을 서로 바꾸고 싶을 때!
// a의 값을 잠시 다른 곳에다가 저장시킴
swap(&a,&b);
printf("a = %d, b = %d\n",a,b);
}
이렇게 작성해도 두 개의 변수 값이 서로 바뀌게 된다. 이렇게 매개변수들이 변수의 값만 가지고 다룬 것이 아니라 포인터를 이용해서 참조했다 해서
"call-by-reference"라고 한다.
reference 변수는 C++에만 존재하는데 한 번 봐보자!
#include <stdio.h>
void swap(int &x,int &y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
int a = 2;
int b = 3;
// 값을 서로 바꾸고 싶을 때!
// a의 값을 잠시 다른 곳에다가 저장시킴
swap(a,b);
printf("a = %d, b = %d\n",a,b);
}
일반 포인터와 똑같지만 &를 변수명 앞에 붙여서 사용할 수 있다. C++에서만 가능한 방법!
< 34강. 프로토타입 >
prototype : 원형, 시제품
함수의 원형을 미리 적어두는 것. 어떻게 생겼는지 간략하게 적어두는 것을 말한다. 정의는 나중에!
#include <stdio.h>
// 로봇 만들 때
// 걷기
void walk(int dist){
printf("%dcm를 걸었습니다.\n",dist);
}
// 돌기
void rotate(int angle){
printf("%d도 회전했습니다. \n",angle);
}
// 정사각형을 그리며 돌도록 만들기
void drawSquare(){
for (int i = 1; i <= 4; i++){
walk(10);
rotate(90);
}
}
// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.
int main(){
drawSquare();
}
이게 정상.
#include <stdio.h>
// 로봇 만들 때
// 걷기
void walk(int dist);
// 돌기
void rotate(int angle);
// 정사각형을 그리며 돌도록 만들기
void drawSquare();
// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.
int main(){
drawSquare();
}
이렇게 ;로만 작성해서 틀만 잡아준다. 기능은 모르지만 어떻게 생긴건지만 말해주는 것, 나중에 그 기능들을 적어주면 돌아간다.
#include <stdio.h>
// 로봇 만들 때
// 걷기
void walk(int dist);
// 돌기
void rotate(int angle);
// 정사각형을 그리며 돌도록 만들기
void drawSquare();
// 함수 순서 잘 지켜서 써줘야 함! 미리 선언해야한다는 것.
int main(){
drawSquare();
}
void walk(int dist){
printf("%dcm를 걸었습니다.\n",dist);
}
// 돌기
void rotate(int angle){
printf("%d도 회전했습니다. \n",angle);
}
// 정사각형을 그리며 돌도록 만들기
void drawSquare(){
for (int i = 1; i <= 4; i++){
walk(10);
rotate(90);
}
}
더 나아가서 매개변수도 타입만 적어줘도 됨. int int 처럼. 순서도 굳이 신경쓰지 않고 적어도 됨! 문제는 발생하지 않음
< 35강. 재귀 함수 >
재귀 함수 :
학 ( 배울 학 ) 교 ( 학교 교 ) 자기 정의 안에 다시 자기 자신이 들어가는 것.
#include <stdio.h>
void rec(){
printf("***\n");
rec();
}
int main(){
rec();
}
// 프로그램이 계속 무한 반복된다!
#include <stdio.h>
void rec(int n){
printf("n = %d\n",n);
rec(n + 1);
}
int main(){
rec(1);
}
// 프로그램이 계속 무한 반복된다!
// ctrl + c 누르면 강제종료!
계속 1씩 더해지는 과정을 볼 수 있다.
#include <stdio.h>
void rec(int n){
if (n>5) return;
printf("n = %d\n",n);
rec(n + 1);
}
int main(){
rec(1);
}
이러면 n = 5 일 때, return하고 종료하게 됨. 6일 때는 조건문에 걸림.
팩토리얼 : 5! = 5x4x3x2x1 = 120
n! = n* (n-1)! 재귀라는 것을 알 수 있음
재귀 함수로 만들어보기.
#include <stdio.h>
int factorial(int n){
if (n == 1) return 1;
return n * factorial(n-1);
}
int main(){
printf("%d\n",factorial(5));
}