728x90

교수님 추천: 지오지브라(수학 계산 프로그램)

 

게임에는, 심리스방식, 존방식

심리스방식: 맵이 계속해서 이어지는것 방대한 맵 wow 같은거

존방식: 각 지역을 딱딱 단위별로 잘라낸거

 

%: 나머지

/: 몫

 

#include 로 헤더파일을 추가할때

< > <--- 비주얼에서 지정하고있는 라이브러리 경로에있는 헤더파일을 참조할때 쓴다.

" " <---같은 경우는 우리가 프로젝트를 할때 임의로 만든 즉 사용자 지정 헤더를 참조할때 쓴다.현재 코드가 있는 위치를 기준으로 헤더파일을 찾는다.

 

 

-디버깅-

f9 -> 브레이크포인트

f5 -> 브레이크포인트 지점에 화살표모양

f10 -> 한단계씩 진행

f11 -> 함수만나면 이제 함수안으로 들어가서 진행하게끔

ctr+f10 -> 커서있는쪽으로 바로이동

조사식:

ex) 이름에 배열이름 "a"를치면 현재 a가 크기가 10인 배열이라하면 0~9까지의 값이 나온다

또, a하고 , 콤마를 찍고 10,뭐 100 치면 10개 , 100개의 배열과함께 안의 값이 나온다.

 

-주석-

범위선택하고 ctr+k, ctr+c 하면 선택 범위 주석

범위선택하고 ctr+k, ctr+u 하면 선택 범위 주석 해제

 

구조체는 메인함수 밖에서 선언해라, 구조체 객체만들때 한글로해도 된다.

여러가지 정보를 한군데에 묶어서 뭐 배열에 넣고 이렇게 쓰기위해서 구조체 쓴다.

 

-포인터-

앞에 보통 p로 시작해서 붙임.. 곡 규칙은 아님.

(*a).age 같은 경우에는 "."이 "*"보다 우선순위가 더 높아서 괄호를 해줘야 포인터를 인식한다

그런데 이렇게 치면 좀 복잡하니까

a->age로 입력할수도 있다. 표현은 똑같다.

 

*p = *d : 둘다 포인터이고, 둘다 같은 주소를 가르킨다는 뜻이다. 즉 p와 d가 가르키는곳이 같고, p나 d나 둘중 하나가 값이 수정되면

둘다 값이 바뀐다.

 

p = *d : p가 클래스라고 치고, d도 클래스인데 포인터형이라 하면, p를 생성함과동시에 d에 있는 값들을 참고로 해서 생성한다는뜻이다. p(*d)와 같다, 즉 생성자가 클래스이름이 test라 하면 test::test(test& a)를 호출하는것과 같다. a라는 매개변수에서 보이듯이 test형의 포인터를 참고로해서 새로운 p를 생성하게된다.

 

상속관계에 있어서도 평소 자바같으면 부모클래스 a = new 자식클래스는 원래 성립이 되지않는다. 자식클래스가 한마디로 메모리가 더 크기 떄문이다라고 생각한다. 하지만 c++에서는 포인터를 사용하여 부모클래스 *a = new 자식클래스 를하게되면 부모클래스의 포인터가 자식클래스를 가르키게되고 자식클래스의 메모리 크기만큼의 공간을 만들기떄문에 포인터로 하면 잘 생성된다.

 

연산자 오버로딩을 할시 포인터를 매개변수로 넘겨주는것과, 그냥 클래스를 넘겨주는것은 메모리 할당에 있어서 차이가 있다.

CTest& operater+(CTest& a) , CTest operater+(CTest a) 두개가 있다하고 return으로 *this를 한다고하자

왼쪽같은경우는 포인터를 받는 연산자 오버, 오른쪽같은경우는 그냥 클래스 객체를 받는 연산자 오버라 하면

왼쪽은 포인터를 매개로 넘겨주고 리턴시 포인터의 주소를 넘겨주게 된다.

즉 c = a + *b를 하게 되면   c메모리->포인터메모리->함수안에서 생성된메모리 이렇게 3개가 되어버린다.

c는 계속해서 처음에 넘겨줫던 포인터의 주소를 가지게 되어 포인터를 거쳐서 함수로 가게된다는 것이다. 매우 비효율적이고, 메모리또한 낭비다

 

하지만 그냥 c = a + b 처럼 클래스 객체를 그냥 매개로 넘겨주면 리턴시 클래스 객체를 그대로 받는것이기 때문에

c메모리 -> 함수안의 메모리 를 바로 가르키게된다, 불필요한 메모리가 생성되지 않는다.

 

그리고 함수안에서 생성된 new 나 이런 메모리들은 그 함수가 끝나면 프로그램이 다 끝난거니까 소멸자 호출과 함께 메모리는 제거 된다라고 일단 그렇게 생각한다 나는.

 

-클래스-

앞에보통 C로시작해서 붙임.. 꼭 규칙은 아님.

클래스 안에 public, protected등 접근 지정 안해주면 자동으로 변수들같은 정적인 데이터들은 private, 접근가능한 함수들 같은경우네는 public으로 자동 지정 된다.

 

멤버변수: m_

정수: n

 

두점 사이의 거리 = (x1,y1) , (x2,y2)

루트((x2-x1)제곱 + (y2-y1)제곱)

------------------------------------------------------------------------------------------------

 

두점이 잇다하면 이동방향 계산 (x2,y2)는 이동할 좌표

(x2-x1, y2-y1)이 x1,y1에서 x2,y2까지 가는데의 이동방향 좌표가 된다.

 

구한후

(0,0)의 좌표를 기준으로 (x2-x1, y2-y1)과의 거리를 구한다.

즉 피타고라스 기준에서 c2=a2+b2 즉 c를 구하는것과 같다.

 

그 나온 c를 이제

x2-x1 / c 는 이동방향의 x좌표

y2-y1 / c 는 이동방향의 y좌표가 되는것이다!!

 

거리/방향 = 단위벡터

-------------------------------------------------------------------------------------------------

두개의 원이 있을 경우

각각 (x1,y1), (x2,y2) 좌표에 두개의 원이 있고 각각의 지름이 잇다고 하자.

그렇다면 이 두 원의 사이의 거리 즉 위의 좌표값이 원의 중심이 되는데 이 중심의거리

즉 두점 사이의 거리가 <= 두원의 지름의 합 이면 두개의 원은 충돌한것이고

그렇지 않으면 충돌하지 않은 것이다.

 

 

-파일입출력-

FILE* f = NULL;
 fopen_s(&f, "a.txt", "rt");    // 매개변수가 파일, 파일이름, 모드
 fwrite("Hello", 5, 1, f);       // 매개변수가 입력할 텍스트, 크기, 몇번반복, 파일
 fclose(f);                        // 파일을 오픈한 후에는 반드시닫아줘야한다.

rt = 텍스트를 읽는다.    rb = 바이너리를 읽는다.

wt = 텍스를 쓴다.        wb= 바이너리를 쓴다.

 

fopen_s(&f, "a.txt", "rt");
 char buffer[10] = { 0 };
 fread_s(buffer, 5, 1, 10, f); //매개변수가 읽어올내용 저장한위치, 저장한 위치의크기, 읽어올 요소 크기, 몇번반복, 파일이름 
 cout << buffer << endl;

 

fseek(p, 0, SEEK_SET) //파일에 포인터위치를 처음으로 초기화

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침