现在的位置: 首页 > 综合 > 正文

一个学生成绩管理系统的设计与实现:2

2013年09月01日 ⁄ 综合 ⁄ 共 14076字 ⁄ 字号 评论关闭

原型软件的文件结构如下图所示:


 

SGSS.cpp的源代码如下:

 

 

 



// SGSS.cpp : 定义应用程序的类行为。

//


#include "stdafx.h"

#include "SGSS.h"

#include "SGSSDlg.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#endif



// CSGSSApp


BEGIN_MESSAGE_MAP(CSGSSApp, CWinApp)

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()



// CSGSSApp 构造


CSGSSApp::CSGSSApp()

{

// TODO: 在此处添加构造代码,

// 将所有重要的初始化放置在 InitInstance 中

}


mceinline;">

// 唯一的一个 CSGSSApp 对象


CSGSSApp theApp;



// CSGSSApp 初始化


BOOL CSGSSApp::InitInstance()

{

// 如果一个运行在 Windows XP 上的应用程序清单指定要

// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,

//则需要 InitCommonControls()。否则,将无法创建窗口。

InitCommonControls();


CWinApp::InitInstance();


AfxEnableControlContainer();


// 标准初始化

// 如果未使用这些功能并希望减小

// 最终可执行文件的大小,则应移除下列

// 不需要的特定初始化例程

// 更改用于存储设置的注册表项

// TODO: 应适当修改该字符串,

// 例如修改为公司或组织名

SetRegistryKey(_T("应用程序向导生成的本地应用程序"));


CSGSSDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

// TODO: 在此放置处理何时用“确定”来关闭

//对话框的代码

}

else if (nResponse == IDCANCEL)

{

// TODO: 在此放置处理何时用“取消”来关闭

//对话框的代码

}


// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,

// 而不是启动应用程序的消息泵。

return FALSE;

}

 

 



SGSSDlg.cpp源代码如下:

 

// SGSSDlg.cpp : 实现文件

//


#include "stdafx.h"

#include "SGSS.h"

#include "SGSSDlg.h"

#include "./sgssdlg.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#endif



// 用于应用程序“关于”菜单项的 CAboutDlg 对话框


class CAboutDlg : public CDialog

{

public:

CAboutDlg();


// 对话框数据

enum { IDD = IDD_ABOUTBOX };


protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现

protected:

DECLARE_MESSAGE_MAP()

};


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()



// CSGSSDlg 对话框




CSGSSDlg::CSGSSDlg(CWnd* pParent /*=NULL*/)

: CDialog(CSGSSDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}


void CSGSSDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}


BEGIN_MESSAGE_MAP(CSGSSDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

    ON_BN_CLICKED(IDOK, OnBnClickedOk)

    ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)

    ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8)

    ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)

    ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)

    ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)

END_MESSAGE_MAP()



// CSGSSDlg 消息处理程序


BOOL CSGSSDlg::OnInitDialog()

{

CDialog::OnInitDialog();


// 将/“关于.../”菜单项添加到系统菜单中。


// IDM_ABOUTBOX 必须在系统命令范围内。

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);

}

}


// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

//  执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标


ShowWindow(SW_NORMAL);


// TODO: 在此添加额外的初始化代码

return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE

}


void CSGSSDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}


// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。


void CSGSSDlg::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

{

CDialog::OnPaint();

}

}


//当用户拖动最小化窗口时系统调用此函数取得光标显示。

HCURSOR CSGSSDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}


void CSGSSDlg::OnBnClickedOk()

{

    // TODO: 在此添加控件通知处理程序代码

    OnOK();

}


void CSGSSDlg::OnBnClickedButton7()

{

    // TODO: 在此添加控件通知处理程序代码

    createTable("", "");

}

void CSGSSDlg::createTable(CString sql, CString name)

{

    CString filename, sExcelFile;

    CString sPath;

    CString workDir;



    if ( "" == name )

    {

        CFileDialog fileDlg(FALSE, "xls", filename, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "*.xls");


        if (fileDlg.DoModal() == IDOK)

        {

            sExcelFile = fileDlg.GetPathName();

            CFileFind finder;

            BOOL bWorking = finder.FindFile(sExcelFile);


            if (bWorking)

            {

                CFile::Remove(sExcelFile);

            }

        }

        else

        {

            return;

        }

    }

    else

    {

        sExcelFile = name;

    }

    

    CDatabase database;

    CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";

    CString sSql;

    TRY

    {

        sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",sDriver, sExcelFile, sExcelFile);


        if (database.OpenEx(sSql, CDatabase::noOdbcDialog))

        {

            //sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)";

            if (sql == "")

            {

                sSql = "CREATE TABLE 成绩(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float)";

            }

            else

            {

                sSql = sql;

            }

            //sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)";

            database.ExecuteSQL(sSql);

        }

        database.Close();

        if ("" == name)

        {

            AfxMessageBox("表格创建成功。");

        }

        

    


    }    

    CATCH_ALL(e)

    {

        TRACE1("EXCEL驱动没有安装:%S",sDriver);

    }

    END_CATCH_ALL;




    return;

}


