최신 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