C/C++ 기초 강의 요약 (섹션4)
#include <stdio.h>
int itemCnt=0;
int money=100;
void buyItem(int cost, int cnt){
itemCnt+=cnt;
money -=cost;
printf("아이템을 구매했습니다\n");
printf(" 아이템 개수 : %d\n", itemCnt);
printf(" 잔액 : %d\n", money);
}
int main(){
buyItem(20, 5);
buyItem(30, 7);
}
함수를 정의하고 사용해보았다.
buyItem이라는 함수를 선언해 인자로 cost와 cnt값을 받는다. cost는 가격, cnt는 구매한 개수. 즉 buyItem(cost, cnt);를 실행하면 money값에는 cost가 빠진 값이 저장되고, itemCnt에는 cnt만큼 더해진 값이 저장된다.
#include <stdio.h>
int plus(int a, int b){
return a+b;
}
int main(){
int sum=plus(3,5);
printf("%d\n", sum);
}
return 돌려주다. 반환!
지금까지 main함수를 선언하면서 main이라는 글자 앞에 int를 붙였었다. 이는 main()함수는 int형의 값을 반환한다는 것이다.
위의 코드에서도 마찬가지다. plus()라는 함수를 정의했는데 그 함수의 반환값을 int형으로 했고 함수가 끝날때 return을 사용하여 값을 반환하게 된다.
return을 만나게 되면 그 즉시 그 함수를 빠져나오게 된다. 즉 함수 내에 return이 두 번 있다면 첫번째 return 문을 실행하고 그 뒤의 코드는 실행이 되지않는다.
#include <stdio.h>
void swap(int x, int y){
int tmp;
tmp=x;
x=y;y=tmp;
}
int main(){
int a,b;
scanf("%d %d", &a, &b);
swap(a,b);
}
기대했던 결과는 a와 b의 결과가 서로 바뀌는것이다.하지만 결과는 그렇지 않을 것이다
#include <stdio.h>
void swap(int *x, int *y){
int tmp;
tmp=*x;
*x=*y;*y=tmp;
}
int main(){
int a,b;
scanf("%d %d", &a, &b);
swap(&a, &b);
printf("%d %d\n", a, b);
}
이전에 배운 포인터 개념을 사용해 위에서 원했던 기능을 구현한것이다.
//prototype : 원형, 시제품
#include <stdio.h>
void walk(int distance);
void rotate(int angle);
void drawSquare();
}
int main(){
drawSquare();
}
//걷기
void walk(int distance){
printf("%dkm를 걸었습니다\n" , distance);
}
//돌기
void rotate(int angle){
printf("%d도 회전했습니다\n", angle);
}
void drawSquare(){
for(int i=0;i<4;i++){
walk(10);
rotate(90);
}
prototype 원형, 시제품
prototype은 뜻 그대로 시제품, 먼저 보여준다..?의 느낌이다. 위의 코드를 보자. main함수 전에 함수의 본체는 없이 앞대가리만 써져있는게 보일 것이다. 그리고 main함수가 다 끝나고 나서 다시 한 번 앞서 정의되어있던 함수를 본체도 포함해 작성된 것을 볼 수 있다. 컴파일러는 위에서부터 명령문을 실행하다보니 만약 main앞에 저렇게 프로토타입을 설정해놓지 않고 main 뒤에서 정의를 한다면, main함수에서 실행된 함수는 정의되지 않은 함수가 되기 때문에 오류가 발생한다. 이를 막기 위해 prototype을 작성한다. 이는 필수적인 것은 아니지만 코드의 간결함과 가독성을 올리는데는 확실한 기여를 한다는 것을 알 수 있다.
#include <stdio.h>
void rec(int n){
printf("n=%d\n",n);
rec(n+1);
}
int main(){
rec(1);
}
재귀함수 함수가 자신을 호출하는 함수 recursion
위의 코드를 보면, main안에서 rec(1)을 호출했을때 n=1을 출력하고 호출된 rec함수가 끝나기 전에 rec(2)로 다시 호출이 된다. 이를 반복한다.
중간에 조건문을 넣어 무한 재귀를 제어할 수 있다.
//팩토리얼
//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(6));
}
팩토리얼 값을 출력하는 코드를 재귀함수를 사용해 구현한것이다. factorial(3)을 호출하면 return 3*factorial(2)을 하게 되는데
여기서 다시 factorial(2)를 호출하게 된다. 이렇게 차차 수가 작아지다가 factorial(1)을 호출하게 됐을때 if(n==1) 조건문에 성립하게 되어 1!=1을 반환하게 된다.
#include <stdio.h>
void doubleArr(int arr[4]){
for(int i=0;i<4;i++){
arr[i]*=2;
}
}
int main(){
int arr[4]={1,2,3,4};
doubleArr(arr);
for(int i=0;i<4;i++){
printf("%d\n", arr[i]);
}
}
위의 함수를 실행했을때 2 4 6 8이 출력되는걸 보면 doublaArr에 인자로 주어진 arr[4]에 arr을 대입시키면 call-by-reference가 된다는것을 알 수 잇다 .여기서 더 정확히 하고자 한다면 int doubleArr(int *arr)로 선언을 하면 arr은 &arr[0] 이기 때문에 포인터와 주소 개념이 정확히 성립한다.
<종합문제>
//정수 하나를 입력 받아서 그 수가 짝수이면 0 ,홀수 이면 1을 반환하는 함수를 작성해보세요.
#include <stdio.h>
int q1(int n){
if(n%2==0) return 0;
return 1;
}
int main(void){
int a;
scanf("%d", &a);
printf("입력한 숫자가 짝수라면 0 ,홀수라면 1 >>>%d\n", q1(a));
}
Q1.정수 하나를 입력 받아서 그 수가 짝수이면 0 ,홀수 이면 1을 반환하는 함수를 작성해보세요.
슬롯 0의 아이템을 1번 썼습니다.
슬롯 1의 아이템을 1번 썼습니다.
슬롯 2의 아이템을 1번 썼습니다.
슬롯 3의 아이템을 0번 썼습니다.
슬롯 4의 아이템을 2번 썼습니다.
Q2.주어진 프로그램의 출력값을 적어보시오.
5
4
3
2
1
1
2
3
4
5
Q3.주어진 프로그램의 출력값을 적어보시오.
return을 하면 방금 그 함수가 호출된 곳으로 돌아간다. 문제의 코드에서는 rec(0)이 호출되어 rec함수로 들어갔을때 조건문에 걸려 return을 하게 된다. 그럼 방금 rec(0)을 호출한 rec(n-1)으로 돌아와 그 밑의 printf("%d\n",n);을 실행하고 rec(1)이 끝나며 rec(2)함수 내의 rec(n-1)함수로 돌아가게 된다. 이렇게 반복을 하다가 n=5까지 가게 되면 위의 실행값이 나온다.
#include <stdio.h>
#include <string.h>
void print_noSpace(char *str){
for(int i=0;i<strlen(str);i++){
if(str[i]==' ') continue;
printf("%c", str[i]);
}
}
int main(void){
print_noSpace("Hello, World!\n");
print_noSpace("My name is Doodle\n");
}
Q4.주어진 문자열을 공백없이 출력하는 함수를 만드시오.
댓글
이 글 공유하기
다른 글
-
지옥방 포너블 1주차 과제
지옥방 포너블 1주차 과제
2020.03.30 -
C/C++ 기초 강의 요약 (섹션7)
C/C++ 기초 강의 요약 (섹션7)
2020.03.27 -
C/C++ 기초 강의 요약 (섹션3)
C/C++ 기초 강의 요약 (섹션3)
2020.03.27 -
C/C++ 기초 강의 요약 (섹션2)
C/C++ 기초 강의 요약 (섹션2)
2020.03.27