C 언어 - 박우전 교수 (Prof. PARK's)

Download Report

Transcript C 언어 - 박우전 교수 (Prof. PARK's)

프로그래밍 일반
2001학년도 제2학기 1학년 과목
박우전 (한남대 컴퓨터공학전공)
연구실 : 90706호, Tel : 629-7547
전공 : 프로그래밍언어, 컴파일러
http://ce.hannam.ac.kr/~wjpark
조교 : 김병규 (PL실험실, Tel : 629-7861)
본 슬라이드의 상업적인 목적을 위한
무단 복제를 금함.
2001년 9월 일
교재 파일
1. Visual C++ 사용법 개요: vc++.ppt
2. Unix 사용법 개요: unix.ppt
3. SPARCompiler C 4.0 사용법 개요: sparcC.ppt
2015-07-20
프로그래밍일반
2
Visual C++ 6.0의 실행
바탕화면의 VC++6.0 아이콘을 2번 클릭
or
시작/프로그램/MS VC++6.0/MS VC++6.0 선택
or
…/ProgramFiles/DevStudio/SharedIDE/bin/msdev.
exe
or
확장자가 .dsw인 파일을 2번 클릭
2015-07-20
프로그래밍일반
3
Visual C++6.0 주메뉴, project, workspace
주메뉴: F E V I P B T W H
Visual C++ organizes programming tasks into projects, and
usually each separate program get its own project.
A project is a collection of files that are all used to create
one working, runnable program. (확장자 .dsp)
In addtion, projects themselves are placed in workspaces,
and a workspace can have several projects in it
(you set the “active” project with the Set Active Project
item in Visual C++’s Project menu). (확장자 .dsw)
마우스 우측단추의 Popup 메뉴.
2015-07-20
프로그래밍일반
4
C++ 프로그램 편집
(1) File/New 선택.
(2) VC++ 6.0 이외의 도구를 이용하여 편집.
(3) 기존 Workspace의 .cpp 파일 이용.
(File/Open Workspace)
2015-07-20
프로그래밍일반
5
(1) File/New에 의한 프로그램 편집
File/New 선택.
[new] Files/C++ Source Files 선택 후 OK.
Project/Settings 선택.
[Project Settings]
Settings For/Win32 Debug 또는
Settings For/Win32 Release 중에 하나를 선택한 후
OK. (디버깅 종료 후 최종 버전 컴파일 직전에는
Release 선택)
2015-07-20
프로그래밍일반
6
프로그램 편집
- Build/Build 선택
This . . . . Would you like to create a default
project
workspace? 가 표시되면 (예) 를 선택.
- Build/Execute파일명
- 수정후 다음버젼의 실행요령
File/SaveAs
File/CloseWorkspace 기존workspace닫음
Build/Compile v2.cpp
2015-07-20
프로그래밍일반
7
라이브러리 디렉토리등 경로 추가
Tools/Options [Options]
Directories/Show directories for:
Include files
Library files
선택
Source files
Executable files
Directories: 해당 경로 추가/삭제 후 OK 선택
2015-07-20
프로그래밍일반
8
(2) VC++6.0 밖에서 편집한 프로그램 수정
- Files/Open 선택.
- [열기] 해당위치로 이동
파일형식을 “*.*”로 선택하면 확장자가 .CC인 파일
명도 표시됨.
- 해당파일 선택 후 “열기”를 선택.
글씨색깔, 줄 맞춤 등 되지 않음.
- File/SaveAs 선택.
- [다른 이름으로 저장] 저장위치 선택.
확장자를 .cpp로 하여 새 파일명 입력, 저장.
2015-07-20
프로그래밍일반
9
원시파일과 Workspace
Build [MS Developer Studio]
This build command requires an active project
workspace. Would you like to create a default
project workspace?
yes 선택: 원시파일 위치에 build가 됨.
no 선택: build 취소.
Open된 원시 파일명: default workspace 명칭.
default를 표기 생략으로 번역.
2015-07-20
프로그래밍일반
10
(3) 기존 Workspace의 .cpp파일 편집
File/Open Workspace 선택.
2015-07-20
프로그래밍일반
11
멀티미디어 파일
문서작성기(document system): 텍스트, 도형, 이미지.
(WYSISYG형, non-WYSIWYG형)
예. FrameMaker, MS Word, 한글 97
편집기(editors): 텍스트
Vi, 워드패드, 메모장
.PDF(Portable Document Format)
.PRN(PostScript File)
2015-07-20
프로그래밍일반
12
C++ 프로그램의 컴파일
File/Open Workspace [OpenWorkspace]
Build/Compile 선택: 파일명.obj 생성됨.
Build/Build 선택: 파일명.exe 생성됨.
(컴파일 및 링크)
Build/Rebuild All: 모든 원시파일을 재컴파일, 링크.
2015-07-20
프로그래밍일반
13
컴파일 에러의 예 및 원인 찾기
Syntax error C2065: Undeclared id.
C2143: missing “;” before “{”
- Help/Search 선택 후 Type in the keyword to find:
난에 에러코드를 입력 또는
- 에러코드에 커서를 위치시킨 후 F1키.
- Help/Search에서 함수설명 등을 볼 때 VC++6.0
CD를 넣어야 되는 경우도 있음.
2015-07-20
프로그래밍일반
14
프로그램의 실행
복수 Project 존재시
Project/SetActiveProject로 원하는 Project선택
Build/!Execute 선택
[실행파일명]에서 입력데이타 등 입력.
입력 종료 시 “Press any key to continue”가 표시됨.
한글 MS-DOS 윈도우에서 명령행(Command line)을
이용하여 실행하는 것도 가능.
2015-07-20
프로그래밍일반
15
입출력 재 지정
Project/Settings 선택.
[Project Settings] Debug/Program arguments: 난에
“<입력파일명>출력파일명”을 입력함.
While(EOF != scanf(“%d %d”,&a, %a)
{ ...
}
프로그램 실행시 키보드 입력인 경우 ^Z가 EOF임을
표현.
2015-07-20
프로그래밍일반
16
프로그램 디버깅 (1)
F1: 커서가 위치하는 부분에 대한 도움말 표시.
Help/Contents: Help 디렉토리 구조가 workspace윈
도우
에 표시됨.
Help/Search 선택 [search]에서
Type in the keyword to
find:[
] 에 알고 싶은 단어를
쳐 넣음. 예. printf 또는 컴파일시 error번호 예를
들어 C2653등을 입력하면 설명이 표시됨. (Id: not
a class or namespace name.)
2015-07-20
프로그래밍일반
17
프로그램 디버깅 (2)
- 마우스포인터가 회색바탕에 존재시
편집모드에서 마우스우측버튼을 누르면
각종윈도우 및 툴바의 선택여부가 표시됨.
-
이 때 Browse를 체크하여 선택
Browser 툴바가 표시됨.
Tools/Source Browser : yes누르면 .bsc파일생성됨
[Browse] Identifier난에 변수명 입력후 해당 query선택
(예: Def and References, Call Graph등)
- Browse(Tool Bar)/GotoDefinition (F12)
- Browser/제5메뉴 PopContext
커서가 원터치로 복귀
2015-07-20
프로그래밍일반
18
프로그램 디버깅(3)
F9 키로 BreakPoint 지정후
Build/StartDebug/Go
회색바탕 마우스 우측버튼 Debug [Debug]
우측단추/Variable [Variables]
우측단추/Watch [Watch]
Debug/StepOver 한 개씩 명령수행
BreakPoint 삭제 F9키
2015-07-20
프로그래밍일반
19
복수 Project Workspace
Workspace 윈도우에서 워크스페이스명을 선택
마우스 우측버튼 누름
Add New Project to Workspace
또는 Insert Project to Workspace 에 의해 Project 추
가
예.
first.dsw
first.dsp : by first 출력
second.dsp : by second 출력
first.cpp, second.cpp
2015-07-20
프로그래밍일반
20
복수파일 Project
프로젝트내의 파일/추가는 Workspace 윈도우에서
특정 프로젝트 선택후 마우스 우측버튼을 누르면
Add Files to Project 등이 표시됨.
또는 Project/Add to Project 에서 해당 파일지정
삭제는 Workspace 윈도우에서 해당파일 선택후
Delete키 누름
예.
부전공/pgms/v1.cpp, n_files.cpp
2015-07-20
프로그래밍일반
21
윈도우즈 프로그래밍
Event-driven 프로그래밍 ( 문헌[4]: 330쪽 참조)
Visual C++ 6.0 윈도우즈 프로그래밍
MFC AppWizard[exe] :
winmain을 DevStudio가 생성해줌
Win32 Application:
프로그래머가 winmain 함수를 작성
2015-07-20
프로그래밍일반
22
MFC AppWizard 프로그래밍 과제
Main Window에서
“덧셈으로”를 선택하면 “덧셈” 대화상자 (dialog box)가
“뺄셈으로”를 선택하면 “뺄셈” 대화상자가 표시되게 하며
실행종료를 선택하면 프로그램 실행을 종료하는
MFCAppWizard 형 프로그램을 Single Document 인터페이스
를 사용하여 작성하는 과정을 제출하라. .
2015-07-20
프로그래밍일반
23
대화상자: 덧셈
정수1과 정수2난에 각각 정수값을 입력한후
덧셈반복 버튼을 누르면 두 정수의 합을 계산하여 합난에
표시하고,
뺄셈으로 버튼을 누르면 덧셈대화상자를 닫고
“뺄셈” 대화상자가 표시되게 하며
초기화면 버튼을 누르면 뺄셈대화상자를 닫고
초기화면으로 제어를 넘김.
2015-07-20
프로그래밍일반
24
Projects/MFC AppWizard(exe)
- Projects/MFC AppWizard(exe) 선택 후
Location: 명칭입력
Project name: 디렉토리겸 프로그램명 입력
OK 선택
2015-07-20
프로그래밍일반
25
Projects/MFC AppWizard(exe) (2)
- MFC AppWizard 대화상자 Step 1 Doc. 종류 선택 Next 누름
Step 2 DB 관련 선택 (None) Next 누름
Step 3 복합문서 관련 선택(ActiveX) Next 누름
Step 4 제공 feature 선택 Next 누름
2015-07-20
프로그래밍일반
26
Projects/MFC AppWizard(exe) (3)
Step 5 원시파일 커멘트 생성여부 선택
(Yes, Shared DLL) Next 누름
Step 6 선택사항 종합리스트 표시 및 수정
Finish 선택
OK 선택
- Class (View)를 선택하여 편집을 함
(App, Frame, Doc, View) 클래스 중의 하나를
선택
(보통은 App).
- File (View)를 선택하여 원시프로그램 선택
2015-07-20
프로그래밍일반
27
참고문헌
[1] Steven Holzner, MicroSoft Visual C++ 5,
Sybex Inc., 1997.
[2] Beck Zaratian, Microsoft Visual C++ 6.0 Programmer’s
Guide, Microsoft Press, 1998.
[3] 김용성, Visual C++ 6 완벽가이드, 영진출판사, 1998.
[4] 이상엽, Visual C++ 프로그래밍 바이블 .ver. 6.x,
영진출판사, 1998.
[5] 구익환 역, C 기초플러스, 성안당, 830페이지, 1995. 9. 20.
(원본: Michell Waite and Stephen Prata,
New C Primer Plus )
2015-07-20
프로그래밍일반
28
학과 서버의 사용자 ID 신청할 것
워크스테이션의 도메인 네임: ce.hannam.ac.kr
- 사용자 ID
- 암호:
- PC-B실에서 네트웍을 경유한
학과서버의 사용법 안내
2015-07-20
프로그래밍일반
29
ce의 SPARCompiler C 4.0 사용안내
가. 25인용 라이센스?
컴파일할 때는 반드시 자신의 ID 또는
공통계정unix (암호:
) 를 사용한다.
나. /opt/SUNWspro/bin/cc
1) 자신의 홈디렉토리의 .cshrc파일의 경로 (path)에
/opt/SUNWspro/bin을 추가.
(.cshrc파일 변경이 어려우면 사용자 wjpark의 .cshrc
파일을 복사하여 사용: "cp ~wjpark/.cshrc ."을 수
행후 "source .cshrc"를 수행 )
2) C 원시프로그램의 확장자는 .c 임.
2015-07-20
프로그래밍일반
30
ce의 SPARCompiler C 4.0 사용안내 (계속)
3) SPARCompiler C 4.0 사용법: man cc를 수행하면
화면을 통해 사용자 매뉴얼을 볼 수가 있음. 일반적
으로 "man 명령어"는 그 명령어에 대한 manual을
표시해 줌.
4) cc의 인수(parameters)옵션표시: cc -flags
5) 원시프로그램 prog1.c를 컴파일하여 prog1라는 실행
가능한 목적프로그램으로 변환하기 위한 명령:
cc -o prog1 prog1.c
다. “(개정판) 알기쉬운 C언어" 내의 프로그램
파일: /prof/wjpark/bujon/EasyC 디렉토리
2015-07-20
프로그래밍일반
31
인터넷상의 공지사항 게시 및 통신
- 프로그래밍 일반의 웹 홈페이지:
http://ce.hannam.ac.kr/~wjpark 프일
또는 http://cse.hannam.ac.kr/~wjpark 프일
- 담당교수의 e-mail address:
[email protected]
- 조교 김병규 연락처:
PL 실험실 (629-7861)
2015-07-20
프로그래밍일반
32
제1장 C 언어란?
1.1 C 언어의 유래
Dennis Ritchie in 1972 at AT&T Bell Lab.
1.2 C 언어의 특징
융통성(flexibility)
UNIX 운영체제에서의 주 언어
2015-07-20
제1장 C언어란?
33
1.3 C 언어의 사용
- 프로그램 작성(확장자 .c .cpp .cc)
컴파일
실행
- 프롬트(prompt)
- 오류메세지(error message)
- a.out
2015-07-20
제1장 C언어란?
34
1.4 예제
#include <stdio.h>
main()
{
int num;
/* 함수의 이름 */
/* 빈줄 */
num = 1;
printf(“I am a simple ”);
printf(“computer. \n”);
printf(“I like number %d. \n”, num);
}
2015-07-20
제1장 C언어란?
35
1.5 프로그램 구조와 함수
1.5.1 간단한 프로그램의 구조:
함수는 머리(header)와 본체(body)로 구성된다.
본체 { } 블록(block)
함수 호출문(1_8.c에는 3개)
1.5.2 읽기 쉬운 프로그램
1.5.3 함수
1.6 간단한 예제 프로그램
2015-07-20
제1장 C언어란?
36
제2장 자료와 자료형(data type)
2.3 자료형
값의 집합 및 그 값들에 대한 연산
표2.1 자료형의 종류 (2-5쪽)
2.3.2 비트, 바이트, 워드
부록 A ASCII 코드표
2015-07-20
제2장 자료와 자료형
37
2.4 정수형
Twos Complement Method
1 word = n bits
-2n-1  정수값  2n-1 -1
2.4.4 오버플로
변환지정자 %d
2015-07-20
제2장 자료와 자료형
38
2.5 부동소수형(float type)
7.0과 0.7E1
가수부(fractional part): 0.7
지수부(exponent part): 1
IEEE 754
S
E
부호
지수부
1 : 11 : 20 SPARC Architecture
(예) 37.3의 내부표현: 0x4042a666
(1-2*s)f * 2e 단 0  f  0.5
f를 F로, e를 E로 변환 후 저장
언더플로우란?
2015-07-20
제2장 자료와 자료형
F
가수부
39
2.6 문자형
‘A’ 와 A
95 printable char.s
33 control char.s
‘\007’
0x0a LF
0x0d CR
특수문자 \n, \t, \b, \r, \f, \\, \’, \”
2015-07-20
제2장 자료와 자료형
40
2.7 상수자료형
2.6.3 자료형의 크기
함수 sizeof(자료형명)
2.7.1 상수
2.7.2 상수의 선언
키워드 const
2.7.3 나열형(enumeration)
enum keykey {ASM, AUTO, BREAK};
enum keykey key;
key = AUTO;
값의 부여(default 0부터)
2015-07-20
제2장 자료와 자료형
41
제3장 문자열과 printf( ), scanf( ) 함수
- white space: 공백(blank), 탭, 개행(newline), 주석
- 문자열의 끝은 항상 ‘\0’ (빈문자 또는 null문자)로 끝남.
- 문자열 배열의 크기는 처리하고자 하는 문자열의 길이보다 1
커야함.
- 문자열의 길이: strlen( ) 함수
2015-07-20
제3장 문자열과 printf(), scanf() 함수
42
변환지정자 (conversion spec.)
%d (decimal, 10진수)
%o (octal, 8진수)
%x (hexadecimal, 16진수)
%u (unsigned, 무부호)
%c (character, 문자)
%s (string, 문자열)
%f (fixed-point, 실수)
%e (exponent form, 지수형)
%g (
??
, %f나 %e의 변환의 문자수가 적은쪽)
2015-07-20
제3장 문자열과 printf(), scanf() 함수
43
입출력 관련 사항
- 변환지정자의 개수와 입/출력 항의 갯수비교
- %10.3f의 의미: 10자리 폭을 잡아 소수점 이하 표시를 위해
3자리 할당)
- 키보드 입력의 끝을 말해주는 문자, ^Z
- EOF
2015-07-20
제3장 문자열과 printf(), scanf() 함수
44
출력함수 printf(control, item1, item2, ...)
- 출력항(item)에 따라 변환지정자 d, o, u, s, c, f, e,
g를 사용하여 출력자료를 표시
- 출력 폭(width)의 변경: 기호 * 이용
scanf(“%d”, &width);
printf(“The value: %*d:\n”,width,number);
2015-07-20
제3장 문자열과 printf(), scanf() 함수
45
입력함수 scanf(control, &item1, &item2, . . .)
-제어 문자열내에 있는 변환지정자를 이용하여 출력
자료형 표시
- 입력의 생략: 기호 * 이용
scanf(“%*d %*d %d”, &n);
printf(“The last integer was %d\n”, n);
2015-07-20
제3장 문자열과 printf(), scanf() 함수
46
입출력 예제 프로그램 (chap3.cpp)
#include <stdio.h>
void main()
{ char name[14], ch;
int age, di, oi, xi;
float fl, ex;
unsigned ui;
printf("Input your name and age!\n");
scanf("%s %d", name, &age);
printf("Hi, %s! You are %d years old.\n", name, age);
2015-07-20
제3장 문자열과 printf(), scanf() 함수
47
chap3.cpp (2)
printf("Input three integers (for %%d %%o %%x) and two
real numbers!\n");
scanf("%d %o %x %f %e", &di, &oi, &xi, &fl, &ex);
printf("value of di: %3d\n", di);
printf("value of oi: %3d\n", oi);
printf("value of xi: %3d\n", xi);
printf("value of fl: %10.3f\n", fl);
printf("value of ex: %10.3e\n", ex);
printf("value of fl by %%g: %g\n", fl);
2015-07-20
제3장 문자열과 printf(), scanf() 함수
48
chap3.cpp (3)
printf("Input a positive integer and a character!\n");
scanf("%u %c", &ui, &ch);
printf("ui: %3u\n", ui);
printf("ui by %%c: %3c\n", ui);
printf("ch: %3c\n", ch);
printf("ch by %%u: %3u\n", ch);
}
2015-07-20
제3장 문자열과 printf(), scanf() 함수
49
제4장 연산자와 수식
치환연산자 (=)
대입문:
변수 = 수식
연산자(operators), 연산항(operands)
2항연산자(binary op.s), 단항연산자(unary op.s)
2015-07-20
제4장 연산자와 수식
50
연산자 우선순위 (operator precedence)
예. 4 + 5 * 3의 값?
27
or
19
연산자 결합법칙 (operator associativity rule)
예. 25-17-12의 값? -4
or
20
2015-07-20
제4장 연산자와 수식
51
4.2
%, ++, -- 연산자
Immediate increment
b = ++a는
a = a + 1; b = a; 와 동일
Deferred increment
b = a++는
b = a;
a = a +1; 과 동일
2015-07-20
제4장 연산자와 수식
52
4_108.cpp
main()
{
int i = 0, j = 0;
while(++i <= 3)
printf("%d ", i);
printf("\n");
while(j++ <= 3)
printf("%d ", j);
}
실행결과
1 2 3
1 2 3 4
2015-07-20
제4장 연산자와 수식
53
4.3 수식과 명령문
선언문
치환문
함수(호출)문
while 명령문
2015-07-20
제4장 연산자와 수식
54
4.4 자료형의 변환
묵시적 (implicit) 형변환:
char ch; float fl;
fl = 2.0 * ch + i;
명시적 (explicit) 형변환:
int j;
j = (int)1.6 + (int)1.7;
2015-07-20
제4장 연산자와 수식
55
제5장 문자입출력 함수와 수학함수
5.1 입출력 함수
...
char ch;
ch = getchar( );
putchar(ch);
...
/* 한 문자를 읽어 들인다. */
/* 한 문자를 출력 시킨다. */
시스템 버퍼의 유무, 필요성
2015-07-20
제5장 문자입출력함수와 수학함수
56
5.2 입출력 함수의 응용
sentinel(보초): STOP
#define STOP ‘*’
main( )
{
...
while (ch != STOP){
putchar(ch);
ch = getchar( );
}
}
EOF로 인식하는 문자: [Ctrl - d] in Unix, [Ctrl - z] in PC
2015-07-20
제5장 문자입출력함수와 수학함수
57
5.3 입출력 방향 지정
표기생략 표준 입출력?
< 기호
> 기호
>> 기호
2015-07-20
제5장 문자입출력함수와 수학함수
58
제6장 제어와 선택방법
if 문:
if (E) S1;
if (E) S1 else S2;
switch문:
switch(e) {
case ce1 : S1; break;
...
case cek : Sk; break;
default : Sk+1;
}
각 명령에 대한 순서도 표현?
2015-07-20
제6장 제어와 선택방법
59
if문에서의 모호성 (ambiguity):
if (e1) if (e2) S1 else S2 를 다음 중 어느 것으로
해석해야 하는가?
(가) if (e1) { if (e2) S1 else S2}
(나) if (e1) { if (e2) S1 } else S2
모호성 해결규칙 (resolution rule):
else를 기 출현한 (짝이 없는) 가장 가까운 if 와 대응 시킴.
2015-07-20
제6장 제어와 선택방법
60
6.3 관계연산자와 수식
<
<=
==
>=
>
!=
6.4 논리연산자
&&
||
!
x == 0 일때
x>0 && x<10의 계산
배열 A가 10개의 요소를 가질때
x = 0;
while(x>9 or A[x] == 0)
{x = x + 1;}
...
2015-07-20
제6장 제어와 선택방법
61
6.6 조건부 연산자 ( ?: )
e1 ? e2 : e3 의 의미
3항 연산자 ?:
if (e1) b = true
else b = false;
b = e1;
e1 ? b = true : b = false;
6-23쪽 예2) break의 기능
2015-07-20
제6장 제어와 선택방법
62
제7장 반복문과 배열
while (E) S;
for (e1; e2; e3) S; (반복실행횟수를 미리 예측 가능)
do S while(E);
세가지 반복문의 순서도 작성
종료후에는 각각 !(E), !(e2), !(E) 가 true.
2015-07-20
제7장 반복문과 배열
63
for 문
형식: for (초기화; 조건식; 변경내용) 명령문
for (e1; e2; e3) S ;는
e1; while (e2) { S; e3; }와 동등하다.
제어변수(control variable)
2015-07-20
제7장 반복문과 배열
64
누적치환 연산자
+=,
-=,
*=,
/=,
%=
a = a + b는 a += b와 동등
comma operator: left associative
m = ( k = 100, k+5); 실행후 m == 105
2015-07-20
제7장 반복문과 배열
65
7.7 다른 도구들 break, continue, goto
(1) break: 둘러싸고 있는 반복문의 밖으로 나온후
그 다음 명령문을 수행
(2) continue: switch를 제외한 다른 반복문에서
다음 차례 반복
(3) goto문과 레이블 (label)
label의 사용(참조, 액세스)
label의 정의
2015-07-20
제7장 반복문과 배열
66
7.8 배열 (array)
float debts[20];
20개의 float형 변수 debts[0], debts[1], . . .,
debts[19]
요소형 (component type)
첨자형 (index type)
요소 (의 값, 주소)
대입문의 좌변에도 배열요소 사용가능
(debt[ I ] = debt[ I ] + x
요소사용(참조, 액세스):
배열명 [수식]
2015-07-20
제7장 반복문과 배열
67
제8장 함수와 포인터
함수
Fortran에서의 서브루틴
Pascal에서의 프로시져
procedural abstraction (cf. data abstraction)
블랙박스
대형 프로그램의 공동개발 가능
2015-07-20
제8장 함수와 포인터
68
8.2 함수의 인수
#include <stdio.h>
void P(int* X, int Y) // 함수의 선언, 여기서 X, Y가
// 형식인수 (formal parameters)
{ *X = *X + 4;
Y = *X + Y; }
void main()
{ int a, b;
// if int a=1, b = 2; then printf will print 5 and 2.
scanf("%d %d", &a, &b);
while (a!=0) {
// !=0 는 사족
P(&a, a+b);
// 함수 호출, 또다른 형태는?
// &a, a+b: 실인수 (actual parameters)
// caller: main( ),
callee: P( )
printf("%d \t %d \n", a, b);
scanf("%d %d", &a, &b);
}
}
2015-07-20
제8장 함수와 포인터
69
함수 호출
실인수와 형식인수의 대응: 갯수, 자료형, 값/주소
8.2.3 지역변수와 전역변수
유효범위 (scope) 규칙
8.3 함수의 호출과 반환값 (return value)
return
( 수식 ) ;
8.3.2 반환값의 자료형 = 함수의 자료형
double sum (int n)
...
{
...
}
void형 함수
2015-07-20
제8장 함수와 포인터
70
프로그램 실행과 메모리
코드영역
데이타영역:
실행시간 스택 (runtime stack)
힙 영역 (heap area)
활성레코드: 함수 호출시마다 그 함수의 활성레코드가 실
행시간 스택에 할당된다.
활성레코드에 보관되는 정보:
형식인수 및 지역변수
반환주소 (return address)
스택관련 정보
2015-07-20
제8장 함수와 포인터
71
함수호출의 3단계
1. 실행시간 스택에 활성레코드 확보
2. 실인수의 값/주소 및 반환주소를 활성레코드의 해
당장소에 저장
3. 그 함수의 명령어들을 수행 개시.
함수 종료의 3단계
8.2절의 예제 프로그램 실행시
실행시간 스택의 단계별 변화:
2015-07-20
제8장 함수와 포인터
72
8.4 포인터
값으로서 개체의 주소를 가지는 변수
교환1
8.4.2 포인터 상수 ( & 연산자)
번지(주소)연산자: &
polish = 30;
printf(“%d %u \n”, polish, &polish);
30 36570
2015-07-20
제8장 함수와 포인터
73
8.4.3 포인터 변수 (* 연산자)
포인터 ptr이 가리키는 곳에 저장된 값:
*ptr
* : 간접연산자 또는
dereferencing op.
8.4.4 포인터의 선언
int *pti;
/* pti: pointer to integer */
char *pe;
교환2 (교재254쪽)
2015-07-20
제8장 함수와 포인터
74
chap8.cpp (교재 254쪽 여백)
main( ) {
int a, b, c;
void P( );
a = 3; b = 6; c = 1;
P(7, a + b + c, a); P(a * b, a % b, c);
printf(“%4d %4d %4d\n”,
a, b, c);
}
void P(x, y, z)
int x, y, *z;
{ *z = x + y + *z;
printf(“%4d %4d %4d\n”, x, y, *z);
}
2015-07-20
제8장 함수와 포인터
75
8.4.6 변수의 이름, 주소, 값
값 전달기법 (call by value):
모듈간의 안전성 보장, 시간/기억 장소 소모
주소전달기법 (call by reference):
시간/기억장소 절약, 프로그램 신뢰성 저하
배열을 인수로 전달시 편리.
2015-07-20
제8장 함수와 포인터
76
제9장 변수의 영역
유효범위
scope of identifiers
scope of variables
명칭을 사용할 수 있는 텍스트 상의 범위
2015-07-20
제9장 변수의 영역
77
정의와 선언
명칭의 속성 소개 (1)
명칭에 대한 기억장소 할당 (2)
(1), (2):
(1) or
2015-07-20
정의
(1), (2):
선언
제9장 변수의 영역
78
변수의 종류
자동변수 (automatic variables): 지역변수 (local
variables)
외부변수 (external variables): 전역변수 (global variables)
cf. 비지역변수 (nonlocal
variables)
정적변수 (static variables): 재호출시 이전값 보존.
레지스터 변수 (register variables): 액세스시간 빠른 변수
(예. 제어변수)
2015-07-20
제9장 변수의 영역
79
영역규칙과 수명
변수의 영역규칙:
참조가능범위 / 선언이 여럿일 경우 / 선언후 참조
변수의 수명 (lifetime):
기억장소가 할당되어 있는 시간
외부정적변수 (external static varibles):
동일 화일내에서 사용가능
레지스터변수:
정의는 함수 내부에서, 수명은 해당함수 실행기간
2015-07-20
제9장 변수의 영역
80
9.4 기억장소의 구분
코드영역
테이타 영역 (실행시간스택, 힙)
각 영역에 대한 포인터 명칭.
2015-07-20
제9장 변수의 영역
81
숫자 읽는 함수
프로그램 9_292.cpp
원시프로그램의 이해
프로그램 실행에 따른 (정수 45를 읽을 경우)
실행시간 스택의 변화를 손으로 그려나감.
2015-07-20
제9장 변수의 영역
82
제10장 C-preprocessor
선행처리자
전처리기
cpp
cc(cpp, ccom, as, ld) on unix
2015-07-20
제10장 선행처리자와 그래픽스
83
매크로 (macro)
#define PI 3.1415926
#define PR(x) pritnf(“x is %d. \n”, x)
#include <stdio.h>
#include <“ . . . ”>
/* /usr/include */
교재 311쪽 여백 포함관계 설명
#ifdef MAVIS
...
#else
...
#endif
조건부 컴파일 (conditional compile)
2015-07-20
제10장 선행처리자와 그래픽스
84
10.5 비트별 논리 연산자
~ complement (cf. !)
& AND
(cf. &&)
| OR
(cf. ||)
^ exclusive OR
bp << i
bp >> j
left-shift
right-shift
(a >> 8) & 0xffff
(a: 32-bit)
함수 itob( )
2015-07-20
제10장 선행처리자와 그래픽스
85
제11장 배열과 포인터
11.1.2 배열의 선언
float rain[365];
부동소수형 1차원 배열, 그림표현은?
rain[0], . . ., rain[364]
형식: 자료형 배열명 첨자정보;
float score[STUDENT][SUBJECT];
score[i][j] 의 의미는?
i+1 번째 학생의 j+1번째 과목의 점수
자동배열과 레지스터배열은 초기화 불가
2015-07-20
제11장 배열과 포인터
86
11.2 배열과 포인터
배열명은 첫번째 원소의 기억장소에 대한 주소
T1 flizny[N];
flizny == &flizny[0]
포인터 상수 (pointer constant)
int dates[4], *pti, index;
pti + index의 값과 pti 값의 차이는?
11_345.cpp, 교재 345쪽 보조그림
2015-07-20
제11장 배열과 포인터
87
11.2.2 포인터 변수와 포인터 상수
dates + 2 == &dates[2]
*(dates + 2) == dates[2]
11.3.1 함수사이의 배열전달
배열의 각 원소 대신 그 포인터(주소)만을 전달하여
callee에서 배열을 이용할 수 있게 한다.
예. 11_348.cpp
2015-07-20
제11장 배열과 포인터
88
11.5 포인터 연산
프로그램 11_352.cpp의 실행결과:
교재 334쪽의 보조그림을 이용하여 설명
포인터 연산: 프로그램의 신뢰도를 저하시킴.
Java 언어에서는 포인터 기능을 제거.
2015-07-20
제11장 배열과 포인터
89
11.6 Multi-dimensional array
다중 배열
다차원 배열
static float rain[5][12];
행(row)과 열(column)의 개념.
2015-07-20
제11장 배열과 포인터
90
배열의 기억장소 할당
row major order (또는 column major order)에 의한
할당
M[I1][I2]. . .[In]의 기억장소 할당은 어떻게?
int zippo[4][2];
교재 360쪽 하단 3행 “포인터의 포인터”:
교재 361쪽 보조그림을 이용하여 설명
2015-07-20
제11장 배열과 포인터
91
11.7.2 배열포인터와 포인터 배열
int (*pz)[2];
/* Pointer to array */
int *pax[2];
integer) */
/* Array of pointers (to
2015-07-20
제11장 배열과 포인터
92
제12장 문자열과 문자열 함수
12.1 문자열의 정의
‘\0’로 끝나는 1차원 문자배열
char *m3 = “\nEnough about me -- What’s your
name?”;
static char *mytal[LIM] = {“Adding numbers
swiftly”, . . .,
Understanding the C
language”};
교재 382쪽 문자열의 배열 mytal에 대한 보조 그림 설명
2015-07-20
제12장 문자열과 문자열 함수
93
문자열 상수와 문자열의 초기화
12.1.1
“\“Run, Spot, run ! \” Said Dick \n”
main( )
{ printf(“%s, %u, %c \n”, “We”, “love”, *”flgs”); }
의 출력:
We, 34, f
12.1.2 문자열의 초기화:
1. 배열처럼 초기화
2. 포인터 이용 초기화
2015-07-20
제12장 문자열과 문자열 함수
94
12.2.2 gets( ) 함수
키보드로부터 한줄 (‘\n’ 문자를 만날때까지의 문자
열)의 문자열을 읽어들여 저장.
자동으로 ‘\0’(null) 문자가 끝에 들어감.
gets(name) 또는 ptr = gets(name)
gets는 a pointer to char 를 반환
scanf( ) 함수: white space가 아닌 문자부터 시작해
서 다음 공백이 읽혀지기까지 읽어들임.
2015-07-20
제12장 문자열과 문자열 함수
95
12.3 문자열의 출력
puts(s1);
한줄의 문자열 출력후 자동적으로 줄을 바꿈.
S1은 어떤 것들이어야 하는가?
printf(“%s \n”, string);
== puts(string)
while(*string != ‘\0’) putchar(*string++);
에서 !=‘\0’는 redundant
2015-07-20
제12장 문자열과 문자열 함수
96
12.4 문자열 함수
strlen(string):
문자열 string의 길이를 반환하는 함수
strcat(a, b):
문자열 a 다음에 문자열 b를 연결시켜 새로운 문자열을
만들고, 그것을 문자열 a로 만듦.
Concatenation op.
결합법칙은 성립하지만: (a • b) • c == a • (b • c)
교환법칙은 성립 안함: a • b != b • a
%cat 파일명 (UNIX 에서)
2015-07-20
제12장 문자열과 문자열 함수
97
문자열 함수 (2)
strcmp(“apples”, “apple”)
strcpy(a, b); // a  b
12.6 command-line argument
프로그램의 인수
명령행 인수
명령 “cat apple pear banana”에서
포인터 배열 argv와
인수갯수 argc 설명
연습: pm.cpp의 컴파일 및 실행
(pm p는 2수를 더해서 인쇄하고 pm m은 2수의 차를
인쇄)
2015-07-20
제12장 문자열과 문자열 함수
98
제13장 구조와 기타자료형
13.2 구조의 정의
struct book {
char title[MAXTIT];
char author[MAXAUT];
float value;
};
struct book libry;
교재 424쪽 보조그림
구조형 명칭 / 구조변수 / 멤버
2015-07-20
제13장 구조체
99
구조의 멤버 사용
libry.value,
libry.title[0]
“.” (membership op.)
구조의 배열: 교재 430쪽 libry[MAXBKS] 보조그림
구조내의 구조: 435쪽 변수 fellow 보조그림
fellow.handle.first == (fellow.handle).first 이므로
struct member op.는 left associative.
2015-07-20
제13장 구조체
100
구조의 포인터
struct guy *him;
//438쪽
13.6.2 포인터를 이용하여 멤버 취하기 (439쪽)
(1) him  income
(2) (*him).income
: indirect membership op.
2015-07-20
제13장 구조체
101
13.8 기억장소의 절약
(1) 동일한 기억장소를 두 객체가 공유.
서로 다른 시간에 나누어 쓰는 것.
공용체(union).
(2) 한 바이트내에 복수개의 객체를 저장
(비트) 필드 (bit field)
(3) 필요할 때만 기억장소 할당
동적기억장소 할당 (함수 malloc 이용)
2015-07-20
제13장 구조체
102
union
union holdem{
int digit;
double bigfl;
char letter;
};
union holdem fit;
변수 fit의 그림표현은?
변수 fit의 기억장소의 크기는?
448쪽의 공용체 배열 product의 원소:
보조그림 설명
product[i].price.ivalue의 의미.
2015-07-20
제13장 구조체
103
자료형 분류
13.8.2 필드(field): 450쪽 제11행
13.9 자료형의 분류
기본자료형 (또는 내장자료형: built-in type)
사용자 정의 자료형 (user-defined type)
(무명) 포인터/배열/함수 자료형
(교재에 주어진 파생자료형은 OOP의 그것과 혼동소
지)
typedef A B 에서 새로 정의되는 자료형은?
typedef char *STRING 에서 새로 정의되는 자료형은?
char (*famp)( );은 무슨 자료형인가?
2015-07-20
제13장 구조체
104
추상자료형과 객체지향 프로그래밍
1970
ADT type = values + operations
1980
OOP type의 계층구조 허용 (파생클래스)
OOP = ADT + inheritance
2015-07-20
제13장 구조체
105