void CSGSSDlg::OnBnClickedButton8()

{

    CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName;

    CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience;

    CDatabase database;

    CDatabase database2;

    CString sPath;

    GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH), MAX_PATH);

    sPath.ReleaseBuffer();

    int nPos = -1;

    nPos = sPath.ReverseFind('//');

    sPath = sPath.Left(nPos);

    CString sSourceFile = sPath + "//data//source//chengji.xls";

    CString sResultFile = sPath + "//data//source//sourcedata.xls";


    CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";

    CString sDsn;

    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile);

    CString sDsn2;

    sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile);

    TRY

    {

        database.Open(NULL, false, false, sDsn);

        database2.Open(NULL, false, false, sDsn2 );


        CRecordset recordSet(&database);

        CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC";

        recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

        while (!recordSet.IsEOF())

        {

            recordSet.GetFieldValue("序号",iID);


            recordSet.GetFieldValue("姓名", sName);

            recordSet.GetFieldValue("班级", iClassID);

            recordSet.GetFieldValue("语文", fChinese);

            recordSet.GetFieldValue("代数", fMath);

            recordSet.GetFieldValue("外语", fEnglish);

            recordSet.GetFieldValue("物理", fPhysics);

            recordSet.GetFieldValue("化学", fChymistry);

            recordSet.GetFieldValue("生物", fBiology);

            recordSet.GetFieldValue("历史", fHistory);

            recordSet.GetFieldValue("地理", fGeography);

            recordSet.GetFieldValue("理综", fArts);

            recordSet.GetFieldValue("文综", fScience);



            CString destName;

            destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength()));

            CString sInsertSql;

            sInsertSql.Format("INSERT INTO 成绩(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')", 

                (int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal,

                (float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal,

                (float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal);


            database2.ExecuteSQL(sInsertSql);

            recordSet.MoveNext();

        }

        database.Close();

        database2.Close();

        AfxMessageBox("导入数据成功。");

    }

    CATCH_ALL(e)

    {

        TRACE0("数据库出错了。");

    }

    END_CATCH_ALL;



}


void CSGSSDlg::OnBnClickedButton5()

{

    // TODO: 在此添加控件通知处理程序代码

    CWnd * TextCtrl = NULL;

    CString filename, sExcelFile;

    CString sPath;

    CFileDialog fileDlg(TRUE, NULL, NULL, NULL, NULL);


    if (fileDlg.DoModal() == IDOK)

    {

        sExcelFile = fileDlg.GetPathName();

        TextCtrl = GetDlgItem(IDC_EDIT1);

        TextCtrl->SetWindowText(sExcelFile);

    }

    else

    {

        return;

    }


}


void CSGSSDlg::OnBnClickedButton6()

{

    // TODO: 在此添加控件通知处理程序代码

    CString fileName;

    CWnd * TextCtrl = NULL;

    int MaxLen = 255;

    TextCtrl = GetDlgItem(IDC_EDIT1);

    TextCtrl->GetWindowText(fileName.GetBuffer(MaxLen),MaxLen);

    ShellExecute(NULL,"open",fileName,NULL,NULL,SW_SHOWNORMAL);

    return;

}


void CSGSSDlg::OnBnClickedButton1()

{

    statisticsEachClassCourse();// TODO: 在此添加控件通知处理程序代码

}

//统计各班级学科成绩表


void CSGSSDlg::statisticsEachClassCourse()

{

    int MaxLen = 255;

    CString workDir;

    CWnd * textCtrl;

    CString sourceData;

    CString destData;


    char resultFilePath[200];

    GetModuleFileName(NULL,resultFilePath,200); 

    workDir = resultFilePath;

    int pos = workDir.ReverseFind('//');

    workDir = workDir.Left(pos);

    workDir = workDir +"//data//work//";

    destData = workDir +"allClassTable.xls";


    CString allClassTableString = "CREATE TABLE 年级学科成绩表(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float, 总分 float, 平均 float, T平均 float, 班级名次 int, 年级名次 int)";

    createTable(allClassTableString, destData);


    textCtrl = GetDlgItem(IDC_EDIT1);

    textCtrl->GetWindowText(sourceData.GetBuffer(MaxLen),MaxLen);


    staticSumAverageTAverage(sourceData, destData);

/*    staticGradeOrder();

    staticClassOrder();


    generateViewReport();

    generatePrintReport();

    */


}

void CSGSSDlg::staticSumAverageTAverage(CString source, CString dest)

{

    int courseCount = 5;

    CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName;

    CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience;

    CDatabase database;

    CDatabase database2;


    CString sSourceFile = source;

    CString sResultFile = dest;


    CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";

    CString sDsn;

    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile);

    CString sDsn2;

    sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile);

    TRY

    {

        database.Open(NULL, false, false, sDsn);

        database2.Open(NULL, false, false, sDsn2 );


        CRecordset recordSet(&database);

        CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC";

        recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

        while (!recordSet.IsEOF())

        {

            recordSet.GetFieldValue("序号",iID);


            recordSet.GetFieldValue("姓名", sName);

            recordSet.GetFieldValue("班级", iClassID);

            recordSet.GetFieldValue("语文", fChinese);

            recordSet.GetFieldValue("代数", fMath);

            recordSet.GetFieldValue("外语", fEnglish);

            recordSet.GetFieldValue("物理", fPhysics);

            recordSet.GetFieldValue("化学", fChymistry);

            recordSet.GetFieldValue("生物", fBiology);

            recordSet.GetFieldValue("历史", fHistory);

            recordSet.GetFieldValue("地理", fGeography);

            recordSet.GetFieldValue("理综", fArts);

            recordSet.GetFieldValue("文综", fScience);


            float fSum = fChinese.m_dblVal + fMath.m_dblVal + fEnglish.m_dblVal 

                + fPhysics.m_dblVal + fPhysics.m_dblVal;

            float fAverage = fSum / courseCount;

            float fTAverage = 500;

            CString destName;

            destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength()));

            CString sInsertSql;

            sInsertSql.Format("INSERT INTO 年级学科成绩表(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综,总分,平均,T平均) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')", 

                (int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal,

                (float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal,

                (float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal,fSum,fAverage,fTAverage);


            database2.ExecuteSQL(sInsertSql);

            recordSet.MoveNext();

        }

        database.Close();

        database2.Close();

        AfxMessageBox("导入数据成功。");

    }

    CATCH_ALL(e)

    {

        TRACE0("数据库出错了。");

    }

    END_CATCH_ALL;

    return;

}



stdafx.cpp源代码如下:

 

// stdafx.cpp : 只包括标准包含文件的源文件

// SGSS.pch 将是预编译头

// stdafx.obj 将包含预编译类型信息


#include "stdafx.h"

 

resource.h源代码如下:

 

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ generated include file.

// Used by SGSS.rc

//

#define IDM_ABOUTBOX                    0x0010

#define IDD_ABOUTBOX                    100

#define IDS_ABOUTBOX                    101

#define IDD_SGSS_DIALOG                 102

#define IDR_MAINFRAME                   128

#define IDC_EDIT1                       1000

#define IDC_BUTTON1                     1001

#define IDC_EDIT2                       1002

#define IDC_BUTTON2                     1003

#define IDC_EDIT3                       1004

#define IDC_BUTTON3                     1005

#define IDC_BUTTON4                     1006

#define IDC_EDIT5                       1007

#define IDC_EDIT6                       1008

#define IDC_BUTTON5                     1009

#define IDC_BUTTON6                     1010

#define IDC_BUTTON7                     1011

#define IDC_BUTTON8                     1012


// Next default values for new objects

// 

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        129

#define _APS_NEXT_COMMAND_VALUE         32771

#define _APS_NEXT_CONTROL_VALUE         1013

#define _APS_NEXT_SYMED_VALUE           101

#endif

#endif

SGSS.h源代码如下:
// SGSS.h : PROJECT_NAME 应用程序的主头文件
//

#pragma once

#ifndef __AFXWIN_H__
#error 在包含用于 PCH 的此文件之前包含“stdafx.h”
#endif

#include "resource.h" // 主符号


// CSGSSApp:
// 有关此类的实现,请参阅 SGSS.cpp
//

class CSGSSApp : public CWinApp
{
public:
CSGSSApp();

// 重写
public:
virtual BOOL InitInstance();

// 实现

DECLARE_MESSAGE_MAP()
};

extern CSGSSApp theApp;
SGSSDlg.h源代码如下:
// SGSSDlg.h : 头文件
//

#pragma once


// CSGSSDlg 对话框
class CSGSSDlg : public CDialog
{
// 构造
public:
CSGSSDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_SGSS_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:
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedButton7();
    //creat table
    void createTable(CString sql, CString name);
    //load file
    //static file
    void statisticsEachClassCourse();
    void staticSumAverageTAverage(CString source, CString dest);
    //preview file
    //print file
    afx_msg void OnBnClickedButton8();
    afx_msg void OnBnClickedButton5();
    afx_msg void OnBnClickedButton6();
    afx_msg void OnBnClickedButton1();
};

stdafx.h源代码如下:
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 项目特定的包含文件

#pragma once

#ifndef VC_EX

抱歉!评论已关闭.