1장 C 언어 복습

1장 C 언어 복습
표준 입출력
배열
포인터
배열과 포인터
함수
const와 포인터
구조체
컴파일러 사용 방법
C++ 프로그래밍 입문
교수 소개 – IT학부 서동수 교수
1장 C 언어 복습
1
1. 표준 입출력
표준 입출력
„
입력 : 키보드, scanf 함수
#include <stdio.h>
„ 출력 : 모니터, printf 함수
int main(void)
문제 : 정수값 2개를 입력받고 {
int Num1, Num2;
두 값 사이의 값들을 더하여
i t Sum
int
S = 0;
0
출력하라.
int i;
주소 전달
서식 문자 : int형 - %d
값 전달
// 전처리문 사용
// main 함수
// 변수 선언
// 변수 선언 및 초기화
printf( 2개의 정수 입력 : ");
printf("2개의
);
scanf("%d %d", &Num1, &Num2);
// 출력
// 입력
for (i = Num1; i <<= Num2; i++)
Sum += i;
// 제어문
// 연산자
pprintf("%d부터 %d까지의 합 : %d n",
Num1, Num2, Sum);
return 0;
1장 C 언어 복습
2
2. 배열
배열 : 같은 타입의 변수 여러 개를 묶어서 처리
배열 변수 선언 및 초기화의 예
int Grade[5];
// 지역 변수의 경우 쓰레기값을 가짐
Grade[2] = 100;
// 세 번째 원소의 값을 100으로 변경
int Grade[5] = { 10, 20, 30, 40, 50 ;
int Grade[5] = { 10, 20 ;
// Grade[2] 이후로는 0 값을 가짐
int Grade[5] = { 0 ;
// 모두 0 값을 가짐
int Grade[2][3] = { { 10, 20, 30 , { 40, 50, 60
G d [1][1] = 100;
Grade[1][1]
100
1장 C 언어 복습
;
// 2차원 배열
// 2행 2열 원소의 값을 100으로 변경
3
배열의 개요
배열(array)의 정의
„
같은 데이터 형을 가지는 여러 개의 변수를 하나의 배열명으
로 공유
„
기억공간을 순차적으로 할당 받아 사용하는 것
[그림 7.1] 일반 변수와 배열 변수의 차이
1장 C 언어 복습
4
배열의 개요
배열(array)의 필요성
„
같은 데이터 형의 여러 개의 변수 간결하게 선언
„
기억공간을 순차적으로 변수의 값들을 저장, 관리
국어, 영어, 수학 성적의 변수 선언 예
[그림 7.2] 일반 변수와 배열 변수의 비교
1장 C 언어 복습
5
정수형 데이터를 배열에 대입, 출력
#include<stdio.h>
void main(void){
int a[10]={0, 10, 20, 30, 40, 50, 60, 70, 80, 90}, i;
for(i=0;i<10;i++)
printf(“%u
printf(
%u \t %d\n”,
%d\n , &a[i], a[i]); }
[
[결과
출력]]
1245016
1245020
1245024
1245028
1245032
1245036
1245040
1245044
1245048
1245052
1장 C 언어 복습
0
10
20
30
40
50
60
70
80
90
6
배열의 개요
배열(array)의 구조
„
배열의 요소들이 기억장치에 저장되어 지는 주소값 및 실제
변수값의 구조
정수형 배열변수에 배열요소 구조 예
„
a[0]=1 ・・・ , a[9]= 90
a[0]=1,
[그림 7.3] 배열 변수의 구조(int a[10])
1장 C 언어 복습
7
배열 사용하기
배열의 선언
데이터형 배열 변수명[배열 요소의 개수];
„
배열명은 변수명을 지정할 때와 같은 규칙을 따름
„
영문자 대․소문자 또는 언더바(_)가 첫번째 문자로 사용
„
숫자 사용 가능(단,
가능(단 배열 변수명의 첫번째 문자로는 사용 불가)
„
특수문자 및 예약어 사용 불가(데이타형, 명령어 등)
1장 C 언어 복습
8
배열 사용하기
배열의 초기화
„
배열의 초기치를 선언문에 직접 입력
int a[5]={0, 1, 2, 3, 4 ;
int b[5]={1,
in
b[ ] {1, 2,
, 3 ;
„
반복문 또는 제어문을 이용한 배열의 초기화
int i, a[5]
a[5];
for(i=0;i<=4 ; i++)
a[i]=i+1;
„
배열 선언시 요소개수를 지정하지 초기화
int a[ ]={0,
]={0 1,
1 22, 3,
3 4 ;
int b[ ]={1, 2, 3 ;
1장 C 언어 복습
9
for 반복문을 사용한 배열의 초기화 예
#include<stdio.h>
void
id main(void)
i ( id)
{
int i, a[5];
for(i=0;i<=4;i++)
{
a[i]=i+1;
printf(“a[%d]=%d
printf(
a[%d]=%d \n
\n”, i,
i a[i]);
[결과 출력]
a[0]=1
a[1]=2
[ ]
a[2]=3
a[3]=4
a[4]=5
1장 C 언어 복습
10
배열 사용하기
배열 초기화할 때 주의할 점
„
문자열 변수를 배열로 선언할 때
¾ 문자열의 마지막에는 NULL 문자가 반드시 존재
¾ 실제 문자열의 수보다 1바이트 크게 배열의 크기를 지정
char color[3]=“RED”; (컴파일 에러)
char color[4]=“RED”;
char color[4]={‘R’
color[4] { R , ‘E’
E , ‘D’
D ,
‘0/’ ;
„
배열의 초기값 설정
¾ 선언된 배열의 요소 수보다 적은 수의 초기치가 주어진 경우에는 모자
라는 요소의 개수만큼은 0이 대입
¾ 배열의 요소 개수보다 많은 수가 초기화될 경우에는 컴파일 에러가 발
생
1장 C 언어 복습
11
정수 값의 합 및 평균
##include<stdio.h>
void main(void)
{
int i, data[]={78, 55, 99, 75, 84, 39, 67, 98, 87,
100 ;
int sum=0;
float ave;
for (i=0; i < 10; i++)
sum += data[i];
ave=(float)sum / 10.0;
printf(“Total=%d
i f(“
l %d Average=%.2f\n”,
A
% 2f\ ” sum, ave);
)
[결과 출력]
Total=782 Average=78.20
1장 C 언어 복습
12
정수의 값들을 오름차순으로 정렬
#include<stdio.h>
void main(void)
{
int i,
i j,
j temp=0,
temp=0 data[]={78,
data[]={78 55,
55 99,
99 75,
75 84,
84 39,
39 67,
67 98,
98
87,100 ;
for (i=0; i < 9; i++){
for (j=i+1; j < 10; j++){
if(data[i] >= data[j]){
temp=data[i];
data[i]=data[j];
data[j]=temp;
printf(“Resort array list:”);
for(i=0; i<10; i++)
printf(“%3d
(“
”
”, data[i]);
[ ])
[결과 출력]
Resort array list: 39 55 67 75 78 84 87 98 99 100
1장 C 언어 복습
13
다차원 배열
2차원 배열 선언 및 사용
„
2차원 배열은 배열의 요소를 표현하는 첨자가 2개인 배열
데이터형 2차원 배열 변수명
[행 배열 요소의 개수][열 배열 요소의 개수];
예) int a[2][3];
[ ][ ]
„
2차원 배열은 2(행)×3(열)=6(개)의 요소의 수만큼 변수
사용이 가능
„
메모리 공간은 6(개)×4(Byte)=24Byte를 할당
1장 C 언어 복습
14
다차원 배열
2차원 배열의 초기화
기화
int a[2][3]={0, 1, 2, 3, 4, 5 ;
또는,
또는
int a[2][3]={{0, 1, 2 , {3, 4, 5 ;
2차원 배열의 구조
1장 C 언어 복습
15
2차원 배열 요소의 합
#include<stdio.h>
void
id main(void)
i ( id)
{
int m[4][3]={ {10, 5, -3 , {9, 0, 0 , {32, 20, 1 , {0, 0, 8
int row, column, sum =0 ;
for( row=0; row < 4; row++ )
for( column=0; column < 3; column++ ){
sum=sum + m[row][column];
printf(“m[%d][%d]=%d\n”
printf(
m[%d][%d]=%d\n , row,
row column
column,
m[row][column]);
;
printf(“The
printf(
The total is %d\n”,
%d\n , sum );
[결과 출력]
m[0][0]=10 m[0][1]=5 m[0][2]=-3
m[1][0]=9 m[1][1]=0 m[1][2]=0
m[2][0]=32 m[2][1]=20 m[2][2]=1
m[3][0]=0 m[3][1]=0 m[3][2]=8
Th totall is
The
i 82
1장 C 언어 복습
16
다차원 배열
3차원 배열 선언 및 사용
„
3차원 배열은 배열의 요소를 표현하는 첨자가 3개인 배열
변수명[행 열의 평면 배열 요소의
데이터형 3차원 배열 변수명[행,열의
개수][행 배열 요소의 개수][열 배열 요소의 개수];
예) int a[2][2][2]={0, 1, 2, 3, 4, 5, 6, 7 ;
„
3차원 배열은 2(평면)×2(행)×2(열)=8(개)의 요소의 수만
큼 변수 사용이 가능
„
메모리 공간은 8(개)×4(Byte)=32Byte를 할당
1장 C 언어 복습
17
다차원 배열
3차원 배열의 구
구조
„
Step 1:평면에 2차원 배열에 해당하는 데이터를 행, 열의 순서대로
대입
„
Step 2:다음 평면 요소에 Step 1과 같이 2차원 배열에 해당하는 데
이터를 행,
행 열의 순서대로 대입
1장 C 언어 복습
18
배열을 이용한 문자열 다루기
문자열의 입출력
„
문자 표현 : 작은따옴표(‘ ’) 사용
„
문자열 표현 : 큰따옴표(
큰따옴표(“ ”)) 사용
문자:‘a’, ‘b’, ‘c’, ‘d’
문자열:“abcd”, “C Language”
„
한 줄의 문자열을 입력받는 함수 : gets() 함수
„
한 줄의 문자열을 출력하는 함수 : puts() 함수
1장 C 언어 복습
19
배열을 이용한 문자열 다루기
문자 배열 선언 및 사용
문자 데이터형 배열 변수명[문자 배열 요소의 개수];
char
h color_1[3]=“RED”;
l 1[3] “RED” (컴파일 에러)
char color_2[4]=“RED”;
메모리 구조
(a) char color_1[3]=“RED”
2[4] “RED”
(b) char color
color_2[4]=
RED
1장 C 언어 복습
20
배열을 사용한 문자열 복사
・ 문자열 배열 요소에 문자변수 개별 대입(NULL
(
문자 포함))
#include<stdio.h>
void main(void)
{
char a1[5]=“BOOK”, a2[5];
a2[0]=a1[0];
a2[1]=a1[1];
a2[2] a1[2]
a2[2]=a1[2];
a2[3]=a1[3];
a2[4]=a1[4];
printf(“a1 배열 문자열:%s \n”, a1);
printf(“a2
printf(
a2 배열 문자열
문자열:%s
%s \n
\n”, a2);
[결과 출력]
a1 배열 문자열:BOOK
a2 배열 문자열:BOOK
1장 C 언어 복습
21
2. 배열
문제 : 5행 5열의 int형 배열을 선언하고 실행 결과와 같이 각 원소의
값을 채운 후 출력하기
int main(void)
{
int Ary[5][5];
int i, j;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (i >= j)
A [i][j] = i + 11;
Ary[i][j]
else
Ary[i][j] = 0;
// 2차원 배열
// 왼쪽 아래 부분 : i + 1
// 오른쪽 위 부분 : 0
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", Ary[i][j]);
printf(" n");
return 0;
1장 C 언어 복습
22
3. 포인터 : 프로그램과 메모리
실행 중인 프로그램(프로세스)의 메모리 구조
1장 C 언어 복습
23
3. 포인터 : 메모리 주소
메모리 주소
„
주소 : 바이트 단위의 번호
„
주소를 8비트로 표현한다면 Æ 28개(0~255번지)의 주소값
„
Windows 운영체제에서는 32비트로 표현 Æ 232개(0
개(0~2
232-1번지)
1번지)
¾ 프로세스 1개 당 4GByte의 전용 메모리(가상 메모리)가 할당됨
변수와 함수의 주소
„
변수와 함수는 메모리 공간을 차지함
1장 C 언어 복습
24
3. 포인터 : 변수와 포인터
변수의 주소 : 주소 연산자(&) 사용
„
int num = 5;
„
printf("변수 num의 주소 : %d\n", &num);
포인터 : 주소값을 저장하는 변수
„
타입 별로 다르게 표현됨 Æ 포인터 변수를 통해 간접 처리 가능
„
예 : int형 포인터 변수
1장 C 언어 복습
25
3. 포인터 : 변수와 포인터
포인터 변수를 통한 변수 접근 : 역참조 연산자(*) 사용
„
int *pNum = &num; *pNum = 5; (num = 5;와 동일)
포인터 연산 : 증가(++), 감소(--), 덧셈(+), 뺄셈(-) 가능
„
int형 포인터의 경우 1 증가 : int형 변수의 크기인 4만큼 증가함
예제
int main(void)
{
int var = 5;
int *p = &var;
// 포인터 변수 선언 및 var 주소로 초기화
printf("var의주소 : %d n", &var);
pprintf("var의값
(
: %d n",, var);
)
printf("p의주소 : %d n", &p);
printf("p의값
: %d n", p);
printf("p가가리키는변수의값 : %d n", *p);
int형이므로
4 증가
p++;
printf(">> 변경후 n");
printf("p의값
printf(
p의값
: %d n"
n , p);
return 0;
1장 C 언어 복습
26
4. 배열과 포인터
배열은 포인터처럼, 포인터는 배열처럼 사용 가능!
배열에 대한 포인터 연산의 적용 예
배열 첫 번째 원소의 주소 대입
다음 원소를 가리킴
„
pNum[0], pNum[1], … 과 같이 사용 가능
„
pNum[2] == *(pNum + 2)
주의 : 배열명에 대한 주소 변경 불가 Æ 상수 개념
1장 C 언어 복습
27
4. 배열과 포인터 : 메모리 동적 할당
메모리 동적 할당 및 해제 함수
„
malloc(), free()
예제 : 10개의 원소를 갖는 int형 배열에 대한 메모리 동적 할당
#include <stdio.h>
#include <stdlib.h>
<stdlib h>
#include <time.h>
// srand
srand, rand 함수
// time 함수
int main(void)
{
int ii, ary[10]
ary[10], *p;
srand((unsigned) time(NULL));
for (i = 0; i < 10; i++)
ary[i] = rand();
// 무작위 값 대입
p = (int *) malloc(sizeof(int) * 10); // int형 10개 메모리 동적 할당
for (i = 0; i < 10; i++)
p[i] = ary[i];
// 포인터는 배열처럼 사용 가능
printf("index tary tp n");
for (i = 0; i < 10; i++)
printf("%d t%d t%d n", i, ary[i], p[i]);
free(p);
// 메모리 해제
malloc의 반환형 : void *
Æ 형변환 필요
Æ C에서는 자동 형변환됨
return 0;
1장 C 언어 복습
28
5. 함수
함수 작성 시 고려 사항
„
함수 원형, 함수 정의, 함수 호출, 매개변수 전달
예제 : xy을 계산하는 함수
값에 의한 전달
#include <stdio.h>
<stdio h>
int power(int x, int y)
{
int i;
int result = 1;
for (i = 0; i < y; i++)
result *= x;
iint main(void)
i ( id)
{
int a = 2;
int b = 3;
int result = power(a, b);// 함수호출
printf("%d^%d : %d n", a, b, result);
a = 3;
b = 4;
result = power(a, b);
printf("%d^%d : %d n", a, b, result);
return result;
return 0;
1장 C 언어 복습
29
5. 함수 : 매개변수 전달 방식
값에 의한 전달
예제 : swap 함수
„
문제점은?
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
t
값에 의한 전달
int main(void)
{
int a = 2;
int b = 3;
pprintf("a : %d, b : %d n", a, b);
swap(a, b);
printf("a : %d, b : %d n", a, b);
return 0;
1장 C 언어 복습
30
5. 함수 : 매개변수 전달 방식
참조에 의한 전달
*x int *y)
void swap(int *x,
{
int temp = *x;
*x = *y;
p
*yy = temp;
예제 : swap 수정
참조에 의한 전달
int main(void)
{
int a = 2;
int b = 3;
printf("a : %d, b : %d n", a, b);
swap(&a, &b);
주소 전달
printf("a : %d, b : %d n", a, b);
return 0;
0
1장 C 언어 복습
31
5. 함수 : 매개변수 전달 방식 – 배열의 전달
배열의 전달
„
값에 의한 전달 불가
„
첫 번째 원소의 주소를 전달 Æ 참조에 의한 전달 사용
예제
int형 배열 포인터, 원소 개수
void SetArray(int *ary, int count)
{
int i;
for (i = 0; i < count; i++)
ary[i] = i * i;
int main(void)
{
int i;
int Ary[5];
배열의 첫 번째 원소 주소,
주소
원소의 개수 전달
SetArray(Ary, 5);
for (i = 0; i < 5; i++)
printf("%d
i tf("%d : %d n",
" ii, Ary[i]);
A [i])
return 0;
포인터를 배열처럼 사용
1장 C 언어 복습
32
6. const와 포인터
const 상수 선언
„
const double PI = 3.14;
„
변수 PI의 값 변경 불가
함수 매개변수의 상수화
„
int sum(const int x, const int y) { return (x + y); }
„
함수 내에서 x,
x y의 값 변경 불가
„
실매개변수로 일반 변수와 const 상수 모두 사용 가능
¾ 형식매개변수가 const가 아닌 경우에는 실매개변수로 const 상수 불가
const와 포인터
„
int *pNum = &num;
1장 C 언어 복습
33
6. const와 포인터
1. num의 상수화
„
const int *pNum
pNum = &num;
2. pNum의 상수화
„
int * const pNum = &num;
예제 : const의 사용
int main(void)
{
int var1 = 1;
int var2 = 2;
선언과 동시에 초기화
const int *p1;
p1;
//int * const p2;
int * const p2 = &var1;
p1 = &var1;
p1 = &var2;
//*p1 = 5;
var2 = 4;
*p2 = 3;
//p2 = &var2;
포인터를 통해 값 변경 불가
변수 자체는 변경 가능
다른 변수로 변경 불가
printf("var1 : %d n", var1);
printf("var2 : %d n", var2);
return 0;
1장 C 언어 복습
34
7. 구조체
구조체
„
동질 또는 이질적인 데이터 여러 개를 하나의 그룹으로 처리
„
사용자 정의형
„
예 : 2차원 평면상의 한 점
„
구조체 변수 대입 O
¾ 배열은 대입 X
struct Point {
// 구조체 선언
int x;
int y;
;
struct Point P1, P2; // 변수 선언
P1.x = 5;
// 변수 사용
P1.y = 6;
값에 의한 전달 가능
P1 = P2;
struct Point Sum(struct Point P1, struct Point P2);
„
구조체 배열 가능
„
구조체의 멤버 변수로 배열 가능
¾ 이 경우에도 대입 가능
1장 C 언어 복습
struct
t t PPoint
i t Ary[10];
A [10]
struct Student {
char name[20];
int id;
int score;
;
35
7. 구조체
예제 : 2차원 평면상의 한 점을 위한 Point 구조체 사용
struct Point {
int x, y;
;
에 의한 전달
P1 : 값에 의한 전달, P2 : 참
참조에
struct Point Sum(struct Point P1, struct Point *P2)
{
struct Point Po;
Po.x = P1.x + P2->x;
구조체 포인터의 멤버는 ->로 접근
Po.y = P1.y + P2->y;
(*P2).x와 동일
return Po;
구조체 변수의 선언 및 초기화
int main(void)
{
struct Point A = { 1, 2 ;
struct Point B = { 3, 4 ;
struct Point C;
C = Sum(A, &B);
A : 값 전달, B : 주소 전달
printf("Point
i tf("P i t C : (%d,
(%d %d) n",
" C.x,
C
CC.y);
);
return 0;
1장 C 언어 복습
36
7. 구조체 : 단방향 링크드 리스트
예제 : 단방향 링크드 리스트 만들기
#include
#i
l d <<stdio.h>
tdi h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
;
int main(void)
{
int i;
struct Node *pStart = NULL;
struct Node *pEnd = NULL;
struct Node *Current;
1장 C 언어 복습
// 첫 번째 노드 포인터
// 마지막 노드 포인터
37
7. 구조체 : 단방향 링크드 리스트
for (i = 1; i <= 5; i++) {
// 노드생성
Current = (struct Node *) malloc(sizeof(struct Node));
Current >data = i;
Current->data
Current->next = NULL;
if (pStart
(p
== NULL))
pStart = pEnd = Current;
else {
pEnd->next = Current;
pEnd = Current;
// 첫 번째 노드
// 노드 추가
// 첫 번째 노드부터 출력
Current = pStart;
while (Current != NULL) {
printf("%d
printf(
%d nn", Current->data);
Current >data);
Current = Current->next;
return 0;
1장 C 언어 복습
38
8. 컴파일러 사용 방법
프로그램 작성 및 수행 과정
컴파일러의 종류
„
Visual C++ : Windows 운영 체제, 통합 개발 환경 제공
¾ Visual C++ 6.0 : 현재 가장 많이 사용되고 있음
¾ Visual
Vi
l C++ 8
8.0
0 : 최신 버전,
버전 Visual
Vi
l St
Studio
di .NET
NET 2005에 포함
„
gcc : UNIX 운영 체제
„
그 외 다수
컴파일러의 선택
„
어떤 컴파일러라도 상관없음
„
자신의 컴퓨터 사용 환경에 따라 적절히 선택하여 사용하면 됨
„
본 강의에서 배우는 것은 컴파일러의 사용 방법이 아닌 표준 C++!
1장 C 언어 복습
39