최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

Download Report

Transcript 최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

최신 C 프로그래밍 언어
문제해결에서 프로그래밍까지
개정판
9장 : 함수
도서출판 - 인터비젼
1
9장 함수

학습목표
 1. 함수의 정의 및 선언 그리고 함수 프로토타입(원형)에
대해 이해한다.
 2. 함수들 간의 매개변수 전달 방법을 이해한다.
 3. 구조적 프로그래밍 기법에 대해 이해한다.
 4. 순환함수 및 함수포인터에 대해 이해한다.
 5. 메인함수를 보다 자세히 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2
목차

9장 함수
 예습시간
– 함수의 기본 개념 이해
– 구조적 프로그래밍
– 순환 함수와 함수 포인터 그리고 메인 함수
 실습시간
– 구조적 프로그래밍 접근
– 사용자 정의 함수 활용
 연습시간
– 사용자 함수 및 관계 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
3
예습시간 – 1 교시
함수의 기본 개념 이해
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
함수의 기본 개념 이해

학습 개요




함수의 의미와 구조에 대해 이해한다.
사용자 정의 함수에 대해 이해한다.
함수간의 데이터 전달 방법을 이해한다.
함수의 결과 값 전달 방식에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
5
함수의 기본 개념 이해

함수의 기본 개념
 함수란
–
–
–
–
프로그램의 일부를 그룹화 한 하나의 모듈
어떠한 입력에 대한 특정 일을 수행하고 처리 결과를 제공한다.
블랙박스 구조의 모듈
함수의 종류
» 라이브러리 함수 (표준 함수)
 표준으로 미리 정의된 함수로 컴파일러에 의해 제공
» 사용자 정의 함수
 사용자가 임으로 만들어 사용하는 함수
 함수 사용의 장점
– 프로그램의 반복적인 내용을 효율적으로 만들고 사용 가능하게
한다.
– 함수의 재사용이 용이하다.
– 프로그램을 특정 단위로 모듈화함으로써 이해가 용이하다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
6
함수의 기본 개념 이해

사용자 정의 함수의 정의와 사용
 함수의 형식
[❶ 결과 반환 데이터형] [❷ 함수의 이름]([❸ 매개변수 리스트]){
// ❹ 함수 내부 지역 변수 선언
// ❺ 함수 실행 문장들
...
❻ return [결과데이터];
}






❶
❷
❸
❹
❺
❻
결과 반환 데이터형 : 함수 처리 후 결과 반환 데이터 형
함수의 이름 : 사용자 정의 함수 이름
매개변수 리스트 : 호출 시 전달되는 변수 이름
함수 내부 지역 변수 선언 : 함수 내부 변수
함수 실행 문장들
return [결과데이터] : 처리 결과 전달 문
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
7
함수의 기본 개념 이해

사용자 정의 함수 작성 예
 int sum(int x, int y){

int z;

z= x+y;

return z;
 }
 6개의 요소 분리
–
–
–
–
–
–
❶
❷
❸
❹
❺
❻
결과 반환 데이터형 :
함수의 이름 :
매개변수 리스트 :
함수 내부 지역 변수 선언 :
함수 실행 문장들 :
return [결과데이터] :
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
int
sum
int x, int y
int z
z = x + y;
return z
8
함수의 기본 개념 이해

함수의 사용
 함수의 사용은 함수의 이름을 호출하고 매개변수를 전달하는
과정으로 이루어진다.
 함수를 포함한 프로그램 구조
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
...
//❶함수의 원형
int sum(int x, int y);
//전역변수선언
void main(){
//지역 변수 선언
int first, second, result;
...
//❷함수의 호출
result = sum(first, second);
...
}
//❸함수의 정의
int sum(int x, int y){
int z;
z= x+y;
return z;
}
•함수의 원형
• 함수의 원형의 선언은 컴파일러에게
함수의 사용을 알려준다.
•함수의 호출
•함수의 이름을 이용해 함수를 호출
•매개변수 존재할 경우 매개 변수 전달
•함수의 정의
•함수의 구현 부로 실제 처리 담당
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
9
함수의 기본 개념 이해

함수의 사용
 함수의 호출과정과 제어 흐름
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
10
함수의 기본 개념 이해

함수간의 데이터 전달 방법
 함수 호출과정에서 매개변수 전달 방법
 종류
– 값에 의한 전달방식 (Call by Value)
– 주소에 의한 전달방식 (Call by Reference)
 매개변수의 분류
– 실 매개변수
» 함수 호출 시 전달되는 실제 데이터
» 함수 호출을 위해 전달되는 매개변수
– 형식 매개변수
» 실제 데이터를 받아들이는 변수
» 함수에 선언된 매개변수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
11
함수의 기본 개념 이해

값에 의한 매개변수 전달방식(Call by Value)
 실제 값을 매개변수로 전달
 값의 복사가 이루어짐
 전달 예>
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
12
함수의 기본 개념 이해

값에 의한 매개변수 전달방식(Call by Value)
 실 매개변수와 형식 매개변수는 각기 독립적인 공간을 가진다.
 이들 변수 사이에 값이 복사 되어 전달
 함수들간의 독립성이 보장되고 함수내의 값의 변화에 영향을 받지
않는다.
 사용 예>
출력 결과
30
main() : data = ________________
60
send() : data = ________________
01
02
03
04
05
06
07
08
09
10
11
12
13
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
#include <stdio.h>
int send(int x); // 함수의 원형
void main(){
int data, result;
data = 30;
result = send(data);
printf("main() : data = %d \n", data);
}
int send(int data){
data = data + 30;
printf("send() : data = %d \n", data);
return 0;
}
13
함수의 기본 개념 이해

주소에 의한 호출 방법(Call by Reference)
 함수에 값이 아닌 값이 저장된 메모리 주소를 전달
 포인터를 이용한 호출 방법
 주소의 조작을 통해 호출한 위치의 값이 함수 내부에서 변경될 때 그
값은 영향을 받는다.
 사용 예>
01 #include <stdio.h>
출력 결과
20
x = ________________
10
y = ________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
02
03
04
05
06
07
08
09
10
11
12
13
14
void exchange(int *px, int *py);
void main(){
int x = 10;
int y = 20;
exchange(&x,&y);
printf(" x = %d , y = %d \n");
}
void exchange(int *px, int *py){
int temp;
temp = *px;
*px = *py;
*py = temp;
}
14
함수의 기본 개념 이해

주소에 의한 호출 방법(Call by Reference)
 프로그램 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
15
함수의 기본 개념 이해

매개변수로 배열 전달
 주소에 의한 매개변수 전달 방법을 취함(Call by
Reference)
 함수의 매개변수로 배열의 대표명이 전달될 경우
주소로써 전달된다.
 배열의 대표명은 주소의 역할을 가짐
 배열을 매개변수를 전달할 경우 두 가지 형태로 그
배열을 받아들일 수 있다.
– 포인터 변수를 이용한 배열의 주소 값으로
– 배열형식으로 배열을 받아 들임. 이때 배열의 크기는 전달되지
않는다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
16
함수의 기본 개념 이해

매개변수로 배열 전달
 사용 예>
포인터 변수로써
01 #include <stdio.h>
02 // 함수의 원형
배열 명으로써
03 int min(int *x);
04 int max(int x[]);
05 // 메인 함수
06 void main(){
07 static a[]={11,23,13,54,25,36,47,78,19,20};
08 int mi,ma;
09 mi = min(a); // 배열의 대표명으로 인자 전달
10 ma = max(a); // 배열의 대표명으로 인자 전달
11 printf("mi = %d ma = %d \n",mi,ma);
12}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
13 int min(int *x){ //포인터 변수로 인자 얻음
14 int i, result = *x; // 첫번째 값 결과에
15 for(i=1;i<10;i++){
16
x++; // 다음 번지로 이동
17
if(result > *x){
18
result = *x;
19
}
20 }
21 return result;
22 }
23 int max(int x[]){ //배열 명으로 인자 얻음
24 int i, result = x[0]; // 첫번째 값 결과에
25 for(i=1;i<10;i++){
26
if(result < x[i]){
27
result = x[i];
28
}
29 }
30 return result;
31 }
17
함수의 기본 개념 이해

함수의 결과 값 전달
 함수의 처리 결과는 return문을 통해 전달
 함수 처리 과정 중 return 문을 만나면 함수의 호출위치로
제어가 이동됨
 return 문 사용형태
– return; //아무 값도 전달하지 않고 함수 호출 위치로 제어 이동
– return value; // value에 포함된 값을 전달한다.
– return 0;
// 0 값을 전달한다.
 return 문의 전달 값은 함수 선언 시 정의된 함수의 리턴
타입과 동일해야 한다.
– 예> double getAve(int value, int count){
double result;
...
return result;
 리턴 타입이 void일 경우 return문 생략 가능
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
18
함수의 기본 개념 이해

사용자 정의 함수의 분류
 함수의 결과 유형과 매개변수 전달 방법에 따른 분류
종류
값반환
(return)
매개변수
전달방법
값
기본형
X
출력
매개변수형
입력
매개변수형
X
리턴형
X
리턴/출력
매개변수형
리턴 입/출력
매개변수형
설명
주소
X
void fun()
단순출력용으로 사용
O
void fun(int *x)
함수의 결과를 매개변수로 전달 목적
X
void fun(int x)
입력 내용에 대한 단순 출력 목적
O
void fun(int x, int *y)
함수에 대한입력과 출력을 매개변수를 통해 처리함
X
int fun()
내부처리 후 결과반환
O
int fun(int *x)
처리 결과를 매개변수와 반환 값으로 처리
X
int fun(int x)
입력 값에 대한 하나의 결과 제공
O
int fun(int x, int *y)
입력 값에 대한 처리 결과를 매개변수와 리턴 값으로
전달
O
입/출력
매개변수형
리턴/입력
매개변수형
사용 예
O
O
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
19
예습시간 – 2 교시
구조적 프로그래밍
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
20
구조적 프로그래밍

학습 개요
 함수 기반의 구조적 프로그래밍에 대해 알아본다.
 구조적 프로그래밍 설계 기법에 대해 다룬다.
 하향식 설계 기법을 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
21
구조적 프로그래밍

프로그래밍 설계 기법
 현실적으로 프로그램은 매우 크고 복잡한 구조를 가진다.
 어떻게 프로그램을 분석하고 설계할 것인가?
– 분할 정복 방식 (Divide and Conquer)
» 큰 문제를 여러 개의 작은 단위로 분리하고 그 작은 단위의
문제부터 해결해 나가는 방식
– 하향식 설계 원리
 해결 가능한 최소의 단위를 함수를 통해 구성한다.
 구조체 차트(Structure Chart) 활용
– 한 문제와 다른 문제 사이의 관계를 효율적으로 분석
 알고리즘 및 플로우차트
– 각 단위의 문제에 대한 흐름 파악
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
22
구조적 프로그래밍

하향식 접근 방식을 통한 프로그램 설계 흐름





1) 문제의 이해
2) 알고리즘 작성
3) 보다 작은 단위의 문제로 분할
4) 작은 부 문제를 이용해 구조체 차트 작성
5) 각 요소 중 보다 상세한 기술이 요구되는 부분을 위해
흐름도(플로우차트)작성
 6) 분할된 요소를 중심으로 프로그램 작성
 7) 테스트
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
23
구조적 프로그래밍

하향식 접근 방식을 통한 프로그램 설계 흐름 예
 문제 정의
– 산술처리를 담당하는 프로그램을 작성해야 한다고 가정해 보자.
이 프로그램은 사용자의 입력에 의해 사칙 연산을 수행하고 이
입력 결과를 화면에 출력한다.
 알고리즘 작성
– 프로그램 작성 과정을 문장을 통해 간략히 기술한다.
– 알고리즘
» 1. 데이터 입력
 1.1 데이터 값을 입력 받는다.
 1.2 연산형태를 입력 받는다.
» 2. 계산 처리




2.1
2.2
2.3
2.4
+ 연산자 : 덧셈 처리
- 연산자 : 뺄셈 처리
* 연산자 : 곱셉 처리
/ 연산자 : 나눗셈 처리
» 3. 계산 결과 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
24
구조적 프로그래밍

작은 단위의 문제 분할
 분할 정책
– 부 문제로 분류할 부분을 찾아 함수로 분할
– 분할된 문제가 더 작은 단위로 분할 가능한지를 분석
– 부 문제는 그 분할된 의미가 분명해야 하며 다른 곳에서 사용
가능한지 여부를 고려하여 구분한다.
 이 프로그램은 사칙 연산에 대한 부분을 작은 단위로
분리하고 함수로 정의 한다.
–
–
–
–
덧셈 처리
뺄셈 처리
곱셈 처리
나눗셈 처리
: int add(int x, int y)
: int sub(int x, int y)
: int mul(int x, int y)
: double div(int x, int y)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
25
구조적 프로그래밍

부문제를 포함하여 구조체 차트 작성
 해설
– 구조체 차트는 레벨을 가지고 있으며 최상위 문제에서 분할된 부
문제와 다시 그 부 문제에서 분할된 부 문제로 나누어져 구성됨
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
26
구조적 프로그래밍

요소 중 상세한 기술이 요구되는 부분에 대한 흐름도 작성
 해설
– 흐름도(플로우차트)는 하나의 구성요소에서의 제어 흐름을 세부적으로
보여줄 수 있다.
– 제어 흐름이 많거나 중요한 부분을 대상으로 흐름도를 작성한다.
 이 프로그램에서는 [0.산술처리]가
다양한 요소를 포함하고 있기 때문에
이 부분에 대한 흐름도를 작성한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
27
구조적 프로그래밍

프로그램 코드 작성
 프로그램 분석 완료 후 이들 알고리즘,구조체차트 그리고
흐름도를 이용해 코드로 작성한다.
 프로그램 코드 248페이지
01
02
03
04
05
06
07
08
09
10
11
/*****************************
* 산술 처리 프로그램.
* 생성일 : 2004년 10월 ..
* 작성자 : W Y KIM
*****************************/
#include <stdio.h>
//함수 원형 선언
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
double div(int x, int y);
*
*
*
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
12 //0. 산술 처리 메인
13 void main(){
14
//변수 선언
15
int x,y,iRes;
16
char op;
17
double dRes;
18
//1. 자료 입력
19
//1.1 두개의 데이터 자료 입력
20
printf("계산할 두 데이터 값은 :
");
21
scanf("%d%d",&x,&y);
22
fflush(stdin);
28
구조적 프로그래밍
23
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 }
//1.2 연산자 입력
printf("연산자는(+,-,*,/) : ");
scanf("%c",&op);
fflush(stdin);
// 2 계산처리
switch(op){
case '+' :
iRes = add(x,y); // 2.1 덧셈처리
break;
case '-' :
iRes = sub(x,y); // 2.2 뺄셈 처리
break;
case '*' :
iRes = mul(x,y); // 2.3 곱셈 처리
break;
case '/' :
dRes = div(x,y); // 2.4 나눗셈 처리
}
// 3 계산 결과 출력
if(op != '/'){
printf("%d %c %d = %d \n", x, op, y, iRes);
}else{
printf("%d %c %d = %.2f \n", x, op, y, dRes);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지

44
45
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
프로그램 코드(계속)
// 사용자 정의 함수 정의
//2.1 덧셈 처리
int add(int x, int y){
return x+y;
}
//2.2 뺄셈 처리
int sub(int x, int y){
return x-y;
}
//2.3 곱셈 처리
int mul(int x, int y){
return x*y;
}
//2.4 나눗셈 처리
double div(int x, int y){
if(y!=0){
return x / (double)y;
}else{
return 0.0;
}
}
29
예습시간 – 3 교시
순환 함수와 함수 포인터 그리고
메인 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
30
순환 함수와 함수 포인터 그리고 메인 함수

학습 개요
 순환(재귀)함수에 대해 이해한다.
 함수 주소를 이용한 함수 포인터에 대해 다룬다.
 메인 함수를 보다 자세히 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
31
순환 함수와 함수 포인터 그리고 메인 함수

순환(재귀)함수
 자기 자신을 호출 하는 함수
 재귀적으로 서로 상이한 매개변수 값을 가지고 자기
자신을 호출하는 구조
 반복 처리의 대안으로 널리 이용됨
 반복 구조에 비해 처리 면에서 다소 느리지만 복잡한
구조를 간결하게 구성할 수 있게 한다.
 순환 함수의 구성
– 자기자신과 나머지의 집합
– 종결조건
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
32
순환 함수와 함수 포인터 그리고 메인 함수

순환(재귀)함수 프로그램 예
 N! 계산 프로그램
– N과 나머지의 곱으로 해석
– 그 나머지는 다시 N과 나머지의 곱으로 구성
– 종결조건 : N == 0 또는 N = 1 일 경우 1값
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
33
순환 함수와 함수 포인터 그리고 메인 함수

순환(재귀)함수 프로그램 예
 N! 프로그램
(반복과 순환함수 비교)
01 #include <stdio.h>
02 int factorial(int n);
03 int fact(int n);
04 void main(){
05
int value,result;
06
// 1. 값 입력
07
printf(" N!값 : ");
08
scanf("%d",&value);
09
// 2. 계산
10
result = factorial(value);
11
//3. 출력
12
printf(" %d! = %d \n", value, result);
13}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//2. factorial 계산 (for문 사용)
int fact(int n){
int i, result=1;
for(i=n; i>0; i--){
result = result * i;
}
return result;
}
//2. factorial 계산 (순환 함수)
int factorial(int n){
int result;
if(n==1) return 1;
result = n * factorial(n-1);
return result;
}
34
순환 함수와 함수 포인터 그리고 메인 함수

순환(재귀)함수 프로그램 예
 순환 함수 호출 흐름
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
35
순환 함수와 함수 포인터 그리고 메인 함수

함수 포인터




함수 역시 특정 주소에 저장되어진다.
그 결과 함수 주소에 대한 포인터 연산이 가능
함수 포인터 선언과 할당
선언 방법
– [데이터 형] (*[포인터명])([매개변수리스트])
» [데이터 형] 함수의 리턴 타입 형
» (*[포인터명]) : 함수의 주소를 저장할 함수 포인터 이름
» [매개변수리스트] : 함수에 전달되는 매개변수 리스트
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
36
순환 함수와 함수 포인터 그리고 메인 함수

함수 포인터 사용 예
15
16
17
18
01 #include <stdio.h>
함수 포인터
19
02 //함수의 원형
20
03 int min(int *x);
21
04 int max(int *x);
22
05 void main(){
23
06
static a[]={13,33,11,54,25,36,47,88,19,20};
24
07
int mi,ma;
25
08
int (*pfun)(int *x);
// 함수 포인터 선언
26
09
pfun = min; // 함수 포인터에 min함수 주소 할당
27
10
mi=pfun(a); // 함수 포인터를 이용해 min함수 호출 28
11
pfun = max; // 함수 포인터에 max함수 주소 할당
29
12
ma=pfun(a); // 함수 포인터를 이용해 max함수 호출 30
13
printf("mi = %d ma = %d \n",mi,ma);
31
14 }
32
33
34
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
int min(int *x){
int i, result = *x; // 첫번째 값
for(i=1;i<10;i++){
x++; // 다음 번지 이동
if(result > *x){
result = *x;
}
}
return result;
}
int max(int *x){
int i, result = *x; // 첫번째 값
for(i=1;i<10;i++){
x++; // 다음 번지 이동
if(result < *x){
result = *x;
}
}
return result;
}
37
순환 함수와 함수 포인터 그리고 메인 함수

함수 포인터 배열
 함수 포인터 역시 배열로 관리 될 수 있다.
 함수 포인터 배열 선언
– [데이터형](*[포인터명][배열의크기])([매개변수리스트])
»
»
»
»
[데이터 형] 함수의 리턴 타입 형
*[포인터명] : 함수의 주소를 저장할 함수 포인터 이름
[배열의 크기] : 함수 포인터 배열의 크기
[매개변수리스트] : 함수에 전달되는 매개변수 리스트
 동일 유형의 함수 구조를 그룹화하여 관리 가능
– 사용 예 :
» int (*pfuns[2])(int *);
– 포인터 배열 활용예 – 페이지 256
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
38
순환 함수와 함수 포인터 그리고 메인 함수

메인 함수(main)의 확장
 메인 함수의 원형
– [반환 데이터형] main([매개변수 리스트]);
– [반환 데이터형] : 정수형 이나 void 형 사용
» main함수의 실행이 정상적인지 아닌지를 판단하기 위해 사용
» 함수의 정상종료 시 : 0
» 비정상 종료 시
:1
– [매개변수 리스트]
»
»
»
»
명령라인에서 입력된 값을 얻기 위해 사용
두 개의 인자 존재
1. 명령 라인에 입력된 인자의 수 (정수형)
2. 명령 라인에 입력된 실제 데이터 배열 공간 (문자열 포인터 배열
변수)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
39
순환 함수와 함수 포인터 그리고 메인 함수

메인 함수(main)의 확장
 메인 함수의 매개 변수 사용 예
 프로그램
–
–
–
–
–
–
–
–
01 #include <stdio.h>
02 void main(int argc, char *argv[]){
03
int i;
04
printf("입력된 매개변수 값들 \n");
05
for(i=0;i<argc; i++){
06
printf("%d ==> %s \n",i,argv[i]);
07
}
08 }
 argc : 명령라인에서 입력된 인자의 수
 *argv[] : 입력된 인자의 문자열 배열
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
40
순환 함수와 함수 포인터 그리고 메인 함수

메인 함수(main)의 확장
 사용 예: 명령 라인에서 다음과 같이 입력 후 두 인자의
결과
– C:> maintest.exe Hi 2030 world ꎠ
» maintest.exe는 프로그램의 이름
 argc와 *argv[]의 저장 값
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
41
실습시간 – 1 교시
구조적 프로그래밍 접근
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
42
구조적 프로그래밍 접근

학습개요
 구조적 프로그래밍 방법에 의한 프로그램 분석방법을
학습
 함수와 이들간의 관계 그리고 프로그래밍 절차를
알아본다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
43
구조적 프로그래밍 접근

월간 기온 변화에 대한 보고서
 문제 정의
– 기상 관측소에서 월간 기온 자료를 통해 그 달의 기온 변화에
대한 보고서를 만들려고 한다. 특정 월에 대한 입력을 통해 그
달의 기온 값을 입력하고 그 기간 동안의 가장 더운 날과 가장
추운 날 그리고 한달 평균 온도를 계산하여 출력한다. 또한 특정
기간에 대한 온도 변화 그래프를 출력할 수 있게 한다.
 입/출력 조건
– 입력 조건
» 1) 입력을 원하는 달 (1월 12월) : 정수형(int)
» 2) 해당 월에 대한 기온 리스트 : 실수형(double)
» 3) 그래프 출력을 위한 시작일(int)와 기간(int)
– 출력 조건
»
»
»
»
1)
2)
3)
4)
그
그
그
그
달의
달의
달의
달의
가장
가장
평균
특정
더운 날
추운 날
기온
기간에 대한 기온 그래프
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
44
구조적 프로그래밍 접근
 입/출력 예
– 먼저 입력할 원을 1월에서 12월 사이 값으로 입력
– 해당 월에 대한 기온 입력 (-10~40도 사이의 값)
– 개괄적인 기온 결과 출력 후 그래프 출력 기간 입력을 통해 해당
기간의 그래프 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
45
구조적 프로그래밍 접근
 관련 함수 및 식
– 1) 입력 월에 의해 입력 데이터 크기를 결정한다.
» 1, 3, 5, 7, 8, 10, 12월 : 31일 (31개의 입력 공간)
» 4, 6, 9, 11월 : 30일 (30개의 입력 공간)
» 2월 : 28일 (28개의 입력 공간)
– 2) 동적 메모리 할당 함수 calloc() - <stdlib.h>
– 3) 기온은 -10도에서 40도 사이의 값으로 입력한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
46
구조적 프로그래밍 접근

알고리즘 (또는 플로우차트)
 1단계 : 개괄적 알고리즘
– 1. 데이터 입력
» 1.1 월을 입력한다.
» 1.2 월의 값에 대한 데이터 공간 크기를 얻어온다.
» 1.3 데이터 공간을 할당하고 값을 입력 받는다.
– 2. 데이터 처리
» 2.1 월 최고 기온을 기록한 날짜를 계산한다.
» 2.2 월 최저 기온을 기록한 날짜를 계산한다.
» 2.3 월 평균 기온을 계산한다.
– 3. 요약 정보 출력
» 3.1 월 요약 정보를 출력한다. (최고, 최저, 평균)
– 4. 그래프 출력
» 4.1 그래프 출력을 원하는 시작일 과 기간을 입력한다.
» 4.2 해당기간에 대한 그래프 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
47
구조적 프로그래밍 접근

알고리즘 (또는 플로우차트)
 2단계 : 구조체차트(Structure Chart) 작성
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
48
구조적 프로그래밍 접근
 3단계 : 플로우차트
4.2 그래프 출력 함수
1.3 기온 입력 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
49
구조적 프로그래밍 접근

프로그램 작성
 1단계
– 263페이지의 프로그램을 위의 분석 내용을 기반으로 빈 부분을
채워 넣은 후 프로그램을 작성하고 weather.c 이름으로 저장하자.
①. getMonthDay(month)
②. getDays(days,dayNum)
③. getHiDay(days,dayNum)
④. getLowDay(days,dayNum)
⑤. getAve(days,dayNum)
⑥. display(days,start,count)
⑦. hi = *(days+i)
⑧. calloc(cnt,sizeof(double))
⑨. (int)*(days+i)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
50
구조적 프로그래밍 접근

프로그램 작성
 2단계 -컴파일이 정상적을 완료되면 다음 입력에 대한 결과 작성
입력 조건
출력 결과
대상 월 : 3 월
기온 데이터 (1~31)
3.0 3.4 -2.0 4.0 1.2 -3.5 -5.0
-2.0 1.0 3.0 3.5 4.0 5.0 3.3
5.3 7.9 8.0 9.8 5.0 7.0 6.6
7.7 9.1 9.9 13.5 16.8 12.0 11.1
10.1 9.0 8.8
그래프 표시 기간
시작일 : 6 기간 : 10
대상 월 : 2 월
기온 데이터 (1~28)
2.0 1.4 2.8 -4.0 -1.2 -5.5 -3.0
-1.0 1.0 3.0 4.5 3.0 1.0 6.3
7.3 8.9 10.0 8.8 8.0 7.0 5.6
4.7 5.1 7.9 8.5 5.8 6.0 7.1
6.1 7.0 5.8
그래프 표시 기간
시작일 : 2 기간 : 10
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
51
실습시간 – 2 교시
사용자 정의 함수 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
52
사용자 정의 함수 활용

학습개요
 사용자 함수 기반 프로그램을 작성한다.
 사용자에 의해 만들어지는 다양한 함수의 형태를
이해한다.
 함수의 전달과정과 순환 함수를 다룬다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
53
사용자 정의 함수 활용

집합 연산자 만들기
 문제 정의
– C언어는 산술, 관계, 논리 연산자등 다양한 연산자를 제공하고
있지만 집합에 대한 연산은 제공 하지 않는다. 그러나 수치
집합들에 대한 처리 과정에서 집합 처리 연산이
요구되었다. 필요한 집합연산은 합집합(∪), 교집합(∩),
차집합(−)을 계산해야 한다. 이러한 연산을 제공하는 프로그램을
작성하여라.
 입/출력 조건
– 입력 조건
» 1) 정수형의 두 집합의 리스트
» 2) 각각의 집합에 대한 크기와 값들이 입력된다.
– 출력 조건
» 1) 두 집합에 대한 합집합(A∪B)
» 2) 두 집합에 대한 교집합(A∩B)
» 3) 두 집합에 대한 차집합(A−B)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
54
사용자 정의 함수 활용
 관련 함수 및 식
– 1) 입력된 집합의 크기에 의해 동적으로 메모리 공간 확보
(calloc()함수 이용)
– 2) 집합 관계를 표현하는 사용자 정의 함수
» 2.1 합집합 unionSet
 B의 요소가 A 집합의 요소가 아닐 경우 합집합 요소 이다.
 합집합 = A의 집합 + A집합에 속하지 않은 B의 요소들
» 2.2 교집합 commSet
 B요소가 A집합의 요소 이면 합집합의 요소이다.
 합집합 = B요소가 A집합인 요소들
» 2.3 차집합 diffSet
 A요소 이면서 B의 집합에 속하지 않는 경우 차집합의 요소이다.
 차집합 = A요소 중 B의 집합에 속하지 않은 요소들
» 2.4 한 요소가 집합에 속하는지 여부 판별 : isElement
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
55
사용자 정의 함수 활용
 관련 함수 및 식
– 한 요소와 집합의 관계
» 한 요소와 집합에서의 첫 번째 요소 비교 부분과 나머지들의 비교
부분
» 순환 알고리즘으로 구성
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
56
사용자 정의 함수 활용

알고리즘 (또는 플로우차트)
 개괄적 알고리즘 흐름
– 1. 두 집합 입력
» 1.1 집합 A의 크기와 값 입력
» 1.2 집합 B의 크기와 값 입력
– 2. 계산 결과 처리와 출력
» 2.1 합집합 계산
» 2.2 합집합 출력
» 2.3 교집합과 차집합은 2.1과 2.2 순으로 동일하게 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
57
사용자 정의 함수 활용
 구조체차트
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
58
사용자 정의 함수 활용

프로그램 작성
 1 단계
– 271페이지의 프로그램을 빈 부분을 포함하여 작성한 후
set.c파일로 저장하자.
①. input(first,&fcnt)
②. input(second,&scnt)
③. first,fcnt,second,scnt,&rcnt
④. display(titles[i],result,rcnt)
⑤. isElement(*(second+i),first,fcnt)
⑥. isElement(element,++set, --cnt)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
59
사용자 정의 함수 활용

프로그램 작성
 2 단계
– 정상적으로 컴파일 되면 아래의 값을 입력하여 출력 결과를
기록하자.
입력 조건
출력 결과
A 집합의 수 : 8
집합 : 4 5 3 8 6 9 13 15
B의 집합의 수 : 7
집합 : 1 2 4 5 7 8 12
A 집합의 수 : 9
집합 : 1 3 5 7 8 6 15 11 6
B의 집합의 수 : 5
집합 : 3 6 9 12 15
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
60
함수
The End.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
61