카테고리 없음

4. 함수(function)

리버윤 2024. 10. 6. 04:40
728x90

r

 

#include <stdio.h>

int up(int x) {  //함수 정의, 여기서 x는 parameter
	return x+1;
}
int main(void) {
	up(3);  //함수 호출, 여기서 3은 argument
    return 0;
}

 

 

- 함수

 : 특정한 작업을 하도록 맏들어진 독립적인 단위 모듈

    큰 프로그램 하나를 여러개의 함수로 분할하여 구현하는 구조적 프로그래밍(structured programming) 방식의 가본

int main(void)
{
	코드 작성
	return 0;
}

리턴형 함수이름(매개변수 리스트)
{ // 함수의 시작
	코드 작성
	0을 리턴함. 문장 끝에는 “;”을 씀
} // 함수의 끝

  리턴형에 쓰는 void는 생략 불기

 

1. 전광판 함수

#include <stdio.h>
int display()
{
	printf("안녕");
}
//함수 정의

int main()
{
	printf("Hi");
    display();  // 함수 호출
    return 0;
}

// 결과 : Hi안녕

 

 

2. 두배 해서 출력하는 함수

#include <stdio.h>
int double_number(int x)
{
	return x * 2;
}
int main()
{
	int x;
	x = double_number(3);  //리턴값을 보관하고 다음에 사용하는 것을 권장
	printf("%d", x);
	return 0;
}

 

 

- C++에서 문자열 : const char*  vs  string

▷ const char*

#include <iostream>
using namespace std;

const char* vending(int x)
{
	if (x == 1) return "커피";
	else return "유자차";
}
int main()
{
	cout << vending(1);
	return 0;
}

 

▷ string

#include <iostream>
using namespace std;

string vending(int x)
{
	if (x == 1) return "커피";
	else return "유자차";
}
int main()
{
	cout << vending(1);
	return 0;
}

 

 

 

- 함수의 정의와 선언

▷ 오류 고치기 (함수 선언)

#include <stdio.h>

int main(void)
{
	printf("메인함수 : view 호출 전\n");
	view();
	printf("메인함수 : view 호출 후\n");
	return 0;
}
void view(void)
{
	printf("view함수\n");
}

//오류 발생

 

#include <stdio.h>

void view(void);  //함수선언

int main(void)
{
	printf("메인함수 : view 호출 전\n");
	view(); //함수호출
	printf("메인함수 : view 호출 후\n");
	return 0;
}
void view(void)  //함수정의
{
	printf("view함수\n");
}

 

 

- 함수 선언 연습

#include <stdio.h>
void display();
int main()
{
	display();
	return 0;
}
void display()
{
	printf("안녕");
}
#include <stdio.h>
void print_double_number(int x); //함수선언
int main()
{
	print_double_number(3);
	return 0;
}
void print_double_number(int x)
{
	printf("%d", x * 2);
}

 

 

c++스타일로 작성

#include <iostream>
using namespace std;
void print_double_number(int x); //함수선언
int main()
{
    print_double_number(3);
    return 0;
}
void print_double_number(int x)
{
    cout << (x * 2) << endl; // 결과 출력
}
#include <stdio.h>
#include <iostream>
using namespace std;

int double_number(int x); //함수선언
int main()
{
    int x;
    x = double_number(3);
    printf("%d\n", x);
    printf("%d\n", double_number(3));
    return 0;
}
int double_number(int x)
{
    return x * 2;
}
#include <iostream>
using namespace std;

int double_number(int x); // 함수 선언
int main()
{
    int x;
    x = double_number(3);
    cout << x << endl; // 결과 출력
    cout << double_number(3) << endl; // 결과 출력
    return 0;
}
int double_number(int x)
{
    return x * 2;
}
#include <iostream>
using namespace std;

const char* vending(int x)
{
	if (x == 1) return "커피";
	else return "유자차";
}
int main()
{
	cout << vending(1);
	return 0;
}

 

 

- 매개변수

#include <stdio.h>
int add(int x, int y);
int main(void)
{
	int sum;
	sum = add(5, 10);
	//함수를 호출할 때 사용하는 매개변수인 5와 10은 실매개변수, argument
}
int add(int x, int y) //함수 정의시 사용하는 x와 y는 형식매개변수, parameter
{ //x에 5, y에 10이 전달됨
	return(x + y);
}

 

