<div>===헤더===</div> <div><br>// flightDlg.h : 헤더 파일<br>//<br>#define MAX 100 // db 크기 </div> <div>#pragma once<br>#include "afxwin.h"</div> <div><br>// CflightDlg 대화 상자<br>class CflightDlg : public CDialogEx<br>{<br>// 생성입니다.<br>public:<br> CflightDlg(CWnd* pParent = NULL); // 표준 생성자입니다.</div> <div>// 대화 상자 데이터입니다.<br>#ifdef AFX_DESIGN_TIME<br> enum { IDD = IDD_FLIGHT_DIALOG };<br>#endif</div> <div> protected:<br> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.</div> <div><br>// 구현입니다.<br>protected:<br> HICON m_hIcon;</div> <div> // 생성된 메시지 맵 함수<br> virtual BOOL OnInitDialog();<br> afx_msg void OnSysCommand(UINT nID, LPARAM lParam);<br> afx_msg void OnPaint();<br> afx_msg HCURSOR OnQueryDragIcon();<br> DECLARE_MESSAGE_MAP()<br>public:<br> CStatic m_imgBg;</div> <div> </div> <div>// afx_msg void OnBnClickedSearch();<br> void setup();<br> void assert_flight(char*, char* , int);</div> <div> int match(char*, char* );<br> int find(char*, char*);<br> void push(char* , char* , int );<br> void pop(char* , char* , int* );<br> void isflight(char* , char*);<br> void route(char*);</div> <div> </div> <div> /* 비행 데이터베이스 구조 */<br> struct FL {<br> char from[20];<br> char to[20];<br> int distance;<br> char skip; // 백트랙킹을 위해 사용됨 <br> <br> };</div> <div> struct FL flight[MAX]; // db 구성</div> <div> /* 스택 구조 */<br> struct stack {<br> char from[20];<br> char to[20];<br> int dist;<br> };</div> <div> struct stack bt_stack[MAX]; // 백트랙킹을 위한 스택 <br> int f_pos = 0; // 비행 db 안에 있는 자료 위치값 <br> int find_pos = 0; // 비행 db안에서의 탐색용 인덱스<br> int tos = 0; // 스택용 포인터로 항상 스택의 top을 가리킴 </div> <div><br> afx_msg void OnBnClickedSearch();<br>};</div> <div> </div> <div> </div> <div> </div> <div>==dlg.cpp ==</div> <div>#include "stdafx.h"<br>#include "flight.h"<br>#include "flightDlg.h"<br>#include "afxdialogex.h"<br>#include <stdlib.h><br>#include <string.h></div> <div> </div> <div>#ifdef _DEBUG<br>#define new DEBUG_NEW<br>#endif</div> <div><br>// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.</div> <div>class CAboutDlg : public CDialogEx<br>{<br>public:<br> CAboutDlg();</div> <div>// 대화 상자 데이터입니다.<br>#ifdef AFX_DESIGN_TIME<br> enum { IDD = IDD_ABOUTBOX };<br>#endif</div> <div> protected:<br> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.</div> <div>// 구현입니다.<br>protected:<br> DECLARE_MESSAGE_MAP()<br>};</div> <div>CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)<br>{<br>}</div> <div>void CAboutDlg::DoDataExchange(CDataExchange* pDX)<br>{<br> CDialogEx::DoDataExchange(pDX);<br>}</div> <div>BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)<br>END_MESSAGE_MAP()</div> <div><br>// CflightDlg 대화 상자</div> <div> </div> <div>CflightDlg::CflightDlg(CWnd* pParent /*=NULL*/)<br> : CDialogEx(IDD_FLIGHT_DIALOG, pParent)<br>{<br> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);<br>}</div> <div>void CflightDlg::DoDataExchange(CDataExchange* pDX)<br>{<br> CDialogEx::DoDataExchange(pDX);<br> DDX_Control(pDX, IDC_PICBOX, m_imgBg);<br>}</div> <div>BEGIN_MESSAGE_MAP(CflightDlg, CDialogEx)<br> ON_WM_SYSCOMMAND()<br> ON_WM_PAINT()<br> ON_WM_QUERYDRAGICON()<br>// ON_BN_CLICKED(IDC_SEARCH, &CflightDlg::OnBnClickedSearch)<br>ON_BN_CLICKED(IDC_SEARCH, &CflightDlg::OnBnClickedSearch)<br>END_MESSAGE_MAP()</div> <div><br>// CflightDlg 메시지 처리기</div> <div>BOOL CflightDlg::OnInitDialog()<br>{<br> CDialogEx::OnInitDialog();</div> <div> HBITMAP hbit;<br> hbit = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PIC));</div> <div> m_imgBg.SetBitmap(hbit);</div> <div><br> // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.</div> <div> // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.<br> ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);<br> ASSERT(IDM_ABOUTBOX < 0xF000);</div> <div> CMenu* pSysMenu = GetSystemMenu(FALSE);<br> if (pSysMenu != NULL)<br> {<br> BOOL bNameValid;<br> CString strAboutMenu;<br> bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);<br> ASSERT(bNameValid);<br> if (!strAboutMenu.IsEmpty())<br> {<br> pSysMenu->AppendMenu(MF_SEPARATOR);<br> pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);<br> }<br> }</div> <div> // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는<br> // 프레임워크가 이 작업을 자동으로 수행합니다.<br> SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.<br> SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.</div> <div> // TODO: 여기에 추가 초기화 작업을 추가합니다.<br> </div> <div><br> return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.<br>}</div> <div>void CflightDlg::OnSysCommand(UINT nID, LPARAM lParam)<br>{<br> if ((nID & 0xFFF0) == IDM_ABOUTBOX)<br> {<br> CAboutDlg dlgAbout;<br> dlgAbout.DoModal();<br> }<br> else<br> {<br> CDialogEx::OnSysCommand(nID, lParam);<br> }<br>}</div> <div>// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면<br>// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는<br>// 프레임워크에서 이 작업을 자동으로 수행합니다.</div> <div>void CflightDlg::OnPaint()<br>{</div> <div> if (IsIconic())<br> {<br> CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.</div> <div> SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);</div> <div> // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.<br> int cxIcon = GetSystemMetrics(SM_CXICON);<br> int cyIcon = GetSystemMetrics(SM_CYICON);<br> CRect rect;<br> GetClientRect(&rect);<br> int x = (rect.Width() - cxIcon + 1) / 2;<br> int y = (rect.Height() - cyIcon + 1) / 2;</div> <div> // 아이콘을 그립니다.<br> dc.DrawIcon(x, y, m_hIcon);<br> }<br> else<br> {<br> CDialogEx::OnPaint();</div> <div> }<br>}</div> <div>// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서<br>// 이 함수를 호출합니다.<br>HCURSOR CflightDlg::OnQueryDragIcon()<br>{<br> return static_cast<HCURSOR>(m_hIcon);<br>}</div> <div> </div> <div> </div> <div><br>void CflightDlg::setup()<br>{<br> assert_flight("뉴욕", "시카고", 1000);<br> assert_flight("시카고", "덴버", 1000);<br> assert_flight("뉴욕", "토론토", 800);<br> assert_flight("뉴욕", "덴버", 1900);<br> assert_flight("토론토", "캘거리", 1500);<br> assert_flight("토론토", "로스엔젤리스", 1800);<br> assert_flight("토론토", "시카고", 500);<br> assert_flight("덴버", "우르바나", 1000);<br> assert_flight("덴버", "휴스톤", 1500);<br> assert_flight("휴스톤", "로스엔젤리스", 1500);<br> assert_flight("덴버", "로스엔젤리스", 1000);</div> <div>}</div> <div> </div> <div>void CflightDlg::assert_flight(char* from, char* to, int dist)<br>{<br> if (f_pos<MAX) {<br> strcpy(flight[f_pos].from, from);<br> strcpy(flight[f_pos].to, to);<br> flight[f_pos].distance = dist; // 거리 저장 하기<br> flight[f_pos].skip = 0;<br> f_pos++; //지식베이스 인덱스 증가<br> }<br> else printf("flight database full.\n");<br>}</div> <div> </div> <div>int CflightDlg::match(char* from, char* to)<br>{<br> CString str;<br> register int t;</div> <div> for (t = f_pos - 1; t > -1; t--)<br> {<br> if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))<br> {<br> return flight[t].distance;<br> // 비행경로 발견시 거리 린턴<br> <br> }<br> return 0;<br> <br> }<br> <br>}</div> <div><br>int CflightDlg::find(char* from, char* anywhere)<br>{<br> find_pos = 0;<br> while (find_pos<f_pos) { //f_pos : kdb 인덱스<br> if (!strcmp(flight[find_pos].from, from) &&!flight[find_pos].skip)<br> {<br> strcpy(anywhere, flight[find_pos].to);<br> flight[find_pos].skip = 1; /*make active */<br> return flight[find_pos].distance;<br> }<br> find_pos++;<br> }</div> <div> return 0;/* 발견되지 않음 */</div> <div>}</div> <div> </div> <div>void CflightDlg::push(char* from, char* to, int dist)<br>{<br> if (tos<MAX) { // tos : 전역변수,초기값 0<br> strcpy(bt_stack[tos].from, from);<br> strcpy(bt_stack[tos].to, to);<br> bt_stack[tos].dist = dist;<br> tos++; //스택포인터 증가<br> }<br> else printf("스택가득참.\n");<br>}</div> <div><br> void CflightDlg::pop(char* from, char* to, int* dist)<br> {<br> if (tos>0) {<br> tos--;<br> strcpy(from, bt_stack[tos].from);<br> strcpy(to, bt_stack[tos].to);<br> *dist = bt_stack[tos].dist;<br> }<br> else printf("스택공간 부족.\n");<br> }</div> <div><br> void CflightDlg::isflight(char* from, char* to)<br> {<br> CString str2;<br> int d, dist; char anywhere[20];<br> /* 목적지인지 조사 */<br> if (d = match(from, to)) { // from – to 도시간 경로 있으면 거리 리턴<br> push(from, to, d); // d는 from 도시에서 최종목적기간 거리<br> return;<br> }<br> /* 다른 도시로의 연결 편 조사 */<br> if (dist = find(from, anywhere)) {<br> push(from, to, dist); // 현재도시, 목적지, 현재 - 임의도시 거리 보관<br> isflight(anywhere, to); // 임의의 도시에서 목적지간 경로 찾기<br> }<br> else if (tos>0) { /* backtrack */<br> pop(from, to, &dist);<br> isflight(from, to);<br> }</div> <div> }</div> <div> <br> void CflightDlg::route(char* to)<br> {<br> CString str;<br> int dist, t;</div> <div> dist = 0;<br> t = 0;<br> while (t < tos) {<br> printf("%s => ", bt_stack[t].from);<br> dist += bt_stack[t].dist;<br> t++;</div> <div> <br> }<br> str.Format(_T("비행거리는 %d입니다"), dist);<br> SetDlgItemText(IDC_EDIT1, str);<br> <br> //char* to = LPSTR(LPCTSTR(to1)); //형변환 cstring->char<br> //char* from = LPSTR(LPCTSTR(from1));<br> //printf("%s 를(을) 경유하는 \n", to);<br> //printf("비행거리는 %d입니다.\n", dist);<br> //str1.Format(_T("%s를 경유하는"), to);<br> // str3 = str1 + str2;</div> <div> </div> <div> </div> <div><br> }</div> <div><br> void CflightDlg::OnBnClickedSearch()<br> {<br> // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.<br> CString to1, from1;</div> <div> // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.<br> setup();</div> <div> GetDlgItemText(IDC_START, from1);<br> GetDlgItemText(IDC_END, to1);</div> <div> char* from = LPSTR(LPCTSTR(from1));//출발지<br> char* to = LPSTR(LPCTSTR(to1)); //형변환 string->char</div> <div> //from1.Format(_T("%s"), from);<br> //AfxMessageBox(from1);</div> <div><br> isflight(from, to); // 비행경로 탐색 함수 호출 <br> route(to); // 발견된 비행경로 및 거리 출력 함수 호출</div> <div><br> }</div> <div> </div> <div>원래는 C로짜여진 콘솔 프로그램입니다.</div> <div>gets()로 출발점과 도착점을 입렵하면 </div> <div>데이터값을 계산해서</div> <div>그 두곳간의 거리를 출력하는 프로그램인데..</div> <div> </div> <div>MFC C++로 바꾸려고 합니다.</div> <div> </div> <div>코드는 그대로 옮겨왔습니다.</div> <div>이렇게 해서 </div> <div> </div> <div>에디트컨트롤 두개로 입력을 받고 </div> <div>그것을 c언어로 짜여진 곳에 들어가게 하려고 </div> <div>합니다.</div> <div>CString 값으로 입력을 받아서 char 로 변환해서 대입하려고 합니다.</div> <div>근데 뭐가잘못됬는지 .. 변수전달이 안되는건지..</div> <div>초기화된 값만 뜹니다.. 왜그럴까요 도와주세요 ㅠ</div> <div> </div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.