⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yucejieguo.cpp

📁 用Visual c++写
💻 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 + -