cinclude <stdio.h>
int sum(int a, int b); //함수 선언
int main(void)
{
	int a = 2, b = 5, result;
	double da = 2.5, db = 5.2;
	result = sum(2, 5);
	printf("%d\n", result);
	result = sum(a, b); //2와 5가 넘어감
	printf("%d\n", result);
    
	result = sum(2.5, 5.2);
	printf("%d\n", result);
	result = sum(da, db);
	printf("%d\n", result);
	return 0;
}
int sum(int a, int b)
{
	return(a + b);
}

기본은 call by value임

 

#include <stdio.h>
int sum(int x, int y);
int main(void)
{
	int a = 2, b = 5, c = 0;
	printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
	c = sum(a, b);
	printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c); //2,5,14  변수가 넘어가는게 아닌 값만 넘어가는 것이기 때문에
	return 0;
}
int sum(int a, int b) //각 값인 2와 5가 넘어감
{
	a = a + 2;  //4
	b = b + 5;  //10
	printf("sum()함수 내 a=%d b=%d a+b=%d\n", a, b, a + b);  //4, 10, 14
	return(a + b);
}
#include <stdio.h>
int sum(int* pa, int* pb);
int main(void)
{
	int a = 2, b = 5, c = 0;
	printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
	c = sum(&a, &b);  //앞에 주소연산자 &를 사용하여 주소를 이용해 호출
	printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c);
	//4,10,14
	return 0;
}
int sum(int* pa, int* pb)  //*
{//a의 주소가 포인터 pa로 전달됨
	*pa = *pa + 2;
	*pb = *pb + 5;
	return(*pa + *pb);
}

 

 

- 구조적 프로그래밍

 

 

#include <stdio.h>
void add(int x, int y);  //함수 선언
int main(void)
{
	int num1 = 1, num2 = 2, num3 = 3;
	int num4 = 4, num5 = 5, num6 = 6;
	add(num1, num2);
	add(num3, num4);
	add(num5, num6);  //함수 호출
	return 0;
}
void add(int x, int y)  //함수 정의
{
	printf("두 수 %d과 %d를 더한 결과는 %d입니다.\n", x, y, x + y);
}

 

 

- 모듈화

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h> //INT_MIN, INT_MAX가 정의되어 있음
int main(void)
{
	int i, num, sum = 0, total, max = INT_MIN, min = INT_MAX;
	// max는 int형으로 표현할수 있는 가장 작은값 INT_MIN으로 초기화
	// min은 int형으로 표현할수 있는 가장큰값 INT_MAX로 초기화
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃ 임의의 개수의 수의합, 평균, 최대값, 최소값을 구하는 프로그램┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("계산하려는 수는몇 개입니까 = > ");
	scanf("%d", &total);
	for (i = 1; i <= total; i++) {
		printf("%d번째 수를 입력하세요=",i);
		scanf("%d", &num);
		sum += num;
		max = (num > max) ? num : max;
		min = (num < min) ? num : min;
	}
	printf("합: % d 평균 : % .2f 최댓값 : % d 최솟값 : % d\n", sum, (double)sum / total, max, min);
	return 0;
}

 

 

//소스파일 -> 새항목추가 -> 헤더파일
#include "score.h"
int main(void)
{
	int i, num, sum = 0, total;
	int max = INT_MIN, min = INT_MAX;
	start();//함수 호출
	printf("계산하려는 수는 몇 개입니까=>");
	scanf("%d", &total);
	for (i = 1; i <= total; i++) {
		printf("%d번째 수를 입력하세요=", i);
		scanf("%d", &num);
		sum += num;
		max = max_number(num, max);//함수 호출
		min = min_number(num, min);//함수 호출
	}
	printf("합:%d 평균:%.2f 최대값:%d 최소값:%d\n",
		sum, (double)sum / total, max, min);
	return 0;
}


void start(void)//함수 정의
{
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 합, 평균, 최대값, 최소값 ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
int max_number(int a, int b)//함수 정의
{
return((a > b) ? a : b);
}
int min_number(int a, int b)//함수 정의
{
return((a < b) ? a : b);
}


//score.h 헤더파일 내용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
void start(void);//함수 선언
int max_number(int a, int b); //함수 선언
int min_number(int a, int b); //함수

 

 

 

- 지역(local)변수, 전역(global)변수

 : 변수의 유효범위란 프로그램 내에서 변수가 사용될 수 있는 범위

   변수의 선언 위치에 따라서 결정됨

지역변수 - 해당함수나 블록{}내에서만 사용할 수 있음

전역변수 - 소스 전체에서 사용할 수 있음

 

#include <stdio.h>
int main(void)
{
	int k = 10; //지역 변수
	printf("%d ", k); //10
	{
		int k = 20; //지역 변수
		k += 10;
		printf("%d ", k); //30
	}
	k += 5;
	printf("%d ", k); //15
	return 0;
}
#include <stdio.h>
int add(int x, int y); //함수 선언
int main(void)
{
	int x = 5, y = 10, sum;
	printf("add()함수 호출 전 메인 함수 x=%d, y=%d\n", x, y);
	sum = add(x, y); //함수 호출(call by value), 리턴된 25를 sum에 저장
	printf("sum=%d\n", sum);
	printf("add()함수 호출 후 메인 함수 x=%d, y=%d\n", x, y);
	return 0;
}
int add(int x, int y) //함수 정의 5, 10
{
	printf("add()함수 내부 1 x=%d, y=%d\n", x, y);
	x = x + 5;
	y = y + 5;
	printf("add()함수 내부 2 x=%d, y=%d\n", x, y);
	return (x + y);
}

 

 

- 자료형과 기억 클래스

 

  - 자동(auto) : 가장 많이 사용하는 기억 클래스

auto는 생략 가능해서 평소에 쓰던 int a;와 같은 문장

#include <stdio.h>
int main(void)
{
	auto int a = 1; //여기서 auto는 생략가능
	{
		int a = 2; //auto 변수
		{
			int a = 3; //auto 변수
			printf("%d ", a);
		}
		printf("%d ", a);
	}
	printf("%d ", a);
	return 0;
}

 

 

- 정적(static) 변수

#include <stdio.h>
void sub(void);
int main(void)
{
	sub();
	sub();
	sub();
	return 0;
}
void sub(void)
{
	auto int x = 10; //auto는 생략가능
	static int y = 10; //실행시 이 문장은 실행하지 않음, 컴파일시 이미 결정됨
	printf("x=%d, y=%d\n", x, y);
	x++;
	y++;
}
// c++ 스타일
#include <iostream>
using namespace std;

void sub(); // 함수 선언

int main()
{
    sub();
    sub();
    sub();
    return 0;
}

void sub()
{
    int x = 10; // c++에선 auto는 생략해야함
    static int y = 10; // static 변수, 프로그램 실행 시 단 한 번만 초기화됨
    cout << "x=" << x << ", y=" << y << endl; // 결과 출력
    x++;
    y++;
}

 

 

#include <stdio.h>
int gx = 12, gy = 24; // 전역 변수, 데이터 영역에
int main(void)
{
	int ax = 15, ay = 25; // auto변수, 스택에
	static int sx = 10, sy = 20; // static변수, 데이터 영역에
	printf("ax=%d 주소=%p, ay=%d 주소=%p\n", ax, &ax, ay, &ay);
	printf("gx=%d 주소=%p, gy=%d 주소=%p\n", gx, &gx, gy, &gy);
	printf("sx=%d 주소=%p, sy=%d 주소=%p\n", sx, &sx, sy, &sy);
	return 0;
}

 

 

- 기억 클래스 정리

 

- 구조체(struct)

struct Man{
    char name[7];
    int age;//멤버변수
};
struct Man han; //C
Man han; //C++



class Man{
    private:
    	int age; //멤버변수
    public:
        int getAge() {return age;}//멤버함수
        void setAge(int age) {age=a;}
};
Man han; //C++

 

 

 

#include <stdio.h>
struct Man { //구조체 선언
	int age;
	double weight;
};
int main(void)
{
	int x;
	x = 10;
	struct Man River;
	River.age = 22;
	River.weight = 55.3;
	printf("%f\n", River.weight);
	return 0;
}
#include <stdio.h>
struct Man { //구조체 선언
	int age;
	double weight;
};
int main(void)
{
	Man River;  //c++스타일
	River.age = 22;
	River.weight = 55.3;
	printf("%f\n", River.weight);
	return 0;
}

 

 

728x90