프로그래밍/C언어 2016. 6. 7. 04:31

이번에 해볼것은 저번에 했던 우주선에서 배경을 텍스트 파일로 불러오는 것이다.

한마디로 요약하자면 배열에 들어 갈 값을 텍스트파일로 받아오는것이다.


엄청나게 간단하다.


int map[WIDTH][HEIGHT]; 일단 이렇게 2차원의 map이라는 배열을 선언해 준 후 



이렇게 메모장에 배경과 맵을 만들어 준다.


그리고 

FILE *fp = fopen("map.txt", "r");

for (int i = 0; i<WIDTH; i++)

for (int j = 0; j<HEIGHT; j++)

fscanf(fp, "%d", &map[i][j]);

이렇게 해주면 끝이다. fscanf 는 공백까지 읽어드리므로 그냥 1하고 스페이스바 한번 누르고 1 이렇게 쓰면 된다.

posted by 천마서생
:
프로그래밍/C언어 2016. 6. 7. 04:24

조건

1. 배열의 크기 상관없음.

2. 우주선 모양 상관없음.

3. 구름(▩)의 모양, 속도 상관없음. 갯수는 적어도 세 개 이상.

4. 테두리 지워지지 말것.

5. 우주선이 구름에 가려지면 안 됨. 그 반대로 구현해야함.


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



솔직히 우주선이라 보기에는 너무 대충만들었다.

그래도 일단 시작해보자. 

필자는 이번 문제를 보면서 생각한 것이 우주선은 어쩌피 안 움직이고 뒤에 배경 즉, 구름만 움직여야 한다는 조건을 듣고 생각을 해봤다. "차라리 우주선을 배경으로 씌워버리면 어떨까? 어쩌피 우주선은 고정이니깐" 이런 생각을 가지고 저번 포스팅때 만든 맵을 그대로 가져왔다.

우주선이 해결되니 남은 것은 구름이다. 우주선은 기본적으로 움직여야 하니 구름은 스스로 내려가도록 설정해야한다. 따라서 필자는 AutoMove() 라는 함수를 새로 만들었다.

AutoMove()

{

m_y++;

}

맨 처음에는 이렇게 짰었다. 하지만 구름은 미친듯한 속도로 내려가는 걸 보고 절망에 빠졌고 속도를 늦출 방법을 생각해야했다. 그래서 검색을 하던중 time.h에 시간에 관련된 함수가 있는 것을 보고 delay(clock_h n) 이라는 함수라는 것을 새로 만들었다. delay함수는 이 함수를 컴파일러가 읽으면 n값 만큼 시간을 지연시켜주는 함수이다.


void delay(clock_t n)

{

clock_t start = clock();

while (clock() - start < n);

}

AutoMove()

{

delay(100);

m_y++;

}

이렇게 설정을 해주고 나니 이제 남은 것은 구름과 테두리를 충돌 체크 해줘야한다.

 

충돌 체크는 의외로 쉬웠다.오른쪽으로 움직일 시 구름의 좌표 + 구름의 길이 +1의 값이 BLOCK 즉 테두리 일 경우 입력을 못 받게 했으면 왼쪽으로 움직일 시 구름의 좌표 -1의 값을 체크했다. 이렇게 완성을 했다.


이번에도 소스코드는 C++이다. 하지만 전편에서도 말했지만 딱히 상관은 없다. C++의 꽃인 상속(다형성)은 1도 안썼다. 





posted by 천마서생
:
프로그래밍/C언어 2016. 6. 7. 04:06

맵 만들기 


1. 맵을 만든다.(벽에 닿으면 못나가게 충돌체크)


2. 움직일 플레이어와 도착지점을 만든다.


3. 플레이어가 도착점에 들어가면 종료


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


이번 문제는 VS에서 주는 기본적인 함수를 알고 깨야한다.


void setXY(int x, int y)

{

// 함수값을 정해주는 함수

COORD Pos = { x, y };


SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}


바로 이 함수인데, 좌표값을 잡아주는 함수이다. 함수 이름은 마음대로 정해도 된다.


꼭 배열로 안 만들어도 되지만, 쉽고 간편하게 만들기 위해서 배열을 사용한다.


