๋ฐฐ์ด(array) : ๋์ผํ ํ์
์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ๋ ์ฌ์ฉ๋จ
=> random access(direct access) : ์์ฐจX
=> ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์ : ์ธ๋ฑ์ค ์ฌ์ฉ
๋ฐฐ์ด ADT(์ถ์ ์๋ฃํ) : <์ธ๋ฑ์ค(index), ๊ฐ(value)>์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์งํฉ
โ 1์ฐจ์ ๋ฐฐ์ด
์ปดํ์ผ๋ฌ ์ฃผ์ : base+i*sizeof(int) (์์์ฃผ์: base, type: int)
โ
2์ฐจ์ ๋ฐฐ์ด
ex) int list[3][5];
0์ด(column) | 1์ด | 2์ด | 3์ด | 4์ด | |
---|---|---|---|---|---|
0ํ | list[0][0] | list[0][1] | list[0][2]list[0][3] | list[0][4] | list[0][5] |
1ํ | list[1][0] | list[1][1] | list[1][2] | list[1][3] | list[1][4] |
2ํ | list[2][0] | list[2][1] | list[2][2] | list[2][3] | list[2][4] |
๊ณ์ฐ 1) int test[3][5]๋ก ์ ์ธ๋ ๋ฐฐ์ด์์ test[2][3]์ ์์์ ์ฃผ์๊ฐ์?
2*5 + 3 = 13
๊ณ์ฐ 2) int test[3][4][5]๋ก ์ ์ธ๋ ๋ฐฐ์ด์์ test[2][3][3]์ ์์์ ์ฃผ์๊ฐ์?
2*4*5 + 3*5 + 3 = 58
๊ตฌ์กฐ์ฒด(structure) : ํ์
์ด ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ๋ ๋ฐฉ๋ฒ
๐ 'struct' ํค์๋ ์ฌ์ฉ
๊ตฌ์กฐ์ฒด ํ์ | ๊ตฌ์กฐ์ฒด ๋ณ์ |
---|---|
struct ๊ตฌ์กฐ์ฒด์ด๋ฆ { ํญ๋ชฉ1; ํญ๋ชฉ2; ... }; | struct ๊ตฌ์กฐ์ฒด์ด๋ฆ ๊ตฌ์กฐ์ฒด๋ณ์; |
struct studentTag { char name[10]; int age; double gpa; }; | struct studentTag s; |
๐ ๊ตฌ์กฐ์ฒด ์์ ๋ฉค๋ฒ ์ฌ์ฉ : ๋ณ์ ๋ค์ ๋ฉค๋ฒ์ฐ์ฐ์ '.' ์ฌ์ฉ
strcpy(s.name, "kim");
s.age = 20;
s.gpa = 4.3;
๐ c์ธ์ด์์๋ typedef์ ์ฌ์ฉํด ๊ตฌ์กฐ์ฒด๋ฅผ ์๋ก์ด ํ์ ์ผ๋ก ์ ์ธ ๊ฐ๋ฅ
struct studentTag {
char name[10];
int age;
double gpa;
} student;
๐ ๋ณ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ ๊ฐ๋ฅ
student s = { "kim", 20, 4.3 };
p(x) = aโxโฟ + aโโโxโฟโปยน + ... + aโx + aโ
=> a: ๊ณ์, x: ๋ณ์, n: ์ฐจ์ (๊ฐ์ฅ ํฐ ์ฐจ์=๋คํญ์์ ์ฐจ์)
โ ๋ชจ๋ ์ฐจ์์ ๊ณ์๊ฐ์ ๋ฐฐ์ด์ ์ ์ฅ : dense(๋ถํฌ๋ ์ข์ ํํ)์์ ์ ๋ฆฌ
=>๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ดํด ๊ฐ๋ฅ
=> ๋๋ถ๋ถ์ ํญ์ ๊ณ์๊ฐ 0์ธ ํฌ์ ๋คํญ์์์ ๊ณต๊ฐ์ ๋ญ๋น๊ฐ ์ฌํจ
ex) 10xโต+6x+3 = 10โxโต+0โxโด+0โxยณ+0โxยฒ+6โx+3
#include <stdio.h>
#define MAX(a,b) (((a)>(b))?(a):(b)) // a>b->a, a<=b->b
#define MAX_DEGREE 101 // ๋คํญ์ ์ต๋ ์ฐจ์:100 + ์์:1
typedef struct {
int degree; // ๋คํญ์์ ์ฐจ์๋ฅผ degree์ ์ ์ฅ
float coef[MAX_DEGREE]; // ๊ณ์๋ฅผ coef์ ์ ์ฅ
} polynomial;
polynomial poly_add(polynomial A, polynomial B) {
polynomial C;
int Apos = 0; Bpos = 0; Cpos = 0;
int degree_a = A.degree;
int degree_b = B.degree;
C.degree = MAX(A.degree, B.degree);
while (Apos <= A.degree && Bpos <= B.degree) {
if (degree_a > degree_b) {
C.coef[Cpos++] = A.coef[Apos++];
degree_a--;
}
else if (degree_a == degree_b) {
C.coef[Cpos++] = A.coef[Apos++] + B.coef[Bpos++];
degree_a--; degree_b--;
}
else {
C.coef[Cpos++] = B.coef[Bpos]++;
degree_b--;
}
}
return C;
}
void print_poly(polynomial p) {
for (int i=p.degree; i>0; i--) {
print("3.1fx^%d + ", p.coef[p.degree - i], i);
printf("%3.1f \n", p.coef[p.degree]);
}
int main(void) {
polynomial a = {5, {3, 6, 0, 0, 0, 10}}; // degreen, coef
polynomial b = {4, {7, 0, 5, 0, 1}};
polynomial c;
print_poly(a);
print_poly(b);
c = poly_add(a, b);
print_poly(c);
return 0;
}
Q. C.coef[Cpos++] = A.coef[Apos++]์ C.coef[++Cpos] = A.coef[++Apos]์ ์ฐจ์ด์ ?
A. for๋ฌธ์์๋ ์ฐจ์ด ์์. ์ ์๋ ๊ณ์ฐ ํ ํฌ์ง์ ๊ฐ ์ฆ๊ฐ, ํ์๋ ํฌ์ง์ ๊ฐ ์ฆ๊ฐ ํ ๊ณ์ฐ
โก ๋คํญ์์์ 0์ด ์๋ ํญ๋ง์ ํ๋์ ์ ์ญ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ : sparse(๋ถํฌ๋ ๋์ ํํ)์ ์ ๋ฆฌ
=> ๊ณต๊ฐ ๋ญ๋น ์ ์
=> ์ธ๋ฑ์ค ๋ณ์๋ฅผ ๊ด๋ฆฌํด์ผํจ, ๋คํญ์์ ๋ฐ๋ผ ๊ณต๊ฐ์ ๋ ์ฐจ์งํ ์ ์์, ๋ฐฉ๋ฒ์ด ์ข ๋ ์ด๋ ค์
ex) A = 8xยณ+7x+1 = ( (8,3), (7,1), (1,0) ) , B = 10xโต+6x+3 = ( (10,5), (6,1), (3,0) )
coef: ๊ณ์, expon: ์ฐจ์, avail: ํ์ฌ ๋น์ด์๋ ์์์ ์ธ๋ฑ์ค
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 101
typedef struct {
float coef;
int expon;
} polynomial;
polynomial terms[MAX_TERMS] = { {8,3}, {7,1}, {1,0}, {10,3}, {3,2}, {1,0} };
int avail = 6; // c์ ์์ ์ธ๋ฑ์ค
char compare(int a, int b) {
if (a>b) return '>';
else if (a == b) return '=';
else return '<';
}
void attach(float coef, int expon) {
if (avail > MAX_TERMS) {
fprintf(stderr, "ํญ์ ๊ฐ์๊ฐ ๋๋ฌด ๋ง์\n");
exit(1);
}
terms[avail].coef = coef;
terms[avail].expon = expon;
avail++;
}
void poly_add(int As, int Ae, int Bs, int Be, int *Cs, int *Ce) {
float tempcoef;
*Cs = avail;
while (As <= Ae && Bs <= Be) {
switch (compare(terms[As].expon, terms[Bs].expon)) {
case '>':
attach(terms[As].coef, terms[As].expon);
As++; break;
case '=':
tempcoef = terms[As].coef + terms[Bs].coef;
if (tempcoef) // 0 ์ผ ๋ ์๋ฌด๊ฒ๋X, 0 ์๋ ๋ attach
attach(tempcoef, terms[As].expon);
As++; Bs++; break;
case '<':
attach(terms[Bs].coef, terms[Bs].expon);
Bs++; break;
}
for (; As<=Ae; As++) // A์ ๋๋จธ์ง ํญ๋ค ์ด๋
attach(terms[As].coef, terms[As].expon);
for (; Bs<=Be; Bs++) // B์ ๋๋จธ์ง ํญ๋ค ์ด๋
attach(terms[Bs].coef, terms[Bs].expon);
*Cs = avail - 1;
}
void print_poly(int s, int e) {
for (int i=s; i<e; i++)
printf("%3.1fx^&d + ", terms[i].coef, terms[i].expon);
printf("%3.1fx^&d\n", terms[e].coef, terms[e].expon);
}
int main(void) {
int As=0, Ae=2, Bs=3, Be=5, Cs, Ce;
poly_add(As, Ae, Bs, Be, &Cs, &Ce);
print_poly(As, Ae);
print_poly(Bs, Be);
print_poly(Cs, Ce);
return 0;
}
ํฌ์ํ๋ ฌ ํํ๋ฐฉ๋ฒ
โ ํ๋ ฌ์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํ : dense
=> ๋ง์ ํญ์ด 0์ผ๋ก ๋์ด์๋ ๊ฒฝ์ฐ(ํฌ์ํ๋ ฌ) -> ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ฌํจ
a[i][j] => a[j][i]
#include <stdio.h>
#define ROWS 3
#define COLS 3
void matrix_transpose(int A[ROWS][COLS], int B[ROWS][COLS]) {
for (int r=0; r<ROWS; r++)
for (int c=0; c<COLS; c++)
B[c][r] = A[r][c];
}
void matrix_print(int A[ROWS][COLS]) {
for (int r=0; r<ROWS; r++) {
for (int c=0; c<COLS; c++)
printf("%d ", A[r][c]);
printf("\n");
}
}
int main(void) {
int array1[ROWS][COLS] = { {2,3,0}, {8,9,1}, {7,0,5} };
int array2[ROWS][COLS];
matrix_transpose(array1, array2);
matrix_print(array1);
matric_print(array2);
return 0;
}
โก 0์ด ์๋ ํญ๋ง ํํ : sparse
=> ํฌ์ํ๋ ฌ : ๋ฐฐ์ด ์ฌ์ฉํ๋ 0์ด ์๋ ์์๋ค๋ง ๋ํ๋ -> ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ ์
=> ์ ์น์ฐ์ฐ : ์๋นํ ํ๋ก๊ทธ๋๋ฐ ํ์
(row, col, value) => (col, row, value)
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 100
typedef struct {
int row;
int col;
int value;
} element;
typedef struct SparseMatrix {
element data[MAX_TERMS];
int rows;
int cols;
int terms;
} SparseMatrix;
SparseMaxtrix matrix_transpose(SparseMatrix a) {
SparseMatrix b;
int bindex;
b.rows = a.rows;
b.cols = a.cols;
b.terms = a.terms;
if (a.terms > 0) {
bindex = 0;
for (int c=0; c<a.cols; c++) {
for (int i=0; i<a.terms; i++) {
if (a.data[i].col == c) {
b.data[bindex].row = a.data[i].col;
b.data[bindex].col = a.data[i].row;
b.data[bindex].value = a.data[i].value;
bindex++;
}
}
}
}
return b;
}
void matrix_print(SparseMatrix a) {
for (int i=0; i<a.terms, i++) {
printf("(%d, %d, %d) \n", a.data[i].row, a.data[i].col, a.data[i].value);
}
}
int main(void) {
SparseMatrix m = {
{ {0,3,7}, {1,0,9}, {1,5,8}, {3,0,6}, {3,1,5}, {4,5,1}, {5,2,2} },
6,
6,
7
};
SparseMatrix result;
result = matrix_transpose(m);
matrix_print(result);
return 0;
}
int a = 100;
int *p;
p = &a;
// *p == a
์ฐ์ฐ์
โ & ์ฐ์ฐ์ : ๋ณ์์ ์ฃผ์๋ฅผ ์ถ์ถํ๋ ์ฐ์ฐ์
โก * ์ฐ์ฐ์ : ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฅ์์ ๊ฐ์ ์ ์ฅํ๋ ์ฐ์ฐ์
์๋ฃํ์ ๋ฐ๋ฅธ ํฌ์ธํฐ
int *p; // intํ ๋ณ์
float *pf; // doubleํ ๋ณ์
char *pc; // charํ ๋ณ์
if (p == NULL) {
fprintf(stderr, "์ค๋ฅ: ํฌ์ธํฐ๊ฐ ์๋ฌด ๊ฒ๋ ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค.");
return;
}
int **a;
a = 200;
*a = 100;
**a = 10;
#include <stdio.h>
void swap(int *px, int *py) {
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int main(void) {
int a=1, b=2;
print("swap์ ํธ์ถํ๊ธฐ ์ : a=%d, b=%d\n", a, b);
swap(&a, &b);
print("swap์ ํธ์ถํ ๋ค์: a=%d, b=%d\n", a, b);
return 0;
}
Q. swap(&a, &b)๋ก callํ๊ณ (*px, *py)๋ก ๋ฐ๋ ์ด์ ?
A. swap์์ a, b๊ฐ ๋ฐ๋์ด๋ main์ผ๋ก ๋์ด๊ฐ์ง ์์ (px, py๋ ์ฃผ์๋ฅผ ๊ฐ๊ณ ์์ผ๋ ๊ด์ฐฎ์)
- ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(dynamic memory allocation) : ํ์ํ ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น ๋ฐ์์ ์ฌ์ฉํ๊ณ , ๋๋๋ฉด ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉํ๋ ๊ธฐ๋ฅ => ํจ์จ์
- ํํ(heap) : ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ ๊ณต๊ฐ, ์ด์์ฒด์ ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ชจ์ ๋์ ๊ณณ
int *p;
p = (int *)malloc(sizeof(int)); // โ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
*p = 1000; // โก ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
free(p); // โข ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ๋ฉ
โ malloc( ) : ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ์์ ์ฃผ์๋ฅผ ๋ฐํ
ย ย ย ย void * : ๋ฐํ๋๋ ์ฃผ์์ ํ์
ย ย ย ย ๋ฉ๋ชจ๋ฆฌ ํ๋ณด๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉด NULL์ ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ๋ฐํ
โก ๋์ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ์ธํฐ๋ก๋ง ์ฌ์ฉ ๊ฐ๋ฅ
โข free( ) : ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด์์ฒด์ ์๊ฒ ๋ฐํ
ย ย ย ย ์ฃผ์! malloc( ) ํจ์๊ฐ ๋ฐํํ๋ ํฌ์ธํฐ ๊ฐ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์๋จ => ์์ด๋ฒ๋ฆฌ๋ฉด ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ฐํ ๋ถ๊ฐ๋ฅ
ย ย ย ย malloc( )์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด NULL์ ๋ฐํ (๋ฐ๋์ NULL์ธ์ง ๊ฒ์ฌ)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define SIZE 10
int main(void) {
int *p;
p = (int *)malloc(SIZE * sizeof(int));
if (p == NULL) {
fprint(stderr, "๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ํ ๋นํ ์ ์์ต๋๋ค. \n");
exit(1);
}
for (int i=0; i<SIZE; i++)
p[i] = i;
printf("%d ", p[i]);
free(p);
return 0;
}
(*ps).i == ps->i : ํฌ์ธํฐ๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ์ ๊ทผ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct studentTag {
char name[10];
int age;
double gpa;
} student;
int main(void) {
student *s;
s = (student *)malloc(sizeof(student));
if (s == NULL) {
fprintf(stderr, "๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ํ ๋นํ ์ ์์ต๋๋ค.\n");
exit(1);
}
strcpy(s->name, "Park");
s->age = 20;
free(s);
return 0;
}