编程实验报告科学计算器设计与实现.docx
- 文档编号:24901628
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:31
- 大小:102.89KB
编程实验报告科学计算器设计与实现.docx
《编程实验报告科学计算器设计与实现.docx》由会员分享,可在线阅读,更多相关《编程实验报告科学计算器设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
编程实验报告科学计算器设计与实现
《可视化程序编程环境》
实验报告
项目名称科学计算器设计与实现
学院计算机学院
专业班级计算机科学与技术0804
2010年1月9日
一、设计任务与要求
使学生了解可视化程序设计语言的基础知识,掌握面向对象编程的分析设计方法,以及与面向对象技术相关的一些软件开发技术,掌握在VisualC++6环境下进行可视化程序设计技术。
通过实践具体的项目,为他们进一步开展相关领域的学习和科研打下良好的基础。
二、需求分析
1.功能需求(功能划分、功能描述)
1、二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算
2、科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行
3、以角度、弧度两种方式实现上述部分函数
4、具备历史计算的记忆功能
5、对不正确的表达式能指出其错误原因
2.运行需求(用户界面、人机接口、故障处理)
根据计算器要实现的相应功能来布局,分为基本功能区,特殊函数区,进制转换区,度数转换区和输出显示区五大基本模块。
三、实验方案
1、总体设计框图
2、计算器平面图
3.基本功能区的设计
在这个模块中主要把0到F各个按键按下去后在输出显示区上显示出来
列举一例:
voidCaysf55Dlg:
:
OnBnClickedButton3()
{if(zuizong=="0")m_str="";
m_str+="1";
UpdateData(0);
if(zuizong=="0")zuizong="";
zuizong+="1";//TODO:
在此添加控件通知处理程序代码
}
接下来从输出显示区获得字符串,通过运算符的相应按键处理:
列举加法:
voidCaysf55Dlg:
:
OnBnClickedButton19()/*加法运算*/
{doublezan;
if(m_str=="")MessageBox(L"没有运算数");
elseif(y==1||M==1)MessageBox(L"只能输入数值");
elseif(m_str.GetAt(m_str.GetLength()-1)=='+'||m_str.GetAt(m_str.GetLength()-1)=='-'||m_str.GetAt(m_str.GetLength()-1)=='*'||m_str.GetAt(m_str.GetLength()-1)=='/')
MessageBox(L"不能连续输入运算符!
!
");
else{{m_str+="+";UpdateData(0);point=0;
if(jinzhi.GetCurSel()==0)zan=S2toN(zuizong);
elseif(jinzhi.GetCurSel()==1)zan=S8toN(zuizong);
elseif(jinzhi.GetCurSel()==2)zan=StoN(zuizong);
elseif(jinzhi.GetCurSel()==3)zan=S16toN(zuizong);}
if(Ds==0&&Ms==0)
{if(As==0&&Ss==0){Ap1=zan;As=1;zuizong="";}
elseif(As==0&&Ss==1){Sp2=zan;Ss=2;jisuan();Ap1=result;As=1;zuizong="";}
elseif(As==1&&Ss==0){Ap2=zan;As=2;jisuan();Ap1=result;As=1;zuizong="";}
}
if(Ms==1){if(As==0&&Ss==0)
{Mp2=zan;Ms=2;jisuan();Ap1=result;As=1;zuizong="";}
elseif(As==1)
{Mp2=zan;Ms=2;jisuan();Ap2=result;As=2;jisuan();Ap1=result;As=1;zuizong="";}
elseif(Ss==1)
{Mp2=zan;Ms=2;jisuan();Sp2=result;Ss=2;jisuan();Ap1=result;As=1;zuizong="";}}
if(Ds==1){if(As==0&&Ss==0)
{Dp2=zan;Ds=2;jisuan();Ap1=result;As=1;zuizong="";}
elseif(As==1)
{Dp2=zan;Ds=2;jisuan();Ap2=result;As=2;jisuan();Ap1=result;As=1;zuizong="";}
elseif(Ss==1)
{Dp2=zan;Ds=2;jisuan();Sp2=result;Ss=2;jisuan();Ap1=result;As=1;zuizong="";}}
}
//TODO:
在此添加控件通知处理程序代码
}
4.特殊函数区的设计
特殊函数区各个按键的功能实现主要是通过调用系统函数来实现的
举一例如sin:
voidCaysf55Dlg:
:
OnBnClickedButton27()/*sin*/
{doublep;
if(jiaohu==2)MessageBox(L"请先选择角度或弧度!
");
elseif(m_str==""&&jiaohu==1)MessageBox(L"请输入角度!
!
");
elseif(m_str==""&&jiaohu==0)MessageBox(L"请输入弧度!
!
");
else{OnBnClickedButton34();
if(jiaohu==1){if(zhengfan.GetCheck()==1){p=asin(result);p=p*180/3.141592653;}
elseif(zhengfan.GetCheck()==0){p=sin(result*3.141592653/180);}
}
if(jiaohu==0){if(zhengfan.GetCheck()==1){p=asin(result);}
elseif(zhengfan.GetCheck()==0){p=sin(result);}
}
m_str=NtoS(p);zuizong=NtoS(p);UpdateData(0);point=1;//TODO:
在此添加控件通知处理程序代码
}
}
其他函数cos,tan,cot,arcsin,arccos,arctan,log,ln实现方法相类似。
Pi函数则通过对Pi置数3.141592653来实现。
4.进制转换区的设计:
在进制转换这个模块中主要涉及二进制,八进制,十进制跟十六进制之间的转换,并相应隐藏基本功能区中相应按键。
举二进制为例:
voidCaysf55Dlg:
:
OnCbnSelchangeCombo2()
{longk;
inta=jinzhi.GetCurSel();
if(As!
=0||Ss!
=0||Ms!
=0||Ds!
=0){m_str="";zuizong="";}
if(a==0){if(m_str!
="")
{if(ya==1){k=S8toN(m_str);m_str=IntNtoS(k);m_str=OnDecToOther
(2);}
elseif(ya==2){k=StoN(m_str);m_str=IntNtoS(k);m_str=OnDecToOther
(2);}
elseif(ya==3){k=S16toN(m_str);m_str=IntNtoS(k);m_str=OnDecToOther
(2);}}
kz1.EnableWindow(true);
kz2.EnableWindow(false);
kz3.EnableWindow(false);
kz4.EnableWindow(false);
kz5.EnableWindow(false);
kz6.EnableWindow(false);
kz7.EnableWindow(false);
kz8.EnableWindow(false);
kz9.EnableWindow(false);
kz0.EnableWindow(true);
kzA.EnableWindow(false);
kzB.EnableWindow(false);
kzC.EnableWindow(false);
kzD.EnableWindow(false);
kzE.EnableWindow(false);
kzF.EnableWindow(false);
kzpi.EnableWindow(false);
kzd.EnableWindow(false);
kzdao.EnableWindow(false);
kzsin.EnableWindow(false);
kzcos.EnableWindow(false);
kztan.EnableWindow(false);
kzcot.EnableWindow(false);
kzx2.EnableWindow(true);
kzx3.EnableWindow(true);
kzxy.EnableWindow(true);
kzlog.EnableWindow(false);
kzln.EnableWindow(false);ya=0;UpdateData(0);zuizong=m_str;}}
longCaysf55Dlg:
:
S2toN(CStringstr)
{//将二进制CString类型字符串转化为十进制数字
String^newStr=gcnewString(str);
longd=Convert:
:
ToInt32(newStr,2);
returnd;
}
其他进制按键设置及类型转换相类似。
5.度数转换区的设计:
这个模块主要是为特殊函数区服务的,即是以度数来转换还是弧度来转换。
通过在特殊函数中判断选择了哪种度数来进行相应计算。
6.输出显示区的设计:
这个模块是用来实现数据输出的,通过设置一个变量来实现显示功能。
四.程序清单
#include"stdafx.h"
#include"123asdf.h"
#include"123asdfDlg.h"
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy123asdfDlgdialog
CMyMMDlg:
:
CMyMMDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMyMMDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMy123asdfDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//----------------------------------------------
//数据在构造函数初始化
m_lastsystem=10;
m_result=m_num1=m_num2=0;
BOOLm_deg_flag=true;
m_str="";
m_operator=-1;
m_canclean=false;
m_memorysave=="";
}
voidCMyMMDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMy123asdfDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyMMDlg,CDialog)
//{{AFX_MSG_MAP(CMyMMDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_BTN_0,IDC_BTN_MA,Buttons)
ON_EN_CHANGE(IDC_EDIT1,OnChangeEdit)
ON_BN_CLICKED(IDC_DEC,OnDec)
ON_BN_CLICKED(IDC_BIN,OnBin)
ON_BN_CLICKED(IDC_HEX,OnHex)
ON_BN_CLICKED(IDC_OCT,OnOct)
ON_BN_CLICKED(IDC_RAD,OnRad)
ON_BN_CLICKED(IDC_DEG,OnDeg)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMy123asdfDlgmessagehandlers
BOOLCMyMMDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//CButton*p;
CButton*p=(CButton*)GetDlgItem(IDC_DEC);
p->SetCheck
(1);
p=(CButton*)GetDlgItem(IDC_DEG);
p->SetCheck
(1);
SetDlgItemText(IDC_EDIT1,"0.");
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyMMDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMyMMDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMyMMDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
//读入数字
voidCMyMMDlg:
:
Read(longdouble&num)
{
CStringtemp;
GetDlgItemText(IDC_EDIT1,temp);
char*endp;
//对上一次是进制数的处理
if(m_lastsystem==10)
{
num=(atof(temp));
}
elseif(m_lastsystem==16)
{
num=strtol(temp,&endp,16);
}
elseif(m_lastsystem==2)
{
num=strtol(temp,&endp,2);
}
elseif(m_lastsystem==8)
{
num=strtol(temp,&endp,8);
}
}
//将结果写在屏幕上
voidCMyMMDlg:
:
Write()
{
CStringtemp;
charbuffer[1024];
if(m_lastsystem==10)
{
if(m_result-(int)m_result)
temp.Format(_T("%f"),m_result);
else
temp.Format(_T("%d"),(int)m_result);
}
elseif(m_lastsystem==16)
{
_itoa((int)m_result,buffer,16);
temp.Format("%s",buffer);
}
elseif(m_lastsystem=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 实验 报告 科学 计算器 设计 实现