GPA成绩换算器

来源:互联网 发布:北京眼镜店哪家好 知乎 编辑:程序博客网 时间:2024/04/30 10:02

GPA换算器,功能要点:

1.学生成绩可以由文件导入。

2.GPA标准可以选择,也可以手动导入。

3.GPA的计算过程易于监督控制。

4.计算的可读性强。

主界面:


类视图:


// GPADlg.h : 头文件//#pragma once// CGPADlg 对话框class CGPADlg : public CDialogEx{// 构造public:CGPADlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_GPA_DIALOG };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:CString m_sPathName;double m_dS1;double m_dS2;double m_dS3;double m_dS4;double m_dS5;double m_dS6;double m_dS7;double m_dO1;double m_dO2;double m_dO3;double m_dO4;double m_dO5;double m_dO6;double m_dO7;double m_dO8;CString m_strAverage;CString m_strGPA;CComboBox m_cmbStandard;double m_dTotal;CListBox m_ListScore;afx_msg void OnMenuitemman();afx_msg void OnMenuExit();afx_msg void OnAbout();typedef struct stScore{double dOPoint;//原始分double dSPoint;//标准分double dNum;//学分};private:CArray<stScore,stScore&>arScore;double GetSDPoint(double dPoint);void SpliterString(CString str, double &a, double &b);void GatherData(void);void ChangeType(int nType);void SetEditRead(bool bReadOnly);public:afx_msg void OnClickedButtonOpen();afx_msg void OnClickedButtonOk();afx_msg void OnSelchangeComboStandard();};