필자는 배열에 0 , 1 , 2라는 숫자를 넣었고 각각 ROAD,BLOCK, FINISH 로 enum으로 이름을 정의해 줬다. (꼭 해줄 필요는 없다. 가독성을 위해서 한 것 이므로)


그리고 배열로 출력을 어떻게 해요 라는 분들이 있는데, 우리에게는 setXY 함수가 있으니 활용을 하면 된다! 필자 같은 경우에는 

void Render()

{

setXY(m_x * 2, m_y);

printf("%s", m_name);

}

이런식으로 사용했다. 솔직히 x에 2를 왜 곱하는지는 모르겠지만 흠흠... 일단 오른쪽으로 가려면 꼭 2배로 증가해야 한다는 사실을 알아두도록 하자. 


int map[WIDTH][HEIGHT] =

{

{ 1,1,1,1,1,1,1,1,1,1 },

{ 1,0,1,0,0,0,0,0,0,1 },

{ 1,0,1,0,0,0,0,1,0,1 },

{ 1,0,0,1,0,0,0,1,0,1 },

{ 1,0,0,1,0,0,0,0,0,1 },

{ 1,0,0,0,0,1,1,0,0,1 },

{ 1,0,0,0,0,1,1,0,0,1 },

{ 1,0,0,0,0,0,0,0,0,1 },

{ 1,0,0,0,0,1,1,0,2,1 },

{ 1,1,1,1,1,1,1,1,1,1 },

};

이렇게 배열을 짰고 출력 할때는 

for (int i = 0; i < WIDTH; i++)

{

for (int j = 0; j < HEIGHT; j++)

{

setXY( i* 2,j);

if(map[i][j]==0)

printf("");

else if(map[i][j]==1)

printf("□");

else if(map[i][j]==2)

printf("☆");

}

}


대충 이렇게 해주면 될 듯하다. 


이번꺼는 원래 C++로 짰다. C로 바꾸기 귀찮아서.... C++로 올리겠다. 차이는 구조체를 클래스로 만들어줬자는 거 밖에 없으므로 그렇게 혼동은 안 올 것이다.





posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 03:44

주소록 만들기 문제


(1)삽입)회원번호,이름,휴대전화 번호 입력하도록


(2)정렬)회원번호 기준으로 오름차순으로 정렬


(3)삭제)무슨 번호를 삭제할지 묻고,사용자 입력 정보를 삭제

삭제는 회원번호 이름 휴대전화를 전부 0으로 만든다.


(4)출력)정렬한 후 출력할 경우, 정렬한 순으로 정보 출력

아닌 경우 그대로 출력(회원 번호, 이름, 휴대전화 번호 출력)


struct와 enum 꼭 이용.


정렬 예제
5 4 2 3 1 6 9 8 [정렬X]
정렬 시-> 1 2 3 4 5 6 8 9
정렬 후 출력할 경우

1번 ※ ***-****-****

2번 ※ ***-****-****

3번 ※ ***-****-****

4번 ※ ***-****-****

5번 ※ ***-****-****

6번 ※ ***-****-****

8번 ※ ***-****-****

9번 ※ ***-****-****


//회원 번호 0번은 입력 불가능 하도록.

//출력 때 회원번호 0번은 출력되지 않도록.

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




이번 문제는 약간 머리를 써야하는 문제이다. 

기본적으로 배열은 인덱스가 전부 연결되어있는 완성된 형태이다. 

이러한 배열의 성질때문에 중간의 어떤 인덱스를 지우는것은 불가능하다. (이런것이 가능한 것은 리스트이다.)

예를들어 1 2 3 4 5 이 순서대로 저장되어 있다고 치자. 이때 2를 삭제하려고 한다. 그러면
1 0 3 4 5 이런 식으로 되있을것이다.

필자가 생각하는 삭제 및 출력방식은 총 2가지이다. 


1번째는 필자가 만든 방식으로 삭제 할 때 0으로 만들고 그 0을 뒤로 밀어버리는 방식이다. 그리고 출력할때도 회원번호가 0인 것이 나올때까지 출력하는 것이다.

예를 들어 1 2 3 4 5 0 0 0 ... 이런식으로 되있고 2를 삭제하면 1 0 3 4 5 0 0 0 ,,, 이런식으로 만든 후 1 3 4 5 0 0 0 0 ... 이렇게 만드는 것이다. 또한 출력때도 1 3 4 5 까지만 출력하고 반복문을 탈출한다. 

2번째는 그냥 0으로 삭제하고 출력할때 회원번호가 0인 것은 거르는 형식이다.

예를 들면 1 2 3 4 5 0 0 0 ... 이런식으로 되있고 2를 삭제하면 1 0 3 4 5 0 0 0... 이런식으로 놔두고 출력할때 회원번호가 0이면 출력을 안 하게 조건문을 만드는 것이다.


필자는 가급적 1번째를 추천한다. 왜냐하면 1번째는 구조체에 데이터가 있는 부분까지만 반복문이 돌고 2번째는 구조체의 끝부분까지 즉, 회원번호를 입력 안한 곳까지도 확인하기 때문에 메모리 낭비이다. 사실상 별 차이 없기는 하지만 자료구조를 배우게 되면 이해 할 것이다.





posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 03:13

저번 포스팅때는 너무나도 잘 알려진 구조로 만들어서 약간 재미없었을 것이다. 그래서 달팽이(나선형)구조를 이용하면서 새로운 구조를 생각해 봤다.


이번에는 문자열을 받아서 그 길이만큼 나선형을 만들고 문자는 계속 입력된값이 나오도록 만드는 것이다. 설명이 어려워서 실행창으로 설명을 대체하겠다.



조건은 100자이내의 문자열을 입력했을때 실행된다. 







posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 03:06

이번에 만들어 볼 것은 배열을 이용해 달팽이(나선형)구조를 만들어 볼것이다.



실제로 이것은 윤성우가 쓴 책인 열혈강의 C 프로그래밍에 도전 프로그래밍에 수록되었고 많은 사람들이 포스팅을 했던 코드라 감회가 별로 없을것이다.

하지만 다음번 포스팅때는 재밌는 문제로 바꿔서 만들어 볼 것이다.




posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 02:45

직각삼각형 -> 정삼각형 -> 다이아몬드를 반복문으로 만들어봤다.


이번에는 풍차를 만들어보자. 



풍차에 붙여진 숫자는 밑에 소스코드를 이해하기 위해 임의로 붙여놨다.


풍차는 기본적으로 4개의 직각삼각형을 붙인 구조이다. 


1번 삼각형은 이미 만들어 봤고 2번부터 문제다. 1번과 2번은 동시에 생성되야한다. 같은 의미로 

3번과 4번 또한 동시에 생성되어야한다. 왜냐하면 위에서부터 한줄 한줄 생성하기 떄문이다.




posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 02:35

이번에는 반복문을 이용하여 마름모(다이아몬드)를 만들어 보겠다.


주의사항은 입력은 홀수만 받아야한다.





마름모를 만드는 방법은 여러개다. 

필자는 위와 아래를 나누어 정삼각형 두개를 만들고 붙여서 마름모를 만들것이다.





posted by 천마서생
:
프로그래밍/C언어 2016. 4. 15. 02:26

for문 즉, 반복문을 이용해 직삼각형, 정삼각형을 만드는 예제이다.


실행 예 )





일단, 반복문 한개를 쓰는 것과 중첩해서 쓰는 방법이 있다.


먼저 이 글에서는 중첩해서 만들것이다. 여기서 왜 한개를 쓰는 건 안 쓰냐고 하는 분들도 계실텐데 보통 중첩해서 하는게 편하고 대중화 되어 있으므로 중첩해서 쓸 것이다. 

한개를 이용해 만들고 싶은 사람들은 반복문과 조건문을 잘 활용하면 만들 수 있다.


각설하고 우선 정삼각형을 만들기전에 직사각형을 만들면서 기본적인 구조에 대해 알아보자.


*

**

***


대충 이런 모양을 내려고 한다. 





다음으로는 정삼각형이다.



정삼각형은 공백과 별 그리고 띄워쓰기를 유용하게 써야한다.




posted by 천마서생
: