How We Coding

Week 6

1. 색종이(넓이)

- 도화지를 2차원 배열(0으로 초기화)로 생각할 수 있고, 색종이를 붙인다는 건

  그 도화지에 1을 채우는 것으로 생각할 수 있다.

- 결국 1의 갯수가 색종이가 붙여진 곳의 넓이..!!

2. 색종이2(둘레)

- 000

  010

  000 에서 1은 1x1 크기의 색종이, 이 색종이의 둘레는 4


- 000

  010

  000

  010

  000 에서 도화지에 붙인 색종이의 둘레는 8.

- 즉 1의 상하좌우에 있는 0의 갯수가 둘레가 됨..!!

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

  for(j=0; j<100; j++) {

if(dowhaji[i][j] == 1) {

if(dowhaji[i-1][j] == 0) cnt++; // 상

if(dowhaji[i+1][j] == 0) cnt++; // 하

if(dowhaji[i][j-1] == 0) cnt++; // 좌

if(dowhaji[i][j+1] == 0) cnt++; // 우

}

}

  }

3. 통계학 문제

- 빈도수관련 하여 배열을 이용하여 카운트 할 수 있는데,

  이 문제에서 값의 범위는 절대값이 4000 이하.

  즉 -4000 ~ 4000 까지의 값이 들어오게 되는데,

  이 값을 0 ~ 8000 으로 매핑해서 빈도수를 체크할 수 있음.

  즉 scanf("%d", &k); cnt[k]++; 이런식으로 가능

- 반올림의 경우 0.5를 더한 후 버림을 하면 구할 수 있음.

4. 동적할당

- #include <stdlib.h> 헤더파일 선언 필요

- 배열의 크기를 그때그때 다르게 하고 싶을때..?

int main() {

f(n);

}

void f(int n)

{

int arr[n]; // 컴파일 에러 발생

}


int *arr = (int*)malloc(sizeof(int)*n);

>> malloc() 은 주소를 반환. int*로 캐스팅을 하는 이유는

   포인터 연산(배열의 인덱싱)을 할 때 자료형의 크기(여기서는 int)만큼

   계산되기 위해..

   위의 경우 sizeof(int) = 4Bytes * n 크기의 공간이 생성되고,

   그 공간의 시작주소를 반환하게 되며 arr에 그 시작주소가 저장됨.

   (int*)으로 캐스팅하여 arr[0] ~ arr[n-1]까지 배열처럼 사용가능.


동적할당은 힙 이라는 메모리 영역이 할당되어,

free(arr); 이라는 명령어를 통해 해당 메모리를 따로 해제시켜줘야함.

#include <stdio.h>

char* getName();


int main()

{

char *name;

name = getName();

printf("%s\n", name);

return 0;

}


char* getName()

{

char name[30];

scanf("%s",name);

return name;

}


>> 위 문장은 에러발생. 에러메세지 확인해보기. 

>> getName() 의 name은 지역변수..!!

>> 지역변수는 함수가 소멸되면 같이 소멸됨 

>> 동적할당으로 해결 가능

'Tutoring > 17-1 C Lang (Summer)' 카테고리의 다른 글

170727 - Week 5  (0) 2018.02.21
170720 - Week 4  (0) 2018.02.21
170706 - Week 2  (0) 2018.02.21
170629 - Week 1  (0) 2018.02.21