게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C언어 MFC C++ GUI로 바꾸려고합니다.
게시물ID : programmer_19134짧은주소 복사하기
작성자 : 여친보고싶다
추천 : 0
조회수 : 712회
댓글수 : 1개
등록시간 : 2016/11/27 18:06:36
옵션
  • 본인삭제금지
근데 잘안되네요...
 
flightDlg.h=====
// flightDlg.h : 헤더 파일
//

#pragma once
#include "afxwin.h"

// CflightDlg 대화 상자
class CflightDlg : public CDialogEx
{
// 생성입니다.
public:
 CflightDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
 enum { IDD = IDD_FLIGHT_DIALOG };
#endif
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.

// 구현입니다.
protected:
 HICON m_hIcon;
 // 생성된 메시지 맵 함수
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 DECLARE_MESSAGE_MAP()
public:
 CStatic m_imgBg;
 
// afx_msg void OnBnClickedSearch();
 void setup();
 void assert_flight(char*, char* , int);
 int match(char*, char* );
 int find(char*, char*);
 void push(char* , char* , int );
 void pop(char* , char* , int* );
 void isflight(char* , char*);
 void route(char*);
#define MAX 100   // db 크기
 /* 비행 데이터베이스 구조  */
 struct FL {
  char from[20];
  char to[20];
  int distance;
  char skip; // 백트랙킹을 위해 사용됨
 
 };
 struct FL flight[MAX]; // db 구성
         /* 스택 구조 */
 struct stack {
  char from[20];
  char to[20];
  int dist;
 };
 struct stack bt_stack[MAX];  // 백트랙킹을 위한 스택
 int f_pos = 0;                  // 비행 db 안에 있는  자료 위치값 
 int find_pos = 0;            // 비행 db안에서의  탐색용 인덱스
 int tos = 0;                     // 스택용 포인터로 항상 스택의 top을 가리킴

 afx_msg void OnBnClickedSearch();
};
 
 
===========dlg.cpp
 
 
void CflightDlg::setup()
{
 assert_flight("뉴욕", "시카고", 1000);
 assert_flight("시카고", "덴버", 1000);
 assert_flight("뉴욕", "토론토", 800);
 assert_flight("뉴욕", "덴버", 1900);
 assert_flight("토론토", "캘거리", 1500);
 assert_flight("토론토", "로스엔젤리스", 1800);
 assert_flight("토론토", "시카고", 500);
 assert_flight("덴버", "우르바나", 1000);
 assert_flight("덴버", "휴스톤", 1500);
 assert_flight("휴스톤", "로스엔젤리스", 1500);
 assert_flight("덴버", "로스엔젤리스", 1000);
}
 
void CflightDlg::assert_flight(char* from, char* to, int dist)
{
 if (f_pos<MAX) {
  strcpy(flight[f_pos].from, from);
  strcpy(flight[f_pos].to, to);
  flight[f_pos].distance = dist;   // 거리 저장 하기
  flight[f_pos].skip = 0;
  f_pos++;  //지식베이스 인덱스 증가
 }
 else printf("flight database full.\n");
}
 
int CflightDlg::match(char* from, char* to)
{
 CString str;
 register int t;
 for (t = f_pos - 1; t > -1; t--)
 {
  if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))
  {
   return flight[t].distance;
   // 비행경로 발견시 거리 린턴
  }
  return 0;
 }
}

int CflightDlg::find(char* from, char* anywhere)
{
 find_pos = 0;
 while (find_pos<f_pos) {   //f_pos : kdb 인덱스
  if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip)
  {
   strcpy(anywhere, flight[find_pos].to);
   flight[find_pos].skip = 1;       /*make active */
   return flight[find_pos].distance;
  }
  find_pos++;
 }
 return 0;/* 발견되지 않음  */
}
 
void CflightDlg::push(char* from, char* to, int dist)
{
 if (tos<MAX) {  // tos : 전역변수,초기값 0
  strcpy(bt_stack[tos].from, from);
  strcpy(bt_stack[tos].to, to);
  bt_stack[tos].dist = dist;
  tos++;                  //스택포인터 증가
 }
 else printf("스택가득참.\n");
}

void CflightDlg::pop(char* from, char* to, int* dist)
{
 if (tos>0) {
  tos--;
  strcpy(from, bt_stack[tos].from);
  strcpy(to, bt_stack[tos].to);
  *dist = bt_stack[tos].dist;
 }
 else printf("스택공간 부족.\n");
}

void CflightDlg::isflight(char* from, char* to)
{
 CString str;
 int d, dist;       char anywhere[20];
 /* 목적지인지 조사 */
 if (d = match(from, to)) { // from – to 도시간 경로 있으면 거리 리턴
  push(from, to, d);       // d는  from 도시에서 최종목적기간 거리
  return;
 }
 /* 다른 도시로의 연결 편 조사 */
 if (dist = find(from, anywhere)) {
  push(from, to, dist);        //  현재도시, 목적지, 현재 - 임의도시 거리 보관
  isflight(anywhere, to); //   임의의 도시에서 목적지간  경로 찾기
  

  
 }
 else if (tos>0) {            /* backtrack */
  pop(from, to, &dist);
  isflight(from, to);
 }

 
}

void CflightDlg::route(char* to)
{
 CString str;
 int dist, t;
 dist = 0;
 t = 0;
 while (t < tos) {
  printf("%s => ", bt_stack[t].from);
  dist += bt_stack[t].dist;
  t++;
  
 }
 
  UpdateData(FALSE);
  str.Format(_T("비행거리는 %d입니다"), dist);
  SetDlgItemText(IDC_EDIT1, str);
 
}

void CflightDlg::OnBnClickedSearch()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 CString str,to1, from1;
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 setup();
 UpdateData(TRUE);
 GetDlgItemText(IDC_START, from1);
 GetDlgItemText(IDC_END, to1);
 
 char from[20], to[20];
 
 strcpy_s(from, 20, CT2A(from1)); //하.. 내가이거떔에 개고생을..형변환 string->char
 strcpy_s(to, 20, CT2A(to1));
         //from1.Format(_T("%s"), from);
         //AfxMessageBox(from1);

 isflight(from, to);              // 비행경로 탐색 함수 호출
 route(to);                         // 발견된 비행경로 및 거리 출력 함수 호출
 
}
c언어 소스를
그대로 들고와서
약간 수정을하여 만들고있습니다.
 
버튼을 누르면
시작하는 곳과 도착지점에 거리를 계산해서 출력해줘야하는데..
시작점위치만 계산되고 출력되어버립니다.
C언어 소스는 이상이없구요.
 
UpdateData(FALSE);
  str.Format(_T("비행거리는 %d입니다"), dist);
  SetDlgItemText(IDC_EDIT1, str);
 
이소스 위치를 바꿔야하나요? 다른곳에 바꿔도안되서요..ㅠ
실행화면 입니다.
캡처.JPG
뉴욕-시카고는
void CflightDlg::setup()
{
 assert_flight("뉴욕", "시카고", 1000);
 assert_flight("시카고", "덴버", 1000);
 assert_flight("뉴욕", "토론토", 800);
 assert_flight("뉴욕", "덴버", 1900);
 assert_flight("토론토", "캘거리", 1500);
 assert_flight("토론토", "로스엔젤리스", 1800);
 assert_flight("토론토", "시카고", 500);
 assert_flight("덴버", "우르바나", 1000);
 assert_flight("덴버", "휴스톤", 1500);
 assert_flight("휴스톤", "로스엔젤리스", 1500);
 assert_flight("덴버", "로스엔젤리스", 1000);
}
에 의해서 1000이 맞지만
 
뉴욕- 토론토 해도 1000이 나옵니다 ㅠ
 

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호