{만든사람 : 2002013XXX 황XX비쥬얼 프로그래밍 과제만든날짜 : 2002. 12. 9.일작업환경 :->CPU : Intel Celeron Processor 800 Mhz->Ram : 256MB SDRAM->HDD : 30GB->O.S : WINDOWS 2000 PROFESSIONAL->사용툴 : VISUAL STUDIO 6.0제가 만든 오목 프로그램은 모두 400개의 사각형으로 이루어진 오목판과 그 옆에 만든이, 만든이의 소속, 간단한 사용법, 현재 누구의 차례인지 나타나는 항목, 그리고 흰돌과 검은돌의 개수를 보여주는 정보창으로 이루어져 있습니다.구현된 기능은 우선 오목판에 같은 종류의 바둑알이 일렬로 5개가 놓아지면 승리를 선언하고 게임을 초기화 시키는 기능과, 같은 종류의 바둑알이 3개 또는 4개가 놓아질 경우 그곳에 놓아진 바둑알의 겉에 빨간색 사각형을 그리게 하여 사용자가 알 수 있도록 하였습니다.정보창에는 현재 누구의 차례인지 검은돌과 흰돌의 개수가 몇개인지를 알 수 있도록 하였습니다.{-> 오목구현저는 오목을 구현하기 위하여 일단 사용자에게 보여지는 오목판과 또한 오목알을 놓고 프로그래밍을 좀더 간단하게 하기 위해 사용자에게 보여지지 않는 메모리 오목판을 만들어 두었습니다. 메모리 오목판은 사용자에게 보여지는 오목판이 20*20개의 사각형의로 이루어진데 반해 21*21개의 오목판으로 이루어져 있습니다. 그리고 메모리 오목판은 사용자에게 보여지는 오목판의 두 변을 정확히 가운데로 자르기 때문에 결국 프로그래밍을 할때에 사용자가 클릭한 곳이 메모리 오목판의 어디에 해당하는지 알아낸 후 메모리 오목판 안의 사각형에 원을 그려주면 사용자가 볼때에는 사각형들의 교점에 오목알이 놓여지는 것 처럼 보이게 됩니다.그리고 나서 오목알이 한번 놓여질때마다 흰색돌에서 검은색돌로 검은색돌에서 흰색돌로 토글이 되도록 만들어 두었습니다.그 다음 오목알이 놓여 졌을때 현재 오목이 흰돌이 이겼는지 검은돌이 이겼는지 파악하기 위해선 오목판을 검색해야 할 필요성이 있습니다.그래서 제가 생각해낸 방법은 일단 어떤 좌표 (x,y)에 오목알이 놓여졌다면 그 좌표를 중심으로 좌우 상하 대각선 4군데 이렇게 8개의 방향을 검색하게 됩니다.그런데 만약 x,y에 놓여진 오목알이 검은색이라면 각 방향에서 검은색이 있는곳만 검색을 하면 됩니다.따라서 각 8개의 방향을 검색하다 검은색이 아닌것(흰색돌이나 그냥 공간)을 만나게 되면 그 방향으로의 검색은 중지하게 되고 다른방향의 검색은 검은색돌이 놓여져 있는한 계속해서 검색하게 됩니다.{예를들어 위와같은 모습일때 가운데에 놓여진 검은색 오목알을 방금 놓았다고 하면 프로그램은 11시방향, 12시방향, 1시방향, 3시방향, 5시방향, 6시방향, 7시방향, 9시방향을 검색하게 되는데 11시방향, 1시방향, 7시방향은 검은돌이 아니라 흰돌이기 때문에 검색을 중단하게 되고 12시방향, 3시방향, 6시방향, 9시방향은 검은돌이 아니라 공간이기 때문에 역시 검색을 중단하게 됩니다. 5시방향에는 같은 검은돌이 있기 때문에 적절한 변수를 1증가 시키고 5시방향으로 또다시 검색하게 됩니다. 그런데 5시 방향에는 더이상 검은돌이 없기 때문에 역시 검색을 중단시킵니다.이런식으로 하여 나중에 어떤 특정한 변수에 증가되어 있는값이 오목으로 판단될 경우에 게임 승리를 선언하고 게임을 초기화 시키도록 하였습니다.->3개나 4개가 일렬로 늘어섰을 경우 사용자에게 알려줌{같은 종류의 돌이 3개나 4개가 일렬로 늘어섰을때 저는 그곳을 빨간색 네모상자 안에 들어오게 하여서 사용자가 알 수 있도록 하였습니다.방법은 매우 간단한데 우선은 처음에 설명했던데로 각 방향을 검색하는 방법은 동일합니다.위와같은 방법으로 검색하여 그 개수가 3개나 4개인걸로 판단이 되면 메모리상에 있는 오목판 중 해당하는 오목알이 있는곳만 사용자에게 보여지게 하면 사용자가 그곳이 3개가 되었는지 알 수 있습니다.저는 CVIEW클래스만을 이용하여 오목을 구현하였습니다. 오목 프로젝트는 모두 19개의 함수와 8개의 변수들로 이루어져 있습니다. 일단 사용자가 저의 오목을 시작하게 되면다음과 같은 코드가 수행되어 화면의 크기를 전체 화면으로 만들어 줍니다.m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);그 다음은 프로그램 내의 모든 변수들을 초기화 시켜줄 필요가 있으므로 COmok2View클래스의 생성자 함수에 제가 만들어 둔 initialvariable함수를 호출하게 하여 모든 변수를 초기화 시키게 됩니다.COmok2View::COmok2View(){// TODO: add construction code hereinitialvariable(); //생성자 함수가 호출되면 모든 변수들을 초기화 시킨다.}제가 변수 초기화 하는 함수를 따로 만들어 둔 이유는 이상하게도 MFC에서는 int x = 0;이런식으로 선언과 동시에 초기화를 시켜주면 컴파일이 되지 않았습니다. 그래서initvariable이라는 함수를 이용하여 초기화 시켜줄 수 있도록 하였고 또 다른 이유는메모리상의 오목판을 만들기 위해 RECT형 배열을 만들어 두었는데 이 배열을 초기화 시킬 필요가 있기 때문이었습니다.void COmok2View::initialvariable(){whoplays = WHITEUSER;memx = 0;memy = 0;for(y=0; y
황XX 2002013XXX-- 황XX 계산기 프로젝트..- 자료구조를 이용한 계산기이번 프로젝트인 계산기를 만들기 위해서 정말 많은 시간과 노력을 투자 하였습니다. 제가 만든 계산기의 가장 커다란 특징은 바로 자료구조를 이용했다는 것 입니다. 물론 아직 그쪽에 대해선 전혀 배워본바가 없지만(그래서 약간 엉성합니다 ^^;) 우리가 공부하는 교과서에 스택과 큐에 관한 언급이 있어서 그곳에 명시한 특성대로 스택과 큐를 만들어 보았습니다.우선 제가 만든 계산기에 대해 소개하겠습니다. 먼저 간단한 구성을 살펴보면 제가 만든 계산기는 큐에 해당하는 역할을 하는 QueData, 스택에 해당하는 역할을 하는 StackData, 그리고 계산기의 전박적 역할을 수행하는 Calculator, 이렇게 세 개의 클래스로 이루어져 있습니다.QueData는 모두 10개의 메소드로 이루어져 있고 StackData는 6개의 메소드, Calculator는 9개의 메소드로 이루어져 있습니다.만들다 보니 처음 생각보다 자꾸 뭔가가 추가되어 제가 생각했던 크기보다 프로그램의 크기가 약간 더 커졌습니다.제가 만든 계산기가 수행되는 원리는 아주 간단합니다. 간단히 설명 드리면 일단 사용자 어떤 데이터를 마우스를 이용하여 입력하도록 합니다. 만약 1+2*3을 입력하고 = 버튼을 클릭하였다면 사용자가 지금까지 입력한 데이터를 모두 가져오게 됩니다.그리고 나서 일명 PostFix라는걸 하게 되는데(인터넷에서 참조한 알고리즘 입니다.) PostFix 하는건 매우 간단한 원리 입니다. 우선 하나의 스택에 숫자 1,2,3을 차례로 저장합니다. 그리고 또다른 스택에는 연산자를 저장하게 되는데 연산자는 숫자처럼 순서대로 저장하는게 아니고 우선순위가 높은순으로 먼저 저장됩니다. 따라서 *,+순으로 저장이 되겠지요그리고 나서 숫자가 저장된 스택에 연산자가 저장된 스택에 있는 자료들을 모두 저장하게 됩니다. 그렇게 하면 처음 숫자를 저장했던 스택에는 1,2,3,*,+순으로 저장이 됩니다.저러한 순서로 저장하는게 Post해 내는데 무려 17시간을 잠안자고 생각해야 했습니다. ㅜㅜ...{사용된 레이아웃은 BorderLayout과 GridLayout 입니다. 이곳에는 모두 4개의 패널이 있는데 숫자버튼이 있는 패널은 BorderLayout의 west에 사칙연산 기호가 있는곳은 BorderLayout의 Center에 그리고 삼각함수 기호가 있는곳은 BorderLayout의 east에 위치시켰고 결과창과 입력창 PostFix창이 나오는곳은 BorderLayout의 North에 위치시켰습니다.이번 프로젝트 에서는 계산기를 디자인 하는것보다 계산기 내부적으로 수행되는 동작에 초점이 맞추어져 있기 때문에 외부적 디자인은 default로 사용하였습니다.(PostFix의 구현)Introduction에 저의 알고리즘과 계산기의 레이아웃을 설명해 두었고 Implementation 파트에서는 알고리즘을 어떻게 실제 코드로 구현하였는지 설명하겠습니다.우선 PostFix를 만드는 과정부터 설명하겠습니다.사용자가 데이터의 입력을 끝내고 = 버튼을 클릭하면 바로 입력한 데이터를 가져오게 되고Stack에 얼마만큼의 메모리를 할당할지를 결정하게 됩니다.//생략..String nToken; // 토큰을 하나씩 받아와서 저장할려고..StringTokenizer parser;parser = new StringTokenizer(inputData,"+-*/^%~sctprl()",true);int num = parser.countTokens(); // 각 원소 갯수를 알아냄.StackData mainStack = new StackData(num); // 실제로 필요한 스택자료저장StackData tempStack = new StackData(num); // +-/ 등을 임시 저장하기위해//생략...또한 입력된 데이터를 적당히 tokenize 시켜서 token들을 하나하나씩 검사해 봅니다. 만일 token이 연산자라면 isOperator라고 선언되어진 boolean타입의 변수에 true가 입력이 되고 그렇지 않으면 faack에 저장시킵니다. 그리고 그 자리에 새로 들어온 좀더 우선순위가 낮은 연산자를 저장시킵니다.while ( (tempStack.top >= 0) && getPri(nToken,true) =0){mainStack.push(tempStack.pop());}다음과 같은 코드를 구현함으로써 tempStack에 남아있는 연산자들을 mainStack에 옮기게 됩니다.괄호가 있을시에는 약간 다르긴 하지만 기본적으론 지금까지 설명한것과 똑같기 때문에 자세한 설명은 생략하고 간단한 설명으로 대치하도록 하겠습니다.만약 괄호가 있다면 괄호를 PostFix시키게 됩니다. 예를들어서 (1+2)+(1+2*3)이라면 간단히(PostFix)+(PostFix) 그리고 전체를 PostFix 순으로 가게 됩니다. 따라서1+2를 PostFix 시키면 1,2,+가 되고 1+2*3을 PostFix 시키면 1,2,3,*,+가 되고 전체를 PostFix 시키면 1,2,+,1,2,3,*,+,+가 되는 원리 입니다. 약간 복잡하긴 하지만 결과적으론 지금까지 설명한걸 여러번 하는것에 불과합니다.(결과의 구현)일단 Stack을 이용하여 제대로된 PostFix를 하였다면 다음번 역할을 Que에게 넘어가게 됩니다.//생략..QueData dataque = new QueData(mStack.top+1);double result=0;double former;double latter;int i;for(i=0; i=2){dataque = modify(dataque);}일단 Stack에서 제대로된 데이터를 받아 왔으면 modify함수에 의해 실제적인 계산을 하게 됩니다.QueData modify(QueData dataque){int exception = 0;dataque = SearchDanhangOperator(dataque);dataque = YihangOperator(dataque,exception);dataque.ShowQueData();return dataque;}modify함수는 또 다시 두개의 함수를 호출렇지 않으면 보통의 계산기 처럼 하도록 하려고 했는데 기말이 되어 시간이 많지 않아 여기까지 하고 프로그램을 끝내고자 합니다.자바공부를 많이 하지 않아서 책을 뒤져가며 공부 하였습니다. 학기말이 되었고 비쥬얼 프로그래밍 역시 지금까지 한 프로젝트가 API로 시계와 게임을 구현하고 또 다음주까지 MFC로 지뢰찾기를 구현해야 하고 시험기간에다 다른 과목들역시 레포트를 너무 많이 내주는 바람에 계산기 한곳에만 매달릴 수 밖에 없었던 지난 시간들이 너무 아까웠고 다른 과목들 생각에 계산기를 만드는데 집중 할 수가 없었습니다.인터넷에서 소스를 구해보았던 것도 요즈음 학업에 대한 부담이 너무 가중되어서 어떻게 하면 좀 쉽게 해볼 수 없을까 하는 잘못된 마음에서 비롯되었습니다.게다가 자바는 VISUAL STUDIO처럼 강력한 툴이 없었고 저는 개인적으로 이클립스라는 툴을 사용하는걸 안좋아 하기 때문에 프로젝트를 메모장으로 만들 수 밖에 없었습니다.메모장을 사용하면서 조금만 잘못되면 프로그램의 어디가 잘못되었는지 알 수가 없어 처음부터 프로그래밍을 다시 했던때도 있었습니다. 또한 비주얼 스튜디오는 에러가 나면 그곳이 어디라고 찍어 주지만 자바에서는 600번째 줄에서 에러가 났다 이런식으로밖에 말을 안하기 때문에 어느때는 정말로 처음부터 일일이 세어서 600번째 줄을 찾아내어 고쳐주기도 하였습니다.만드는 과정에서 자바 정말 안좋다는 생각을 수도없이 하였지만 어렵게 만든 만큼 지금은 자바에 대해서 예전보다는 좀 더 애착이 가게 되었습니다.그동안 학교에서 가르켜주는 것으로만 해왔더니 많은 어려움이 있었습니다. 방학이 되면 자바나 기타 프로그래밍 언어와 알고리즘에 대해 좀더 깊은 공부를 하여 2학년때는 이번 학기와 같은 부담이 없도록 하겠습니다.--- 숫자 맞추기 게임 (숫자 야구 게임)평소 때 많이 했던 숫자 야구 게임을 그대로 구현해 보았습니다. 야구게임에 대해서 말하자면 임의의 세 숫자를 정해 놓고, 그 숫자를 알아맞히는 게임입니다. 맞추기를 시도할 때, 숫자를 맞추면 볼이 자리수, 일의 자리수를 의미하는 각 변수에 저장합니다. 랜덤함수를 이용하는 부분은 수업시간에 배운 부분이기 때문에 쉽게 사용할 수 있었습니다. 여기서 while문을 쓴 이유는 0에서 9까지의 숫자를 막 집어넣어서는 안되기 때문입니다. 일단 one은 0이여서는 안됩니다. 일반적으로 숫자가 가장 최상위 단위에 0이 들어갈 수 없기 때문입니다. 그래서 0이 나오지 않을 때까지 랜덤을 while문을 돌렸습니다. 십의 자리수인 two는 약간 다른 이유에서 while문을 돌렸습니다. 그건 다른 수와 겹치는 것을 막기 위해서입니다. 야구게임은 겹치지 않는 세 숫자를 임의로 정해야 하기 때문에, 바로 앞에서 만들었던 수와 one과 비교를 해서 같지 않게 했습니다. three까지 비교할 필요는 없습니다. three는 순서 상 아직 만들어지지도 않았기 때문입니다. three의 경우는 당연히 one과 two를 모두를 비교해서 같지 않게 해야합니다. 그래서 one과 two가 같지 않을 때까지 while문을 돌렸습니다.처음에 게임을 실행시키면 게임을 시작하겠다는 문구와 게임에 대한 규칙 문구가 뜹니다. 게임에 대한 규칙은 다음과 같습니다.1. 15번 안에 맞추어야 합니다.2. 백의 자리에는 0을 넣어서는 안됩니다.3. 답은 세자리의 수이니, 세자리의 수를 입력하는 것이 좋을 것입니다.{15번 까지 맞추어야 하는 이유는 설정입니다. while문을 돌려서 count가 15가 되면 게임이 종료가 되게 만들었습니다. 그리고 마지막 조건은 내 프로그램은 몇 자리의 수를 넣어도 에러 문구를 띄우지 않기 때문입니다. 답은 세 자리의 수인데, 다른 자리의 수를 넣는 다는 것은 어리석기 때문입니다.{이제 중간의 핵심 코드로 넘어 가겠습니다. 위에서 말했듯이, 기회를 15번 준다. 15번은 count로 제어하며, while문이 count가 15가 될 때까지 맞추지 못하면 아래와 같은 문구가 나오게 됩니다. result is 102 라는 말은 답이 102 였다는 것을 알켜주는 것입니다.{처음에 stri.^^:
#include <windows.h>#include <stdio.h>#include <math.h>#include "resource.h"SYSTEMTIME SystemTime; // 시스템의 시간 정보를 저장하는 함수 RECT wndRect = {0, 0, 300, 350};// 시간을 출력하는 함수 void ShowAnalogTime(HWND hWnd, RECT rect);void ShowDigitalTime(HWND hWnd, RECT rect);//// 새롭게 추가한 함수