본문 바로가기

프로그래밍/C 프로그래밍

[C언어] 함수

# 함수

  • 특정한 작업을 수행하도록 설계된 독립적인 프로그램
    • 모든 함수는 서로 독립적
  • 이러한 함수들이 정해진 순서에 따라 실행됨으로써 프로그램의 기능 수행
  • C 프로그램은 함수들로 구성
    • 전체 실행 내용을 몇 개의 모듈로 분류
  • 함수들은 서로를 자유로이 호출 가능

# 함수의 장점

  • 프로그램 수정이 용이하다
  • 함수 재사용으로 코드 중복 최소화
  • 프로그램 기능 한 눈에 파악할 수 있다. 👉유지관리가 쉽다.

#함수의 정의

  • 매개변수가 없으면 void형으로 사용
  • 반환 자료형에서 void 반듣시 명시 (생략시 int로 처리)
  • 매개변수 (void)와 ()는 동일한 의미

# 함수의 원형 선언

  • 함수는 변수와 같이 사용되기 전에 미리 선언
  • 원형선언은 일반적으로 main()함수 이전에 한다.
  • 원형선언은 함수정의 부분의 헤더부분에 세미콜론(;)추가

# 함수의 호출

  • 매개변수
    • 실 매개변수 : 함수를 호출하는 함수에 쓰이는 매개변수
    • 형식 매개변수: 호출당하는 함수(피 호출함수)에 쓰이는 매개변수
    • 실 매개변수와 형식 매개변수 사이에는 자료형과 변수의 개수가 일치해야한다.
    • 자료형이 일치하지 않을 경우 형 변환 발생
    • 변수의 개수가 일치하지 않을 경우 컴파일 에러 발생
  • 결과값 반환(return)
    • 함수를 끝내고 제어와 함수 수행결과를 호출함수로 넘긴다.
    • return 0; 정상 종료
//입력되는 소문자 <-> 대문자 변환
 
#include <stdio.h>
#include <ctype.h>

int main(){
	char ch, ch1, ch2;
	printf("문자를 입력하세요.");
	
	ch = getchar();
	if(isupper(ch)){ //대문자 판별 
		printf("%c is a uppercase \n", ch);
		ch1=tolower(ch); //소문자로 변환 
		printf("%c is a lowercase \n", ch1);
	}
	else if(islower(ch)){
		printf("%c is a lowercase \n", ch);
		ch2 = toupper(ch);
		printf("%c is a uppercase \n", ch2); 
	}else
		printf("%c is not alpha character \n", ch1);
	
}

# 함수

  • 표준함수
    • 표준함수의 사용: 함수의 원형이 보관되어 있는 헤더파일을 #include 해야 한다.
    • 표준함수의 실체는 라이브러리 파일에 수
    • 헤더 파일: stdio.h, conio.h, math.h, string.h, stdlib.h, ctype.h 등
      • stdio.h : 입출력, 파일관련 함수
      • conio.h: 콘솔 입출력함수 (putch(), getch(), 등)
      • string.h: 문자열 처리 함수
      • stdlib.h: 수치변환, 난수 관련(rand(), srand()),정렬, 검색함수
  • 사용자 정의 함수
    • 사용자 정의 함수의 원형을 선언해야 한다.
    • 원형 선언: 사용자 정의 함수의 헤더 부분에 세미콜론(;) 추가.
#include <stdio.h>
#include <string.h> // 문자열 처리 함수의 원형

int main(){
	char string[]="abcdefghijklmnopqrstuvwxyz";
	unsigned i, len;
	
	puts(string); //puts 함수는 문자열 출력 및 자동 줄바꿈 
	len=strlen(string); //문자열 길이 구하기 
	
	for(i=0; i<len; i++){
		string[i] = string [i] & 0xDF;  //0xDF는 2진수로 1101 1111
	}
	puts(string);
}

//abcdefghijklmnopqrstuvwxyz
//ABCDEFGHIJKLMNOPQRSTUVWXYZ

  01100001 (소문자a)
& 11011111 (0xDF)
---------------------
  01000001 (대문자 A)

