软件设计报告.docx
- 文档编号:26570807
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:52
- 大小:397.85KB
软件设计报告.docx
《软件设计报告.docx》由会员分享,可在线阅读,更多相关《软件设计报告.docx(52页珍藏版)》请在冰豆网上搜索。
软件设计报告
通信与信息工程学院
2010/2011学年第2学期
课程设计实验报告
模块名称VC++软件设计
专业网络工程
学生班级B080218
学生学号B08021804
学生姓名张平平
指导教师董恒等
日期2011年5月27日
基础题
题目1
基本环境调试改错
1、实验目的
在基本环境中调试程序,理解编译错误,运行错误等,掌握基本错误的修改方法,能够自己发现错误,并且改正错误,得出程序运行结果。
2、实验内容
将例程1用VC++打开,修改错误使程序能够运行
3、实验过程
首先,打开给定的例程1程序Fund1.dsw,编译链接以便检验存在的错误;
然后,按照编译指出的错误依次修正程序,直至没有错误(主要是简单的符号错误);
最后,运行程序,修改参数,检验结果
4、实验结果及其分析
测试1:
计算100以内的素数并输出
测试2:
计算500以内的素数并输出
运行程序,跳出如图对话框。
观察得知,修改后的程序在输入范围参数后,点击Calculate按钮即可计算出范围内的素数个数,并依次显示。
点击Quit按钮,对话框关闭。
5、关键代码
按钮Calculate的响应函数:
voidCFund1Dlg:
:
OnButton1()
{
UpdateData();
intPrimes[65536];//存放素数的数组,定义一个尽可能大的数值防止显示不全结果
intindex=0;
boolflag=true;//简单的求素数算法
for(intm=2;m<=m_limit;m++)
{
for(inti=2;i { if(m%i==0) { flag=false; break; } else flag=true; } if(flag==true) Primes[index++]=m; } CWnd*pWnd=GetDlgItem(IDC_STATICOUTPUT); CStringstr; str.Format("%d以内的素数有%d个: \n\n",m_limit,index); for(inti=0;i { charbuf[10]; sprintf(buf,"%d",Primes[i]); str+=buf; } pWnd->SetWindowText(str); } 按钮Quit的响应函数: voidCFund1Dlg: : OnButton2() { OnOK(); } 6、实验中遇到的问题及改进的设想 本项实验主要是在基本调试环境中根据给定程序调试程序修改错误,运行程序验证试验结果。 实验程序主要涉及了基础基本符号输入错误和符号丢失的现象,如: 相等判断使用连等号“==”,多项嵌套注意“{}”成对出现,这些错误并不复杂,可通过前后语境环境观察修正。 根据指示修改程序后,可运行检验。 在此过程会发现,当参数范围较小时,不会发现明显错误;但是参数范围较大时,素数个数可判断,一次输出显示出现错误。 主要原因是存放素数的数组Primes[]初值定义太小,无法存放个数较多的素数,此时,需把数组初值定义一个尽可能大的值,使其在以后修改参数范围时总能存放所有素数,不影响实验结果,如Primes[65536]。 这样修改后,实验即可准确无误的运行。 题目2 数据库操作 1、实验目的 学习数据库相关概念、特点和基础知识,了解VC++数据库访问技术、VC++编写数据库应用程序的相关组件以及标准数据库应用程序接口。 本次实验项目主要学习ODBC开放数据库互联访问技术。 学习掌握ODBC相关类和函数,学会利用Access2003建立数据库,掌握ODBC数据源的创建方法,学会建立数据库关联文档应用程序,详细解析OBDC访问技术。 2、实验内容 通过ODBC数据源访问数据库(ACCESS),数据库中保存以下内容: 学生姓名,性别,年龄,家庭住址,电话,电子邮件,爱好等; 再以上基础上进行该记录的读出并可编辑浏览显示。 3、实验过程 ODBC体系结构个部件组成关系: 数据源名将数据传递给应用函数 应用层 应用程序调用 ODBCAPI ODBC层 数据层 ODBC管理器负责管理数据源名DSN、驱动程序管理器、驱动程序和数据源。 驱动程序管理器负责管理ODBC驱动程序和数据源。 第一步,建立数据库。 利用MicrosoftOfficeAccess2003创建一个名为“STU”的数据库,在此数据库中建立一个名为“学生信息”的表,表项信息依次为学生姓名、性别、年龄、家庭住址、电话、电子邮件、爱好,其中各项属性依次为文本、文本、数字、文本、文本、文本、文本。 为表格手动输入几项记录,完善表格内容。 第二步,创建ODBC数据源。 点击“开始”→“控制面板”→“管理工具”→“数据源(ODBC)”,弹出“ODBC数据源管理器”对话框。 选择“添加”,双击“MicrosoftAccessDriver(*.mdb)”,弹出“ODBCMicrosoftAccess安装”对话框,输入数据源名“Student”,说明“学生信息”;单击“选择”,弹出“选择数据库”对话框,从目录中找到自己建立的数据库“STU”,依次点击“确定”。 完成数据源“Student”的添加,可以在“ODBC数据源管理器”看到新添加的数据源。 第三步,创建应用程序框架。 打开VC++,新建一个基于DatabaseViewWithoutFileSupport的单文档程序STU,ODBC数据源选择为“Student”。 第四步,为STU程序框架添加函数,完善功能,使程序实现顺序浏览、编辑记录、添加记录、删除记录,并可以保存每次操作。 最后,编译程序,调试并修正错误,运行检验结果。 4、实验结果及其分析 运行程序后,跳出如图对话框,依次显示学生信息。 点击工具栏中代表左右移动的四个三角键,即可浏览其他学生信息。 点击“添加记录”按钮,各数据编辑框清空,依次手动输入各项信息,然后点击左右三角上下浏览,输入的信息即可保存在数据库中,存储位置即在之前浏览记录的下一个位置,可打开ACCESS数据库表格检验结果。 随便修改对话框显示的某条信息,继续浏览学生信息,则可保存修改结果。 点击“删除记录”按钮,当前浏览记录从数据库表格删除,显示下一项信息。 5、关键代码 按钮“添加记录”的响应函数: voidCStuView: : OnAdd() { m_pSet->AddNew();//新纪录 m_IP=TRUE;//单击了按键 CEdit*pCtrl=(CEdit*)GetDlgItem(IDC_NAME); intnResult=pCtrl->SetReadOnly(FALSE);//限制只读 UpdateData(FALSE);//更新数据,修改变量值并显示在控件 } 按钮“删除记录”的响应函数: voidCStuView: : OnDelete() { try { m_pSet->Delete();//删除 } catch(CDBException*e)//捕捉异常 { AfxMessageBox(e->m_strError); e->Delete(); } m_pSet->MoveNext();//对当前操作移位 if(m_pSet->IsEOF())//指针到末尾,如果记录集合的指针在最后一个记录之后,就返回TRUE m_pSet->MoveLast(); if(m_pSet->IsBOF())//指针到开头,如果记录集合的指针在第一个记录之前,就返回TRUE m_pSet->SetFieldNull(NULL); UpdateData(FALSE); } 添加或编辑记录后的保存函数,左右移时存储数据: BOOLCStuView: : OnMove(UINTnIDMoveCommand) { if(m_IP)//判断是否单击按钮 { m_IP=FALSE;//未单击 UpdateData(TRUE);//将记录从控件取到变量m_pSet中 if(m_pSet->CanUpdate())//是否可更新 { m_pSet->Update(); } m_pSet->Requery();//从更新后的数据库中重新取出记录集 UpdateData(FALSE);//将m_pSet中的记录取回到控件中 CEdit*pCtrl=(CEdit*)GetDlgItem(IDC_NAME);//恢复姓名只读属性 pCtrl->SetReadOnly(TRUE); returnTRUE; } returnCRecordView: : OnMove(nIDMoveCommand); } 6、实验中遇到的问题及改进的设想 本次实验主要是基于数据库的编程。 实验中建立了自己的ODBC数据源“Student”,我所建立的数据库表格在上面实验结果及分析截图显示。 我所设计的界面添加了编辑框,按钮,静态文本框等控件,如上面实验结果及分析截图所显示。 在编辑函数的过程中,我的程序也不是一步成功的,中间出现了多次错误。 开始时无法逐项浏览信息,后来无法添加和编辑记录,后来在老师和同学的帮助下逐一解决了这些问题,正确完成实验。 实验中有些需要注意的问题: 1.注意ODBC数据源的添加途径是否前后一致;2.注意控件名称的设置;3.注意一些静态变量的设置;4.学会改进函数的编辑设计;5.学会查找较为复杂的错误。 题目3 图形编程 1、实验目的 学习图形图像的绘制,了解Windows提供的图形设备接口、图形库、图形影射模式、画笔和画刷的使用,掌握一些简单图形的绘制方法,学习主要绘图函数及其调用方法。 2、实验内容 提供一个图形工具界面,让用户能够画出直线,椭圆,多边形等几何元素,结果可以保存并可读出。 3、实验过程 第一步,建立一个单文本程序。 设置均采用默认设置。 创建或取得设备环境。 第二步,设置绘图属性,包括映射模式等。 第三步,创建绘图工具画笔、画刷等(否则用系统默认绘图工具)。 第四步,将绘图工具选入设备环境,同时保存原绘图工具。 第五步,绘制图形。 第六步,恢复原绘图工具并释放获取的设备环境。 第七步,检查其他功能的实现,仔细完善各个功能函数。 最后,编译程序,调试改错,运行检验结果。 4、实验结果及其分析 运行程序后,会跳出如图文本框,但是空白新建界面。 点击工具栏中“文件”→“打开”,即可打开、修改保存的画图文本。 点击“画笔”,随机选取“点”、“直线”、“椭圆”、“矩形”、“多边形”,在下面画图形,即可显示如图图形。 点击“文件”→“保存”,可命名保存所画图形。 5、关键代码 如果对于view中的图像进行更改(包括打开图像或者对已经有的图片进行操作)时,重新绘画出这幅图像: voidCDrawView: : OnDraw(CDC*pDC) { CDrawDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); intnCount; nCount=pDoc->m_obArray.GetSize(); for(inti=0;i { ((CDraw1*)pDoc->m_obArray.GetAt(i))->Draw(pDC); } } 每次按下鼠标时,记录鼠标位置: voidCDrawView: : OnLButtonDown(UINTnFlags,CPointpoint) { m_point=point; CView: : OnLButtonDown(nFlags,point); } 鼠标左键松开时的响应函数: voidCDrawView: : OnLButtonUp(UINTnFlags,CPointpoint) {CClientDCdc(this); CPenpen(PS_SOLID,1,RGB(255,0,0));//添加一个画笔 dc.SelectObject(&pen); CBrush*pBrush=CBrush: : FromHandle((HBRUSH)GetStockObject (NULL_BRUSH));//添加一个透明画刷 dc.SelectObject(pBrush); switch(m_type) {case1: dc.SetPixel(point,RGB(255,0,0));//画一个点 break; case2: dc.MoveTo(m_point);//画一条直线 dc.LineTo(point); break; case3: dc.Ellipse(CRect(m_point,point));//画椭圆 break; case4: dc.Rectangle(CRect(m_point,point));//画矩形 break; case5: dc.Polygon(m_pt,7);//画一个多边形 m_pt[0].x=0;m_pt[0].y=250; m_pt[1].x=50;m_pt[1].y=175; m_pt[2].x=100;m_pt[2].y=175; m_pt[3].x=150;m_pt[3].y=250; m_pt[4].x=200;m_pt[4].y=325; m_pt[5].x=250;m_pt[5].y=325; m_pt[6].x=300;m_pt[6].y=250; break; } CDraw1*pDraw1=newCDraw1(m_type,m_point,point); CDrawDoc*pDoc=GetDocument(); pDoc->m_obArray.Add(pDraw1); CView: : OnLButtonUp(nFlags,point);//得到松开鼠标时的坐标,并完成画从起点到此点 } 当选中“画笔”下“点”、“直线”、“椭圆”、“矩形”、“多边形”的响应函数: voidCDrawView: : OnDian() {m_type=1;} voidCDrawView: : OnZhixian() {m_type=2;} voidCDrawView: : OnTuoyuan() {m_type=3;} voidCDrawView: : OnJuxing() {m_type=4;} voidCDrawView: : OnDuobx() {m_type=5;} 删除文档的数据,确信一个文档在使用前为空: voidCDrawDoc: : DeleteContents() { intnCount; nCount=m_obArray.GetSize();//获得大小数量 while(nCount--) { deletem_obArray.GetAt(nCount);//从返回值中第nCount个字符开始删除 m_obArray.RemoveAt(nCount); } CDocument: : DeleteContents(); } 存储处理(在新增类中实现函数功能): voidCDraw1: : Serialize(CArchive&ar) { if(ar.IsStoring()) {ar< else {ar>>m_type>>m_point>>point;} } 新增类中的绘图响应函数: voidCDraw1: : Draw(CDC*pDC) {CPenpen(PS_SOLID,1,RGB(255,0,0)); CPen*pOldPen=pDC->SelectObject(&pen); CBrush*pBrush=CBrush: : FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush*pOldBrush=pDC->SelectObject(pBrush); switch(m_type) {case1: pDC->SetPixel(point,RGB(255,0,0)); break; case2: pDC->MoveTo(m_point); pDC->LineTo(point); break; case3: pDC->Ellipse(CRect(m_point,point)); break; case4: pDC->Rectangle(CRect(m_point,point)); break; case5: pDC->Polygon(m_pt,7); m_pt[0].x=0;m_pt[0].y=250; m_pt[1].x=50;m_pt[1].y=175; m_pt[2].x=100;m_pt[2].y=175; m_pt[3].x=150;m_pt[3].y=250; m_pt[4].x=200;m_pt[4].y=325; m_pt[5].x=250;m_pt[5].y=325; m_pt[6].x=300;m_pt[6].y=250; break; } pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); } 6、实验中遇到的问题及改进的设想 本项实验开始,在查询图书馆资料的基础上,很快实现了点、直线、椭圆、矩形、多边形的绘制,但是如何保存和打开已画文档始终无法实现,困惑了我很长时间。 后来,我查询了其他包括网上的共享资料,终于通过新增了一个类添加功能函数的方法较为完善的完成了这个功能。 但是,我的程序还存在一点不足,画的多边形只能固定一种结构,一个固定位置,没有实现随意绘制,保存格式固定,希望以后能得到改进。 题目4 字符串操作 1、实验目的 掌握字符操作,学习字符串的统计方法,能够编程实现文本文档的打开和读入,巩固程序设计和函数编写的方法。 2、实验内容 能够从磁盘上选择打开文本文档,读入所有内容并显示,统计所有的字符数目,单词数目,中文字符串的数目 3、实验过程 第一步,建立单文档程序框架。 第二步,添加响应函数,实现文档读入,字符统计,初始化和显示。 通过新增一个对话框类,实现跳出对话框显示统计结果。 第三步,编译程序,逐步调试,修正错误,直至达到所需功能。 4、实验结果及其分析 运行程序,跳出text.txt-zfc操作框,显示的是空白文档。 选择“文件”→“打开”,即可以打开一个文本文档。 选择“统计”→“开始统计”,即跳出如图对话框,显示统计结果。 “所有字符数”包括文档中所有字符、标点符号和空格;“中文字符数”包括汉字个数和中文标点符号;“英文单词数”为英文单词个数。 5、关键代码 设置滚动视图的逻辑尺寸和映射模式,第一次调用OnDraw前会调用: voidCZfcView: : OnInitialUpdate()//初始化视图中控件 { CScrollView: : OnInitialUpdate();//初始化Scroll的相关属性值 CSizesizeTotal(50,50);//水平滚动条滚动范围: 50,垂直滚动条滚动范围: 50 SetScrollSizes(MM_TEXT,sizeTotal);//MFC库函数,设置滚动条属性 } /*类CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。 结构SIZE表示一个矩形的长度和宽度*/ 显示函数: voidCZfcView: : Display(CDC*pDC) { CZfcDoc*pDoc=GetDocument();//定义一个指向doc类对象的指针指向本工程doc对象 intnLines=pDoc->m_string.GetSize();//GetSize返回元素的数目 if(nLines<1) return; CSizesizeLine=pDC->GetTextExtent("A");//获取字符串的宽度和高度 intnTabChars=4*sizeLine.cx;//设置一个Tab符等于4个字符 inty=0;//行位置 CStringstr; intnWidthMax=0; for(inti=0;i {str=pDoc->m_string.GetAt(i);//得到i对应的元素值 CSizesize=pDC->TabbedTextOut(0,y,str,1,&nTabChars,0); y=y+sizeLine.cy;//更新行位置 if(nWidthMax nWidthMax=size.cx;//更新最大宽度 } SetScrollSizes(MM_TEXT,CSize(nWidthMax,y));//设置滚动视图逻辑尺寸映射模式 } 统计字符串的总字符数,英文单词数,中文字符数: voidCZfcView: : OnStatistic() {CZfcDoc*pDoc=GetDocument();//定义一个指向doc类对象的指针指向本工程doc对象intnLines=pDoc->m_string.GetSize();//GetSize返回元素的数目 if(nLines<1) return; CStringline; charch; boolm_IP=true;//true表示字符是单词首字符, longnT=0,nC=0,nE=0; for(inti=0;i {line=pDoc->m_string.GetAt(i);//得到i对应的元素值 for(intj=0;j {nT=nT+1; ch=line.GetAt(j); if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//该字符为字母 {if(m_IP)//表示字符是单词首字符 {nE=nE+1;} m_IP=false; } else {m_IP=true;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 报告