📄 yucejieguo.cpp
字号:
// Yucejieguo.cpp : implementation file
//
#include "stdafx.h"
#include "mining.h"
#include "Yucejieguo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern TreeNode dt;
/////////////////////////////////////////////////////////////////////////////
// CYucejieguo dialog
CYucejieguo::CYucejieguo(CWnd* pParent /*=NULL*/)
: CDialog(CYucejieguo::IDD, pParent)
{
//{{AFX_DATA_INIT(CYucejieguo)
m_jiaoxuejishi = 0;
m_qimochengji = 0;
m_zhuanye = _T("");
m_ziyoujishi = 0;
//}}AFX_DATA_INIT
}
void CYucejieguo::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CYucejieguo)
DDX_Text(pDX, IDC_EDIT1, m_jiaoxuejishi);
DDX_Text(pDX, IDC_EDIT2, m_qimochengji);
DDX_Text(pDX, IDC_EDIT3, m_zhuanye);
DDX_Text(pDX, IDC_EDIT4, m_ziyoujishi);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CYucejieguo, CDialog)
//{{AFX_MSG_MAP(CYucejieguo)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_YUCEJIEGUO, OnYucejieguo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CYucejieguo message handlers
BOOL CYucejieguo::OnInitDialog()
{
CDialog::OnInitDialog();
height=0;
int width=0;
char ***string;
CODBCFieldInfo fldInfo;
m_RecJoin.Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM 预测学校成绩表,预测过级成绩表\
where 预测学校成绩表.学号=预测过级成绩表.学号");
//得到记录集的字段数和记录数
m_RecJoin.MoveFirst();
while(!m_RecJoin.IsEOF())
{
height++;
m_RecJoin.MoveNext();
}
width=m_RecJoin.GetODBCFieldCount()-3;
//测试
LPSTR lpStr;
m_RecJoin.GetODBCFieldInfo(1,fldInfo);
lpStr=fldInfo.m_strName.GetBuffer(fldInfo.m_strName.GetLength());
m_RecJoin.GetODBCFieldInfo(2,fldInfo);
lpStr=fldInfo.m_strName.GetBuffer(fldInfo.m_strName.GetLength());
m_RecJoin.GetODBCFieldInfo(3,fldInfo);
lpStr=fldInfo.m_strName.GetBuffer(fldInfo.m_strName.GetLength());
m_RecJoin.GetODBCFieldInfo(6,fldInfo);
lpStr=fldInfo.m_strName.GetBuffer(fldInfo.m_strName.GetLength());
m_RecJoin.GetODBCFieldInfo(7,fldInfo);
lpStr=fldInfo.m_strName.GetBuffer(fldInfo.m_strName.GetLength());
//将记录集的数据量化成适合我们的ID3算法的格式
string=(char ***)malloc(height * sizeof(char **));
for(int i=0;i<height;i++)
{
string[i]=(char **)malloc(width * sizeof(char *));
for(int j=0;j<width;j++)
string[i][j]=(char *)malloc(10 * sizeof(char));
}
m_RecJoin.MoveFirst();
int k=0;
while(!m_RecJoin.IsEOF())
{
CString s;
if(m_RecJoin.m_column2<20) //教学机时概化;
{
string[k][0]="低";
}
else if(m_RecJoin.m_column2<=29)
{
string[k][0]="中";
}
else if (m_RecJoin.m_column2<=40)
{
string[k][0]="高";
}
if(m_RecJoin.m_column3<20) //自由机时概化;
{
string[k][1]="低";
}
else if(m_RecJoin.m_column3<=29)
{
string[k][1]="中";
}
else if (m_RecJoin.m_column3>=30)
{
string[k][1]="高";
}
if(m_RecJoin.m_column4<60) //期末成绩概化;
{
string[k][2]="不及格";
}
else
{
string[k][2]="及格";
}
char *zhuanye;
zhuanye=m_RecJoin.m_column32.GetBuffer(m_RecJoin.m_column32.GetLength());
if((strcmp(zhuanye,"化学")==0) ||
(strcmp(zhuanye,"计算机")==0) ||
(strcmp(zhuanye,"数学")==0) ||
(strcmp(zhuanye,"教育技术")==0))
{
string[k][3]="理科";
}
if((strcmp(zhuanye,"机器翻译")==0) ||
(strcmp(zhuanye,"教育学")==0) ||
(strcmp(zhuanye,"历史教育")==0) ||
(strcmp(zhuanye,"心理学")==0) ||
(strcmp(zhuanye,"对外汉语")==0) ||
(strcmp(zhuanye,"政教")==0))
{
string[k][3]="文科";
}
if(strcmp(zhuanye,"美术学")==0 ||
strcmp(zhuanye,"体育")==0)
{
string[k][3]="艺术类";
}
if(m_RecJoin.m_column12<60) //过级成绩概化
{
string[k][4]="不及格";
}
else
{
string[k][4]="及格";
}
m_RecJoin.MoveNext();
k++;
}
Yuce(string,height,width,dt.child->node);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CYucejieguo::Yuce(char ***string, int height, int width, TreeNode *node)
{
TreeNode *dt;
bool bIsHave;
//初始化预测正确和错误的记录个数
nRightCount=0;
nWrongCount=0;
for(int i=0;i<height;i++)
{
dt=node;
while((strcmp(dt->Title,"YES")!=0) && (strcmp(dt->Title,"NO")!=0))
{
int j;
j=Classify(dt->Title);
if(j==-1)
{
MessageBox("预测出现错误!程序将退出!","提示");
::exit(0);
}
bIsHave=false;
for(int k=0;k<dt->nChildCount;k++)
{
if(strcmp(string[i][j],dt->child[k].value)==0)
{
bIsHave=true;
dt=dt->child[k].node;
break;
}
}
if(!bIsHave)
break;
}
if(strcmp(dt->Title,"YES")==0)
{
if(strcmp(string[i][width-1],"及格")==0)
{
nRightCount++;
}
else
nWrongCount++;
}
else
{
if(strcmp(dt->Title,"NO")==0)
{
if(strcmp(string[i][width-1],"不及格")==0)
{
nRightCount++;
}
else
nWrongCount++;
}
else
{
nWrongCount++;
}
}
}
}
int CYucejieguo::Classify(char *title)
{
if(strcmp(title,"教学机时")==0)
return 0;
if(strcmp(title,"自由机时")==0)
return 1;
if(strcmp(title,"期末成绩")==0)
return 2;
if(strcmp(title,"专业")==0)
return 3;
return -1;
}
void CYucejieguo::OnPaint()
{
CDC *dc;
//CClientDC dc(this);// device context for painting
PAINTSTRUCT ps;
dc=BeginPaint(&ps);
CBrush brush(RGB(180,150,188));
dc->FillRect(CRect(200,35,700,220),&brush);
CBrush Brush(RGB(0,0,0));
dc->FillRect(CRect(205,190,477,193),&Brush);//X坐标;
dc->FillRect(CRect(225,48,228,200),&Brush);//Y坐标;
int y;
float a,b;
CString s;
CBrush Brush1(RGB(255,0,0));
//过级成绩“不及格”!
a=(float)nRightCount/(float)height;
s.Format("%f",a);
y=int(int(a*120));
dc->FillRect(CRect(228,(180-y),238,190),&Brush1);
dc->SetBkColor(RGB(255,255,100));
dc->TextOut(228,195,"正确率");
dc->TextOut(228,(150-y),s);
CBrush brush1(RGB(255,0,0));
dc->SelectObject(&brush1);
dc->Pie(500,60,620,180,560,60,560-(int)(sin(2*3.1415926*a)*60),60+60-(int)(cos(2*3.1415926*a)*60));
dc->TextOut(500,40,"正确率");
//过级成绩”及格“!
CBrush Brush2(RGB(0,255,0));
b=(float)nWrongCount/(float)height;
s.Format("%f",b);
y=int(b*120);
dc->FillRect(CRect(295,(180-y),308,190),&Brush2);
dc->TextOut(288,195,"错误率");
dc->TextOut(285,(150-y),s);
CBrush brush2(RGB(0,255,0));
dc->SelectObject(&brush2);
dc->Pie(500,60,620,180,560-(int)(sin(2*3.1415926*a)*60),60+60-(int)(cos(2*3.1415926*a)*60),560,60);
dc->TextOut(560-(int)(sin(2*3.1415926*a)*60)-10,60+60-(int)(cos(2*3.1415926*a)*60)+20,"错误率");
CString ss;
ss.Format("预测数据的记录总数为:%d",height);
SetDlgItemText(IDC_BIAOTI1,ss);
ss.Format("预测正确的记录总数为:%d",nRightCount);
SetDlgItemText(IDC_BIAOTI2,ss);
ss.Format("预测错误的记录总数为:%d",nWrongCount);
SetDlgItemText(IDC_BIAOTI3,ss);
EndPaint(&ps);
}
void CYucejieguo::OnYucejieguo()
{
char **string1;
int fResult=0;
CString jiaoxue,qimo,ziyou,yucezhuanye;
string1=(char **)malloc(4 * sizeof(char *));
for(int i=0;i<4;i++)
{
string1[i]=(char *)malloc(10 * sizeof(char));
}
GetDlgItemText(IDC_EDIT1,jiaoxue);
m_jiaoxuejishi=atoi(jiaoxue);
if((m_jiaoxuejishi>=0)&&(m_jiaoxuejishi<=40))
{
if(m_jiaoxuejishi<20)
{
string1[0]="低";
}
else if(m_RecJoin.m_column2<=29)
{
string1[0]="中";
}
else if (m_RecJoin.m_column2<=40)
{
string1[0]="高";
}
}
else
{
MessageBox("数据不合法!教学机时数0--40!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
GetDlgItemText(IDC_EDIT4,ziyou);
m_ziyoujishi=atoi(ziyou);
if((m_ziyoujishi>=0)&&(m_ziyoujishi<=30))
{
if(m_ziyoujishi<20)
{
string1[1]="低";
}
else if(m_RecJoin.m_column3<=29)
{
string1[1]="中";
}
else if (m_RecJoin.m_column3<=30)
{
string1[1]="高";
}
}
else
{
MessageBox("数据不合法!自由机时数0-30!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
GetDlgItemText(IDC_EDIT2,qimo);
m_qimochengji=atoi(qimo);
if((m_qimochengji>=0)&&(m_qimochengji<=100))
{
if(m_qimochengji<60)
{
string1[2]="不及格";
}
else if(m_qimochengji<=100)
{
string1[2]="及格";
}
}
else
{
MessageBox("数据不合法!成绩为0-100!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
char *zhuanye;
GetDlgItemText(IDC_EDIT3,yucezhuanye);
zhuanye=yucezhuanye.GetBuffer(yucezhuanye.GetLength());
if( (strcmp(zhuanye,"化学")==0) ||
(strcmp(zhuanye,"计算机")==0) ||
(strcmp(zhuanye,"数学")==0) ||
(strcmp(zhuanye,"教育技术")==0)||
(strcmp(zhuanye,"机器翻译")==0) ||
(strcmp(zhuanye,"教育学")==0) ||
(strcmp(zhuanye,"历史教育")==0) ||
(strcmp(zhuanye,"心理学")==0) ||
(strcmp(zhuanye,"对外汉语")==0) ||
(strcmp(zhuanye,"政教")==0)||
(strcmp(zhuanye,"美术学")==0) ||
(strcmp(zhuanye,"体育"))==0
)
{
if((strcmp(zhuanye,"化学")==0) ||
(strcmp(zhuanye,"计算机")==0) ||
(strcmp(zhuanye,"数学")==0) ||
(strcmp(zhuanye,"教育技术")==0))
{
string1[3]="理科";
}
if((strcmp(zhuanye,"机器翻译")==0) ||
(strcmp(zhuanye,"教育学")==0) ||
(strcmp(zhuanye,"历史教育")==0) ||
(strcmp(zhuanye,"心理学")==0) ||
(strcmp(zhuanye,"对外汉语")==0) ||
(strcmp(zhuanye,"政教")==0))
{
string1[3]="文科";
}
if(strcmp(zhuanye,"美术学")==0 ||
strcmp(zhuanye,"体育")==0)
{
string1[3]="艺术类";
}
}
else
{
MessageBox("没有此专业!","提示",MB_OK|MB_ICONINFORMATION);
return;
}
fResult=PreYuce(string1,dt.child->node);
if(fResult==1)
MessageBox("依据生成规则,预测该同学将会及格!","预测结果",MB_OK|MB_ICONINFORMATION);
else
MessageBox("依据生成规则,预测该同学将不会及格!","预测结果",MB_OK|MB_ICONINFORMATION);
}
void CYucejieguo::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
int CYucejieguo::PreYuce(char **string, TreeNode *dtNode)
{
TreeNode *dt;
bool bIsHave;
dt=dtNode;
while((strcmp(dt->Title,"YES")!=0) && (strcmp(dt->Title,"NO")!=0))
{
int j;
j=Classify(dt->Title);
if(j==-1)
{
MessageBox("预测出现错误!程序将退出!","提示");
::exit(0);
}
bIsHave=false;
for(int k=0;k<dt->nChildCount;k++)
{
if(strcmp(string[j],dt->child[k].value)==0)
{
bIsHave=true;
dt=dt->child[k].node;
break;
}
}
if(!bIsHave)
break;
}
if(strcmp(dt->Title,"YES")==0)
{
return 1;
}
else
{
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -