1、1编 号 :( )字 号软件课程设计报告班 级: 信科 07-4 姓 名: 张明涛 学 号: 08073654 指导老师: 王 珂 职 称: 讲师 中国矿业大学计算机科学与技术学院二八年 月2软件课程设计任务书专业年级: 电子信息科学与技术 2007 级 学生姓名: 张明涛 任 务 下 达 日 期 : 2008 年 11 月 14 日课程设计日期:2008 年 11 月 14 日至 2009 年 1 月 3 日课程设计题目: 类别 题目序号面向过程 1、2、3、4、5、7面向对象 1、2、4、5、6、9图形界面 1数据结构 13软件课程设计指导教师评阅书指导教师评语(基础理论及基本技能的掌握;
2、独立解决实际问题的能力;研究内容的理论依据和技术方法;取得的主要成果及创新点;工作态度及工作量;总体评价及建议成绩;存在问题等):成 绩: 指导教师签字:年 月 日4一、面向过程第二题:1. 题目:编程序,从键盘输入正整数 n,求出 n 与其反序数之和并输出。例如,输入 2038,输出应为 2038+8302=10340。2. 需求分析:设计一个程序可以实现求其与其反序数之和。根据题目要求,规定如下:测试数据:【输入数据】:2038【输出数据】:10340【输入数据】:1153【输出数据】:46643.设计概要:(1)定义整形变量 n 为用户输入值;(2)输出反序数;(3)定义整形变量 sum
3、 求和;(4)输出 sum 的值。(5)主程序流程:step1:让用户输入一个整数 n;step2:进入 for 循环计算其反序数;step3:求和并输出。3. 详细设计与编码(1) 流程图:5进入 for 循环yes判断条件no(2) 源程序#include using namespace std;int main()int n,a,b,c,sum;coutn;a=n;cout#includeusing namespace std;char c50,d50;int i,j,a,NUMBER; string ROME=“MDCLXVI“;int ROME_DATA7=1000,500,100,
4、50,10,5,1;void ROME_INT();void INT_ROME();int main()ROME_INT();8INT_ROME();return 0;/将罗马数据转换为十进制数据void ROME_INT ()coutc;for(a=0,i=0;ci!=0;i+)switch (ci)case M:a=a+1000;break;case D:a=a+500;break;case C:a=a+100;break;case L:a=a+50;break;case X:a=a+10;break;case V:a=a+5;break;case I:a=a+1;break;defaul
5、t :break;coutNUMBER;coutusing namespace std;class DateType /自定义的日期类DateTypeint y,m,d; /数据成员,表示当前日期的年、月、日public:DateType(int y0=1, int m0=1, int d0=1); /构造函数,设定年、月、日;并设置参数默认值void set_DateType()cinymd;void incrementDay(); /增加 1 天bool equal(DateType dt2); /判断二日期是否相等 void printDate(); /屏幕输出日期对象的有关数据(年、月
6、、日);DateType:DateType(int y0,int m0,int d0) /构造函数y=y0;m=m0;d=d0;void DateType:incrementDay() /增加一天int a=31,28,31,30,31,30,31,31,30,31,30,31;if(y%4=0if(d=31m=1;d=1;else if(d=am-1)m+;d=1;else if(d#include16#includeusing namespace std;class CStudentint Num;char Name10;char Sex10;int Age;int Math,Com,En
7、g,Total;public:void getdata() /输入类元素coutNum; coutName;coutSex;coutAge;coutMath;coutCom;coutEng;coutn;17for(int i=0;ia;switch(a)case 1:get();break; /输入数据 case 2:put();break; /输出数据default:cout。其实题目中还有有关检索的要求,但因为精力有限、知识有限没有编写,请指导老师见谅!经过此次调试过程熟悉了采用 binary 文件形式,并使用随机读写的处理方式,磁盘的写入读出也更加熟练,还得到了经验教训,在使用不同的处理
8、方式时要加入相应的头文件。6.用户使用说明【step1】打开程序;【step2】选择操作类型;【step3】若选择输入数据,则选择要输入的人数,然后再输入相关数据;【step4】继续选择相关的操作,若想停止则输入出 1、2 之外的数据。7.测试分析输入一组验证数据:1001 张华 男 20 89 85 92002 李宁 女 19 88 76 9523输出结果:分析:经过比较可以发现输出结果与程序设计之初预想的结果完全吻合,这表明已达到先前的设计要求,而且整个操作过程都有操作提示,显示出此程序的健壮性!8.实验体会19经过此次试验对 binary 文件及随机读写的处理方式有了更加深刻的认识,从实
9、验过程中也得到的了不少经验教训,比如:应该随程序的使用函数、操作不同要增加相应的头文件;程序在操作过程中要有相应的操作提示,这样才更有益与用户更好的使用!三、可视化编程第一题:计算器的基本设计1题目1. 用你熟悉的一种可视化编程语言实现如下图所示的计算器。该计算器需要实现基础的数学运算,如加,减,乘,除。2需求分析设计一个简单的计算器可以进行简单的数学运算,比如加减乘除。利用 C+中的 MFC来编写实现。输出形式要与题目中给的样板相同或类似。输入数据和输出数据均以 double 型数据表示测试数据:【输入数据】9-15【输出结果】-6【输入数据】2.4*0.2【输出结果】0.48【输入数据】4
10、.8/3【输出结果】1.63.概要设计(1) 设置如图说是的按钮;(2) 点击每一个按钮,起一个函数名,进入 Dlg.cpp 中编写相应的函数体;(3) 设置一些全局变量:double 型 m1、m2 、m3 、m4 分别再加减乘除函数体的编写时使用;int 型变量 m、n、I,m 取 1、2、3、4 时分别表示加减乘除的使用,n=1 时则代表着小数点的使用,I 则表示输入的时小数点后的第几位;(4) 编写等号的函数,根据 m 的不同取值选取不同的操作。4.详细设计与编码20(1)根据概要设计中描述的进行编码:数符的编码流程图:数符的函数体if 判断语句n=1 n=0执行小数点的处理语句 执行
11、整数的处理语句等号的编码流程图:等号的函数if 判断语句判断 m 的值m=1 m=2 m=3 m=4执行加法操作语句 执行减法操作语句 执行乘法操作语句 执行除法操作语句(2) 源程序:/计算器张明涛 Dlg.cpp/ 计算器张明涛 Dlg.cpp : implementation file/#include “stdafx.h“#include “计算器张明涛.h“#include “计算器张明涛 Dlg.h“#include double m1,m2,m3,m4;int i=1,m=0,n=0;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FI
12、LEstatic char THIS_FILE = _FILE_;#endif21/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataEx
13、change(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_D
14、ATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAP22END_MESSAGE_MAP()/ CMyDlg dialogCMyDlg:CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg:IDD, pParent)/AFX_DATA_INIT(CMyDlg)m_t = 0.0;/AFX_DATA_INIT/ Note that LoadIcon does no
15、t require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CMyDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMyDlg)DDX_Text(pDX, IDC_EDIT1, m_t);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMyDlg, CDialog)/AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()O
16、N_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_1, On1)ON_BN_CLICKED(IDC_2, On2)ON_BN_CLICKED(IDC_cheng, Oncheng)ON_BN_CLICKED(IDC_deng, Ondeng)ON_BN_CLICKED(IDC_3, On3)ON_BN_CLICKED(IDC_4, On4)ON_BN_CLICKED(IDC_5, On5)ON_BN_CLICKED(IDC_6, On6)ON_BN_CLICKED(IDC_7, On7)ON_BN_CLICKED(IDC_8, On8)ON_
17、BN_CLICKED(IDC_9, On9)ON_BN_CLICKED(IDC_0, On0)ON_BN_CLICKED(IDC_dian, Ondian)ON_BN_CLICKED(IDC_jian, Onjian)ON_BN_CLICKED(IDC_jia, Onjia)ON_BN_CLICKED(IDC_chu, Onchu)23ON_BN_CLICKED(IDC_qingchu, Onqingchu)/ON_EN_SETFOCUS(IDC_EDIT1, OnSetfocusEdit1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyDlg message handl
18、ersBOOL CMyDlg:OnInitDialog()CDialog:OnInitDialog();/ Add “About.“ menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. T
19、he framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CMyDlg:OnSysCommand(UINT nID
20、, LPARAM lParam)if (nID dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CMyDlg:OnPaint
21、() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(int x = (rect.Width() - cxIcon + 1)
22、 / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CMyDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;25void CMyDlg:On1() / TODO: Add yo
23、ur control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+1*pow(10,-i);i+ ;elsem_t=m_t*10+1;UpdateData(FALSE);void CMyDlg:On2() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+2*pow(10,-i);i+ ;elsem_t=m_t*10+2;UpdateData(FALSE);void CMyDlg:On3(
24、) / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+3*pow(10,-i);i+ ;elsem_t=m_t*10+3;UpdateData(FALSE);26void CMyDlg:On4() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+4*pow(10,-i);i+ ;elsem_t=m_t*10+4;UpdateData(FALSE
25、);void CMyDlg:On5() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+5*pow(10,-i);i+ ;elsem_t=m_t*10+5;UpdateData(FALSE);void CMyDlg:On6() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+6*pow(10,-i);i+ ;elsem_t=m_t*10+6;
26、UpdateData(FALSE);void CMyDlg:On7() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)27m_t=m_t+7*pow(10,-i);i+ ;elsem_t=m_t*10+7;UpdateData(FALSE);void CMyDlg:On8() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+8*pow(10,-i);i+
27、;elsem_t=m_t*10+8;UpdateData(FALSE);void CMyDlg:On9() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+9*pow(10,-i);i+ ;elsem_t=m_t*10+9;UpdateData(FALSE);void CMyDlg:On0() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (n=1)m_t=m_t+
28、0*pow(10,-i);i+ ;elsem_t=m_t*10+0;28UpdateData(FALSE);void CMyDlg:Ondian() / TODO: Add your control notification handler code hereUpdateData(TRUE);n=1;UpdateData(FALSE);void CMyDlg:Onjian() / TODO: Add your control notification handler code hereUpdateData(TRUE);m2=m_t;m_t=0;m=2;i=1;n=0;UpdateData(FA
29、LSE);void CMyDlg:Onjia() / TODO: Add your control notification handler code hereUpdateData(TRUE);m1=m_t;m_t=0;m=1;i=1;n=0;UpdateData(FALSE);void CMyDlg:Oncheng() / TODO: Add your control notification handler code hereUpdateData(TRUE);m3=m_t;m_t=0;m=3;i=1;n=0;UpdateData(FALSE);29void CMyDlg:Ondeng()
30、/ TODO: Add your control notification handler code hereUpdateData(TRUE);if (m=1)m_t=m1+m_t;else if (m=2)m_t=m2-m_t;else if (m=3)m_t=m3*m_t;else if (m=4)if(m_t=0)MessageBox(“除数不能为零!“);elsem_t=m4/m_t;else m_t=0;i=1;n=0;UpdateData(FALSE);void CMyDlg:Onchu() / TODO: Add your control notification handler
31、 code hereUpdateData(TRUE);m4=m_t;m_t=0;m=4;i=1;n=0;UpdateData(FALSE);void CMyDlg:Onqingchu() / TODO: Add your control notification handler code hereUpdateData(TRUE);30m_t=0;i=1;n=0;UpdateData(FALSE);5.调试分析在试验过程中遇到的困难较多,主要是因为以前从为接触过 MFC,这次完全是从头开始学起,在编写程序主要遇到两个大问题。第一个是整个程序编码是没有错的,可以通过编译,但错误是在运算过程中只要是
32、两个小数进行运算则结果就是。编码检查了好多遍均未发现语法错误,找同学来看也没有找到错误起源,最后有同学建议小数点的使用判断出使用另外一个变量(刚开始这个变量和判断加减乘除的变量为同一个变量,取不同值代表不同的操作)全部替换后,程序过让变得正常啦!错误可能是处在变量相同经过多次赋值后改变了原来的数值。第二个是在修改第一个的过程呢个中出现的,在修改时一不小心把一段自动生成的代码给删除了,当时却没有注意到,导致编译通不过,最后花费了好大的经历才找到删除的地方,把代码补上。通过实验意识到,在使用变量时要避免重复使用一个变量,以取不同的值来代表不同的操作,这样很容易是数据值混乱而出错。在编程时要谨慎,不能随意的删除代码!.用户使用说明【step】打开程序【step】选择 AC 键进行清零【step 3】输入要计算的数据7.测试分析输入数据:9-15结果为: