개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay.

Slides:



Advertisements
Similar presentations
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Advertisements

최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제3장 게임기본모듈 Page 153 ~ 182.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
누구나 즐기는 C언어 콘서트 제7장 함수.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express.
쉽게 풀어쓴 C언어 Express 제8장 함수 C Express Slide 1 (of 26)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
10장 함수.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
C++ Espresso 제12장 템플릿.
6주차: Functions in C and Others
C언어 콘서트 제2장 기초 사항.
2007 1학기 11 프로젝트 기초 실습.
Tail-recursive Function, High-order Function
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express Slide 1 (of 33)
11장. 1차원 배열.
13. 연산자 오버로딩.
C 2장. C 프로그램 시작하기 #include <stdio.h> int main(void) { int num;
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
Method & library.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
어서와 C언어는 처음이지 제14장.
어서와 C언어는 처음이지 제15장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
Chapter 08. 함수.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
제 6 장 함수(functions).
제 15 강 문자와 코드 shcho.pe.kr.
에어 PHP 입문.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
함수, 모듈.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
수업 내용 수업 목표 강의 내용 강의 계획서 교과서 및 참고도서 평가 방법 수강생의 학습 방법 제안 강의자료 사이트
13. 포인터와 배열! 함께 이해하기.
함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수
Presentation transcript:

개정판 누구나 즐기는 C언어 콘서트 제8장 함수 출처: pixabay

규모가 큰 프로그램은 전체 문제를 보다 단순하고 이해하기 쉬운 함수로 나누어서 프로그램을 작성하여야 한다. 이번 장에서 학습할 내용 규모가 큰 프로그램은 전체 문제를 보다 단순하고 이해하기 쉬운 함수로 나누어서 프로그램을 작성하여야 한다. 모듈화 함수의 개념, 역할 함수 작성 방법 반환값 인수 전달 함수를 사용하는 이유

이번 장에서 만들 프로그램

되풀이 되는 작업

함수의 필요성 #include <stdio.h> int main(void) { printf("****************************\n"); printf("한국대학교 컴퓨터 공학과 \n"); printf("홍길동 \n"); return 0; }

함수의 필요성 #include <stdio.h> void print_name() { printf("****************************\n"); printf("한국대학교 컴퓨터 공학과 \n"); printf("홍길동 \n"); } int main(void) print_name(); return 0; 함수를 정의하였다. 함수는 한번 정의되면 여러 번 호출하여서 실행이 가능하다.

함수의 장점 함수를 사용하면 코드가 중복되는 것을 막을 수 있다. 한번 작성된 함수는 여러 번 재사용할 수 있다. 함수를 사용하면 전체 프로그램을 모듈로 나눌 수 있어서 개발 과정 이 쉬워지고 보다 체계적이 되면서 유지보수도 쉬워진다.

함수의 개념 함수(function): 특정 작업을 수행하여 그 결과를 반환하는 문장들 의 집합

함수는 프로그램을 이루는 빌딩블록

2가지 과정 함수를 작성한다. 함수를 호출한다.

함수의 정의 반환형(return type) 함수 헤더(function header) 함수 몸체(function body)

반환형 함수 이름 앞에 반환하는 데이터의 유형을 표시한다. char, int, long, double … 등이 가능하다. 반환형이 없으면 void로 표시 int add(int x, int y) { …. } void print_info() { …. }

함수 이름 일반적으로 동사+명사 (예) compute_average(), get_integer() set_speed() int add(int x, int y) { int result; result = x + y; return result; }

매개 변수 매개 변수(parameter): 함수가 외부로부터 전달받는 데이터를 가지 고 있는 변수 int add(int x, int y) { int result; result = x + y; return result; }

지역 변수 지역 변수(local variable): 함수 안에서 정의되는 변수 int add(int x, int y) { int result; result = x + y; return result; }

함수 정의 예제 함수를 프로그램을 이루는 부품이라고 가정하자. 입력을 받아서 작업한 후에 결과를 생성한다.

예제 #1 사용자로부터 정수 반환 반환값: int 함수 이름: get_integer 매개 변수: 없음 { int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; }

예제 #2 두개의 정수중에서 큰 수를 계산하는 함수 반환값: int 함수 이름: get_max 매개 변수: int x, int y int get_max(int x, int y) {   if( x > y ) return(x);   else return(y); }

예제 #3 정수의 거듭 제곱값(xy)을 계산하는 함수 반환값: int 함수 이름: power 매개 변수: int x, int y int power(int x, int y) {         int i;         long result = 1;    for(i = 0; i < y; i++)                 result *= x;                   return result; }

중간 점검 1. 함수 이름 앞에 void가 있다면 무슨 의미인가? 2. 함수가 작업을 수행하는데 필요한 데이터로서 외부에서 주어지는 것을 무엇이라고 하는가? 3. 함수 몸체는 어떤 기호로 둘러 싸여 있는가? 4. 함수의 몸체 안에서 정의되는 변수를 무엇이라고 하는가?

함수 호출과 반환 함수 호출(function call): 함수를 사용하기 위하여 함수의 이름을 적어주는 것 함수안의 문장들이 순차적으로 실행된다. 문장의 실행이 끝나면 호출한 위치로 되돌아 간다. 결과값을 전달할 수 있다.

인수와 매개 변수 인수(argument): 실인수, 실매개 변수라고도 한다. 매개 변수(parameter): 형식 인수, 형식 매개 변수라고도 한다. int main(void) { … sum = add(2, 3); } 인수 int add(int x, int y) { int result; result = x + y; return result; } 매개 변수

반환값 반환값(return value): 호출된 함수가 호출한 곳으로 작업의 결과값 을 전달하는 것 인수는 여러 개가 가능하나 반환값은 하나만 가능

예제 #1 #include <stdio.h> // 함수를 정의한다. int get_integer() { int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int main(void) int x = get_integer(); // 함수를 호출한다. int y = get_integer(); // 함수를 호출한다. int result = x + y; printf("두수의 합 = %d \n", result); return 0;

실행 결과

예제 #2 // 두수 중에서 큰 수를 찾는 함수 예제 #include <stdio.h> // 함수를 정의한다. int get_integer() { int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int get_max(int x, int y) if (x > y) return(x); else return(y);

예제 #2 int main(void) { int a = get_integer(); // 함수 호출 int b = get_integer(); // 함수 호출 printf("두수 중에서 큰 수는 %d입니다.\n", get_max(a, b)); // 함수 호출 return 0; }

예제 #3 #include <stdio.h> // 함수를 정의한다. int get_integer() { int value; printf("정수를 입력하시오 : "); scanf("%d", &value); return value; } int power(int x, int y) int i; long result = 1; for (i = 0; i < y; i++) result *= x; // result = result * x return result;

예제 #3 int main(void) { int x = get_integer(); // 함수를 호출한다. int y = get_integer(); // 함수를 호출한다. int result = power(x, y); printf("%d의 %d승 = %d \n", x, y, result); return 0; }

중간 점검 1. 인수와 매개 변수는 어떤 관계가 있는가? 2. 반환값이 double형으로 정의된 함수에서 정수를 반환하면 어떤 일 이 발생하는가?

함수 원형 함수 원형(function prototyping): 컴파일러에게 함수에 대하여 미리 알리는 것 함수 원형 #include <stdio.h> int compute_sum(int n); int main(void) { int sum; sum = compute_sum(100); printf("1부터 100까지의 합 = %d \n", sum); return 0; } int compute_sum(int n) int i; int result = 0; for (i = 1; i <= n; i++) result += i; return result; 함수 원형

lab: 온도 변환 함수 섭씨 온도를 화씨 온도로 변환하여 반환하는 함수 FtoC()를 작성하 고 테스트하라.

Sol. #include <stdio.h> double FtoC(double temp_f); // 함수 원형 정의 int main(void) { double c, f; f = 32.0; c = FtoC(f); // 함수 호출 printf("화씨온도 %f은 섭씨온도 %f에 해당한다. \n", f, c); return 0; } double FtoC(double temp_f) // 함수 정의 double temp_c; temp_c = (5.0 * (temp_f – 32.0)) / 9.0; return temp_c;

lab: 그개픽 함수 정의 다음과 같은 원형을 가지는 함수를 정의해보자. void line(HDC hdc, int x1, int y1, int x2, int y2) { ... }

Sol. #include <windows.h> #include <stdlib.h> #include <stdio.h> // (x1, y1)에서 (x2, y2)까지 직선을 그리는 함수 void line(HDC hdc, int x1, int y1, int x2, int y2) { MoveToEx(hdc, x1, y1, NULL); LineTo(hdc, x2, y2); } // [x1, y1] 구간에서 난수를 발생하는 함수 int randint(int x1, int x2) return x1 + rand() % (x2 - x1);

Sol. int main(void) { int i; HDC hdc = GetWindowDC(GetForegroundWindow()); for (i = 0; i < 30; i++) { int x1 = randint(0, 300); int y1 = randint(0, 300); int x2 = randint(0, 300); int y2 = randint(0, 300); line(hdc, x1, y1, x2, y2); Sleep(100); // 100ms 동안 잔다. }

중간 점검 1. 함수 정의의 첫 번째 줄에는 어떤 정보들이 포함되는가? 이것을 무 엇이라고 부르는가? 2. 함수가 반환할 수 있는 값의 개수는? 3. 함수가 값을 반환하지 않는다면 반환형은 어떻게 정의되어야 하는 가? 4. 함수 정의와 함수 원형의 차이점은 무엇인가? 5. 함수 원형에 반드시 필요한 것은 아니지만 대개 매개 변수들의 이름 을 추가하는 이유는 무엇인가? 6. 다음과 같은 함수 원형을 보고 우리가 알 수 있는 정보는 어떤 것들 인가? double pow(double, double);

지역 변수와 전역 변수 함수 안에서 정의되는 변수는 지역 변수라고 불리고 해당 함수 안에 서만 사용이 가능하다. 함수의 외부에서 선언되는 변수는 전역변수 라고 불린다.

지역 변수 지역 변수(local variable): 함수나 블록 안에 선언되는 변수 int compute_sum(int n) { int i, result = 0; for(i=0; i<=n; i++) result += i; return result; } 지역 변수

지역 변수의 사용 범위 int sub1() { 지역 변수 x의 유효한 범위 int I; … } void sub2() printf(“%d \n”, x); 지역 변수 x의 유효한 범위

블록 안에서의 지역 변수

지역 변수의 초기값 int compute_sum(int n) { int i, result; for(i=0; i<=n; i++) result += i; return result; }

전역 변수 전역 변수(global variable): 함수의 외부에 선언되는 변수 초기값을 주지 않으면 0이다. #include <stdio.h> int global = 123; void sub1() { printf("%d\n", global); } void sub2() int main(void) sub1(); sub2(); return 0;

실행 결과

같은 이름의 전역 변수와 지역 변수 #include <stdio.h> int sum = 123; int main(void) { int sum = 321; printf("%d \n", sum); return 0; } 지역 변수가 전역 변수를 가린다.

중간 점검 1. 변수의 범위는 대개 무엇으로 결정되는가? 2. 똑같은 이름의 지역 변수가 서로 다른 함수 안에 정의될 수 있는가? 3. 지역 변수의 초기값은 얼마인가? 4. 전역 변수는 어디에 선언되는가? 5. 전역 변수의 생존 기간과 초기값은? 6. 똑같은 이름의 전역 변수와 지역 변수가 동시에 존재하면 어떻게 되 는가?

Lab: 전역 변수 사용하기 우리의 그래픽 프로그램에서는 항상 hdc라는 변수가 필요하다. 이 렇게 여러 부분에서 공통적으로 필요한 변수를 전역 변수로 선언하 는 것이 좋다. hdc를 전역 변수로 선언하고 여러 함수에서 사용하여 보자.

Sol: #include <windows.h> #include <math.h> #include <stdio.h> HDC hdc; // 전역 변수 hdc 선언 void line(int x1, int y1, int x2, int y2) // 매개 변수가 더 간단해진다. { MoveToEx(hdc, x1, y1, NULL); // 전역 변수 hdc 사용 LineTo(hdc, x2, y2); // 전역 변수 hdc 사용 } int main(void) { int i; int x1 = 200; int y1 = 200; int x2 = 400; int y2 = 200; hdc = GetWindowDC(GetForegroundWindow()); // 전역 변수 hdc 사용 for (i = 0; i<30; i++) { line(x1, y1, x2, y2); y1 -= 10; y2 += 10; Sleep(100); Sol:

static 지정자 정적 변수: 블록에서만 사용되지만 블록을 벗어나도 자동으로 삭제 되지 않는 변수  정적 변수: 블록에서만 사용되지만 블록을 벗어나도 자동으로 삭제 되지 않는 변수 앞에 static을 붙인다. void sub() { static int count; …. return; } 정적 변수

저장 유형 지정자 static #include <stdio.h> void sub(void) { int auto_count = 0; static int static_count = 0; auto_count++; static_count++; printf("auto_count=%d\n", auto_count); printf("static_count=%d\n", static_count); } int main(void) sub(); return 0;

실행 결과

순환호출 순환은 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다

순환호출 #include <stdio.h> long factorial(int n); int main(void) { int x = 0, result; printf("정수를 입력하시오:"); scanf("%d", &x); result = factorial(x); printf("%d!은 %d입니다.\n", x, result); return 0; } int factorial(int n) printf("factorial(%d)\n", n); if (n <= 1) return 1; else return n * factorial(n - 1);

실행 결과

Lab: 동심원 그리기 순환 호출을 이용하여서 동심원을 그려보자.

Sol: #include <windows.h> #include <stdio.h> HDC hdc; void draw_circle(int x, int y, double radius) { // 화면에 원을 그린다. Ellipse(hdc, x - radius, y - radius, x + radius, y + radius); if (radius > 2.0) { // 반지름이 2.0 이상이면 radius *= 0.75; // 반지름을 줄인다. draw_circle(x, y, radius); // 순환호출한다. } int main(void) { hdc = GetWindowDC(GetForegroundWindow()); draw_circle(300, 200, 200.0); return 0;

라이브러리 함수 라이브러리 함수(library function): 컴파일러에서 제공하는 함수 표준 입출력 수학 연산 문자열 처리 시간 처리 오류 처리 데이터 검색과 정렬

난수 함수 난수(random number)는 규칙성이 없이 임의로 생성되는 수이다. 난수는 암호학이나 시뮬레이션, 게임 등에서 필수적이다. rand() 난수를 생성하는 함수 0부터 RAND_MAX까지의 난수를 생성

예제: 로또 번호 생성하기 1부터 45번 사이의 난수 발생

난수 발생 코드 #include <stdio.h> #include <stdlib.h> int main(void) { int i; for(i = 0; i < 6; i++) printf("%d ", rand()); return 0; } 41 18467 6334 26500 19169 15724 0에서 32767 사이의 정수로 생성

1부터 45 사이로 제한 printf("%d ", 1+(rand()%45)); 하지만 실행할 때마다 항상 똑같은 난수가 발생된다. 42 18 35 41 45 20

실행할 때마다 다르게 하려면 매번 난수를 다르게 생성하려면 시드(seed)를 다르게 하여야 한다. #include <stdlib.h> #include <stdio.h> #include <time.h> #define MAX 45 int main( void ) { int i; srand( time( NULL ) ); for( i = 0; i < 6; i++ ) printf("%d ", 1+rand()%MAX ); return 0; } 시드를 설정하는 가장 일반적인 방법은 현재의 시각을 시드로 사용하는 것이다. 현재 시각은 실행할 때마다 달라지기 때문이다.

수학 라이브러리 함수

Sin 함수 그리기 0도 부터 180도까지 싸인 함수를 화면에 그려보자. 윈도우의 GDI 함수인 SetPixel()을 사용한다.

SetPixel() 함수

#include <windows.h> #include <math.h> #include <stdio.h> double deg_to_rad(int degree) // 도를 라디안으로 변환한다. { return 3.141592*degree / 180.0; } int main(void) HDC hdc = GetWindowDC(GetForegroundWindow()); int i; MoveToEx(hdc, 0, 200, NULL); // x좌표축을 그린다. LineTo(hdc, 600, 200); for (i = 0; i < 360; i++) { double value = sin(deg_to_rad(i)); SetPixel(hdc, i, 200-value*100, RGB(0, 0, 0)); return 0;

중간 점검 1. 90도에서의 싸인값을 계산하는 문장을 작성하여 보라. 2. rand() % 10 이 계산하는 값의 범위는?

Q & A