- 소문자에 `& 0xDF` 연산을 하면 대문자로 변환이 된다.

  • string.h
//문자열의 복사 ,연결, 길이 구하는 프로그램
#include <stdio.h>
#include <string.h>

int main(){
	char string[200];
	char s[200];
	printf("문장을 입력한 후, Enter키를 치세요! \n");
	printf("아무것도 입력하지 않으면 프로그램은 종료됩니다. ");
	
	
	do{
		gets(string);
		if(strlen(string) == 0) //문자열의 길이가 0인 경우 loop 종료
			break;
		strcpy(s,string);
		printf("복사된 문자: %s 문자길이:  %d \n\n", s, strlen(s));
		printf("문자열의 길이는 %d입니다. \n\n", strlen(string));
		
		strcat(string, s); // strcat() 문자열 연결 함수
		printf("%s \n", string);   //string에 합쳐져서 출력됨.
		
	}while(1); //조건이 항상 참이므로 loop 반복 
}
  • ctype.h
//입력되는 문자가 영문자인지 판별 
#include <stdio.h>
#include <ctype.h>

int main(){
	char ch;
	printf("문자나 숫자를 입력하세요. \n");
	ch=getchar();
	if(isalpha(ch))
		printf("%c is alpha character. \n", ch);
	else
		printf("%c is not alpha character. \n", ch);
		
	if(isdigit(ch))
		printf("%c is number. \n", ch);
	else
		printf("%c is not number. \n", ch);
}

 

 

 

# 실습 (난수 함수)

// 입력된 수를 seed 값으로 하여 난수 구하는 프로그램 
#include <stdio.h>
#include <stdlib.h>

int main(){
	int i,a;
	printf("input number: ");
	scanf("%d", &a);
	
	srand(a); //난수발생함수의 난수 시작값 seed 설정
	for(i=0; i<=5; i++)
		printf("%d \n", rand()); //0에서 32767 사이의 연속적인 난수 제공 함수 
}

# 피보나치 수열 출력

#include <stdio.h>
unsigned fibonacci(void);

int main(){
	int k;
	printf(" k | fibonacci \n");
	printf("***************\n");
	
	for (k=1; k<=10; k++)
		printf("%2d | %6u\n", k, fibonacci());
		
}
unsigned fibonacci(void){
	static unsigned f=0, pre_f=1; // 정적변수로 함수를 반환해도 이전 피보나치 값이 저장되어 있음. 
	
	unsigned re;
	re=f;
	//printf("현재 re: %6u, f: %6u ", re, f); 
	f+=pre_f;  // 새로운 피보나치값 생성 
	//printf("현재 f: %6u, pre_f:  %6u ", f, pre_f);
	pre_f = re;
	//printf("현재 re: %6u, pre_f: %6u \n", re, pre_f);
	return re; 
		
}



// 출력값
 k | fibonacci
***************
 1 |      0
 2 |      1
 3 |      1
 4 |      2
 5 |      3
 6 |      5
 7 |      8
 8 |     13
 9 |     21
10 |     34

 

# 매개변수 사이의 자료 전달

  • 값에 의한 자료 전달(call by value)
    • 기본적인 자료 전달 방법
    • 실매개변수와 형식매개변수 사이에 값의 전달
    • 호출한 함수의 실행이 끝난 다음 전달받은 값을 되돌려받지 못한다.
  • 참조에 의한 자료 전달(call by reference)
    • 실매개변수와 형식매개변수 값을 서로 교환할 수 있는 자료전달 방법
    • 값을 전달하는 것이 아니라 실 매개변수의 값이 들어있는 주소 값이 전달된다.
반응형

'프로그래밍 > C 프로그래밍' 카테고리의 다른 글

[C언어] 포인터 및 참조  (0) 2024.06.05
[C언어] 배열  (0) 2024.06.04
[C언어] 선택제어문/반복제어문  (0) 2024.06.04
[C언어] 입출력함수와 연산자  (1) 2024.06.04
[C] 선행처리기 매크로  (0) 2024.06.04