함수: 기능 또는 모듈
1. 함수선언: 함수의 프로토타입(틀)을 선언한다.
함수타입 함수명(파라메터 리스트);
함수타입:함수의 반환값의 타입. 함수가 int값을 반환=>함수타입은 int.
함수가 문자 하나를 반환=>함수타입은 char.
함수가 float값을 반환=>함수타입은 float.
함수가 아무값도 반환하지 않음=함수타입은 void.
함수명: c의 이름명명규칙을 따른다. 변수이름 만드는 거랑 똑같음.
영어, 숫자, _ 조합. 숫자로 시작안됨. 키워드 쓰면 안됨. 함수의 기능에 맞는 이름으로 만든다.
파라메터: 함수가 호출될때 필요한 값을 받아서 저장할 변수. 없어도 되고, 필요한 타입과 개수만큼 정의
예>
int add(int a, int b); //함수명은 add, 반환값은 int, 파라메터는 int 2개
void test1(char a[]); //함수명은 test1, 반환값은 없다, 파라메터는 char 배열(즉 문자열)
float test2(); //함수명은 test2, 반환값은 float, 파라메터는 없다
2. 함수정의: 함수가 어떻게 동작할지를 구현
예>
void hello(); //함수 선언
void hello(){ //함수정의(구현)
printf("say hello\n");
}
void add(int a, int b); //함수 선언
void add(int a, int b){ //함수정의(구현)
int c = a+b;
printf("%d + %d = %d\n", a, b, c);
}
3. 함수호출
구현한 함수를 사용하고자 할때 불러서 실행함.
호출방법: 이름을 부르고 괄호에 파라메터의 타입과 개수에 맞는 값을 넣어준다.
hello();
add(1,2);
#include <stdio.h> void gugudan(int dan); void main(){ int i; for(i=2;i<10;i++){ gugudan(i); } } void gugudan(int dan){ int i; printf("%d단\n", dan); for(i=1;i<10;i++){ printf("%d * %d = %d\n", dan, i, dan*i); } printf("\n"); } |
#include <stdio.h> //함수 선언 |
#include <stdio.h> //지역변수는 함수 안에서 선언한 변수 int add(int a, int b); int sub(int a, int b); int mul(int a, int b); float dev(int a, int b); int flag;//0 void main(){ char op; int num1, num2, res; float res2; printf("연산자:"); scanf("%c", &op); printf("숫자 2개:"); scanf("%d%d", &num1, &num2); switch(op){ case '+': res = add(num1, num2); break; case '-': res = sub(num1, num2); break; case '*': res = mul(num1, num2); break; case '/': res2 = dev(num1, num2); if(flag==0){ printf("%d %c %d = %f\n", num1, op, num2, res2); } flag = 1; break; default: printf("잘못된 연산자\n"); flag = 1; break; } if(flag==0){ printf("%d %c %d = %d\n", num1, op, num2, res); } } int add(int a, int b){ return a+b; } int sub(int a, int b){ return a-b; } int mul(int a, int b){ return a*b; } float dev(int a, int b){ if(b==0){ flag = 1; printf("0으로 나눌 수 없다\n"); return 0; } return (float)a/b; } |
4. 다양한 형태의 리턴 값
#include <stdio.h> int a(int x, int y); char b(char ch); float c(int x, int y, int z); int big(int x, int y); void main(){ int res; char ch = 'b', ch2; float z; res = a(4,5); printf("res=%d\n", res); ch2 = b(ch); printf("ch=%c, ch2=%c\n", ch, ch2); z = c(3,4,5); printf("z:%f\n", z); res = big(5,7); printf("big:%d\n", res); } int big(int x, int y){ if(x>=y){ return x; }else{ return y; } } int a(int x, int y){ return x+y; } char b(char ch){ char r; if(ch>'z' || ch<'a'){ printf("소문자 알파벳이 아니다.\n"); return '\0'; } r=ch-32;//대문자로 변환 return r; } float c(int x, int y, int z){ return (float)(x+y+z)/3; } |
5. 다양한 형태의 파라메터
#include <stdio.h> int add1(int a, int b); float add2(float a, float b); void add3(char a, char b, char c); void main(){ printf("add1(3,4)=%d\n", add1(3,4)); printf("add2(3.45f, 4.56f)=%f\n", add2(3.45f, 4.56f)); add3('a', 'b', 'c'); } int add1(int a, int b){ return a+b; } float add2(float a, float b){ return a+b; } void add3(char a, char b, char c){ printf("%c%c%c\n", a, b, c); } |
배열 파라메터 |
#include <stdio.h> void printArr(int a[], int size); void inputArr(int a[], int size); void main(){ int a[]={4,2,6,5,8,7,3,1}; printArr(a, 8); inputArr(a, 8); printf("입력 후 배열요소\n"); printArr(a, 8); } void inputArr(int a[], int size){ int i; printf("숫자 %d개를 입력하라\n", size); for(i=0;i<size;i++){ scanf("%d", &a[i]); } } void printArr(int b[], int size){ int i; for(i=0;i<size;i++){ printf("%d\t", b[i]); } printf("\n"); } |
배열의 합, 최대값, 최소값, 정렬 함수 |
#include <stdio.h>
|
문자열 파라메터 |
#include <stdio.h> #include <string.h> void printName(char name[]); void mystrcpy(char des[], char src[]);//문자열 src를 des에 복사 int len(char str[]);//문자열의 길이를 계산하여 반환 void main(){ char x[]="이름";//nanana char y[10]; printName(x); strcpy(y, x); printf("y=%s\n", y); mystrcpy(x, "abcde"); printf("x=%s\n", x); strcpy(y, "abcde");//배열에 문자열을 실행문에서 할당하는 방법 printf("y=%s\n", y); printf("len:%d\n", len(y)); //strcmp(x, y): x, y 같으면 0반환. 다르면 두 문자열 길이의 차 반환 if(strcmp(x, y)==0){ printf("x,y가 동일하다\n"); }else{ printf("x,y가 다르다\n"); } } int len(char str[]){ int i=0; while(str[i++]!='\0'); return i-1; } void printName(char name[]){ printf("name=%s\n", name); } void mystrcpy(char des[], char src[]){ int i=0; while(src[i]!='\0'){ des[i] = src[i]; i++; } des[i]='\0'; } |
main 파라메터 받기 |
#include <stdio.h> void main(int argc, char*argv[]){ int i; for(i=0;i<argc;i++){ printf("%s\n", argv[i]); } } |
6. 재귀함수
#include <stdio.h>
|
피보나치 수열 구현
재귀함수로 구현 |
#include <stdio.h> int fibo_recur(int x); |
루프로 구현 |
#include <stdio.h> void fibo_loop(int num); void main(){ void fibo_loop(int num){ |
배열로 구현 |
#include <stdio.h> void fibo_arr(int a[], int size); void main(){ void fibo_arr(int a[], int size){ |
7. 지역변수와 전역변수
1) 전역변수: 함수 밖에 선언한 변수. 값을 안주면 0.
그 파일 안의 모든 함수가 사용가능
2) 지역변수: 함수 안에 선언한 변수. 값을 안주면 쓰레기 값.
선언한 그 함수안에서 사용가능. 함수가 끝나면 지역변수는 사라진다.
#include <stdio.h> int a;//전역변수. 0을 갖는다. void test(int a);//파라메터도 지역변수 void main(){ int a = 10; test(300); // printf("a=%d, b=%d\n", a, b); } int c=100;//test()에서는 보이지만 main()에서는 안보임 void test(int a){ int b=20; printf("a=%d, b=%d, c=%d\n", a, b, c); } |
댓글