C++实验报告exp05.docx
- 文档编号:11777687
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:23
- 大小:1.62MB
C++实验报告exp05.docx
《C++实验报告exp05.docx》由会员分享,可在线阅读,更多相关《C++实验报告exp05.docx(23页珍藏版)》请在冰点文库上搜索。
C++实验报告exp05
本科学生设计性实验报告
项目组长____学号_____
成员
专业____班级____
实验项目名称_____实验5数据库程序_______
指导教师及职称__________
开课学期2015至_2016学年_2_学期
上课时间2016年6月19日
一、实验设计方案
实验名称:
数据库程序
实验时间:
2016.6
小组合作:
是○否○
小组成员:
1、实验目的:
对于大量数据处理,采用数据库更为安全简便。
例如,对于学生信息管理系统,常常需要处理学生的基本信息、课程成绩以及课程信息等,这些信息用数据库表的形式来描述更为清晰。
本实验将在列表视图的显示视图中显示学生的基本信息内容。
(1)用MicrosoftAccess2003创建一个数据库main.mdb,含有4个数据表:
学生基本信息表student、课程信息表course、课程成绩表score和专业数据表special,并建立ODBC联接。
(2)创建学生课程成绩表score的CRecordSet派生类CScoreSet。
(3)在主菜单中添加“课程成绩(&S)”顶层菜单,在该菜单添加“添加(&A)”、“删除(&D)”和“修改(&C)”子菜单。
(4)选择“添加”菜单命令,弹出“学生课程成绩”对话框,单击“添加”按钮,在score表中添加一条记录,并自动更新列表视图显示的内容。
如图5.1所示。
图5.1学生课程信息输入及显示图5.2学生课程信息修改及显示
(5)当选定列表视图中的某个列表项后,选择“删除”菜单命令,弹出消息对话框,询问是否确认删除,单击“确定”后,当前选择的列表项所在的数据表记录被删除,并自动更新列表视图显示的内容。
(6)当选定列表视图中的某个列表项后,选择“修改”菜单命令,弹出“学生课程成绩”对话框,对话框的内容就是当前选择的列表项中的内容,修改后,单击“修改”按钮,当前选择的列表项所在的数据表记录被修改,并自动更新列表视图显示的内容。
2、实验场地及仪器、设备和材料:
H114
3、实验思路(实验内容、数据处理方法及实验步骤等):
1.创建数据库和数据表
这里以MicrosoftAccess2003为例说明数据库和数据表的创建过程。
①启动MicrosoftAccess2003。
②选择“文件”→“新建”菜单,在右边任务窗格中单击“空数据库”,弹出一个对话框,将文件路径指定到“…\VisualC++程序\实验\实习”,指定数据库名main.mdb。
单击“创建”按钮,出现如图5.3所示的数据库设计窗口。
图5.3数据库设计窗口
③双击“使用设计器创建表”,出现如图5.4所示的表设计界面。
其中,单击数据类型框的下拉按钮,可在弹出的列表中选择适当的数据类型。
在下方的常规页面中可以设置字段大小、格式等内容。
图5.4表设计界面
④按表9.1添加字段名和数据类型,关闭表设计界面,弹出一个消息对话框,询问是否保存刚才设计的数据表,单击“是(Y)”按钮,出现如图5.5所示的对话框,在表名称中输入score,单击““确定”按钮。
此时出现一个消息对话框,用来询问是否要为表创建主关键词,单击[否(N)”按钮。
注意:
若单击“是(Y)”按钮,则系统会自动为表添加另一个字段ID。
表9.1学生课程成绩表(score)结构
序号
字段名称
数据类型
字段大小
小数位
字段含义
1
studentno
文本
8
学号
2
course
文本
7
课程号
3
score
数字
单精度
1
成绩
4
credit
数字
单精度
1
学分
⑤在数据库设计窗口中,双击score表,就可向数据表输入记录数据。
如图5.6是记录输入的结果。
图5.5保存数据表图5.6在score表中添加的记录
⑥按照上面的过程,添加学生基本信息表student、课程信息表course和专业数据表special,并输入如图5.7所示的记录。
图5.7各数据表添加的记录
关闭MicrosoftAccess2003。
2.创建ODBC数据源
①运行ODBC组件,进入ODBC数据源管理器。
②单击“添加”按钮,弹出有一驱动程序列表的“创建新数据源”对话框,在该对话框中选择MicrosoftAccessDriver。
③单击“完成”按钮,进入指定驱动程序的安装对话框,数据源名称设为“学生信息管理系统”,单击“选择”按钮将本实验中的main.mdb数据库。
④单击“确定”按钮,刚才创建的用户数据源被添加在“ODBC数据源管理器”的“用户数据源”列表中。
3.启动VisualC++6.0
启动VisualC++6.0系统。
4.创建单文档应用程序Ex_Student
①用MFCAppWizard创建一个单文档应用程序Ex_Student,在向导的第2步选中“标题文件”,在向导的第六步将CEx_StudentView的基类由CView改为CListView。
在CMainFrame类的PreCreateWindow虚函数中添加如下代码,使窗口大小为屏幕大小的一半,且位于屏幕正中间:
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
intcx=GetSystemMetrics(SM_CXSCREEN);//获得屏幕大小:
宽
intcy=GetSystemMetrics(SM_CYSCREEN);//获得屏幕大小:
高
cs.cx=0.5*cx;//窗口宽
cs.cy=0.5*cy;//窗口高
cs.x=cx/4;//窗口左上角位置:
x坐标(像素)
cs.y=cy/4;//窗口左上角位置:
y坐标(像素)
returnTRUE;
}
②在CEx_StudentView:
:
PreCreateWindow函数添加下列代码,用来设置列表视图内嵌列表控件的风格:
BOOLCEx_StudentView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
cs.style|=LVS_REPORT;//报表风格
returnCListView:
:
PreCreateWindow(cs);
}
在该类的OnInitialUpdate函数中添加如下代码,控制显示报表的样式:
voidCEx_StudentView:
:
OnInitialUpdate()
{
CListView:
:
OnInitialUpdate();
//TODO:
YoumaypopulateyourListViewwithitemsbydirectlyaccessing
//itslistcontrolthroughacalltoGetListCtrl().
CListCtrl&m_ListCtrl=GetListCtrl();
LONGlStyle;
lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口风格
lStyle&=~LVS_TYPEMASK;//清除显示方式位
lStyle|=LVS_REPORT;//设置报表风格
SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口风格
DWORDdwStyle=m_ListCtrl.GetExtendedStyle();
dwStyle|=LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用于报表风格的listctrl)
dwStyle|=LVS_EX_GRIDLINES;//网格线(只适用与报表风格的listctrl)
m_ListCtrl.SetExtendedStyle(dwStyle);//设置扩展风格
m_ListCtrl.SetBkColor(RGB(227,239,255));//设置背景颜色
m_ListCtrl.SetTextBkColor(RGB(190,219,255));//设置文本背景颜色
m_ListCtrl.SetTextColor(RGB(10,10,80));//设置文本颜色
}
5.为数据表创建CRecordSet用户派生类
①在Ex_Student中添加学生基本信息表student、课程信息表course、课程成绩表score和专业数据表special的CRecordSet派生类CStudentSet、CCourseSet、CScoreSet和CSpecialSet。
按Ctrl+W调出类向导,添加一个新类,名字叫CScoreSet。
点“Change”按钮,把文件名改为ScoreSet.h和ScoreSet.cpp。
点击OK,在随之弹出的“DatabaseOptions”窗口中做如下设置(数据源Datasource选“ODBC”,在后面的下拉列表中选“学生信息管理系统”,Recordsettype项选择Snapshot,Bindallcolumns选中):
点击“确定”后,在弹出的“SelectDatabaseTables”对话框中选择数据表“score”
剩下就是点确定(OK)键了。
这样我们就创建好一个跟数据库main.mdb中的表score相关联的记录集类CScoreSet了,可以在工作区的类视图下观察到这个新添加的类。
如果需要使用别的表,创建对应记录集类的过程跟上面相同。
②在stdafx.h文件中添加CRecordSet头文件包含#include
(这一步也可以在步骤4.①的应用程序向导的第2步选择“仅标题文件(Headerfilesonly”来完成))
6.创建“学生课程成绩”对话框和CScoreDlg类
①创建“学生课程成绩”对话框,资源ID设置为IDD_SCORE。
如下图所示:
②双击对话框中的空白处,为该对话框添加新类CScoreDlg,对话框类文件设为ScoreDlg.h和ScoreDlg.cpp。
③将ScoreDlg.cpp文件前面的头文件中添加文件包含指令#include"Ex_Student.h"。
④利用类向导为四个编辑框分别关联成员变量(从上到下):
控件ID
变量类型
变量名字
含义
IDC_EDIT_SNO
CString
m_strStuNo
学号
IDC_EDIT_CNO
CString
m_strCourseNo
课程号
IDC_EDIT_SCORE
float
m_fScore
成绩
IDC_EDIT_CREDIT
float
m_fCredit
学分
IDC_BTN_UPDATE
CButton
m_btnOK
OK按钮
IDC_CANCEL
――
――
取消按钮
7.实现添加、删除和修改功能
①打开菜单资源IDR_MAINFRAME,添加“课程成绩(&S)”顶层菜单,在该菜单添加“添加(&A)”(ID_SCORE_ADD)、“删除(&D)”(ID_SCORE_DEL)和“修改(&C)”(ID_SCORE_CHANGE)子菜单。
②在CEx_StudentView类添加成员函数DeleteAllColumn,用来删除列表视图的标题头,以便能再创建标题头显示不同的信息。
voidCEx_StudentView:
:
DeleteAllColumn()
{
CListCtrl&m_ListCtrl=GetListCtrl();
intnCount=0;
CHeaderCtrl*pHeaderCtrl=m_ListCtrl.GetHeaderCtrl();
if(pHeaderCtrl!
=NULL)
nCount=pHeaderCtrl->GetItemCount();
for(inti=0;i m_ListCtrl.DeleteColumn(0); } ③在CEx_StudentView类添加成员函数DispScoreInfo,用来显示课程成绩信息。 参数strFilter作为过滤器来使用,用于筛选记录。 voidCEx_StudentView: : DispScoreInfo(CStringstrFilter) { DeleteAllColumn();//删除表头 CListCtrl&m_ListCtrl=GetListCtrl(); CStringstrHeader[]={"学号","课程号","成绩","学分"}; for(intnCol=0;nCol m_ListCtrl.InsertColumn(nCol,strHeader[nCol],LVCFMT_LEFT,100); m_ListCtrl.DeleteAllItems();//删除所有的列表项 CScoreSetsSet; sSet.m_strFilter=strFilter; sSet.m_strSort="studentno,course"; sSet.Open(); intnItem=0; CStringstr; while(! sSet.IsEOF()){ m_ListCtrl.InsertItem(nItem,sSet.m_studentno);//插入学号 m_ListCtrl.SetItemText(nItem,1,sSet.m_course); str.Format("%4.1f",sSet.m_score); m_ListCtrl.SetItemText(nItem,2,str); str.Format("%3.1f",sSet.m_credit); m_ListCtrl.SetItemText(nItem,3,str); nItem++; sSet.MoveNext(); } sSet.Close(); } 编译,会出错,显示CScoreSet未定义。 这是因为使用CScoreSet类的时候,没有加入包含其定义文件的指令。 故: ④在Ex_StudentView.cpp前面添加CScoreSet类和CScoreDlg的头文件包含: #include"Ex_StudentDoc.h" #include"Ex_StudentView.h" #include"ScoreSet.h" #include"ScoreDlg.h" ⑤为CEx_StudentView类添加一个成员变量m_strFilter,类型为CString。 ⑥用MFCClassWizard在CEx_StudentView类中映射菜单ID_SCORE_ADD的COMMAND消息,并添加下列代码: voidCEx_StudentView: : OnScoreAdd() { CScoreDlgdlg; if(dlg.DoModal()! =IDOK)return; CScoreSetsSet; sSet.Open(); sSet.AddNew(); sSet.m_course=dlg.m_strCourseNo; sSet.m_studentno=dlg.m_strStuNo; sSet.m_score=dlg.m_fScore; sSet.m_credit=dlg.m_fCredit; sSet.Update(); sSet.Requery(); sSet.Close(); //更新列表视图 MessageBox("稍等几秒钟后,单击\"确定\"按钮! ","特别提示",MB_OK|MB_ICONINFORMATION); m_strFilter.Format("studentno='%s'",dlg.m_strStuNo); //打开并显示所有学号为dlg.m_strStuNo的记录 DispScoreInfo(m_strFilter); } 编译上述代码,会出错,显示m_strFilter未定义。 为此,在CEx_StudentView类定义中为其添加成员变量CStringm_strFilter; 为CEx_StudentView类添加成员函数GetListCtrlCurSel,用来获取当前选择的列表项索引,其代码如下: intCEx_StudentView: : GetListCtrlCurSel() { CListCtrl&m_ListCtrl=GetListCtrl(); POSITIONpos; pos=m_ListCtrl.GetFirstSelectedItemPosition(); if(pos==NULL){ MessageBox("你还没有选中列表项! "); return-1; } returnm_ListCtrl.GetNextSelectedItem(pos); } 用MFCClassWizard在CEx_StudentView类中映射菜单ID_SCORE_DEL的COMMAND消息,并添加下列代码: voidCEx_StudentView: : OnScoreDel() { intnItem=GetListCtrlCurSel(); if(nItem<0)return; CListCtrl&m_ListCtrl=GetListCtrl(); CStringstrItem,str; strItem=m_ListCtrl.GetItemText(nItem,0); str.Format("你确实要删除%s列表项(记录)吗? ",strItem); if(IDOK! =MessageBox(str,"删除确认",MB_ICONQUESTION|MB_OKCANCEL))return; CStringstrStudentNO=m_ListCtrl.GetItemText(nItem,0); CStringstrCourseNO=m_ListCtrl.GetItemText(nItem,1); CScoreSetinfoSet; infoSet.m_strFilter.Format("studentno='%s'ANDcourse='%s'",strStudentNO,strCourseNO); infoSet.Open(); if(! infoSet.IsEOF()){ CRecordsetStatusstatus; infoSet.GetStatus(status);//获取当前记录集状态 infoSet.Delete();//删除当前记录 if(status.m_lCurrentRecord==0)//若当前记录索引号为0(0表示第一条记录) infoSet.MoveNext();//下移一个记录 else infoSet.MoveFirst();//移动到第一个记录处 } if(infoSet.IsOpen())infoSet.Close(); //更新列表视图 MessageBox("稍等几秒钟后,单击\"确定\"按钮! ","特别提示",MB_OK|MB_ICONINFORMATION); DispScoreInfo(m_strFilter); } 用MFCClassWizard在CEx_StudentView类中映射菜单ID_SCORE_CHANGE的COMMAND消息,并添加下列代码: (先在CScoreDlg类中添加一个CString类型的成员变量m_strOKText) voidCEx_StudentView: : OnScoreChange() { intnItem=GetListCtrlCurSel(); if(nItem<0)return; CListCtrl&m_ListCtrl=GetListCtrl(); CStringstrStudentNO=m_ListCtrl.GetItemText(nItem,0); CStringstrCourseNO=m_ListCtrl.GetItemText(nItem,1); CScoreSetsSet; sSet.m_strFilter.Format("studentno='%s'ANDcourse='%s'",strStudentNO,strCourseNO); sSet.Open(); CScoreDlgdlg; dlg.m_strOKText="修改"; dlg.m_strCourseNo=sSet.m_course; dlg.m_strStuNo=sSet.m_studentno; dlg.m_fScore=sSet.m_score; dlg.m_fCredit=sSet.m_credit; if(IDOK! =dlg.DoModal()){ if(sSet.IsOpen())sSet.Close(); return; } sSet.Edit(); sSet.m_score=dlg.m_fScore;//只能修改成绩 sSet.Update(); sSet.Requery(); if(sSet.IsOpen())sSet.Close(); //更新列表视图 MessageBox("稍等几秒钟后,单击\"确定\"按钮! ","特别提示",MB_OK|MB_ICONINFORMATION); m_strFilter.Format("studentno='%s'",dlg.m_strStuNo); //打开并显示所有学号为dlg.m_strStuNo的记录 DispScoreInfo(m_strFilter); } 在CEx_StudentView: : OnInitialUpdate函数中添加下列代码: voidCEx_StudentView: : OnI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实验 报告 exp05