• 검색 결과가 없습니다.

배열과 02 구조체

N/A
N/A
Protected

Academic year: 2022

Share "배열과 02 구조체"

Copied!
31
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

--- DATA

STRUCTURES USING C

---

1

배열과 구조체

02

CHAPTER

(2)

• 배열(array), 구조체(struct)

– 성적 처리 프로그램에서 45명의 성적을 저장하는 방법

– 주소록 프로그램에서 친구들의 다양한 정보(이름, 전화번호, 주소, 이메일 등) 를 통합하여 저장하는 방법

많은 자료의 처리?

1번

84

2번

72

3번

94

45번

87

홍 길 동

이 름: 홍 길 동

전 화: 010-1234-56XX

주 소: 서 울 특 별 시 XX구 YY동 … 이 메 일: kdhong@korea...

반 학 생 들 의 성 적 처 리 친 구 주 소 록 만 들 기

(3)

3

• 참고 자료

https://youtu.be/Bxv-pmGpHGY

(4)

• 참고 자료-구조체

https://youtu.be/nZZwQNREuJU

(5)

5

• 같은 형의 변수를 여러 개 만드는 경우에 사용

– 여러 개의 변수 선언: int A0, A1, A2, A3, …,A5;

– 하나의 배열 선언: int A[6];

• 만약 배열이 없다면?

– 반복문을 사용할 수 없다!

배열

A[0] A[1] A[2] A[3] A[4] A[5]

a1 a2

a3

a4 a5 a6

변 수 선 언 배 열 선 언

(6)

• 배열: <인덱스, 요소 > 쌍의 집합

– 인덱스가 주어지면 해당되는 요소가 대응되는 구조

• 직접 접근(direct access) 방식

– 항목 접근의 시간 복잡도가 O(1) – 연결 리스트(5장)

• 순차 접근(sequential access) 방식

• 항목 접근의 시간 복잡도 O(n)

• 벡터?

– C++의 STL에서 vector 제공 – 배열과 벡터의 차이는?

배열의 특징

(7)

7

• 자료형 배열이름 [ 배열의_크기 ];

• int A[6];

1 차원 배열

(8)

• 변수의 복사와 배열의 복사

배열의 복사

#include <stdio.h>

int main() {

int A[5] = { 10, 20, 30 };

int B[5], i, x = 2018, y = 0;

y = x;

for (i = 0; i < 5; i++) B[i] = A[i];

printf("변수 복사 결과: x=%d, y=%d\n", x, y);

printf("배열 복사 결과: \n");

for (i = 0; i < 5; i++) {

printf("A[%d] = %d\t", i, A[i]);

printf("B[%d] = %d\n", i, B[i]);

}

return 0;

(9)

9

• char s[12] = “game over”;

• 문자열 처리

– 문자열의 복사나 비교를 위해 =나 == 또는 <등의 연산자를 사용할 수 없다.

– strcmp(), strcpy(), …

– 문자열 처리 함수가 정의되어 있는 <string.h > 포함시킬 것

문자열 : 특별한 1차원 배열

(10)

• 자료형 배열이름[행의_크기][열의_크기];

– int A[4][3];

– int A[4][3]= { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} };

2 차원 배열

(11)

11

• 변수의 전달 ! 값을 복사 (call by value)

• 배열의 전달 ! 첫 번째 항목의 주소를 전달(주소를 복사)

함수의 매개변수로서의 배열

void copy_array(int a[], int b[], int len) { int i;

for (i = 0; i < len; i++) b[i] = a[i];

}

void copy_variable(int a, int b) { b = a;

}

int A[5] = { 10, 20, 30 };

int B[5], i, x = 2018, y = 0;

copy_variable(x, y);

copy_array(A, B, 5);

(12)

• 매개 변수로 배열의 길이도 전달해야 함 .

int findMaxValue( int a[], int len )

int arr[10] = {3, …};

int maxVal = findMaxValue( arr, 10 );

• 2차원 이상의 다차원 배열의 매개 변수 전달에 조심.

– int findMaxPixel( int a[][5], int h, int w )

배열에서의 주의사항

(13)

13

• 기존의 자료형들을 조합해 새로운 자료형을 만드는 방법

• 배열과의 차이

– 구조체(structure): 타입이 다른 데이터를 하나로 묶음 – 배열(array): 타입이 같은 데이터들을 하나로 묶음

구조체

(14)

C의 자료형

자료형 (data type)

기초 자료형 파생 자료형 사용자 정의 자료형

char short int

float double

배열 포인터 구조체(struct) 공용체(union)

함수형

typedef enum

(15)

구조체란?

서로 다른 종류(형,type)의 데이터를 하나로 묶으 려고 할때

학번 : 20170001 (정수) 이름 : “최자영” (문자열) 학점 : 4.3 (실수)

int student_id;

//학번, 정수형

char name[10];

//이름, 문자열

double grade;

//학점, 실수형

struct student { … } 에 묶어준다

struct는 개별 자료형을 하나로 묶음

(16)

구조체 정의

기본 자료형만으로 표현하지 못하는 복잡한 형

예를 들어 사람의 이름, 나이, 키, 몸무게 정보를 하나의 자료 형으로 묶어서 표현하고 싶을 경우?

struct라는 키워드를 이용하여 선언함

(17)

선언

struct 태그 { 자료형 멤버1 자료형 멤버2 };

struct student {

};

student_id n a m e grade

int student_id;

char name[10];

double grade;

(18)

구조체

#include <stdio.h>

#include <stdlib.h>

struct student{

int student_id;

char name[10];

double grade;

};

int main(void) {

struct student s;

s.student_id = 20170001;

strcpy(s.name,"홍길동");

s.grade = 4.3;

printf("학번: %d\n”,s.student_id);

printf("이름: %s\n",s.name);

printf("학점: %f\n",s.grade);

21 34 56 87 109

11 1213 1415 1617 18

structEx.c

(19)

결과

(20)

• 정의

• 선언

• 멤버 접근: 항목 연산자(membership operator) '.'

구조체의 정의와 선언

struct Student { int id;

char name[20];

double score;

};

typedef struct Student_t { int id;

char name[20];

double score;

} Student;

Student a = { 201803156, “홍길동”, 96.3 };

struct Student a; Student a;

a.id = 30830;

a.score = 92.3;

(21)

21

• 대입 연산자만 가능

• 다른 연산자 사용 불가

구조체와 연산자

int x, y=10;

Student a, b={ 201803156, “홍길동”, 96.3 };

x = y; // OK: int 변수의 복사

a = b; // OK: 구조체 변수의 복사

if( a > b ) // 오류: 구조체의 비교연산 불가

a += b; // 오류: 구조체의 다른 대입 연산도 불가

int compare(Student a, Student b) { return a.id – b.id;

}

(22)

• 함수의 매개 변수나 반환형으로 사용할 수 있음.

– Call by value

• 다음 함수의 동작은?

구조체와 함수

void print_complex(Complex c) {

printf("%4.1f + %4.1fi\n", c.real, c.imag);

}

void reset_complex(Complex c) { c.real = c.imag = 0.0;

}

(23)

23

• 다항식의 일반적인 형태

– 처리를 위한 다항식의 자료구조가 필요

– 어떤 자료구조가 다항식의 연산을 편리하게 할까?

• 다항식을 위한 자료구조?

– 배열을 사용하는 방법

• 모든 항의 계수를 배열에 저장

• 다항식의 0이 아닌 항만을 배열에 저장: 희소 다항식

0 1

1

1

...

)

( x a x a x a x a

p =

n n

+

n n

+ + +

배열과 구조체의 응용 : 다항식

(24)

다항식 구조체

#define MAX_DEGREE 101 // 다항식의 최고 차수 + 1 typedef struct {

int degree;

float coef[MAX_DEGREE];

} Polynomial ;

10 0 0 0 6 3

[0] [1] [2] [3] [4] [5] [6] [7] [8]

coef

[9]

3 6 0 0 0 10

coef

...

...

방 법1:

방 법2:

10 0 0 0 6 3 0 0 0 0

3 6 0 0 0 10 0 0 0 0

p(x) = 10x5+0x4+0x3+0x2+6x1+3x0

(25)

25

다항식 표현 방법 #1

• 모든 차수에 대한 계수값을 배열로 저장

• 하나의 다항식을 하나의 배열로 표현

0 1

2 3

4

5

0 0 0 6 3

10 x + x + x + x + x + x

coef

10 0 0 0 6 3

0 1 2 3 4 5 6 7 8 9 10

typedef struct { int degree;

float coef[MAX_DEGREE];

} Polynomial;

Polynomial a = { 5, {10, 0, 0, 0, 6, 3} };

index

(26)

다항식 입출력 연산(방법 1)

Polynomial read_poly() {

int i;

Polynomial p;

printf("다항식의 최고 차수를 입력하시오: ");

scanf( "%d", &p.degree );

printf("각 항의 계수를 입력하시오 (총 %d개): ", p.degree+1);

for( i=0 ; i<=p.degree ; i++) scanf( "%f", p.coef+i );

void print_poly(Polynomial p, char str[]) {

int i;

printf("\t%s", str);

for( i=0 ; i<p.degree ; i++)

printf("%5.1f x^%d + ", p.coef[i], p.degree-i);

printf( "%4.1f\n", p.coef[p.degree] );

}

(27)

27

Polynomial add_poly(Polynomial a, Polynomial b) {

int i;

Polynomial p;

if (a.degree > b.degree) { p = a;

for( i=0 ; i<=b.degree ; i++ )

p.coef[i+(p.degree-b.degree)] += b.coef[i];

}

else {

p = b;

for( i=0 ; i<=a.degree ; i++ )

p.coef[i+(p.degree-a.degree)] += a.coef[i];

}

return p;

}

다항식의 덧셈 연산

• 다항식 덧셈 알고리즘?

• 단순화 방법? c=a+b ➔ c = a; c += b;

(28)

다항식 프로그램

void main() {

Polynomial a, b, c;

a = read_poly();

b = read_poly();

c = add_poly (a, b);

print_poly(a," A = ");

print_poly(b," B = ");

print_poly(c,"A+B= ");

}

(29)

29

연습

– 다항식의 덧셈

A=8x

3

+7x+1,

B=10x

3

+3x

2

+1,

C=A+B

(30)

• 희소 다항식(Sparse Polynomial) 이란?

– 대부분 항의 계수가 0인 다항식 : 10x

100

+6

10 0 0 0 0 0 ... 0 0

[0] [1] [2] [3] [4] [5] ... [98] [99]

coef 6

[100]

...

Polynomial:

100 0

[0] [1] [2] [3] [4] [5] [6]

coef expo SparsePoly:

10 6 Term

희소 다항식의 표현

typedef struct {

int expon;

float coef;

} Term;

typedef struct {

int nTerms;

Term term[MAX_TERMS];

} SparsePoly;

10 0 0 0 0 0 0 0 6

10x

100

+6

10 6 100 0

메모리 낭비

(31)

31

• 과제 #2

• 2 장 연습문제 풀이

참조

관련 문서

 식품에서 대장균 군이 검출되었다는 것은 그 식품이 분변에 오염되어 있을 가능성이 큼.  가열처리식품에서 대장균 군이 검출되면

CHAP 3:배열,

Section 02 CMOS 인버터의

 job_code가 0이면 job_info 공용체 변수의 school_name을 사용하고, job_code가 1이면 company_name을 사용한다...

맊약 컨트롤 팔레트가 나타나지 않 으면 프런트 패널에서 마우스 오른쪽 버튼을 클릭하거나 보기 메뉴에서 컨트 롤 팔레트를 클릭하면 컨트롤 팔레트가 나타난다. ②

 병원체나 조직손상의 자극을 받은 경우 조직에서 병원체를 제거하고 T 림프구에 항원을 전달함 (염증성 대식세포).  병원체를 포식한

링크드리스트( Linked List ) 라고 한다. 매우 중요하지만,

선천성 기형 신생아 간호.. 선천성 기형 아동의 출생.. 임신 중 모체가 갖고 있는 질병이나 유전적 혹은 환경적 요인에 의해서 신체 구조에 이상을 가지고 태어난