📄 gfdlg.cpp
字号:
// GFDlg.cpp : implementation file
//
#include "stdafx.h"
#include "GF.h"
#include "GFDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "help.h"
#include "process.h"
#include "iostream.h"
#include <stdio.h>
#include <math.h>
#include "stdlib.h"
#define StackMaxSize 50
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGFDlg dialog
CGFDlg::CGFDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGFDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGFDlg)
m_function = _T("x*sin(31.4*x+y)+2.0");
m_pc = 0.5;
m_pm = 0.05;
m_maxgen = 100;
m_popsize = 50;
m_l = 6;
m_min = -1;
m_max = 2;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGFDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGFDlg)
DDX_Control(pDX, IDC_BUTTON1, m_help);
DDX_Control(pDX, IDC_LIST2, m_output3);
DDX_Control(pDX, IDC_COMBO1, m_change);
DDX_Control(pDX, IDC_EDIT18, m_output1);
DDX_Control(pDX, IDC_LIST1, m_output2);
DDX_Text(pDX, IDC_EDIT1, m_function);
DDX_Text(pDX, IDC_EDIT2, m_pc);
DDX_Text(pDX, IDC_EDIT3, m_pm);
DDX_Text(pDX, IDC_EDIT4, m_maxgen);
DDX_Text(pDX, IDC_EDIT5, m_popsize);
DDX_Text(pDX, IDC_EDIT19, m_l);
DDX_Text(pDX, IDC_EDIT20, m_min);
DDX_Text(pDX, IDC_EDIT21, m_max);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGFDlg, CDialog)
//{{AFX_MSG_MAP(CGFDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_EN_CHANGE(IDC_EDIT1, OnChange_function)
ON_EN_CHANGE(IDC_EDIT2, OnChange_pc)
ON_EN_CHANGE(IDC_EDIT3, OnChange_pm)
ON_EN_CHANGE(IDC_EDIT4, OnChange_maxgen)
ON_EN_CHANGE(IDC_EDIT5, OnChange_popsize)
ON_EN_CHANGE(IDC_EDIT18, OnChange_output1)
ON_LBN_SELCHANGE(IDC_LIST1, OnSelchange_output2)
ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditchangeCombo_chanshu)
ON_EN_CHANGE(IDC_EDIT19, OnChangeEdit_l)
ON_EN_CHANGE(IDC_EDIT20, OnChangeEdit_min)
ON_EN_CHANGE(IDC_EDIT21, OnChangeEdit_max)
ON_LBN_SELCHANGE(IDC_LIST2, OnSelchangeList_change)
ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo_chanshu)
ON_BN_CLICKED(IDC_BUTTON1, OnButton_help)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGFDlg message handlers
BOOL CGFDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_change.AddString("z");
m_change.AddString("y");
m_change.AddString("x");
m_change.InsertString(-1,"e");
m_change.InsertString(-1,"f");
m_change.InsertString(-1,"g");
m_change.InsertString(-1,"h");
m_change.SetCurSel(0);
chanshu[0].c='x';
chanshu[0].m_min=-1;
chanshu[0].m_max=2;
chanshu[0].l=21;
for(int i=1;i<7;i++)
chanshu[i].l=0;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CGFDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CGFDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CGFDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////接收函数////////////////////////////////
struct Stack{
float stack[StackMaxSize];
int top;
};
void InitStack(Stack&s)
{
s.top=-1;
}
int StackEmpty(Stack&s)
{
if(s.top==-1)return 0;
else return 1;
}
void Push(Stack&s,const float item)
{
if(s.top==StackMaxSize-1){
exit(1);
}
s.top++;
s.stack[s.top]=item;
}
float Pop(Stack &s)
{
if(s.top==-1)exit(1);
float temp=s.stack[s.top];
s.top--;
return temp;
}
////////////////////////////////////////////////////////////////////
////////////////////////////////字符////////////////////////////////
struct Stack_c{
char stack[StackMaxSize];
int top;
};
void InitStack_c(Stack_c&s)
{
s.top=-1;
}
int StackEmpty_c(Stack_c&s)
{
if(s.top==-1)return 0;
else return 1;
}
void Push_c(Stack_c&s,const char item)
{
if(s.top==StackMaxSize-1){
exit(1);
}
s.top++;
s.stack[s.top]=item;
}
char Peek_c(Stack_c &s)
{
return s.stack[s.top];
}
char Pop_c(Stack_c &s)
{
if(s.top==-1)exit(1);
char temp=s.stack[s.top];
s.top--;
return temp;
}
int Precedence(char op)
{
switch(op)
{
case'+':
case'-':return 1;
case'*':
case'^':
case'/':return 2;
case'(':
case'@':return 0;
}
}
float ater(char ch)
{
if(ch=='0'){return 0;}
else if(ch=='1'){return 1;}
else if(ch=='2'){return 2;}
else if(ch=='3'){return 3;}
else if(ch=='4'){return 4;}
else if(ch=='5'){return 5;}
else if(ch=='6'){return 6;}
else if(ch=='7'){return 7;}
else if(ch=='8'){return 8;}
else if(ch=='9'){return 9;}
}
float Compute(CString l,double x,double y,double z,double e,double f,double g,double h)
{
l=l+'@';
Stack s;
InitStack(s);
//double x=0.5,y=-0.5,z=0.5;
char ch;
float save;
int i=0;
while(l.GetAt(i)!='@'){
//for(int i=0;i<l.GetLength();i++){
ch=l.GetAt(i++);
switch(ch){
case 's':
//Pop(s);
save=sin(Pop(s));
Push(s,save);
break;
case 'c':
//Pop(s);
save=cos(Pop(s));
Push(s,save);
break;
case 'a':
// Pop(s);
save=atan(Pop(s));
Push(s,save);
break;
case 't':
//Pop(s);
save=tan(Pop(s));
Push(s,save);
break;
case '+':
save=Pop(s)+Pop(s);
Push(s,save);
break;
case '-':
save=Pop(s);
save=Pop(s)-save;
Push(s,save);
break;
case '*':
save=Pop(s)*Pop(s);
Push(s,save);
break;
case '^':
save=Pop(s);
save=pow(Pop(s),save);
Push(s,save);
break;
case '/':
save=Pop(s);
if(save!=0)
save=Pop(s)/save;
else exit(1);
Push(s,save);
break;
default:
save=0;
while(ch!=' '){
if(ch=='0'){save=save*10;}
else if(ch=='1'){save=save*10+1;}
else if(ch=='2'){save=save*10+2;}
else if(ch=='3'){save=save*10+3;}
else if(ch=='4'){save=save*10+4;}
else if(ch=='5'){save=save*10+5;}
else if(ch=='6'){save=save*10+6;}
else if(ch=='7'){save=save*10+7;}
else if(ch=='8'){save=save*10+8;}
else if(ch=='9'){save=save*10+9;}
else if(ch=='x'){Push(s,x);}
else if(ch=='y'){Push(s,y);}
else if(ch=='z'){Push(s,z);}
else if(ch=='e'){Push(s,e);}
else if(ch=='f'){Push(s,f);}
else if(ch=='g'){Push(s,g);}
else if(ch=='h'){Push(s,h);}
else if(ch=='.')
{
int n=10;
while(l.GetAt(i)!=' ')
{
ch=l.GetAt(i++);
save=save+ater(ch)/n;
n=n*10;
ch=l.GetAt(i);
}
}
ch=l.GetAt(i++);
}
if(save)Push(s,save);
}
}
return s.stack[0];
}
CString Change(CString s1)
{
char p=' ';
int m=0;
CString s2,s3="";
s1=s1+'@';
while(p!='@'){
p=s1.GetAt(m);
s3=s3+s1.GetAt(m);
if(p=='s'||p=='c'||p=='a'||p=='t')m=m+2;
m++;
}
s1=s3;
Stack_c r;
InitStack_c(r);
Push_c(r,'@');
int i=0;
char ch=s1[i];
while(ch!='@')
{
if(ch=='('){
Push_c(r,ch);
ch=s1.GetAt(++i);
}
else if(ch=='s'||ch=='c'||ch=='a'||ch=='t')
{
Push_c(r,ch);
ch=s1.GetAt(++i);
}
else if(ch==')'){
while(Peek_c(r)!='(')
{
s2=s2+Pop_c(r);
s2=s2+' ';
}
Pop_c(r);
char temp=Peek_c(r);
if(temp=='s'||temp=='c'||temp=='a'||temp=='t'){
s2=s2+temp+' ';
Pop_c(r);
}
ch=s1.GetAt(++i);
}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^')
{
char w=Peek_c(r);
while(Precedence(w)>=Precedence(ch))
{
s2=s2+w;
s2=s2+' ';
Pop_c(r);
w=Peek_c(r);
}
Push_c(r,ch);
ch=s1.GetAt(++i);
}
else{
while(ch=='0'||ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='5'||ch=='6'||ch=='7'||ch=='8'||ch=='9'||ch=='.'||ch=='x'||ch=='y'||ch=='z'||ch=='e'||ch=='f'||ch=='g'||ch=='h')
{
s2=s2+ch;
ch=s1.GetAt(++i);
}
s2=s2+' ';
}
}
ch=Pop_c(r);
while(ch!='@'){
s2=s2+ch;
s2=s2+' ';
ch=Pop_c(r);
}
return s2;
}
///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////遗传算法开始/////////////////////////////////////////
////////////////////////////产生[0 1]的随机数 /////////////////
void CGFDlg::initmalloc() /*为全局数据变量分配空间 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -