1. Introduction

Download Report

Transcript 1. Introduction

C Programming Language
Contents
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
Chapter
01
02
03
04
05
06
07
08
09
10
C언어의 개요
C언어의 기본구성
기본 데이터 타입
기본 입출력
연산자
프로그램 제어문
함수
배열
포인터
문자열
[1]
비트교육센터
Contents
Chapter
Chapter
Chapter
Chapter
Chapter
11
12
13
14
15
구조체와 사용자 정의
파일 I/O
메모리 관리
매크로와 전처리기
C 라이브러리
Appendix A 구조적 시스템 개발 방법론
Appendix B 개발 도구 사용법
[2]
비트교육센터
Chapter
01
C언어의 개요
C언어의 소개(I)
C언어란?
- UNIX 운영체제를 설계하는 과정에서 탄생
- 상위수준의 프로그래밍 언어
직접적인 의사소통 불가능
X
C언어
Compiler
기계어
컴파일러를 통한
간접적인 의사소통 가능
O
[4]
비트교육센터
C언어의 소개(II)
C언어의 특징
-
문법이 간결하다
효율적인 언어이다
강력하고 유연하다
이식성이 좋다
절차식 언어이다
C언어의 사용
-
UNIX운영체제 및 컴파일러
게임 및 영화제작(특수효과)
마이크로프로세서 프로그래밍
임베디드 시스템(Embedded System)
[5]
비트교육센터
프로그래밍 과정(I)
1. 프로그램 목적 정의
2. 프로그램 설계
3. 소스 코드 작성
4. 컴파일 & 링크
5. 프로그램 실행
6. 프로그램 검사와 디버그
7. 프로그램 유지와 보수
[6]
비트교육센터
프로그래밍 과정(II)
hello.h
hello.obj
Compiler
hello.exe
Linker
hello.c
목적 파일(*.obj)
실행 파일(*.exe)
소스 파일과 헤더 파일
(*.c & *.h)
라이브러리 파일
[7]
비트교육센터
Chapter
02
C언어의 기본 구성
첫 만남, Hello, World~!
/* HelloWorld.c */
#include <stdio.h>
int main(void)
{
printf(“Hello, World~!\n”);
return 0;
}
[9]
비트교육센터
프로그램 기본 요소들(I)
#include 지시자와 헤더파일
– #include문을 이용하여 헤더파일과 같은 특정 파일의 전체 내용을 그대로 붙여 넣
는 효과를 나타낸다.
– 헤더파일에는 상수가 정의되어 있거나, 함수 이름과 사용 방법에 대한 내용 등의 정
보가 존재한다.
main()함수
– 모든 C프로그램의 시작과 끝
– 반드시 존재해야 하며 단 한번만 사용 가능하다.
중괄호, 몸체, 블록
– 함수 몸체의 시작과 끝을 나타낸다.
– 여러 문장을 하나의 단위(블럭)로 모으는데 사용된다.
[10]
비트교육센터
프로그램 기본 요소들(II)
선언(변수와 상수)
– 식별자를 사용하여 컴퓨터 메모리상의 특정 위치에 연결하여 값을 저장하도록 한다.
함수
– 모든 C프로그램은 여러 개의 함수로 구성되어 진다.
– 필요한 기능들의 함수 정의 및 호출로 프로그램을 구성한다.
연산자
– 계산을 지시하는 기호
– 기본적인 대입, 논리, 산술 연산자 이외에 포인터를 비롯한 복잡한 연산자들이 있다.
[11]
비트교육센터
프로그램 기본 요소들(III)
반환문
– 일반 함수에서의 반환문은 함수의 종료를 뜻하며 호출한 영역으로 특정 값을 반환
한다.
– main()함수에서의 반환문은 프로그램의 종료를 뜻하며 운영체제로 특정 값을 반환
한다.
주석
– 이해하기 쉽도록 설명을 위한 문자열을 프로그램 중간중간에 작성한다.
–
–
–
–
코드를 임시적으로 삭제할 목적으로도 사용된다.
프로그램의 실행에 아무런 영향을 미치지 않는다.
단일 라인의 주석 처리 : //
다중 라인의 주석 처리 : /* 와 */
[12]
비트교육센터
프로그램 기본 요소들(IV)
키워드(ISO/ANSI C)
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
[13]
비트교육센터
Chapter
03
기본 데이터 타입
데이터 타입
구분
타입
기본형
정수형
소수점 이하를 가지지 못하는 숫자 타입
문자형
문자 하나를 표현하는 데이터 타입
실수형
소수점 이하를 가지는 숫자 타입
void형
타입이 정해지지 않은 자료형
열거형
변수가 가질 수 있는 가능한 값의 목록을 나타내는 타입
유도형
설명
배열
같은 타입을 갖는 변수들의 집합
구조체
다른 타입을 갖는 변수들의 집합
공용체
다른 타입의 데이터를 하나의 메모리 공간으로 관리하는 타입
포인터
대상체의 주소를 가리키는 타입
함수형
함수의 주소를 가리키는 타입
[15]
비트교육센터
정수형 데이터 타입(I)
정수형
– 정수란 부호는 있고 소수점 이하를 갖지 않는 숫자를 표현하고 저장할 수 있는 데이
터 타입
부호
크기
(바이트)
short int
O
2
-332768 ~ 32767
int
O
4
-2147483648 ~ 2147483647
long int
O
4 이상
-2147483648 ~ 2147483647
unsigned short int
X
2
0 ~ 65535
unsigned int
X
4
0 ~ 4294967295
자료형
표현 범위
* 시스템 및 컴파일러에 따라서 표현 가능한 데이터의 범위가 달라진다.
[16]
비트교육센터
정수형 데이터 타입(II)
정수형 변수 선언
int num;
int a, b, c;
int age = 30;
//한 문장에서 3개의 변수 선언
//선언과 동시에 초기화
정수값의 출력
– printf()함수의 서식 문자 %d, %o, %x 등을 이용하여 출력
printf(“I am %d years old. \n”, age);
printf(“I am %o years old. \n”, age);
printf(“I am %x years old. \n”, age);
[17]
비트교육센터
문자형 데이터 타입
문자형
–
–
–
–
–
하나의 문자 혹은 하나의 기호를 표현하고 저장하는 데이터 타입
저장할 수 있는 값의 범위 : -127 ~ 128 (정수값의 표현이 가능)
표준 ASCII 코드(0 ~ 127) 사용
문자의 표현시 반드시 작은 따옴표(‘ ’)로 묶어준다
출력되지 않는 문자(Escape Sequences)를 사용한다
문자형 변수 선언
char grade;
char gradeA = ‘A’, gradeB = 66;
//선언과 동시에 초기화
문자값의 출력
– printf()함수의 서식 문자 %c를 이용하여 출력
printf(“My grade is %c. \n”, gradeA);
printf(“Your grade is %c. \n”, gradeB);
[18]
비트교육센터
실수형 데이터 타입(I)
실수형
– 소수점 이하를 가지는 실수를 표현하고 저장하는 데이터 타입
크기
(바이트)
정밀도
float
4
6자리
3.4*10-37 ~ 3.4*1038
double
8
15자리
1.7*10-307 ~ 1.7*10308
8 이상
15자리이상
자료형
long double
표현 범위
1.2*10-4391 ~ 3.4*104392
* 시스템 및 컴파일러에 따라서 표현 가능한 데이터의 범위가 달라진다.
[19]
비트교육센터
실수형 데이터 타입(II)
실수형 변수 선언
float a = 10, b = 20;
double percent = a/100;
double c = 0.3;
실수값의 출력
– printf()함수의 서식 문자 %f, %e, %a, %lf, %le 등을 이용하여 출력
printf(“percent is %f. \n”, percent);
printf(“percent is %e. \n”, percent);
printf(“percent is %a. \n”, percent);
printf(“a : %f , b : %e \n”, a, b);
[20]
비트교육센터
데이터 타입의 크기
특징
– 데이터 타입의 크기는 시스템이나 운영체제, 컴파일러마다 달라질 수 있다.
– 타입간의 크기 순서는 정해져 있다.
1  sizeof(char)  sizeof(short)  sizeof(int)  sizeof(long)
sizeof(float)  sizeof(double)  sizeof(long double)
– sizeof 연산자를 이용하여 자료형의 크기를 확인할 수 있다.
[21]
비트교육센터
데이터 타입의 변환(형 변환)
암시적 형 변환(자동 형 변환)
– 연산자를 기준으로 하여 왼쪽의 데이터와 오른쪽의 데이터의 타입이 서로 다른 경
우에 연산을 수행하기 위하여 발생하는 형 변환
– Type Promotion(형 승격)
동일 종류의 데이터 타입에 대해 타입의 표현 범위가 큰 쪽으로 타입을 변환한다.
(예) bool, char, short -> int
– Standard Type Conversion(표준 형 변환)
기본 데이터 타입간의 가능한 형 변환을 이용하여 찾는다.
(예) int <- -> double
명시적 형 변환(강제 형 변환)
– 프로그래머의 명시적인 선언에 의해서 발생하는 형 변환
(예) float f = (float)100;
[22]
비트교육센터
변수와 상수(I)
변수란?
– 데이터를 저장할 수 있는 메모리 공간에 붙여진 이름
– 데이터 값이 필요에 따라 바뀐다.
– 데이터의 종류에 따라 정수형, 문자형, 실수형, 포인터, 구조체 변수 등으로 나눌 수
있다.
변수의 선언방법
– 필요로 하는 타입을 선택한다.
– 유효한 문자들로 변수 이름을 선택한다.
– 다음과 같은 형식으로 선언한다.
타입이름
변수이름;
– 쉼표를 사용하면 같은 타입의 변수를 하나 이상 선언할 수 있다.
– 선언문에 변수를 초기화할 수 있다.
– 전역 변수인 경우 초기화를 하지 않으면 0으로 초기화된다.
[23]
비트교육센터
변수와 상수(II)
상수란?
– 변하지 않는 데이터를 의미한다.
– 데이터의 종류에 따라 정수형 상수, 문자형 상수, 실수형 상수 등으로 나눌 수 있으
며, 이름이 있는 상수와 이름이 없는 상수로 나눌 수 있다.
상수의 선언
int a = 123;
char gradeA = ‘A’
double d = 3.141592
//123이라는 숫자값이 정수형 상수
// A라는 문자값이 문자형 상수
// 3.141592라는 값이 실수형 상수
const int MAXLEN = 20;
//MAXLEN이라는 이름과 20이라는 값을 갖는 정수형 상수
const double PI = 3.141592
//PI라는 이름과 3.141592라는 값을 갖는 실수형 상수
[24]
비트교육센터
Chapter
04
기본 입출력
스트림
스트림이란?
– C프로그램에서 데이터의 흐름
– 바이트들이 순서대로 입출력 되는 논리적인 장치
– 내부에 입출력 버퍼를 갖고 있어 자동으로 관리됨
– <stdio.h> 파일에 선언됨
Keyboard
Camera
& etc.
입력 스트림
Program
[26]
출력 스트림
Monitor
File
Printer
& etc.
비트교육센터
단일 문자 표준 입출력
단일 문자 입력
– getchar()
– 표준 입력 스트림(stdin)으로부터 한 문자를 입력받아서 반환해주는 함수
단일 문자 출력
– putchar()
– 표준 출력 스트림(stdout)으로 한 문자를 출력하는 함수
#include <stdio.h>
int getchar(void);
int putchar(int c);
//오류가 발생하거나 입력의 끝을 만나게 되면 EOF를 반환
[27]
비트교육센터
문자열 표준 입출력
문자열 입력
– gets()
– 표준 입력 스트림(stdin)으로부터 문자열을 입력받아서 반환해주는 함수
– 문자들을 읽어들이다가 개행 문자(\n)를 만나면 개행문자 대신 널문자(\0)를 붙여
서 프로그램에게 반환
문자열 출력
– puts()
– 표준 출력 스트림(stdout)으로 문자열을 출력하는 함수
– 문자들을 출력하다가 널(\0)문자를 만나면 널문자대신 개행문자(\n)를 붙이고 출
력을 끝낸다.
#include <stdio.h>
char* gets(char* s);
int puts(const char* s);
//오류가 발생하거나 입력의 끝을 만나게 되면 EOF를 반환
[28]
비트교육센터
서식화된 문자열 표준 출력(I)
서식화된 문자열 출력
– printf()
– 인수로 주어지는 문자열 및 변수의 데이터, 상수 등의 데이터를 서식화하여 표준 출
력하는데 사용하는 함수
– 변환 지정자를 사용하여 서식을 정의
– 출력되지 않는 특수문자의 출력이 가능
#include <stdio.h>
int
printf
(const char *format, ...);
[29]
비트교육센터
서식화된 문자열 표준 출력(II)
printf()를 위한 변환 지정자와 출력결과
지정자
출력결과
%a, %A
부동소수점 수, 16진수
%c
단일 문자
%d, %i
부호 있는 10진수 정수
%e
부동소수점 수, e표기법, %E : 부동소수점 수, E표기
%f
부동소수점 수, 소수점 표기
%g, %G
값에 따라서 %f혹은 %e, %E를 사용
%o
부호 없는 8진 정수
%p
포인터
%s
문자열
%u
부호 없는 10진 정수
%x, %X
부호 없는 16진 정수
%%
퍼센트 기호 출력
[30]
비트교육센터
서식화된 문자열 표준 출력(III)
printf()를 위한 변환 지정 수정자
– 기본적인 변환 지정자의 서식에 적절한 옵션(수정자)를 넣어서 필드의 폭이나 정렬,
자릿수 등을 바꿀 수 있다.
수정자
플
래
그
출력결과
-
데이터의 왼쪽 정렬
+
부호 있는 값의 경우, 양수면 양의부호, 음수면 음의 부호와 함께출력
공백
부호 있는 값의 경우, 양수면 공백, 음수면 음의 부호와 함께출력
#
변환 지정자에 대한 대체 형식으로 #이 부동소수점 형식에서 사용될 경우,
소수점 뒤에 아무것도 없더라도 소수점 이하가 출력되는 것을 보장
0
숫자 형식에서 사용될 경우 앞자리의 공백을 0으로 채워서 자릿수 보장
숫자
최소 자리 크기를 지정
.숫자
정밀도 지정. %e, %E, %f 에서는 소수점 오른쪽에 출력될 자릿수를 나타
내고, %g, %G 에서는 유효 자릿수의 최대값, %s에서는 출력될 문자의 최
대 개수, 정수 변환 지정자에서는 보여지게 될 수의 최소 자릿수를 의미
l
정수 변환 지정자와 함께 사용하여 long int, unsigned long int로 출력
L
부동소수점 수 변환 지정자와 함께 사용하여 long double로 출력
[31]
비트교육센터
서식화된 문자열 표준 입력(I)
서식화된 문자열의 표준 입력
– scanf()
– 사용자로부터 데이터를 입력받는 기본 함수
– printf()와 거의 동일한 변환 지정자를 사용하여 데이터의 타입(서식)을 정의하여 표
준 입력을 수행
– 입력된 정보를 분리하는데 공백문자(개행문자, 탭, 빈칸) 이용
#include <stdio.h>
int
scanf
(const char *format, ...);
[32]
비트교육센터
서식화된 문자열 표준 입력(II)
scanf() 사용 규칙
– 읽어올 데이터의 타입이 기본 데이터 타입중 하나라면 변수 이름 앞에 &를 붙인다.
– 읽어올 데이터의 타입이 문자 배열이라면 변수 이름 앞에 &를 붙이지 않는다.
– %s 지정자를 사용하여 문자열을 읽을 때 공백이 포함되어 있으면 공백 바로 전까지
만을 하나의 문자열로 인식한다.
[33]
비트교육센터
연습문제
1. 사용자로부터 단일문자를 입력 받아서 그 문자의 아스키 코드의 값을 출력하는 프로그
램을 구현하시오.
2. 두개의 수를 입력받고 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)의 결과를 출력하는 프로그램
을 구현하시오.
3. fflush()함수의 용도를 알아보시오.
4. 사용자로부터 1문자를 입력받아서 그 문자가 대문자(A-Z)이면 1을, 소문자 (a-z)이면
2를, 숫자(0-9)이면 3을 출력하고 그 이외의 문자라면 0을 출력하는 프로그램을 구현해
보자.(EOF가 되었을 때 프로그램을 종료)
5. A-Z의 아스키 코드 값을 구하시오.
[34]
비트교육센터
Chapter
05
연산자
연산자의 종류
연산자 종류
연산 기호
특징
산술 연산자
+, - , *, / , %
증감연산자
++, --
대입연산자
=, -=, +=, …
비교 연산자
<, <=, >, >=, ==,!=
연산 결과가 참이면 1을 거짓이면 0
논리 연산자
&&, ||, !
연산 결과가 참이면 1을 거짓이면 0
비트 연산자
&, |, ~, ^
변수 자체의 논리가 아닌 각 비트별 논리 연산
쉬프트 연산
<<, >>
간접 연산자
*
피 연산자의 값이 메모리 주소일 때 유효하다.
주소 연산자
&
해당 변수가 할당된 주소를 확인
형변환 연산자
(변환할 type)
구분 연산자
. , ->
조건 연산자
조건?처리1:처리2
기타
(),[],{}
%(나머지) 연산자는 피연산자로 정수형이 온다.
단항 연산자로 피연산자의 위치에 따라 차이가 있다.
우항의 연산결과를 좌항의 변수에 대입한다.
비트 단위의 쉬프트로 기본적으로 빈 곳은 0을 채움
명시적 형변환에 사용된다.
구조체나 공용체 처럼 변수와 멤버사이의 구분자
조건이 참이면 처리1을 거짓이면 처리2를 수행
괄호 연산자는 우선순위가 가장 높다.
[36]
비트교육센터
산술연산자
산술 연산자
– 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 수행하는 가장 기본적이며 자주 사용하는
연산자
연산자
우선순위
의미
결합방식
()
1
+,-(단항)
2
양수, 음수
오른쪽 -> 왼쪽
*,/,%
3
곱셈, 나눗셈,나머지
왼쪽 -> 오른쪽
+,-(이항)
4
덧셈, 뺄셈
왼쪽 -> 오른쪽
왼쪽 -> 오른쪽
[37]
비트교육센터
증감연산자
증감 연산자
– 피연산자를 1씩 증가 혹은 감소 시키는 단항 연산자
– 연산자의 위치에 따라 증감의 시점이 달라지게되어 수식내에서 사용시에 주의해야
한다
연산자
의미
++a
값을 1 증가 후 연산 수행
a++
연산을 수행 후 값을 1 증가
--a
값을 1 감소 후 연산 수행
a--
연산을 수행 후 값을 1 감소
[38]
비트교육센터
대입연산자
기본 대입 연산자 (=)
– 우변값을 좌변값에 대입하는 연산
int num1, num2 = 0;
num1 = 100;
num1 = num1 + 20;
num1 = num1 + num2;
기타 대입 연산자(+=, -=, *=, /=, %=, %=)
– 기본 대입 연산자와 산술 연산자가 합해져서 다양한 형태의 대입 연산자를 정의
a
a
a
a
a
+= b;
-= b;
*= b;
/* = b;
%= b;
//
//
//
//
//
a
a
a
a
a
=
=
=
=
=
a
a
a
a
a
+ b;
- b;
* b;
/ b;
% b;
[39]
비트교육센터
비교연산자(관계연산자)
비교 연산자
– 좌변값과 우변값을 비교하여 누가 큰지, 작은지, 같은지, 같지 않은지 등의 관계를
알려주는 연산자
– 비교 조건이 만족되면 true(=1), 만족하지 못하면 false(=0)를 반환
연산자
<
의미
좌변값이 우변값보다 작은가?
<=
좌변값이 우변값과 같거나 작은가?
==
좌변값과 우변값이 같은가?
>=
좌변값이 우변값과 같거나 큰가?
>
좌변값이 우변값보다 큰가?
!=
좌변값과 우변값이 같지 않은가?
[40]
비트교육센터
논리연산자
논리연산자
– 둘 이상의 비교(관계)식을 결합하는 연산자
연산자
의미
&&
논리곱 : AND
피연산자가 모두 true일 경우 true를 반환
||
논리합 : OR
피연산자 중 하나라도 true이면 true를 반환
!
부정 : NOT
피연산자가 true면 false를, 피연산자가 false면 true를 반환
[41]
비트교육센터
비트 논리 연산자(I)
비트단위 논리 연산자
– 비트 단위(0 또는 1)로 연산을 할 때 사용하는 연산자
– 정수 타입 데이터들만 사용할 수 있다 (char타입 포함)
연산자
의미
~
비트단위 부정(NOT)
1은 0으로, 0은 1로 반전시켜 반환
&
비트단위 논리곱(AND)
두개의 비트가 모두 1일때 1을 반환
|
비트단위 논리합(OR)
두개의 비트 중 하나라도 1이면 1을 반환
^
비트단위 배타적 논리합(Exclusive OR : XOR)
두개의 비트가 서로 다를 경우에 1을 반환
[42]
비트교육센터
비트 논리 연산자(II)
비트단위 논리 연산자의 사용
– 마스크 : 특정 비트들은 가리고 몇 개의 비트들의 값만 사용하고 싶을 때
– 비트켜기 : 특정 비트들만을 1로 설정해서 사용하고 싶을 때
– 비트끄기 : 특정 비트들만을 0으로 설정해서 사용하고 싶을 때
– 비트 토글 : 모든 비트들을 0은 1로, 1은 0으로 토글시키고 싶을 때
[43]
비트교육센터
비트 시프트 연산자
비트 시프트 연산자
– 비트를 왼쪽에서 오른쪽으로, 혹은 오른쪽에서 왼쪽으로 이동시키는 연산자
연산자
의미
<<
왼쪽 시프트 연산자
왼쪽 피연산자의 값의비트들을 오른쪽 피연산자가 나타내는 자
리 개수만큼 왼쪽으로 이동
>>
오른쪽 시프트 연산자
왼쪽 피연산자의 값의비트들을 오른쪽 피연산자가 나타내는 자
리 개수만큼 오른쪽으로 이동
– 예: 정수 15의 왼쪽으로 2자리 이동(15 << 2)
00000000 00000000 00000000 00001111
00000000 00000000 00000000 0000111100
[44]
결과 : 60
비트교육센터
변환연산자(캐스트연산자)
변환 연산자
– 수식내에서 변수의 데이터 타입을 강제로 변환시키는 연산자(명시적 형변환)
– 표기법 :
(타입)변수
int a;
double b = 10.25;
a = (int)b; //b의 실수값이 정수형으로 변환된 후 a에 대입된다.
[45]
비트교육센터
조건연산자
조건연산자
– if~else문의 효과를 내는 연산자
– 피연산자를 3개 취하기 때문에 삼항연산자라고도 불린다
– 표기법 :
조건 ? 값1 : 값2
int a = 10, b;
b = (a > 0) ? 1 : 0; //a의 값이 0보다 크면 1을, 그렇지 않으면 0을 대입
a = (b == 1) ? 1 : 0; //b의 값이 1이면 1을, 그렇지 않으면 0을 대입
[46]
비트교육센터
연습문제
1. 사용자로부터 두개의 수를 입력받은 후 첫번째 수를 두번째 수로 나눈 나머지를 구하는
프로그램을 구현하시오.
2. 사용자로부터 하나의 정수를 입력 받아서 그 수의 제곱수를 출력하는 프로그램을 구현
하시오.
3. 사용자로부터 하나의 정수를 입력 받아서 그 수를 왼쪽으로 3자리 시프트 연산한 결과
를 출력하는 프로그램을 구현하시오.
4. 하나의 숫자를 입력받아서 오른쪽에서 3번째 자리의 비트가 0인지 1인지를 알려주는
프로그램을 구현하시오
5. 사용자로부터 하나의 숫자를 입력 받아서 0xF120으로 ^연산을 한 값과 다시 ^연산을
한 값을 출력하는 기능을 구현하시오.
6. 사용자로부터 두개의 수를 입력받은 후 두 수의 부호에 따라 메시지를 출력하는 프로그
램을 구현하시오. (조건연산자 사용)
- 두수 모두 양수 : 모두 양수입니다.
- 그렇지 않은 경우 : 모두 양수는 아닙니다.
[47]
비트교육센터
Chapter
06
프로그램 제어문
프로그램 제어문
조건에 따른 분기와 점프
: 주어진 조건에 따라 다음에 오는 명령의 실행 여부를 결정하여 상황에 따라 다르게
동작시키는 문장
– if문
– switch문
– goto문
반복문
: 비슷한 형태의 문장들을 여러 번 반복해서 실행하는 문장
– while문
– do while문
– for문
– continue & break
[49]
비트교육센터
if문(I)
if (condition1)
statement1;
else if (condition2)
statement2;
else
statement3;
condition1
false
true
condition2
false
true
•
condition1이
true면 statement1을
false면 condition2를 검사한다
•
condition2가
true면 statement2를
false이면 statement3을 수행한다.
statement1
[50]
statement2
statement3
비트교육센터
if문(II)
다양한 if문의 형태
if (condition)
statement1;
if (condition1)
if (condition3)
statement4;
else
statment5;
else if (condition2)
if (condition4)
statement6;
else
statement7;
else
statement3;
if (condition)
statement1;
else
statement2;
if (condition1)
statement1;
else if (condition2)
statement2;
else
statement3;
[51]
비트교육센터
switch문(I)
switch (n)
{
case value1 : statement1;
break;
case value2 : statement2;
break;
default :
statement3;
}
value1
other value
value2
statement1
•
n =?
statement2
statement3
n의 값이
value1이면 statement1을 수행한다.
value2이면 statement2을 수행한다.
other value면 statement3를 수행한다.
[52]
비트교육센터
switch문(II)
switch문의 형태
char ch = ‘A’;
switch(ch)
{
case ‘A’ : printf (“A...\n”);
break;
case ‘B’ : printf (“B...\n”);
break;
case ‘C’ : printf (“C...\n”);
break;
case ‘D’ : printf (“D...\n”);
break;
default : printf (“다른문자!!\n”);
}
char ch = ‘A’;
switch(ch)
{
case ‘A’ : printf (“A...\n”);
case ‘B’ : printf (“B...\n”);
case ‘C’ : printf (“C...\n”);
case ‘D’ : printf (“D...\n”);
default : printf (“다른문자!!\n”);
}
[53]
비트교육센터
goto문
goto문
– 지정한 곳으로 무조건 점프하는 문장
goto label;
statement1;
statement2;
statement3;
label : statement4;
•
if (num > 10)
goto labelA;
goto labelB;
labelA: num += 100;
labelB: num *= 2;
goto label문장을 만나면 statement1,
statement2, statement3를 수행하지
않고 label이 있는 곳으로 점프하여
statement4를 수행한다.
if (num > 10)
num += 100;
else
num *= 2;
[54]
비트교육센터
while문(I)
while문
– 조건을 먼저 검사하여 true 인 동안
만 문장들을 실행하는 진입 조건형
루프
condition
false
true
while (condition)
{
statement1;
statement2;
statement3;
}
statement4;
statement1
statement2
statement3
statement4
•
condition이 true인 동안 { 과 } 사이의
블럭내의 statement1, statement2,
statement3을 반복하여 수행한다.
[55]
비트교육센터
while문(II)
while문의 중첩
– while문 안에 다시 while문을 포함시킬 수 있다.
int i=1, j;
while (i < 10)
{
j = 1;
while (j < 10)
{
printf (“i : %d,\t j : %d \n”, i, j);
j++;
}
i++;
}
[56]
비트교육센터
do-while문
do-while문
– 일단 루프내의 문장들을 한번 실행
한 후 조건을 검사하여 false가 될때
까지 루프내의 문장들을 반복 실행
하는 탈출 조건형 루프
statement1
statement2
do
{
statement3
statement1;
statement2;
statement3;
} while (condition)
statement4;
true
condition
false
statement4
•
statement1, statement2, statement3를 한번
실행한 후 condition을 검사하여 true인 동안
statement1,2,3을 반복해서 수행한다.
[57]
비트교육센터
for문(I)
for문
– 제어변수를 사용하며, 조건식 외에
초기문과 증감문을 기본적으로 포함
하여 반복 횟수가 미리 정해지게 되
는 반복문
초기문
condition
for (초기문; 조건식; 증감문)
{
statement1;
statement2;
}
statement3;
false
true
statement1
statement2
증감문
•
•
루프에 진입하기 전에 초기문을 수행하고, 조건식
의 true/false를 조사한 후 true인 경우에
statement1, statement2를 수행한다.
한번의 반복루프 수행마다 증감문을 한번씩 수행
하고 다시 조건식을 검사하여 다음 번 반복루프의
수행여부를 결정하게 된다.
[58]
statement3
비트교육센터
for문(II)
for문의 중첩
– for문 안에 다시 for문을 포함시킬 수 있다.
for ( int i = 1; i < 10; i++)
{
for ( int j = 1; j < 10; j++)
{
printf (“i : %d,\t j : %d \n”, i, j);
}
}
[59]
비트교육센터
continue & break
continue
– 반복하고 있는 루프의 나머지 문장은 건너뛰고, 그 다음의 반복주기를 시작한다.
– switch문 내에 break문장이 있으면 switch문을 빠져나간다.
– continue문이 중첩된 반복루프 안에 있을 경우에는 가장 안쪽의 반복루프에만 영
향을 미친다.
break
– 자신을 둘러싸고 있는 반복루프를 빠져나와 루프 밖의 문장을 수행시킨다.
– break문이 중첩된 반복루프 안에 있을 경우에는 가장 안쪽의 반복루프에만 영향을
미친다.
[60]
비트교육센터
연습문제
1. 사용자로부터 10개의 수를 입력받고 그들 중 최대값을 구하는 프로그램을 구현하시오.
2. 1부터 100사이의 2의 배수의 합을 구하는 프로그램을 구현하시오.
3. 1부터 100사이의 소수를 구하는 프로그램을 구현하시오.
4. 아래과 같이 다이아몬드를 출력하는 프로그램을 구현하시오.
5. 사용자로부터 두개의 수를 입력받아 그 둘 사이에 존재하는 수의 합을 구하는 프로그램
을 구현하시오. (for문 이용)
6. 아래와 같은 출력 형태가 되도록 구구단 프로그램을 구현하시오.
7. 사용자가 입력하는 정수를 모두 더한 뒤 평균을 구하는 프로그램을 구현하시오.
(이때, 사용자가 입력하는 수가 0이 되면 입력을 중단하도록 구현한다.)
8. 사용자에게 알파벳 한문자를 입력받아 아래와 같이 출력되는 프로그램을 구현하시오.
9. 사용자로부터 정수를 입력받고(0을 입력할때까지) 입력이 끝나면 입력된 짝수의 개수와,
짝수의 평균 값, 입력된 홀수의 총 개수, 홀수의 평균 값을 출력하는 프로그램을 구현하
시오.
10. 구구단을 출력하되 2단은 2*2까지, 3단은 3*3까지, 4단은 4*4까지, …, 그리고 9단은
9*9까지 출력되도록 break와 continue를 이용하는 프로그램을 구현하시오.
[61]
비트교육센터
Chapter
07
함수
함수의 소개
함수란
– 특정 기능을 위해 설계된 프로그램의 독립적 단위이다.
– 적당한 인자(매개변수)를 주면 그에 따른 출력(반환 값)이 존재한다.
함수를 사용하는 이유
–
–
–
–
재사용성(reusability)
분할 정복 접근법(divide-and-conquer approach)
모듈화가 이루어져, 읽기와 수정 작업이 쉬워진다.
프로그램의 세부사항보다 프로그램의 전반적인 설계에 집중할 수 있다.
함수의 종류
– 표준 함수
– 사용자 정의 함수
[63]
비트교육센터
간단한 함수의 예(I)
#include <stdio.h>
int selectmenu(void); //함수의 선언
int main(void)
{
int sel, num1, num2, sum;
sel = selectmenu();
//함수의 사용
if (sel == 1) sum = num1 + num2;
else if (sel == 2) sum = num1 – num2;
else if (sel == 3) sum = num1 * num2;
else if (sel == 4) sum = num1 / num2;
}
int selectmenu(void) //함수의 정의
{
int selmenu=1;
printf(“--- 메뉴 선택 ---\n”);
printf(“ 1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈 : ”);
scanf(“%d”, &selmenu);
return selmenu;
}
[64]
비트교육센터
간단한 함수의 예(II)
step1.
main()함수에서 변수가
선언되고, 함수를 호출한다.
int sel, num1, num2, sum;
sel = selectmenu();
step2.
함수가 실행되고 사용자의
선택이 main()함수로
반환된다.
if (sel == 1)
sum = num1 +
else if (sel ==
sum = num1 –
else if (sel ==
sum = num1 *
else if (sel ==
sum = num1 /
int selmenu=1;
printf(“--- 메뉴 선택 ---\n”);
printf(“ 1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈 : ”);
scanf(“%d”, &selmenu);
return selmenu;
num2;
2)
num2;
3)
num2;
4)
num2;
step3.
함수의 결과를 변수sel에
저장하고 그 값에 따라
num의 값에 대한
연산결과를 변수 sum에
저장한다.
[65]
비트교육센터
함수의 이름
함수의 이름 정하기(Naming Rule)
– 프로그램에 사용할 변수 명이나 함수의 이름 등을 정할 때에는 이해하기 쉽게 표기
하는 것이 좋다.
– 함수의 기능을 알 수 있도록 하며, 너무 긴 이름은 좋지 않다.
헝가리안 표기법
– 변수명 혹은 함수의 이름을 정할 때 해당되는 타입의 약자를 접두어로 붙여 그 값의
타입을 쉽게 이해할 수 있도록 하는 표기법
– 예 : float f_add(float, float), int i_add(int, int)
낙타의 등
– 명칭을 정할 때 의미가 바뀌는 부분의 첫 문자를 대문자로 그 이외의 문자는 소문자
로 작성함으로써 쉽게 이해할 수 있도록 하는 표기법
– 예 : int GetNumber(void), char* GetLastName(char* FullName)
[66]
비트교육센터
함수의 선언
– 함수는 함수의 이름, 반환 값의 데이터 타입, 입력 매개변수 목록으로 구
성된다.
반환타입
함수명(매개변수목록);
– 반드시 함수의 호출 전에 함수의 선언이 와야 한다.
– 함수의 선언 시 매개변수의 타입과 함께 매개변수 이름을 지정할 수도 있
고, 매개변수 이름을 생략할 수도 있다.
[67]
비트교육센터
함수의 정의
– 실제 함수의 기능에 해당하는 프로그램 코드를 기술한다.
– 필요에 따라 함수 내에서 사용할 변수를 선언할 수도 있다.
– 함수가 매개변수를 가졌다면 매개변수의 데이터 타입과 이름이 선언되어
야 한다.
– 함수의 끝에서 return을 이용하여 값을 반환하여야 한다.
(반환 값이 없는 경우에는 함수의 타입을 void로 정의한다.)
반환타입 함수명(매개변수목록)
{
변수 선언;
프로그램 코드;
return 반환값;
}
[68]
비트교육센터
매개변수 전달방법(I)
매개변수
– 함수를 호출하는 외부에서 함수 내부로 넘겨주고 싶은 데이터가 있는 경우 매개변
수를 사용한다.
– 경우에 따라서는 매개변수가 없을 수도 있다.
매개변수 전달방법(함수의 호출 방식)
– 값에 의한 전달방식(call by value)
변수의 값을 복사해서 전달하는 방법(C에서의 기본방법)
함수 내부에서 외부로부터 매개변수로 전달되는 변수의 값을 직접 바꿀 수 없다.
– 참조에 의한 전달방식(call by reference)
변수의 메모리 주소를 전달하는 방식(포인터를 이용하여 참조 전달 방식 구현)
함수 내부에서 외부로부터 매개변수로 전달되는 변수의 값을 직접 바꿀 수 있다.
[70]
비트교육센터
매개변수 전달방법(II)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void swap(int, int);
int main(void)
{
int i = 10; j = 20;
swap(i, j);
printf(“ i = %d, j = %d \n”, i, j);
return 0;
}
void swap(int n1, int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
printf(“ n1 = %d, n2 = %d \n”, n1, n2);
}
[71]
비트교육센터
매개변수 전달방법(III)
값에 의한 전달방식(call by value).
•
step1.
•
main()함수의 7번째 줄까
지 실행 했을 때의 메모리
메모리주소 변수명
값
step2.
swap()함수가 막 호출되었을
때(14번째 줄)까지의 메모리
메모리주소 변수명
값
•
step3.
swap()함수의 15번째 줄까
지 실행했을 때의 메모리
메모리주소 변수명
값
0x1016
temp
10
0x1012
n2
20
0x1012
n2
20
0x1008
n1
10
0x1008
n1
10
0x1004
j
20
0x1004
j
20
0x1004
j
20
0x1000
i
10
0x1000
i
10
0x1000
i
10
[72]
비트교육센터
매개변수 전달방법(IV)
값에 의한 전달방식(call by value) – (cont’d)
•
step4.
•
swap()함수의 17번째 줄까
지 실행 했을 때의 메모리
메모리주소 변수명
값
step5.
swap()함수가 끝나고 main()함수 9번
째 줄을 수행했을 때의 메모리
메모리주소 변수명
값
0x1016
temp
10
0x1012
n2
10
0x1008
n1
20
0x1004
j
20
0x1004
j
20
0x1000
i
10
0x1000
i
10
[73]
비트교육센터
매개변수 전달방법(V)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void swap(int*, int*);
int main(void)
{
int i = 10; j = 20;
swap(&i, &j);
printf(“ i = %d, j = %d \n”, i, j);
return 0;
}
void swap(int* n1, int* n2)
{
int temp = *n1;
*n1 = *n2;
*n2 = temp;
printf(“ n1 = %d, n2 = %d \n”, *n1, *n2);
}
[74]
비트교육센터
매개변수 전달방법(VI)
참조에 의한 전달방식(call by reference).
•
step1.
•
main()함수의 7번째 줄까
지 실행 했을 때의 메모리
메모리주소 변수명
값
step2.
swap()함수가 막 호출되었을
때(14번째 줄)까지의 메모리
메모리주소 변수명
값
•
step3.
swap()함수의 15번째 줄까
지 실행했을 때의 메모리
메모리주소 변수명
값
0x1008
temp
10
0x1004
j
20
0x1004
n2(j)
20
0x1004
n2(j)
20
0x1000
i
10
0x1000
n1(i)
10
0x1000
n1(i)
10
[75]
비트교육센터
매개변수 전달방법(VII)
참조에 의한 전달방식(call by reference) – (cont’d)
•
step4.
•
swap()함수의 17번째 줄까
지 실행 했을 때의 메모리
메모리주소 변수명
값
step5.
swap()함수가 끝나고 main()함수 9번
째 줄을 수행했을 때의 메모리
메모리주소 변수명
값
0x1008
temp
10
0x1004
n2(j)
10
0x1004
j
10
0x1000
n1(i)
20
0x1000
i
20
[76]
비트교육센터
함수의 중첩
main()
{
fnA(); //함수호출-level
fnB(); //함수호출-level
}
void fnA()
{
fnC(); //함수호출-level
fnF(); //함수호출-level
}
void fnB()
{
fnC(); //함수호출-level
fnE(); //함수호출-level
}
void fnC()
{
fnD(); //함수호출-level
}
1
1
main
fnA
2
2
fnB
fnC
fnD
2
2
fnE
fnF
3
[77]
비트교육센터
재귀함수
재귀 함수(Recursive Function)
– 함수 내에서 자기 자신을 호출하는 함수
– 재귀를 종료시키는 조건 검사 코드를 넣지 않으면 무한히 자신을 호출하게 된다.
long factorial(int n)
{
long res;
long factorial(int n)
{
long res;
for (res=1; n>1; n--)
res *= n;
if (n > 0)
res = n * factorial(n-1);
else
res = 1;
return res;
}
return res;
}
[78]
비트교육센터
함수와 변수의 범위(지역/전역)
전역변수
지역변수
선언
함수 외부에 선언되어 있는 변수
함수 정의문 내에 선언되어 있는 변수
변수할당
프로그램 시작 시 할당
해당 함수 호출 시 할당
변수해제
프로그램 종료 시 해제
해당 함수 종료 시 해제
사용
프로그램 전역에서 사용 가능
해당 함수 내에서만 사용 가능
-
모든 매개변수는 지역변수다.
-
특정 함수 혹은 특정 블럭 내에서 같은 이름의 전역변수와 지역변수가 존재할 경우 지
역변수가 우선한다.
-
스파게티 코드 : 전역 변수의 과도한 선언은 프로그램을 복잡하게 만든다.
[79]
비트교육센터
연습문제
1. 매개변수로 두 수를 입력 받아 더하는 함수를 구현하시오.
2. 매개변수로 하나의 양의정수(n)를 입력 받아 1부터 n까지의 합을 출력하는 함수를 구현
하시오.
3. 매개변수로 3개의 숫자를 입력 받아 가장 큰 값을 출력하는 함수를 구현하시오.
4. 1~10 사이의 정수만을 입력 받을 수 있는 함수를 구현하시오.
5. 매개변수로 하나의 정수를 입력 받아 같은 값의 2진수를 출력하는 함수를 구현하시오.
[80]
비트교육센터
Chapter
08
배열
배열
배열이란?
– 한가지 데이터 타입으로 이루어진 일련의 요소의 모임
– 같은 타입의 변수 여러 개를 하나의 변수이름으로 사용하는 타입
배열 선언
배열요소타입 배열명 [배열크기]
–
–
–
–
–
배열의 선언 : 배열의 요소 개수와 요소의 타입 종류를 알리는 것
배열요소타입 : 일반 변수와 동일한 타입
배열명 : 배열의 이름으로 첫번째 요소가 할당된 메모리 공간의 주소를 가짐
대괄호([ ]) : 대괄호로 둘러싸인 숫자는 배열의 크기(배열 요소의 개수)
배열 요소의 제어 : 대괄호 안에 양의정수 타입의 첨자 혹은 인덱스를 사용하여 구
분하며 숫자는 0부터 시작됨
[82]
비트교육센터
초기화(I)
배열의 초기화
– 단일 값을 갖는 변수와 마찬가지로 배열도 선언과 동시에 초기화가 가능
– 콤마로 구분된 값의 목록을 중괄호로 둘러싸는 방법으로 초기화
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
– 초기화 값의 목록이 배열의 크기보다 모자를 경우, 컴파일러는 나머지 요소를 0으
로 설정
int arr[10] = {1,2,3,4,5,6,7,8};
int arr[10] = {1,2,3,4,5,6,7,8,0,0};
//위의 두가지 선언 결과가 같다.
– 초기화 값의 목록이 배열의 크기를 초과하는 경우 컴파일러는 오류로 처리
int arr[10] = {1,2,3,4,5,6,7,8,9,10,11,12};
[83]
비트교육센터
초기화(II)
배열의 초기화(cont’d)
– 배열 크기를 생략하면 초기화 목록의 값의 개수로 크기가 결정된다.
int arr[] = {1,2,3,4,5,6,7,8};
//초기화 목록에 8개의 값이 있으므로 arr 배열의 요소 크기가 8로된다.
배열 상수의 초기화
– 배열을 읽기 전용으로 사용할 때 const를 붙여 상수로 사용한다.
– 반드시 선언과 동시에 초기화를 해야한다.
– 나중에 값을 대입할 수 없다.
const int arr[10] = {1,2,3,4,5,6,7,8,9,10};
[84]
비트교육센터
배열의 사용
배열 요소에 값 대입하기
– 배열의 첨자 또는 인덱스를 사용하여 배열 요소에 값을 대입할 수 있다.
– 인덱스는 배열 크기에 따라 유효한 범위 내에서 사용되어져야 한다.
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//배열의 크기가 10
//유효한 인덱스의 범위 : 0에서 19사이의 정수
– 컴파일러는 인덱스가 유효한지 검사하지 않는다.
: 오류가 발생할 수도 있고, 정상적인 동작처럼 보일 수도 있다.
[85]
비트교육센터
배열과 메모리
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
1
2
arr[0]
3
4
arr[2]
arr[1]
5
6
arr[4]
arr[3]
7
8
arr[6]
arr[5]
[86]
9
10
arr[8]
arr[7]
arr[9]
비트교육센터
다차원 배열(I)
2차원 배열
– 배열의 배열
– 행과 열로 구성되는 표 형태
//한 학생의 국어, 영어, 수학, 음악, 미술 5과목의 점수를 저장할 배열의 선언
int jumsu[5];
//세명의 학생의 5과목 점수를 저장할 배열의 선언
int jumsu[3][5]
국어
영어
수학
음악
미술
학생1
jumsu[0][0]
jumsu[0][1]
jumsu[0][2]
jumsu[0][3]
jumsu[0][4]
학생2
jumsu[1][0]
jumsu[1][1]
jumsu[1][2]
jumsu[1][3]
jumsu[1][4]
학생3
jumsu[2][0]
jumsu[2][1]
jumsu[2][2]
jumsu[2][3]
jumsu[2][4]
[87]
비트교육센터
다차원 배열(II)
3차원 이상의 배열
– 배열의 배열의 배열(의 배열의 배열의 배열........)
– 행과 열로 구성되는 표가 여러 개 쌓여있는 형태
– 보통 3차원 배열을 처리하기 위해서는 세 번의 중첩 루프를, 4차원 배열을 처리하
기 위해서는 네 번의 중첩 루프를 사용하게 된다.
//세 명의 학생의 5과목 점수를 저장할 2차원 배열의 선언
int jumsu[3][5]
//한 반은 3명으로 구성되어 있고 10개의 반이 존재할 때 모든 학생의 5과목에 대한
점수를 저장할 3차원 배열의 선언
int jumsu[10][3][5]
//한 학교에 6개 학년이 존재하고 각 학년은 10개의 반으로 구성되며 각 반은 3명씩
구성되어 있을 때 모든 학생의 5과목에 대한 점수를 저장할 4차원 배열의 선언
int jumsu[6][10][3][5]
[88]
비트교육센터
다차원 배열의 초기화(I)
다차원 배열의 초기화
– 1차원 배열의 초기화 방법에 기초하여 초기화 할 수 있다.
– 1차원 배열의 초기화 중괄호를 여러 개 묶어서 초기화한다.
//1차원 배열의 초기화
int jumsu[5] = {90,80,75,95,70};
//2차원 배열의 초기화
int jumsu[3][5] = {
{90,80,75,95,70},
{92,70,75,85,80},
{95,88,75,75,90}
//첫번째 학생의 점수
//두번째 학생의 점수
//세번째 학생의 점수
}
*
jumsu[3][5]배열은 3 X 5 배열이라고 표현하기도 한다.
[89]
비트교육센터
다차원 배열의 초기화(II)
다차원 배열의 초기화(cont’d)
– 데이터 개수와 배열의 크기가 맞지 않은 경우의 규칙도 각각의 행에 그대로 적용
– 내부 중괄호를 생략하고 하나의 외부 중괄호만 남겨둘 수 있다. 그러나 이 때에는
초기화할 때 조금 더 신경 써야 한다.
int jumsu[3][5] = {
{90,80,75}, //첫번째 학생의 점수
{92,70,75,85}, //두번째 학생의 점수
{95,88} //세번째 학생의 점수
}
//배열 요소 중 초기화 값이 없는 요소는 0으로 초기화된다.
int jumsu[3][5] = { 90, 80, 75,
92, 70, 75, 85,
95, 88 }
//이 때, 0으로 초기화되는 요소의 인덱스는 무엇일까?
[90]
비트교육센터
다차원 배열과 메모리
int jumsu[3][5] = {
{90,80,75,95,70},
{92,70,75,85,80},
{95,88,75,75,90}
//첫번째 학생의 점수
//두번째 학생의 점수
//세번째 학생의 점수
}
90
80
75
95
70
92
70
jumsu[0]
75
85
80
95
88
jumsu[1]
jumsu[1]
jumsu[2]
jumsu[0][0]
jumsu[1][0]
jumsu[2][0]
jumsu[1][3]
[91]
75
90
jumsu[2]
jumsu[0]
jumsu[0][2]
75
jumsu[2][4]
비트교육센터
연습문제
1. 크기가 10인 int형 배열을 선언하고 arr[i] 에는 0부터 i까지의 합을 대입하는 프로그램
을 구현하시오.
2. getchar()를 이용하여 크기가 10인 char 타입 배열에 이름을 입력하는 프로그램을 구
현하시오.
3. 문제 2에서 입력받은 이름을 역순으로 다른 배열에 대입하는 프로그램을 구현하시오.
4. 허수의 곱을 계산하는 프로그램을 구현하시오.
5. 5명의 국,영,수 점수를 입력 받고 합계에 따른 등수대로 출력하는 프로그램을 구현하시
오.
6. 8 X 9 정수 타입 2차원 배열을 선언하고 그 배열요소의 값으로 구구단의 값을 저장하는
프로그램을 구현하시오.
7. 3 X 4 정수 타입 2차원 배열에 배열 요소의 값으로 행과 열의 인덱스의 합을 저장한 후
4 X 3 정수 타입 2차원 배열로 데이터를 복사하는 프로그램을 구현하시오.
0
1
2
3
0
1
2
1
2
3
4
1
2
3
2
3
4
5
2
3
4
3
4
5
[92]
비트교육센터
Chapter
09
포인터
포인터란?
포인터
– 메모리의 주소 값을 저장하는 변수
– 포인터 혹은 포인터 변수라고 불린다.
– 포인터 변수를 생성하기 위해서는 그 포인터의 타입을 선언해야 한다.
포인터의 선언
[포인터타입] * [포인터이름];
– int * pi;
//정수 변수를 가리키는 포인터의 선언
– char * pc; //단일문자 변수를 가리키는 포인터의 선언
– double * pf;//실수형 변수를 가리키는 포인터의 선언
[94]
비트교육센터
포인터 연산자
간접 연산자 (*)
– 뒤에 포인터 이름이나 주소가 따라올 경우, *는 가리켜진 주소의 메모리 공간에 저
장된 값을 반환한다.
주소 연산자(&)
– 뒤에 변수 이름이 따라올 경우, &는 그 변수가 위치하고 있는 메모리 공간의 주소
를 반환한다.
int num1 = 20;
0x1000
num1 = 20
int num2 = 30;
0x1004
num2 = 30
0x1008
pi = 0x1000
int *pi;
pi = &num1;
printf(“%d, %d\n”, pi, *pi);
0x100c
[95]
비트교육센터
포인터 연산
대입하기
– 포인터에 주소를 대입한다.
값찾기(역참조)
– 포인터로 가리키는 위치에 저장된 값을 읽는다.
– 초기화 되지 않은 포인터는 역참조 하면 안된다.
포인터 주소얻기
– 포인터 또한 변수이므로 해당하는 주소를 가져올 수 있다.
포인터 값 증가시키기
– 배열과 함께 사용될 때 포인터 값을 증가 시킴으로써 다음 요소를 가리킬 수 있다.
포인터 값 감소시키기
– 배열과 함께 사용될 때 포인터 값을 감소 시킴으로써 이전 요소를 가리킬 수 있다.
포인터 사이의 간격 알아내기
– 배열과 함께 사용될 때 두 포인터 값의 차이를 가지고 두 요소 사이의 갯수를 알 수
있다.
[96]
비트교육센터
포인터와 배열(I)
포인터와 배열
-
배열의 이름도 포인터다.
배열내의 첫 번째 요소의 주소 값을 갖는다.
값을 바꿀 수 없는 상수 포인터의 역할을 한다.
이때 포인터의 타입은 배열 요소의 타입과 같다.
포인터와 1차원 배열
int arr[6] = {1,2,3,4,5,6};
0x1000
arr[0] = 1
parr
int *parr = arr;
0x1004
arr[1] = 2
parr+1
0x1008
arr[2] = 3
parr+2
0x100c
arr[3] = 4
parr+3
0x1010
arr[4] = 5
parr+4
0x1014
arr[5] = 6
parr+5
0x1018
parr = 0x1000
[97]
비트교육센터
포인터와 배열(II)
포인터와 다차원배열
int arr[3][2] = {{1,2},{3,4},{5,6}};
int (*parr)[2] = arr;
– arr은 배열의 첫 번째 요소에 대한 주소
arr = arr[0] = &arr[0][0]
– arr + 1은 이들이 가리키는 객체의 크기(int [2])만큼 더해진다.
arr + 1 = arr[1] = &arr[1][0]
– arr은 2차원 배열이기 때문에 포인터나 주소를 역참조하여 요소의 데이터값을 가져
오기 위해서는 역참조를 2번해야 한다.
arr[0][0] = *arr[0] = **arr
[98]
비트교육센터
포인터와 배열(III)
포인터와 배열의 호환성
– 일반 int 타입의 변수를 타입의 변환 없이 double 타입 변수에 대입할 수 있지만 이
들 두 타입을 가리키는 포인터로는 불가능하다.
int num = 10;
double dnum;
int *pi = &num;
double *pd = &dnum;
dnum = num;
//암시적 형변환으로 수행된다.
pd = pi;
//오류발생~!!
– 다차원배열과 포인터의 사용에 있어서는 실제 배열의 각 단위 요소 하나를 가리키
는 것인지 요소들의 배열을 가리키는 것인지 잘 헤아려야 한다.
[99]
비트교육센터
포인터와 배열(IV)
함수, 배열, 포인터
– 배열을 매개변수로 취하는 함수를 작성할 때 함수 전체를 복사하여 사용하는 대신
배열 이름으로 주소 값을 넘겨 함수 내에서 포인터를 이용하여 데이터를 참조하는
“참조에 의한 전달방식(call by reference)”방식을 사용한다.
– 함수 내에서 배열 요소의 값을 수정할 수 있다.
– 함수 내에서 배열 이름만으로는 배열의 크기(배열 요소의 개수)를 알 수 없다.
따라서 1. 함수 내에서 배열의 크기를 고정으로 사용하거나
2. 배열의 크기를 매개변수로 처리해야 한다.
– 1차원 배열을 매개변수로 취하는 함수의 선언의 예
//int 타입의 1차원 배열의 이름과 크기를 매개변수로 하는 함수의 선언 방법
int arr_sum(int *arr, int size); //방법1
int arr_sum(int *, int);
//방법2
int arr_sum(int arr[], int size); //방법3
int arr_sum(int [], int);
//방법4
[100]
비트교육센터
포인터와 배열(V)
함수, 배열, 포인터(cont’d)
– 다차원 배열을 매개변수로 취하는 함수 선언의 예
//int 타입의 3 X 2 배열의 이름과 크기를 매개변수로 하는 함수의 선언 방법
int arr_sum(int (*arr)[2], int size);
//방법1
int arr_sum(int arr[][2], int size);
//방법2
//int 타입의 4 X 3 X 2 배열의 이름과 크기를 매개변수로 하는 함수의 선언 방법
int arr_sum(int (*arr)[3][2], int size);
//방법1
int arr_sum(int arr[][3][2], int size);
//방법2
[101]
비트교육센터
포인터의 포인터
- 포인터의 포인터가 가리키는 것은 일반 포인터의 주소
- 간접연산자 두 개(**)를 사용하여 선언한다.
int num = 10;
int * pi = &num;
int ** ppi = &pi;
0x1000
num = 10
0x1004
pi = 0x1000
0x1008
ppi = 0x1004
printf(“%d\n”,&pi);
printf(“%d\n”,ppi);
0x100c
printf(“%d\n”, num);
printf(“%d\n”,*pi);
printf(“%d\n”,**ppi);
[102]
비트교육센터
포인터와 const(I)
포인터가 가리키는 변수의 상수화
- 포인터가 가리키는 변수의 내용을 포인터를 통해서는 변경하지 못하도록 한다.
- 포인터가 가리키는 변수가 상수가 아니라면 직접 변수 자체의 값을 바꾸는 것은 가
능하다.
int num = 10;
const int* pi = &num;
*pi = 100;
//오류발생~!!
num = 100;
//정상수행
[103]
비트교육센터
포인터와 const(II)
포인터가 가리키는 변수의 상수화(cont’d)
- 함수의 매개변수로 배열을 넘길 때 배열 요소의 데이터를 변경하지 못하도록 하기
위해서 사용한다.
//int 타입의 1차원 배열의 이름과 크기를 매개변수로 하는 함수의 선언 방법
int arr_sum(const int *, int);
//함수의 선언
//함수의 정의
int arr_sum(const int *arr, int size)
{
int i, sum = 0;
for (i = 0; i < size; i++)
sum += arr[i];
for (i = 0; i < size; i++) arr[i]=0;
//오류발생~!!
return sum;
}
[104]
비트교육센터
포인터와 const(III)
포인터의 상수화
- 포인터 자체가 상수화되어 다른 변수를 가리킬 수 없다.
int num1 = 10;
int num2 = 20;
int* const pi = &num1;
pi = &num2;
//오류발생~!!
*pi = 100;
//정상수행
포인터와 포인터가 가리키는 변수 모두 상수화
- 포인터가 상수화 되어 초기화된 변수의 주소 값 이외의 다른 변수를 가리킬 수 없다.
- 포인터가 가리키는 내용도 상수화되어 그 값을 변경하지 못한다.
int num1 = 10;
int num2 = 20;
const int* const pi = &num1;
*pi = 100;
//오류발생~!!
num1 = 100;
//정상수행
pi = &num2;
//오류발생~!!
[105]
비트교육센터
NULL 포인터
- 아무것도 가리키지 않는다는 의미
- 포인터 변수를 선언한 후 0으로 초기화 하는 것
- NULL은 키워드가 아니라 0으로 미리 정의되어 있는 상수
int * pi = 0;
//int * pi = NULL;
char * pc = 0;
//char * pc = NULL;
double * pd= 0;
//double * pd = NULL;
[106]
비트교육센터
함수포인터
- 메인 메모리에 올라와 있는 함수를 가리키는 포인터
- 함수 이름이 함수 포인터가 된다.
- 함수의 포인터 타입은 함수의 반환하는 데이터의 타입과 매개변수로 결정된다.
- 함수 포인터를 이용하면 실행 시에 함수를 매개변수로 입력 받을 수 있다.
- typedef를 이용하여 함수 포인터 타입의 변수를 선언할 수 있다.
//반환 값의 데이터 타입이 int형이고, int형 매개변수를 하나 가지는 함수의 포인터
int (*fct1)(int);
//반환하는 값이 존재하지 않고, double형 매개변수를 두개 가지는 함수의 포인터
void (*fct2)(double,double);
[107]
비트교육센터
void포인터
-
선언 시에 포인터의 타입이 정해지지 않는다.
변수, 함수, 포인터의 주소 등 어떠한 포인터도 void 포인터에 대입될 수 있다.
값을 변경하거나 참조하는 일, 포인터 연산 등이 허용되지 않는다.
void 포인터는 반드시 명시적 형 변환 과정을 통해서만 다른 포인터 변수에 대
입될 수 있다.
- 일단 주소 값을 저장한 후 포인터의 타입은 나중에 결정할 때 사용한다.
int num = 10;
char ch = ‘A’;
void *vp;
//void 포인터 선언
vp = &num;
//int형 포인터의 주소 값 대입
vp = &ch;
//char형 포인터의 주소 값 대입
[108]
비트교육센터
연습문제
1. 3 X 4 정수 타입 2차원 배열에 배열 요소의 값으로 행과 열의 인덱스의 합을 저장한 후
4 X 3 정수 타입 2차원 배열로 데이터를 복사하는 프로그램을 구현하시오. 단, 반드시
배열 이름을 매개변수로 받는 함수를 정의하여 구현하시오.
0
1
2
3
0
1
2
1
2
3
4
1
2
3
2
3
4
5
2
3
4
3
4
5
2. int 배열을 매개변수로 받아서 가장 큰 값을 갖는 요소와 가장 작은 값을 갖는 요소의
차를 반환하는 함수를 구현하시오. 이 때 배열의 내용은 변경될 수 없도록 구현하시오.
3. 5명의 국,영,수 점수를 입력 받아 3X5배열에 넣고 합계에 따른 등수를 int[5] 배열로 출
력하는 프로그램을 함수를 이용하여 구현하시오.
4. 두개의 double형 숫자와 연산의 종류를 입력 받아서 Add, Minus, Multiply, Divide 네
가지 함수 중 하나가 실행되어 그 결과를 출력하도록 구현하시오. 함수의 수행은 반드
시 함수 포인터를 이용하여 구현하시오.
[109]
비트교육센터