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

Download Report

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

최신 C 프로그래밍 언어
문제해결에서 프로그래밍까지
개정판
12장 : 선행 처리기
도서출판 - 인터비젼
1
12장 선행 처리기

학습목표





1.
2.
3.
4.
5.
선행처리 개념과 활용 방법을 이해한다.
선행처리 명령어들을 이해한다.
매크로 사용법을 이해한다.
사용자 헤더파일 작성과 활용법에 대해 이해한다.
사용자 라이브러리 파일을 만들어 본다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2
목차

12장 선행 처리기
 예습시간
– 선행 처리 지시자
– 사용자 라이브러리 파일 만들기
 실습시간
– 선행 처리 지시자 활용
– 사용자 라이브러리 파일 활용
 연습시간
– 선행 처리 지시자 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
3
예습시간 – 1 교시
선행 처리 지시자
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
선행 처리 지시자

학습 개요




선행 처리기의 의미와 절차를 이해한다.
선행 처리 지시자의 종류에 대해 알아본다.
매크로의 의미에 대해 이야기한다.
조건부 컴파일 방법을 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
5
선행 처리 지시자

선행 처리기 개념
 원시 파일을 기계어로 번역하기 전 파일에 대한 부가적인 작업 처리
담당
 작업 내용
– 외부 파일을 원시 파일에 추가
– 문장 치환
– 컴파일 대상 선정
원시코드에서
실행파일 생성 과정
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
6
선행 처리 지시자

선행 처리 지시자
 선행 처리기에 특정 명령 처리 요구
 지시자의 종류
종 류
구 문
기 능
#define
매크로 정의
#undef
매크로 정의 해제
#include
원시파일에 지시된 외부 파일 포함
#ifdef, #else, #endif
정의된 매크로 기반 조건부 컴파일
#ifndef, #else, #endif
정의되지 않는 매크로 기반 조건부 컴파일
#if, #else, #endif
수식 기반 조건부 컴파일
#if, #elif, #else, #endif
수식 기반 다중 조건부 컴파일
#error
컴파일 중에 발생 가능한 에러 메시지 정의
#line
컴파일러에 저장된 라인 속성 변경
매크로(Macro)
외부파일 포함
조건부 컴파일
기타
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
7
선행 처리 지시자

매크로 지시자 (#define, #undef)
 프로그램에서 자주 사용되는 문자열에 대해 의미 있는
이름을 부여하는 방식
 프로그램의 운영성과 가독성을 증대
 매크로 문장은 선행처리기에 의해 기계어 코드 변환 전에
모두 치환되어진다.
 매크로 지시자의 종류
– 매크로 정의 지시자
» #define
– 매크로 해제 지시자
» #undef
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
8
선행 처리 지시자

매크로 정의 지시자 - #define
 매크로 정의 지시자의 종류
– 인수가 없는 매크로 정의
– 형식
» #define [매크로 이름] [치환 문자열]
– 인수를 가진 매크로 정의
– 형식
» #define [매크로 이름](인수리스트) [치환문자열]
 매크로 정의 규칙
– 1. 매크로 이름은 일반변수와 구별하기 위해 주로 대문자를 많이 사용
– 2. 매크로 이름 지정 시 공백을 포함해서는 안 된다.
– 3. 치환 문자열이 한 행에 기술하기 힘들 경우 치환문자열 마지막에
"\"을 표시하고 다음 행에 연결해서 작성 할 수 있다.
– 4. 매크로는 단순 치환의 의미를 가진다.
– 5. 인수리스트를 가진 매크로는 인수와 "()"사이에 공백이 존재해서는 안
된다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
9
선행 처리 지시자

인수가 없는 매크로
 단순 치환의 의미
 프로그램에서 자주 사용되는 문자열에 의미 부여
 사용 예
–
–
–
–
❶
❷
❸
❹
#define
#define
#define
#define
MAX
MIN
PRINT
MID
100
0
printf("\n");
(MAX+MIN)/2
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
10
선행 처리 지시자

선행 처리기에 의해 매크로 치환 흐름
 실행 코드 생성 전 선행 처리기에 의해 #define에 정의된
매크로는 모두 치환됨
 ("")에 포함된 매크로의 이름은 단순한 문자열로 취급
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
11
선행 처리 지시자

인수를 가진 매크로
 매크로의 이름에 인수를 포함하여 마치 함수처럼 사용
 사용 예
– 01 #define SUM(x,y) x+y
– 02 #void main(){
03
int a =50,b=70,c;
– 04
c = SUM(a,b);
– 05
printf("%d + %d = %d",a,b,c);
– 06 }
– 04라인의 SUM(a,b)는 선형처리기에 의해 다음과 같이 변형됨
» c = SUM(a,b)  c = a + b;
 고려 사항
– 매크로는 문자열 치환의 의미를 가지므로 치환 결과의 정확성
확인 필요
» 잘못된 사용 예>
 #define SUM(x,y) x+y
 …
 c = 20 * SUM(2,3);
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
// 기대 값 : 120
결과 값 : 43
12
선행 처리 지시자

설정된 매크로 해제
 이미 설정된 매크로를 해제
 사용 형식
– #undef
[매크로 이름]
 #undef 문이 선언된 위치부터 해당 매크로는 더 이상
사용되지 않는다.
 프로그램 안에 동일한 매크로 이름이 여러 개 존재할
경우
– 가장 최근에 정의된 매크로 해제
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
13
선행 처리 지시자

외부파일 포함 지시자 (#include)
 외부파일을 원시파일에 포함 시키는 지시자
 주로 원시 파일에 헤더파일 정보 포함 시키기 위해 사용
 사용 형태
– #include <외부파일명>
» 미리 정의된 위치의 시스템 파일을 포함 시킴
» 예> #include <stdio.h> , #include <stdlib.h>
– #include "외부파일명"
» 사용자에 의해 필요한 기타 파일을 포함 시킴
» 드라이버나 폴더 정보 포함 가능
» 사용 예:
 #include "user.h"
 #include "D:\sample\common.h"
 #include "user\test.h"
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
14
선행 처리 지시자

조건부 컴파일 지시자
 특정 상황에 맞는 원시 코드 컴파일 대상 분리 목적
 조건 제어 구조와 비슷한 형식
 조건부 컴파일 지시자 사용 방법
– 매크로 정의 기반의 조건부 컴파일 사용
» 매크로 정의 여부를 이용한 컴파일 대상 선정
– 수식기반의 조건부 컴파일 사용
» 수식 결과에 대한 컴파일 대상 선정
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
15
선행 처리 지시자

매크로 정의 기반 조건부 컴파일
 매크로 정의 여부에 의한 컴파일 대상 선택
01 #include <stdio.h>
 사용 형식
사용 예
– #ifdef | #ifndef 매크로명 02 #define DEBUG
03 void main(){
» 문장들...
04
int i, sum=0;
– [
05
#ifdef DEBUG
– #else
06
printf("DEBUG MODE START !!\n");
» 문장들...
07
#else
– ]
08
printf("NORMAL MODE START !!\n");
09
#endif
– #endif
10
for(i=1; i<=100; i++){
11
sum = sum+i;
출력 결과 :
12
#ifdef DEBUG
DEBUG MODE START !!
13
printf(" %i 단계 sum : %d \n", i,sum);
1 단계 sum : 1
14
#endif
2단계 sum : 3
15
}
…
16
printf("1에서 100까지의 합 : %d", sum);
1에서 100까지의 합 : 5050
17 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
16
선행 처리 지시자

수식 기반의 조건부 컴파일
 대상 수식의 결과가 참/거짓 인가에 의해 컴파일 대상
선정
 사용 형태
단일 조건형
다중 조건형
#if 수식
문장들...
#else
문장들...
#endif
#if 수식
문장들...
#elif 수식
문장들...
...
#else
문장들...
#endif
 사용 수식은 매크로 이름이나 상수들로 구성된다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
17
선행 처리 지시자
 수식 기반 조건부 컴파일 사용 예
– 01 #include <stdio.h>
출력 결과 :
– 02 #define DEBUG 1
– 03 #define DEPTH 2
DEBUG MODE START !!
– 04 void main(){
1 단계 sum : 1
– 05
int i, sum=0;
2 단계 sum : 3
– 06
#if DEBUG == 1
…
– 07
printf("DEBUG MODE START !!\n");
1에서 100까지의 합 : 5050
– 08
#else
– 09
printf("NORMAL MODE START !!\n");
– 10
#endif
– 11
for(i=1; i<=100; i++){
– 12
sum = sum+i;
– 13
#if DEBUG != 1
– 14
#elif DEPTH == 2
– 15
if(i%10 == 0){
– 16
printf(" %i 단계 sum : %d \n", i,sum);
– 17
}
– 18
#else
– 19
printf(" %i 단계 sum : %d \n", i,sum);
– 20
#endif
– 21
}
– 22
printf("1에서 100까지의 합 : %d", sum);
– 23 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
18
선행 처리 지시자

기타 지시자
 #error 지시자
– 컴파일 시 에레 메시지를 발생 시키기 위한 지시자
– #if, #infdef 구문과 함께 주로 사용됨
– 형식
» #error [출력 메시지]
– 컴파일 과정에서 이 문장을 만나면 더 이상 컴파일 하지 않고
에러메시지 출력 후 종료함
– 사용 예
» #ifndef USERTYPE
 #error 사용자 타입이 정의되지 않았습니다.
» #endif
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
19
선행 처리 지시자

기타 지시자
 #line 지시자
– 컴파일러가 내부적으로 저장하고 있는 라인번호와 파일 이름값을 변경
– 사용 형식
» #line [라인번호] "[파일이름]"
– 사용 예
»
»
»
»
01 void main(){
02
int x, y, z;
03
x = 10;
04
y = 20;
» 05
»
»
06
07
»
08 }
#line 100
"copy.c"
sum = x + y;
printf("sum = %d\n",sum);
– 05라인 이후 컴파일러에게 라인번호와 이름을 강제적으로 변경
» 06라인  101 라인, 07라인102라인 …
» 05라인 이후 파일이름 copy.c로 컴파일러 정보를 변경
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
20
예습시간 – 2 교시
사용자 라이브러리 파일 만들기
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
21
사용자 라이브러리 파일 만들기

학습 개요
 사용자 라이브러리 파일의 의미를 이해한다.
 사용자 라이브러리 파일 제작 과정을 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
22
사용자 라이브러리 파일 만들기

헤더파일(*.h)와 라이브러리 파일(*.lib)
 헤더파일
– 함수의 원형을 관리
 라이브러리 파일
– 함수의 구현 부분을 관리
– 원시 코드 형태가 아닌 이진 파일 형태
 프로그램에서 라이브러리 파일 사용
– 프로그램 내에 라이브러리 파일에 대한 헤더파일 선언
– 사용 예 : #include <stdio.h>
 컴파일
– 라이브러리 파일의 구현 부분을 고려하지 않고 함수 원형만으로 컴파일
 링크
– 함수의 원형과 실제 함수 구현 부분과의 연결 수행
 라이브러리 파일 제공 목적
– 소스코드에 대한 보호와 관리 용이
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
23
사용자 라이브러리 파일 만들기

라이브러리 파일 만들기
 라이브러리 파일의 종류
– 정적 라이브러리 파일 (*.lib)
» 라이브러리 정보를 각 프로그램마다 서로 독립적인 메모리
공간에서 이용
– 동적 라이브러리 파일 (*.dll)
» 라이브러리 정보를 공통의 메모리 공간을 통해 이용
 라이브러리 파일 구현
– 대상 : 정적 라이브러리 파일 만들기
– 개발 도구
» Visual Studio 6.0 이용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
24
사용자 라이브러리 파일 만들기

각 단계별 진행 과정
 1 단계
– 파일New 메뉴 선택하고 Project Tab에서 Win32 Static
Library 선택 후 파일 정보 입력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
25
사용자 라이브러리 파일 만들기
 2 단계
– 정적 라이브러리에 포함할 내용 선택 다이얼로그에서
[Finish]버튼 선택
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
26
사용자 라이브러리 파일 만들기
 3 단계
– [Finish]버튼 선택 후 만들어질 프로젝트 설명 다이얼로그에서
OK버튼 선택
– 맨 하단의 프로젝트 디렉토리 위치 확인할 것
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
27
사용자 라이브러리 파일 만들기
 4 단계
– 프로젝트에 프로그램 추가 단계로 먼저 라이브러리 함수로
사용할 함수의 원형 정의를 위해 해더파일(*.h)을 생성하자.
– [File][New] 선택 후 다음과 같이 작성
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
28
사용자 라이브러리 파일 만들기
 5 단계
– 헤더 파일에 함수 원형을 작성하자. 정수형 사칙 연산에 대한
함수 원형을 다음과 같이 작성한 후 저장하자.
–
–
–
–
–
–
–
–
–
01
02
03
04
05
06
07
08
09
/*
파일이름 : comlib.h
정수 값에 대한 사칙 연산 라이브러리 함수 헤더파일
*/
// 함수 원형 선언
int add(int x ,int y);
// 덧셈
int sub(int x, int y);
// 뺄셈
int mul(int x, int y);
// 곱셈
double divide(int x, int y);
// 나눗셈
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
29
사용자 라이브러리 파일 만들기
 6 단계
– 구현 파일을 만들어 보자. [File][New] 메뉴를 선택하고
다음과 같이 구성하자. 다 구성한 후 OK버튼 선택
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
30
사용자 라이브러리 파일 만들기
 7 단계
– 6 단계에서 만든 파일에 아래의 함수 구현코드를 작성하자.
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
»
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
/*
파일 이름 : comlib.c
정수 값에 대한 사칙 연산 라이브러리 함수
덧셈 뺄셈 곱셈 나눗셈
*/
int add(int x ,int y){
return x + y;
}
int sub(int x, int y){
return x - y;
}
int mul(int x, int y){
return x * y;
}
double divide(int x, int y){
return x / y;
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
31
사용자 라이브러리 파일 만들기
 8 단계
– 함수의 구현이 완료되면 컴파일과 빌드 작업을 수행하자.
– 정상적인 수행 후 프로젝트의 [Debug] 디렉토리 아래에
프로젝트 이름으로 만들어진 정적 라이브러리 파일을 발견할 수
있을 것이다.
– 예제  common.lib
 이 단계들을 통해 정적 라이브러리 파일을 만들었다.
 이 라이브러리 파일을 사용 시 2개의 파일이 사용된다.
– 헤더파일
» 예제  comlib.h
– 라이브러리파일
» 예제  common.lib
 9 단계부터는 이 라이브러리 사용 단계를 보여준다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
32
사용자 라이브러리 파일 만들기
 9 단계
– 프로젝트 이름을 uselib로 종류를 Win32Console Application을
선택하여 프로젝트를 만들자.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
33
사용자 라이브러리 파일 만들기
 10 단계
– 정적 라이브러리를 사용할 C 파일을 생성하자.
– [File][New] 선택 후 다이얼로그에 다음과 같이 입력하고 OK
선택
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
34
사용자 라이브러리 파일 만들기
 11 단계
– 이전에 만든 라이브러리 파일을 사용하기 위해 이전 프로젝트
폴더에서 두개의 파일(common.lib,comlib.h)을 복사하여 현재
프로젝트의 폴더 위치에 lib폴더를 만들고 그곳에 복사하자.
 12 단계
– 프로젝트에서 이 라이브러리을 사용하기 위한 환경을 설정하자.
– [Project][Settings…] 선택 후 아래와 같은 다이얼로그에서
[Link]탭 선택
– [Object/library modules] 텍스트 필드의 맨 끝에 사용할
라이브러리 이름 추가  lib/common.lib
– 추가 후 [OK] 버튼 선택
– 이 과정을 통해 프로젝트와 라이브러리 파일이 연결됨
– 화면 캡춰  다음 장
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
35
사용자 라이브러리 파일 만들기
 12 단계 (계속)
– 프로젝트 속성 다이얼로그 화면
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
36
사용자 라이브러리 파일 만들기
 13 단계
– 이전 10단계에 만든 libtest.c 파일에 다음과 같이 작성 후
저장하자.
–
–
–
–
–
–
–
–
–
–
–
–
–
–
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#include <stdio.h>
#include "lib\comlib.h"
//common.lib header file
void main(){
int x =30, y = 12, z;
double dz;
z = add(x,y);
printf(" x + y = %6d\n", z);
z = sub(x,y);
printf(" x - y = %6d\n", z);
z = mul(x,y);
printf(" x * y = %6d\n", z);
dz = divide(x,y);
printf(" x / y = %6.2lf\n", dz);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
37
사용자 라이브러리 파일 만들기
 14 단계
– 컴파일과 빌드 과정 처리 후 실행하여 결과를 확인하자.
– 출력 결과
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
38
실습시간 – 1 교시
선행 처리 지시자 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
39
선행 처리 지시자 활용

학습개요
 매크로 활용을 통한 프로그램 가독성 증가 방법의 이해
 조건부 컴파일을 활용한 프로그래밍 이해
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
40
선행 처리 지시자 활용

조건부 컴파일과 매크로 활용
 문제 정의
– 한 회사로부터 기업 정보에 대한 정보 파일을 얻어 왔다. 이들 파일의
정보를 읽어 들어 필요한 회사 정보만을 추출하여 새로운 파일로
저장하고자 한다. 이때 프로그램 작성과정에서는 각 회사 정보가 정확히
추출되는지를 확인하고 싶지만 완성된 상태에서는 확인할 필요가 없다.
이 조건을 만족하도록 프로그램 하여라. 또한 디버깅 모드를 두어 추출
정보에 대한 다양한 확인 방법을 제공하도록 구성해 보자. 아래는
디버깅 모드에 대한 표를 보여주고 있다.
– 작성할 디버깅 모드 종류
디버깅 모드
정 의
1
추출되지 않는 정보들 중 회사 분류와 이름만 출력
2
추출되지 않은 정보들 중 회사 분류,이름, 지역, 종업원 수를 출력
3
추출되거나 추출되는 않은 모든 정보를 출력한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
41
선행 처리 지시자 활용
 입/출력 조건
– 입력 조건
» 이진형태의 기업정보파일 (구조체 형식)
» 추출을 원하는 회사 분류선택 (1:제조업, 2:서비스업, 3: 통신업)
– 출력 조건
» 추출된 새로운 파일
 관련 함수 및 식
– 기업정보에 대한 구조체 형식
기업정보(INFO)
기업분류
(char type[10])
사업자번호
(int num)
회사이름
(char name[20])
지역
(char local[10])
자본금
(long capital)
종업원 수
(int cnt)
– 파일 관련 함수
» fopen(), fclose() : 파일 열기 / 닫기
» fread(),rwrite(): 이진 파일 읽기 / 쓰기
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
42
선행 처리 지시자 활용
 알고리즘 (또는 플로우차트)
– 1. 초기화 작업
» 1.1 일정 크기의 기업정보파일을 생성하여 company.bin파일로
저장
– 2. 추출을 원하는 기업 분류 값 얻기
– 3. 기업 정보 추출
»
»
»
»
3.1
3.2
3.3
3.4
company.bin 파일 오픈
selected.bin 파일 생성
오픈 파일로부터 각 레코드 읽기
읽은 레코드의 기업분류가 일치할 경우
 3.4.1 selected.bin 파일에 저장
– 3.5 오픈 파일이 EOF를 만날 때 까지 3.3부터 반복
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
43
선행 처리 지시자 활용

프로그램 작성
 1 단계
– 393페이지 프로그램을 위의 분석 자료를 통해 작성하자.
– 빈 부분을 채워 넣고 프로그램 한 후 company.c 파일로
저장하자.
①. PRINT(str)
②. #ifdef
③. #if
④. #else
⑤. #endif
⑥. #endif
⑦. strcmp(data,type)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
44
선행 처리 지시자 활용
 2 단계
– 프로그램 작성 후 다음 입력에 대한 출력 결과를 작성하자.
입력 조건
출력 결과
입력 :
추출조건 : 1(제조업)
#define DEBUG
#define MODE 1
입력 :
추출조건 : 1(제조업)
#define MODE 1
입력 :
추출조건 : 2(서비스업)
#define DEBUG
#define MODE 2
입력 :
추출조건 : 3(통신업)
#define DEBUG
#define MODE 3
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
45
실습시간 – 2 교시
사용자 라이브러리 파일 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
46
사용자 라이브러리 파일 활용

학습개요
 사용자 라이브러리 활용 방법을 이해한다.
 프로그램에서 공통으로 사용되는 부분의 활용방법을
이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
47
사용자 라이브러리 파일 활용

스택을 이용한 문자 변환 처리
 문제 정의
– 후입선출 구조를 가진 스택은 다양한 알고리즘에서 활용되는
중요한 자료 구조중의 하나이다. 그러므로 이러한 스택을
라이브러리 형태로 제공할 필요가 있다. 이 시간에는 이러한
스택 관련 함수를 라이브러리로 구축하고 이 스택 라이브러리를
통해 사용자의 문자열 입력에 대한 역순의 결과를 출력하는
프로그램을 만들어 본다.
– 스택(Stack)
» 모든 데이터의 삽입과 삭제가 한쪽 끝(Top)에서 이루어짐
» 일반적으로 배열을 이용해 구현
» 스택의 중심 활동
 push() : 스택의 맨 위쪽에 데이터 삽입
 pop() : 스택에서 맨 위 데이터 삭제
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
48
사용자 라이브러리 파일 활용
 입/출력 조건
– 입력 조건
» 키보드로부터 받은 문자열
– 출력 조건
» 입력된 문자열의 역순
 관련 함수 및 식
– 1. 문자열 처리는 스택을 이용한 구현한다.
– 2. 스택 관련 함수는 정적 라이브러리로 구축하여 활용한다.
– 3. 스택 관련 함수는 다음과 같은 것을 포함한다.
»
»
»
»
»
»
1.
2.
3.
4.
5.
6.
void push(char data) : 스택에 문자 추가
char pop() : 스택에서 한문자 삭제, 삭제된 값 반환
char top() : 현재 top에 존재하는 데이터 값
int overflow() : Overflow 여부 판단
int underflow() : Underflow 여부 판단
int isempty() : 스택의 빈 상태 여부
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
49
사용자 라이브러리 파일 활용
 알고리즘 (또는 플로우차트)
– 1. 키보드로부터 문자열을 읽어온다.(<string.h>파일의
gets()함수 이용)
– 2. 문자단위로 스택에 push 한다.
» 2.1 문자열에 대한 포인터를 통해 한 문자를 push한다.
» 2.2 문자열에 대한 포인터 값이 NULL이 아닐 때까지 2.1 반복
– 3. 스택으로부터 문자열을 pop해 출력한다.
» 3.1 스택으로부터 한 문자를 pop한다.
» 3.2 pop에 의해 얻어온 문자를 화면에 출력한다.
» 3.3 스택이 비었는지를 비교하여 비어 있지 않은 경우 3.1부터 반복
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
50
사용자 라이브러리 파일 활용

프로그램 작성
 1 단계
– 프로그램의 메인 함수를 401페이지와 같이 작성한 후
reverse.c로 저장하여라.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#include <stdio.h>
#include <string.h> // gets()
①_______________________ // 사용자 라이브러리 함수 헤더 파일 포함
void main(){
char str[80]; // 문자열의 크기를 80바이트로 한다.
char *ps , int result;
ps = str;
// 1.문자열 입력
gets(str);
// 2.스택에 문자열 push
15
// 3.스택에서 문자열 pop
while(*ps != NULL){
16
while(!isempty()){
push(*ps++);
17
result = pop();
}
18
printf("%c",result);
19
}
20
printf("\n");
21 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
51
사용자 라이브러리 파일 활용
 2 단계
– 1 단계의 메인함수에 필요한 사용자 라이브러리 함수를 작성하자.
– 사용자 라이브러리 파일 작성은 스텍을 구현한다.
» 스텍 구현의 헤더파일 : mystack.h
» 스텍 구현 파일
: mystack.c
– 스텍에 대한 헤더파일과 구현 파일은 페이지 402에서 보여준다.
– 이 파일의 빈 부분을 완성하여 프로그램을 작성하자.
①. #include "lib\mystack.h"
②. CAPACITY
③. ITEM item
④. ITEM pop()
⑤. used < CAPACITY
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
52
사용자 라이브러리 파일 활용
 3 단계
– 라이브러리 파일 작성 후 컴파일과 빌드 과정을 거친 후 스텍에
대한 라이브러리 파일을 만든다. (mystack.lib)
– 이 라이브러리 파일과 헤더 파일을 이용해 1 단계에서 만든
reserve.c 파일을 컴파일 하고 실행 결과를 작성하자.
입력 조건
출력 결과
입력 : Computer Software
입력 : System Application
현재 스택이 문자를 대상으로 처리
하고 있다. 이 스택의 처리를 정수
형으로 변형하고 아래와 같은 입력
에 대한 결과를 작성하여라.
입력 : 1 3 5 7 9 11 8 6 5 4 2
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
53
선행 처리기
The End.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
54