// GPADlg.cpp : 实现文件//#include "stdafx.h"#include "GPA.h"#include "GPADlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}// CGPADlg 对话框CGPADlg::CGPADlg(CWnd* pParent /*=NULL*/): CDialogEx(CGPADlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_sPathName = _T("");m_dS1 = 0.0;m_dS2 = 0.0;m_dS3 = 0.0;m_dS4 = 0.0;m_dS5 = 0.0;m_dS6 = 0.0;m_dS7 = 0.0;m_dO1 = 0.0;m_dO2 = 0.0;m_dO3 = 0.0;m_dO4 = 0.0;m_dO5 = 0.0;m_dO6 = 0.0;m_dO7 = 0.0;m_dO8 = 0.0;m_strAverage = _T("");m_strGPA = _T("");m_dTotal = 0.0;}void CGPADlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_PATHNAME, m_sPathName);DDX_Text(pDX, IDC_EDIT_S1, m_dS1);DDX_Text(pDX, IDC_EDIT_S2, m_dS2);DDX_Text(pDX, IDC_EDIT_S3, m_dS3);DDX_Text(pDX, IDC_EDIT_S4, m_dS4);DDX_Text(pDX, IDC_EDIT_S5, m_dS5);DDX_Text(pDX, IDC_EDIT_S6, m_dS6);DDX_Text(pDX, IDC_EDIT_S7, m_dS7);DDX_Text(pDX, IDC_EDIT_O1, m_dO1);DDX_Text(pDX, IDC_EDIT_O2, m_dO2);DDX_Text(pDX, IDC_EDIT_O3, m_dO3);DDX_Text(pDX, IDC_EDIT_O4, m_dO4);DDX_Text(pDX, IDC_EDIT_O5, m_dO5);DDX_Text(pDX, IDC_EDIT_O6, m_dO6);DDX_Text(pDX, IDC_EDIT_O7, m_dO7);DDX_Text(pDX, IDC_EDIT_O8, m_dO8);DDX_Text(pDX, IDC_EDIT_AVERAGE, m_strAverage);DDX_Text(pDX, IDC_EDIT_GPA, m_strGPA);DDX_Control(pDX, IDC_COMBO_STANDARD, m_cmbStandard);DDX_Text(pDX, IDC_EDIT_TOTAL, m_dTotal);DDX_Control(pDX, IDC_LIST_SCORE, m_ListScore);}BEGIN_MESSAGE_MAP(CGPADlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(ID_MENUITEMMAN, &CGPADlg::OnMenuitemman)ON_COMMAND(ID_menu_exit, &CGPADlg::OnMenuExit)ON_COMMAND(ID_ABOUT, &CGPADlg::OnAbout)ON_BN_CLICKED(IDC_BUTTON_OPEN, &CGPADlg::OnClickedButtonOpen)ON_BN_CLICKED(IDC_BUTTON_OK, &CGPADlg::OnClickedButtonOk)ON_CBN_SELCHANGE(IDC_COMBO_STANDARD, &CGPADlg::OnSelchangeComboStandard)END_MESSAGE_MAP()// CGPADlg 消息处理程序BOOL CGPADlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码m_cmbStandard.ResetContent();CString strTemp;   for(int i=0;i<4;i++){if(i)strTemp.Format("%d",i);elsestrTemp = "无";m_cmbStandard.AddString(strTemp);}m_cmbStandard.SetCurSel(0);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}void CGPADlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void CGPADlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中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;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CGPADlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CGPADlg::OnMenuitemman(){// TODO: 在此添加命令处理程序代码WinExec("notepad.exe EXPLAIN.HEP",SW_SHOW);}void CGPADlg::OnMenuExit(){// TODO: 在此添加命令处理程序代码DestroyWindow();}void CGPADlg::OnAbout(){// TODO: 在此添加命令处理程序代码CAboutDlg dlg;dlg.DoModal();}double CGPADlg::GetSDPoint(double dPoint){UpdateData();CArray<double,double&>arOPoint;CArray<double,double&>arSPoint;arOPoint.Add(m_dO1);arOPoint.Add(m_dO2);arOPoint.Add(m_dO3);arOPoint.Add(m_dO4);arOPoint.Add(m_dO5);arOPoint.Add(m_dO6);arOPoint.Add(m_dO7);arOPoint.Add(m_dO8);arSPoint.Add(m_dS1);arSPoint.Add(m_dS2);arSPoint.Add(m_dS3);arSPoint.Add(m_dS4);arSPoint.Add(m_dS5);arSPoint.Add(m_dS6);arSPoint.Add(m_dS7);if(dPoint >= arOPoint[0])return arSPoint[0];for(int i = 0;i < arOPoint.GetSize();i++){if(dPoint >= arOPoint[i])return arSPoint[i-1];}return 0;}void CGPADlg::SpliterString(CString str, double &a, double &b){CString strOne, strTwo;int ifind;str.TrimLeft(' ');str.TrimRight(' ');ifind = str.Find(' ');strOne = str.Left(ifind);strTwo = str.Right(str.GetLength()-ifind-1);a = atof(LPCTSTR(_T(strOne)));b = atof(LPCTSTR(_T(strTwo)));}void CGPADlg::GatherData(void){CString str;stScore temp;if(m_sPathName == "")return;arScore.RemoveAll();CFile file(m_sPathName,CFile::modeRead);CArchive ar(&file,CArchive::load);ar.ReadString(str);while(str != ""){SpliterString(str,temp.dOPoint,temp.dNum);temp.dSPoint = GetSDPoint(temp.dOPoint);arScore.Add(temp);ar.ReadString(str);}}void CGPADlg::ChangeType(int nType){switch(nType){case 0:case 4:m_dS1 = m_dS2 = m_dS3 = m_dS4 = m_dS5 = m_dS6 = m_dS7 = 0;m_dO1 = m_dO2 = m_dO3 = m_dO4 = m_dO5 = m_dO6 = m_dO7 = m_dO8 = 0;break;case 1:m_dS1 = 4;m_dS2 = 3;m_dS3 = 2;m_dS4 = 1;m_dS5 = m_dS6 = m_dS7 = 0;m_dO1 = 100;m_dO2 = 90;m_dO3 = 80;m_dO4 = 70;m_dO5 = 60;m_dO6 = m_dO7 = m_dO8 = 0;break;case 2:m_dS1 = 4.3;m_dS2 = 4;m_dS3 = 3.7;m_dS4 = 3.3;m_dS5 = 3.0;m_dS6 = 2.7;m_dS7 = 2.3;m_dO1 = 100;m_dO2 = 90;m_dO3 = 85;m_dO4 = 80;m_dO5 = 75;m_dO6 = 70;m_dO7 = 65;m_dO8 = 60;break;case 3:m_dS1 = 4;m_dS2 = 3;m_dS3 = 2;m_dS4 = m_dS5 = m_dS6 = m_dS7 = 0;m_dO1 = 100;m_dO2 = 85;m_dO3 = 70;m_dO4 = 60;m_dO5 = m_dO6 = m_dO7 = m_dO8 = 0;break;}}void CGPADlg::SetEditRead(bool bReadOnly){((CEdit *)GetDlgItem(IDC_EDIT_S1))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S2))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S3))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S4))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S5))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S6))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_S7))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O1))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O2))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O3))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O4))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O5))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O6))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O7))->SetReadOnly(bReadOnly);((CEdit *)GetDlgItem(IDC_EDIT_O8))->SetReadOnly(bReadOnly);}void CGPADlg::OnClickedButtonOpen(){// TODO: 在此添加控件通知处理程序代码CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"成绩文件|*.dat;*.txt|",NULL);if(fdlg.DoModal() == IDOK){m_sPathName = fdlg.GetPathName();}UpdateData(FALSE);}void CGPADlg::OnClickedButtonOk(){// TODO: 在此添加控件通知处理程序代码double dGPAall = 0;double dAvgall = 0;GatherData();int i = 0;int size = arScore.GetSize();if(size == 0){return;}m_ListScore.ResetContent();m_ListScore.AddString("序号      成绩      学分      标准");m_ListScore.AddString("-----------------------------------------");m_dTotal = 0;while(i<size){CString str;m_dTotal += arScore.GetAt(i).dNum;dGPAall += arScore.GetAt(i).dSPoint*arScore.GetAt(i).dNum;dAvgall += arScore.GetAt(i).dOPoint*arScore.GetAt(i).dNum;str.Format("%d       %0.2f      %0.2f     %0.2f",i+1,arScore.GetAt(i).dOPoint,arScore.GetAt(i).dNum,arScore.GetAt(i).dSPoint);i++;m_ListScore.AddString(str);}m_strGPA.Format("%.2f",dGPAall/m_dTotal);m_strAverage.Format("%.2f",dAvgall/m_dTotal);UpdateData(FALSE);}void CGPADlg::OnSelchangeComboStandard(){// TODO: 在此添加控件通知处理程序代码int nIndex = m_cmbStandard.GetCurSel();if(4 == nIndex)SetEditRead(false);elseSetEditRead(true);ChangeType(nIndex);UpdateData(FALSE);}



运行界面:



0 0
原创粉丝点击