软件工程导论——简易计算器
- 格式:doc
- 大小:198.00 KB
- 文档页数:14
目录第一章:设计目的11.1课程设计目的.................................................................................. 错误!未定义书签。
1.2简易计算器设计的意义 (1)1.3系统的基本要求 (1)1.4功能设计 (3)第二章:功能描述 (3)2.1功能模块框图 (3)2.2相关功能介绍.................................................................................. 错误!未定义书签。
2.1系统模块机构框图 (4)第三章:总体设计 (5)3.1系统流程图 (3)3.2模块描述 (5)3.3函数声明 (5)第四章:程序实现 (5)4.1界面设计 (10)4.2计算界面 (11)4.3退出界面 (12)第五章:课程设计的结果展示 (13)第六章:参考文献................................................................................................. - 15 -第七章:课程设计总结......................................................................................... - 16 -第一章课程设计目的1.通过一个学期的学习,我认为要学好C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。
特别是作为本科生,更要注重实践这一环节,只有这样我们才能成为合格的计算机人材。
通过这次课程设计,进一步巩固所学的语句,如语句嵌套等;加深对循环,分支等结构的运用;最后还可以熟悉四则运算﹑三角函数等经典算法。
2.通过此次课程设计扩展自己的知识面,课本上的东西是远远不够的,可以通过去图书馆查资料,上网找资料等手段学到一些新知识,比如画图函数,颜色填充函等。
简易计算器(Android应用使用Java开发)随着智能手机的普及,手机应用程序也变得越来越多样化和智能化。
其中,计算器应用无疑是人们生活中最常用的一种应用之一。
本文将介绍如何使用Java开发一个简易计算器的Android应用程序。
1. 概述简易计算器是一款可以进行基本的数学计算的应用程序。
用户可以在界面上输入数字和操作符,计算器会自动根据用户的操作给出计算结果。
本应用程序采用Java语言进行开发,运行于Android操作系统。
2. 开发环境在开始开发前,我们需要搭建好Android开发环境。
首先,下载并安装Java Development Kit(JDK),确保版本为最新稳定版。
然后,下载并安装Android Studio,这是一款为Android开发而设计的集成开发环境(IDE)。
3. 创建项目打开Android Studio,并点击"Start a new Android Studio project"来创建一个新的项目。
在弹出的窗口中,填写项目名称、包名等基本信息,并选择适当的设备和目标SDK版本。
4. 设计界面在项目创建完成后,我们需要设计计算器的界面。
可以使用Android Studio自带的可视化UI设计器来拖拽和放置UI元素,也可以手动在XML布局文件中编写界面代码。
界面的核心组件包括输入框、按钮和显示区域。
5. 添加逻辑功能界面设计完成后,我们需要为计算器添加逻辑功能。
创建一个Java类作为计算器的主活动(Activity),在其中实现输入和操作的处理逻辑。
可以使用Android提供的计算相关API,例如使用eval()方法进行表达式计算。
6. 编译和调试在开发过程中,我们可以随时进行编译和调试来检查应用程序的运行情况。
点击Android Studio的运行按钮,选择目标设备并运行应用程序。
在模拟器或真机上进行调试,查看是否符合我们的预期效果。
7. 测试和发布在功能开发和调试完毕后,我们需要进行应用的测试阶段。
运城学院软件开发环境与工具实验一实验题目:简易计算器实验类型:设计性实验地点: 第三软件实验室指导老师:王琦专业班级:计算机科学与技术系1102班姓名:马苗苗(2011100226)2013年 10月21 日一、实验题目简易计算器二、实验目的实现简单的计算器运算功能,包括加减乘除。
三、实验步骤1)代码如下Public Class Form1Dim i As Integer = 0Dim flog As IntegerDim s As StringDim m As DoubleDim t As DoubleDim ta As IntegerDim tb As IntegerPrivate Sub num1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles num1.Clickn=1If i = 0 Thenta = ta * 10 + nshuRu.Text = taElsetb = tb * 10 + nshuRu.Text = ta & "." & tbEnd IfEnd SubPrivate Sub dian_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dian.Clicki = 1End SubPrivate Sub jieGuo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles jieGuo.ClickjiSuan()suanShi.Text = ""s = mflog = 0End SubPrivate Sub jia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles jia.ClickDim sa As Doublesa = shuRu.TextIf flog = 0 Thens = sam = sEnd IfIf flog = 1 Thenm = m + sas = s & "+" & saEnd IfIf flog = 2 Thenm = m - sas = s & "-" & saEnd IfIf flog = 3 Thenm = m * sas = s & "*" & saEnd IfIf flog = 4 Thenm = m / sas = s & "/" & saEnd IfshuRu.Text = msuanShi.Text = s & "+"ta = 0tb = 0i = 0flog = 1End SubPrivate Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadshuRu.Text = 0End SubPrivate Sub C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles C.Clickta = 0tb = 0i = 0m = 0shuRu.Text = 0s = ""suanShi.Text = ""End SubPrivate Sub suanShi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles suanShi.ClickEnd SubEnd Class2)运行结果如下:四、实验总结通过这次实验我学会了如何制作一个简易的计算器,学会了简单的四则运算,加,减,乘,除。
计算器(Calculator)是微型电子计算机的一种特殊类型。
它与一般通用计算机的主要区别在于程序输入方式的不同。
计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。
现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。
目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。
等调试成功后,其它运算子程序的问题将迎刃而解。
引言 (1)目录 (2)1.简易计算器的设计方案 (3)1.1硬件部分设计方案 (3)1.2软件部分设计 (3)1.3 硬件设计原理图 (4)2. 简易计算器部分电路设计 (5)2.1 AT89C51常用指令 (5)2.2 显示及显示接口 (11)2.3 键盘、液晶显示的组合接口 (15)2.4 算术逻辑运算处理 (18)3.总设计电路及调试 (19)致谢 (21)参考文献 (22)1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。
简易计算器设计范文首先,我们需要决定计算器的基本功能。
一个简易计算器通常应该具备加法、减法、乘法和除法的功能。
此外,我们还可以添加开方、求平方以及取模等功能。
在设计计算器之前,我们需要确定用户界面。
对于一个简易计算器来说,我们可以使用命令行界面或者图形用户界面。
在本文中,我们将使用命令行界面。
接下来我们需要设计计算器的算法。
为了实现加、减、乘、除这些基本运算,我们可以编写四个函数来完成。
比如,加法函数可以接收两个数并返回它们的和,减法函数可以接收两个数并返回它们的差,乘法函数可以接收两个数并返回它们的乘积,除法函数可以接收两个数并返回它们的商。
同时,我们还需要添加一些辅助函数来处理开方、求平方以及取模等功能。
比如,开方函数可以接收一个数并返回它的平方根,求平方函数可以接收一个数并返回它的平方,取模函数可以接收两个数并返回它们的余数。
在设计计算器时,我们还要考虑到用户输入的错误处理。
如果用户输入无效的操作或者除数为零,我们需要给出错误的提示信息。
接下来,我们来设计主要的程序流程。
首先,我们需要显示一个欢迎信息,告诉用户如何使用计算器。
然后,在一个循环中,我们会要求用户输入要执行的操作,然后读取用户输入的操作和操作数。
根据用户的选择,我们会调用相应的函数来执行计算,并输出结果。
接着,我们会继续询问用户是否要继续进行计算。
如果用户选择退出,我们会结束循环并显示一个退出信息。
最后,我们需要编写测试用例来确保计算器的功能正常。
我们可以输入一些固定的操作和操作数,然后验证计算器返回的结果是否正确。
如果测试用例中出现错误,我们需要进行修复。
在编写代码之前,我们还需要选择一个编程语言。
对于一个简易计算器来说,Python是一个非常适合的选择。
Python具有简单易读的语法,能够轻松地实现我们的设计。
下面是本文的设计示例:```python#导入所需的库import math#加法函数def add(x, y):return x + y#减法函数def subtract(x, y):return x - y#乘法函数def multiply(x, y):return x * y#除法函数def divide(x, y):if y == 0:raise ValueError("除数不能为零") return x / y#开方函数def square_root(x):if x < 0:raise ValueError("不能对负数开方") return math.sqrt(x)#求平方函数def square(x):return x ** 2#取模函数def modulo(x, y):if y == 0:raise ValueError("除数不能为零") return x % y#欢迎信息print("欢迎使用简易计算器!")print("请按以下方式输入操作:")print("加法:'a 数1 数2'")print("减法:'s 数1 数2'")print("乘法:'m 数1 数2'")print("除法:'d 数1 数2'")print("开方:'r 数'")print("求平方:'q 数'")print("取模:'o 数1 数2'")#主程序循环while True:#用户输入operation = input("输入操作:")data = operation.splitif data[0] == "a":result = add(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "s":result = subtract(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "m":result = multiply(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "d":try:result = divide(float(data[1]), float(data[2])) print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "r":try:result = square_root(float(data[1]))print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "q":result = square(float(data[1]))print("结果为:", result)elif data[0] == "o":try:result = modulo(float(data[1]), float(data[2]))print("结果为:", result)except ValueError as e:print("错误:", str(e))else:print("无效的操作")#判断是否继续计算choice = input("是否继续计算?(y/n)")if choice == "n":breakprint("谢谢使用,再见!")```通过以上设计,我们可以在命令行中使用这个简易计算器来执行加、减、乘、除、开方、求平方和取模等操作。
存档编号XX水利水电大学毕业设计题目简易计算器的制作学院信息工程学院专业通信工程姓名XX学号2XXXX指导教师XX完成时间2014.5.14教务处制独立完成与诚信声明本人郑重声明:所提交的毕业设计(论文)是本人在指导教师的指导下,独立工作所取得的成果并撰写完成的,郑重确认没有剽窃、抄袭等违反学术道德、学术规范的侵权行为。
文中除已经标注引用的内容外,不包含其他人或集体已经发表或撰写过的研究成果。
对本文的研究做出重要贡献的个人和集体,均已在文中作了明确的说明并表示了谢意。
本人完全意识到本声明的法律后果由本人承担。
毕业设计(论文)作者签名:指导导师签名:签字日期:签字日期:毕业设计(论文)版权使用授权书本人完全了解华北水利水电大学有关保管、使用毕业设计(论文)的规定。
特授权华北水利水电大学可以将毕业设计(论文)的全部或部分内容公开和编入有关数据库提供检索,并采用影印、缩印或扫描等复制手段复制、保存、汇编以供查阅和借阅。
同意学校向国家有关部门或机构送交毕业设计(论文)原件或复印件和电子文档(涉密的成果在解密后应遵守此规定)。
毕业设计(论文)作者签名:导师签名:签字日期:签字日期:目录摘要 0Abstract (1)第一章绪论 (2)1.1 开发背景 (2)1.2 设计目的 (3)第二章方案论证与设计 (4)设计指标 (4)方案论证与设计 (4)第三章硬件模块介绍 (7)主控及运算模块 (7)显示模块 (12)输入模块 (15)第四章软件设计 (17)主程序的设计 (17)键盘扫描的程序设计 (18)显示模块程序设计 (20)运算模块程序设计 (22)第五章仿真及调试 (23)结束语 (24)致谢 (25)参考文献 (26)附录一:硬件实物图 (27)附录二:系统程序 (28)附录三:任务书 (39)附录四:开题报告 (41)附录五:外文原文与外文译文 (46)基于AT89C51单片机的简易计算器的设计摘要计算器在人们的日常生活中是较为常见的电子产品之一。
沈阳航空航天大学课程设计报告课程设计名称: 单片机系统综合课程设计课程设计题目:简易计算器的设计与实现院(系):专业: 班级: 学号: 姓名: 指导教师: 完成日期:目录第1章总体设计方案 (1)1.1设计内容 (1)1.2设计原理 (1)1.3设计思路 (2)1.4实验环境 (2)第2章详细设计方案 (3)2.1硬件电路设计 (3)2.2主程序设计 (7)2.2功能模块的设计与实现 (8)第3章结果测试及分析 (11)3.1结果测试 (11)3.2结果分析 (11)参考文献 (12)附录1 元件清单 (13)附录2总电路图 (14)附录3程序代码 (15)第1章总体设计方案1.1设计内容本设计是基于51系列的单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除1位无符号数字的简单四则运算,并在6位8段数码管上显示相应的结果。
设计过程在硬件与软件方面进行同步设计。
硬件方面从功能考虑,首先选择内部存储资源丰富的8751单片机,输入采用4X 4矩阵键盘。
显示采用6位8段共阳极数码管动态显示。
软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。
编程语言方面从程序总体设计以及高效性和功能性对C语言和汇编语言进行比较分析,最终选用汇编语言进行编程,并用protel99se涉及硬件电路。
1.2设计原理在该课程设计中,主要用到一个8751芯片和串接的共阳数码管,和一组阵列式键盘。
作为该设计的主要部分,下面将对它们的原理及功能做详细介绍和说明。
1) 提出方案以8751为核心,和数码管以及键盘用实验箱上已有的器件实现计算器的功能。
2) 总体方案实现(1) 要解决键值得读入。
先向键盘的全部列线送低电平,在检测键盘的行线,如果有一行为低电平,说明可能有按键按下,则程序转入抖动检测---就是延时10ms再读键盘的行线,如读得的数据与第一次的相同,说明真的有按键按下,程序转入确认哪一键按下的程序,该程序是依次向键盘的列线送低电平,然后读键盘的行线,如果读的值与第一次相同就停止读,此时就会的到键盘的行码与列码查表可的键值。
简易计算器详细步骤简易计算器(vs2005)详细步骤1.创建工程(单文档)。
2.资源视图——右击空白处——添加——资源——Dialog——新建——双击所出现的对话框——设置类名CT estDialog——完成3.资源视图——menu——双击IDR_MAINFRAME——添加菜单项“计算器”——改变Popup值为false——改变ID值为IDM_COUNT——右击“计算器”——添加事件处理器——选择view类——添加编辑4.在view类里添加所需要的头文件:#include "TestDialog.h"5.在需要响应的地方添加代码:// CCountView 消息处理程序void CCountView::OnCount()//点击菜单计算器,则调用我们所创建的对话框{// TODO: 在此添加命令处理程序代码CTestDialog ctd;ctd.DoModal();}6.调试运行——点击“计算器”:7.叉掉8.资源视图——Dialog——双击IDD_DIALOG1——改变对话框的大小——添加3个静态框(其实只要添加一个即可,然后按住Ctrl拖动第一个即可,相当于复制)——分别改名为:数值1,数值2,数值3(即改变其属性中的Caption值)——使得3个框左对齐——用同样的方法添加几个编辑框——同样的方法添加几个算术按钮9.对几个文本编辑框进行变量操控右击文本框——添加变量——类别改为“value”——变量类型改为“double”——变量名分别为m_num1,m_num2,m_num3——完成10.实现算法的功能将加减乘除的ID值分别改为IDC_BTN_JIA,IDC_BTN_JIAN,IDC_BTN_CHENG,IDC_BTN_CHU 加法:右击加法按钮——添加事件处理器——选择CTestDialog——添加编辑// CTestDialog 消息处理程序void CTestDialog::OnBnClickedBtnJia(){// TODO: 在此添加控件通知处理程序代码UpdateData();//数据切换m_num3=m_num1+m_num2;UpdateData(false);}减乘除运用相同的方法即可:11.调试运行:。
实验六简易计算器实验目的:1.掌握汇编语言程序的综合应用。
实验设备:计算机一台。
预装Windows XP、宏汇编MASM5。
实验内容A:编写能够实现以下要求的汇编语言程序,并上机实现。
1.编程实现一个3位的加、减计算器(两个运算数和结果均不超过3位),在键盘上键入XXX+XXX=,即可显示出结果并结束工作。
实验内容B:编写能够实现以下要求的汇编语言程序,并上机实现。
1.A程序只能实现大数减小数,如3-2,2若-3则不行。
修改程序使得可以处理。
2.A程序结果总要输出3位,如结果为3,输出便为003。
修改程序使得能够去掉前面的无效0。
预习要求:1.阅读实验内容A的参考源程序,对其结构以及实现方法进行分析,在理解的基础上掌握编程方法。
2.根据要求,编写实验内容B的源程序。
3.编辑建立实验内容A和实验内容B的源程序文件,存入U盘保存。
4.写出预习报告,报告中应有实验内容B的源程序清单。
实验步骤:1.编辑建立实验内容A的源程序,对其进行汇编、链接获得可执行文件。
运行可执行文件,实现实验内容A的要求。
2.参考实验内容A的源程序,编辑建立实验内容B的源程序,对其进行汇编、链接获得可执行文件。
如果在汇编、链接过程中有错误产生,则根据提示信息逐一修改错误,直到无错误产生。
运行可执行文件,实现实验内容B的要求。
重要提示:1.为了能够实现小数减大数得到负数结果,需要在做运算前先进行一次比较,若被减数小于减数则交换两数,并先输出一“-”。
2.为了能够去掉无效0,可以先将3位结果存起来(如同保存输入字符一样),然后从最高位开始查找不为0的位,从此位开始执行输出。
实验内容A参考程序:NAME DEMO7DATA SEGMENTSTRING DB 100 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,STRINGLP1: MOV AH,1 ; 将输入的字符存入string起始的区域中,直到输入“=” INT 21HMOV [BX],ALINC BXCMP AL,'='JNE LP1LEA BX,STRINGMOV CX,0LP2: MOV AL,[BX] ; 将第1个加数转换成二进制CMP AL,'+'JE LP3CMP AL,'-'JE LP3AND AL,0FHMOV AH,0PUSH AXMOV AX,10MUL CXPOP CXADD CX,AXINC BXJMP LP2LP3: PUSH AXPUSH CXMOV CX,0INC BXLP4: MOV AL,[BX] ; 将第2个加数转换成二进制CMP AL,'='JE LP5AND AL,0FHMOV AH,0PUSH AXMOV AX,10MUL CXPOP CXADD CX,AXINC BXJMP LP4LP5: POP AX ; 根据要求做加法或减法POP BXCMP BL,'+'JNE LP6ADD AX,CXJMP LP7LP6: SUB AX,CXLP7: MOV CL,100 ; 将结果转换成十进制输出 DIV CLPUSH AXMOV DL,ALADD DL,30HMOV AH,2INT 21HPOP AXMOV AL,AHMOV AH,0MOV CL,10DIV CLPUSH AXMOV DL,ALADD DL,30HMOV AH,2INT 21HPOP AXMOV DL,AHADD DL,30HMOV AH,2INT 21HRETSTART ENDPCODE ENDSEND BEGIN实验B参考程序:DATA SEGMENTSTRING DB 100 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARBEGIN: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,STRINGLP1: MOV AH,1 ; 将输入的字符存入string起始的区域中,直到输入“=”INT 21HMOV [BX],ALINC BXCMP AL,'='JNE LP1LEA BX,STRINGMOV CX,0LP2: MOV AL,[BX] ; 将第1个加数转换成二进制CMP AL,'+'JE LP3CMP AL,'-'JE LP3AND AL,0FHMOV AH,0PUSH AXMOV AX,10MUL CXPOP CXADD CX,AXINC BXJMP LP2LP3: PUSH AXPUSH CXMOV CX,0INC BXLP4: MOV AL,[BX] ; 将第2个加数转换成二进制 CMP AL,'='JE LP5AND AL,0FHMOV AH,0PUSH AXMOV AX,10MUL CXPOP CXADD CX,AXINC BXJMP LP4LP5: POP AX ; 根据要求做加法或减法POP BXCMP BL,'+'JNE LP6ADD AX,CXJMP LP7LP6:CMP AX, CXJA LPXCHG AX, CXpush axmov dx, 45mov ah, 2int 21hpop axLP: SUB AX, CXLP7: MOV CL,100 ; 将结果转换成十进制输出 DIV CLPUSH AXMOV DL,ALCMP DL,0JE L1ADD DL,30HMOV AH,2INT 21HPOP AXMOV AL,AHMOV AH,0MOV CL,10DIV CLPUSH AXMOV DL,ALCMP DL,0ADD DL,30HMOV AH,2INT 21HPOP AXMOV DL,AHADD DL,30HMOV AH,2INT 21HRETL1: POP AXMOV AL,AHMOV AH,0MOV CL,10DIV CLPUSH AXMOV DL,ALCMP DL,0JE L2ADD DL,30HMOV AH,2INT 21HL2: POP AXMOV DL,AHADD DL,30HMOV AH,2INT 21HRETSTART ENDP CODE ENDSEND BEGIN。
简易计算器目录摘要…………………………………………………………………………………P3 关键字………………………………………………………………………………P3一、设计要求………………………………………………………………………P3二、方案论证与选择………………………………………………………………P32.1 单片机选择………………………………………………………………P32.2 LCD显示屏选择…………………………………………………………P32.3 键盘选择…………………………………………………………………P42.4 CPU工作方式选择………………………………………………………P4三、系统实现………………………………………………………………………P43.1 硬件设计…………………………………………………………………P43.1.1系统框图………………………………… …………………………P43.1.2 盘的电平设计以及与单片机的连接键……………………………P53.2.3单片机与显示器的连接…………………………………………… P53.2软件设计……………………………………………………………………P6四、作品性能测试与分析…………………………………………………………P104.1试性能概览………………………………………………………………P104.2误差分析…………………………………………………………………P12五、参考文献………………………………………………………………………P12六、附录……………………………………………………………………………P136.1计算器功能介绍…………………………………………………………P136.2仿真电路图………………………………………………………………P136.3元件清单…………………………………………………………………P136.4原程序代码………………………………………………………………P14摘要:本设计以低功耗单片机MSP430V136T、1602字符型液晶屏和4*4简易键盘为主要器件,来实现加、减、乘、除、开根号、平方、求倒数等运算。
《高级面向对象》实践报告题目:简易计算器的实现学院:专业班级:指导老师: 学号:姓名:2018年1月目录1 需求分析 (2)1.1 课题要求 (2)1.2 设计思想 (2)1.3 设计要求和步骤 (2)1.3 编译环境 (2)2 系统分析与设计 (3)2.1 代理模式 (3)2.2 设计方案要求 (3)2.3 设计划分 (3)2.4 类图设计 (3)3 系统实现 (4)4 软件测试 (5)4.1 数据调试分析 (5)5 程序源代码 (5)1 需求分析1.1 课题要求用代理模式实现一个简易的计算器,即实现加减乘除四则运算,要求使用代理模式,同时代理方和服务方须分别部署在不同的计算机中(即需要用不同进程实现)。
1.2 设计思想要设计一个计算器应用程序,则计算器必须要进行简单的四则运算功能,并且可以通过人机互动来进行操作。
计算器功能主要包括下面几个方面:*计算简单的加减乘除四则运算;*通过鼠标点击输入数字信息;*显示计算结果;*计算器具有返回功能:按CE键不会清除重现存储器的内容;返零功能;1.3 设计要求和步骤第一步,设计图形界面。
第二步,根据各按钮需要,标明对象名,便于计算操作。
第三步,设定各按钮的特性。
第四步,实例化所有按钮、设置其前景色并注册监听器。
第五步,运行程序*运行小应用*测试各按钮的性能,是否满足问题要求。
1.3 编译环境编码语言:C#编译环境:Microsoft Visual Studio20132 系统分析与设计2.1 代理模式定义:为其他对象提供一种以控制对这个对象的访问。
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2.2 设计方案要求整个程序分三部分,首先是确定程序交互的对象,每个组件要用有意义的标签标明,设计出一个大体的框架,再添加面板,各面板设计分布相互独立,各面板中的按钮分布也相互独立,其各自响应的事件都会由各自的监听动作事件所决定。
面向对象程序设计----简单计算器的设计一、问题描述简单计算器的基本功能如下:1.四则运算,例如加减乘除等;2.除了整数的运算也可实现小数的各类运算;3.判断非法操作,例如判定1/0为非法操作;4.其他特性;这个简易计算器只实现以上所述功能,即实现简单计算。
二、设计思路计算器起始运行在归零状态,此时只接受数字输入,当按下一个数字按钮时,计算器只显示用户输入第一个操作数,用户在该状态下可以继续输入数字。
1.当第一个数字输入完成后,可以接受第二个操作数。
2.在数字输入结束进行运算后,按下=按钮可以根据前面按下的操作符计算结果显示,表示计算完成。
3.在上述计算过程中都可以接受双击等号回到清零状态。
三、功能函数设计:1.数字按钮这个是通过最基本的OnButton()将0~9十个数字按钮的单击消息处理函数用类向导全部关联到此,适文本框应该只是显示当前单击的数字;2.小数点按钮函数OnDecimal这个函数主要是实现小数点在计算器的相关功能3.列表在算法的函数OnSelchangeOperatorList()这一类按钮包括“+”“-”“*”“/”,它们的单击消息在同一个处理函数中进行处理,以同样的方法把这四个按钮的单击操作关联到此函数中,使四则运算法则在列表中通过选择去实现。
4.“=”符号函数OnEnquall()实现计算器中等号的功能,双击时也可使编辑框的数字归零。
四、编码实现:int calculator_type_i;double count=10,value=0;double Input_data_int=0,Input_data_dec=0;double Inputdata1=0,Inputdata2=0;char datatostr_buffer[10];bool decimal=FALSE;以上代码是添加的全局变量,为正确获取键盘输入供所有按钮函数使用。
// TODO: Add extra initialization herem_OperatorBox.AddString("-");m_OperatorBox.AddString("*");m_OperatorBox.AddString("/");m_OperatorBox.AddString("+");以上代码是初始化列表框,并使其在程序运行时具有“加”“减”“乘”“除”可选择功能。
简易计算器设计与实现一、引言计算器是一种广泛应用的工具,可以进行基本的算数运算和一些科学计算,能够极大地方便人们的日常生活和工作。
本文将介绍一个简易的计算器的设计和实现方案。
二、设计思路1.功能选择:通过提供菜单供用户选择,以实现计算器常见功能如加法、减法、乘法、除法等。
2.输入输出处理:用户通过键盘输入待计算的数字和操作符,计算器将结果输出到屏幕上。
3.算术运算:根据用户选择的功能,进行相应的算术运算,如加法、减法、乘法、除法等。
4.错误处理:对于非法的输入,如除数为0,需要给出错误提示。
三、详细设计1.界面设计:计算器通过命令行界面展示,用户通过菜单选择功能。
界面可以提供以下功能选择菜单:1)加法2)减法3)乘法4)除法5)退出2.输入输出处理:在命令行界面上提示用户输入数字和操作符,并读取用户输入的数据。
用户输入格式为两个数字和一个操作符,操作符为"+","-","*"或"/"。
3.算术运算:a)加法运算:将两个数字相加,得到结果。
b)减法运算:将第一个数字减去第二个数字,得到结果。
c)乘法运算:将两个数字相乘,得到结果。
d)除法运算:将第一个数字除以第二个数字,得到结果。
在执行除法运算前,需要检查除数是否为0,如果为0,则给出错误提示。
4.错误处理:在用户选择除法运算时,需要检查除数是否为0。
如果为0,则输出错误提示信息,提示用户输入合法操作数。
五、实现以下为Python语言实现的简易计算器代码示例:```pythondef add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):if b == 0:raise ValueError("除数不能为0")return a / bdef calculator(:while True:print("请选择功能:")print("1) 加法")print("2) 减法")print("3) 乘法")print("4) 除法")print("5) 退出")choice = int(input()if choice == 1:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = add(a, b)print("计算结果:%f" % result)elif choice == 2:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = subtract(a, b)print("计算结果:%f" % result)elif choice == 3:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = multiply(a, b)print("计算结果:%f" % result)elif choice == 4:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) try:result = divide(a, b)print("计算结果:%f" % result)except ValueError as e:print("错误:%s" % str(e))elif choice == 5:breakelse:print("无效的选择,请重新选择功能。
课程设计报告题 目 简易计算器界面设置的图形及标题栏课 程 名 称 结构化程序设计课程设计 院 部 名 称 南京国际软件学院 专 业 软件工程(服务外包) 班 级 12 软件工程(服务外包)3班 学 生 姓 名 顾锦华 学 号 1205106138 课程设计地点 工科楼A206 课程设计学时 20学时 指 导 教 师 吕艳琳金陵科技学院教务处制简易计算器设计报告——界面设置的图形及标题栏(一)课程设计目的与要求①通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了C语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!②通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。
为后续各门计算机课程的学习和毕业设计打下坚实基础。
(二)课程设计的主要内容1、项目名称:简易计算器——界面设置的图形及标题栏2、实验设备及环境:●实验设备:教室机房●硬件环境:具有TC环境的计算机●软件环境:C语言3、软件功能介绍及结构设计由下图所示,本程序主要由五个功能模块组成。
对简易计算器进行修改的模块:✧界面显示模块。
在计算器的界面显示之前级之后显示欢迎界面及退出界面。
计算器界面显示必须在执行实际操作之前完成,在这里主要调用了C语言图形系统函数和字符屏幕处理函数画出类似Windows自带的计算器的界面。
✧计算器鼠标及按键控制模块。
主要完成两大部分功能。
一,当用户使用按键或鼠标按下计算器定义的有效键时,计算器必须执行模拟用户按键的操作。
二,计算器对按键值的判断,执行相应的操作。
✧计算器计算处理模块。
计算处理模块主要完成双目运算和单目运算操作以及优先级的运算处理。
2011-2012(2)《软件工程导论》实验报告实验一:项目计划、分析和设计学院:计算机学院 班级: 软件111 姓名: 张鹏 学号:119074174内容:实验一:项目计划、分析和设计[ 实验日期 ]2012 年3月28日 [ 实验目的 ]1. 初步了解结构化分析、设计方法的原理、步骤以及各阶段的文档,练习撰写简要的需求文档、设计文档。
2. 为了解决自己及他人对世界困惑,更加客观真实的了解国内外!(任务艰巨呀!) [ 实验内容 ](1)包含的功能有:加、减、乘、除运算,开方、平方等功能。
(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。
(4)计算功能基本上是用系统内部函数。
(5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。
(6)“CE”按钮可以清除所有已输入的数据从头计算[ 实验原理和步骤 ]界面要求N[ 实验结果]即[ 实验报告要求][ 实验总结]经过了两个星期的C语言程序设计,在同学的热情帮助下基本完成了计算器课题的设计修改任务,虽然有些地方不尽如人意但是初步达到了对自己的要求。
信息时代是科技和经济发展的产物,软件产业是信息时代的产物,它在我们的生活工作中发挥着越来越大的作用,计算器的设计对我们知识的掌握有很大的作用,更能方便他人,可行性很强。
刚开始设计的时候找不到头绪,不知道该从哪里下手,通过向同学询问和向老师寻求帮助找走进了设计的门槛。
在设计这个程序时,刚开始是根据网上的资料,,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我搞定了。
这些只要你自己愿意去尝试,问题都可以迎刃而解的。
通过网上查找到很多成功的计算器程序,通过对那些已经成功地程序进行分析找到自己的设计思路,制定设计流程。
并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的。
万事开头难,可是对于并不是很熟悉的C语言在下面的工作中困难处处能遇见。
通过查找C语言教材去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决。
测试阶段中发现了几处错误导致程序不能编译,通过耐心的分析源代码终于编好了一个完整无误的程序。
在这次的C语言程序设计实习中遇到了现实编程中必然见到的问题通过这些问题的解决积累了编程的实践经验。
在实际的编程操作中发现自己C语言知识的不足,加深了对C语言的理解。
在学习之余体验到收获的感觉。
同时认识到程序员的工作并不是我们想象的那么简单轻松的,在现在的编程中要有足够的耐心和热情。
实验二:[ 实验目的 ]培养良好的编码风格。
[ 实验内容 ]根据详细设计的结果,按结构化思想编写代码,并对程序进行注释。
[ 实验原理和步骤]编码风格强调“清晰易读”而不是个人技巧。
请注意变量或函数的名字要有意义,表达式和语句要一目了然,排版风格、循环语句风格要保持一致,函数宏的定义,常数的定义,注释要全面。
注释包括序言性注释、函数模块注释和程序语句注释。
程序源代码/*简易计算器..2012.4.4——5.4...张鹏..119074174....此程序在wintc下运行!*/#include"dos.h"#include"conio.h"#include"string.h"#include"stdio.h"#define normbut_bor 0x80#define presbut_but 0xb8#define normnum_but 0x8e#define presnum_but 0xb9#define spebut_char 0x2c#define win_color 0xf2#define win_char 0xfbstruct s_button /*按键的结构体*/{int sx,sy,ex,ey;char *head;int press;}button[17]; /*图表按键数*/char far *vid_mem;static int tx=32,ty=3; /*静态变量*/float v1=0.0,v2=0.0;struct stack /*结构体栈*/{char s[20];int tos,top;}stack;char tag;init_stack() /*初始化栈*/{stack.tos=0;stack.top=0;stack.s[stack.tos]='\0';}push(char ch) /*入栈*/{stack.s[stack.tos++]=ch;stack.s[stack.tos]='\0';}pop() /*取栈数据通过*/{if(stack.tos>0)stack.s[--stack.tos]='\0';}clear_stack() /*清空栈*/{stack.tos=0;stack.top=0;stack.s[stack.tos]='\0';}int form_win() /*表格窗口初始化*/{textbackground(WHITE); /*窗口背景颜色*/clrscr(); /*清零*/draw_win(); /*窗口画线*/active_button(); /*窗口按键*/out_text_win(); /*输出文本窗口*/window_xy(32,3); /*计算结果窗口*/}draw_win() /*边框画线窗口*/{int i;char far *t;char *s="这是一个模拟计算器!"; /*顶端边框输出的字符*/ draw_border(30,0,79,24,win_color); /*边框的位置和颜色*/ i=(79-30-strlen(s))/2+30;t=vid_mem+i*2;for(;*s;){*t++=*s++;*t++=win_color; /*顶端字体颜色*/}}draw_border(int sx,int sy,int ex,int ey,int attrib) /*边界线函数*/ {char far *t,far *v;int i;t=vid_mem;for(i=sx+1;i<ex;i++){v=t+sy*160+i*2;*v++=196; /*每一行上画线确定为直线*/*v=attrib;v=t+ey*160+i*2;*v++=196; /*每一行下画线确定为直线*/*v=attrib;}for(i=sy+1;i<ey;i++){v=t+i*160+sx*2;*v++=179; /*每一列左画线确定为直线*/*v=attrib;v=t+i*160+ex*2;*v++=179; /*每一列由画线确定为直线*/*v=attrib;}write_char(sx,sy,218,attrib);write_char(ex,sy,191,attrib);write_char(sx,ey,192,attrib);write_char(ex,ey,217,attrib);}write_char(int x,int y,char ch,int attrib) /*字符输入函数*/{char far *v;v=vid_mem;v+=x*2+160*y;*v++=ch;*v=attrib;}active_button()/*图表按钮设定函数*/{int i;make_button(0,32,9,38,11,"1");/*每个键对应的位置和数值*/make_button(1,42,9,48,11,"2");make_button(2,52,9,58,11,"3");make_button(3,62,9,67,11,"+");make_button(4,71,9,76,11,"-");make_button(5,32,12,38,14,"4");make_button(6,42,12,48,14,"5");make_button(7,52,12,58,14,"6");make_button(8,62,12,67,14,"*");make_button(9,71,12,76,14,"/");/*"/"的位置*/make_button(10,32,15,38,17,"7");make_button(11,42,15,48,17,"8");make_button(12,52,15,58,17,"9");make_button(13,62,15,67,17,"=");make_button(14,71,15,76,17,"<-");make_button(15,32,18,38,20,"0");/*"0"的位置*/make_button(16,71,18,76,20,"End");for(i=0;i<17;i++){draw_border(button[i].sx,button[i].sy,button[i].ex,button[i].ey,normbut_bor);}for(i=0;i<17;i++){write_top(button[i].sx+1,button[i].sy+1,button[i].ex-1,button[i].head,normnum_but);}}write_top(int x1,int y,int x2,char *s,int attrib){char far *v,far *t;int i;v=vid_mem;for(i=x1;i<=x2;i++){t=v+y*160+i*2;*t++=' ';*t=attrib;}i=(x2-x1-strlen(s)+1)/2+x1;t=v+160*y+i*2;for(;*s;){*t++=*s++;*t++=attrib;}}make_button(int num,int sx,int sy,int ex,int ey,char *top){button[num].sx=sx;button[num].sy=sy;button[num].ex=ex;button[num].ey=ey;button[num].head=top;button[num].press=0;}out_text_win() /*结果输出窗口*/{draw_border(31,2,75,4,0x7f);write_top(32,3,74," ",0xff);}get_key() /*得到按键值*/{union inkey /*共用体*/{char ch[2];int i;}c;c.i=bioskey(0);return(c.i);}window_xy(int x,int y){union REGS r; /*定义联合体*/r.h.ah=2; /*初始化*/r.h.dh=y;r.h.dl=x;r.h.bh=0;int86(0x10,&r,&r);}key_choice() /*小键盘键的输入函数*/{int ch,bx=0,by=0;/*起始停留键的位置*/do{ch=get_key();switch(ch){case 0x4f31:res_but(bx,by);bx=0;by=0;get_data(bx,by);break;/*图表键和小键盘的键对应,此处为1*/case 0x5032:res_but(bx,by);bx=1;by=0;get_data(bx,by);break;/*2*/case 0x5133:res_but(bx,by);bx=2;by=0;get_data(bx,by);break;/*3*/case 0x4b34:res_but(bx,by);bx=0;by=1;get_data(bx,by);break;/*4*/case 0x4c35:res_but(bx,by);bx=1;by=1;get_data(bx,by);break;/*5*/case 0x4d36:res_but(bx,by);bx=2;by=1;get_data(bx,by);break;/*6*/case 0x4737:res_but(bx,by);bx=0;by=2;get_data(bx,by);break;/*7*/case 0x4838:res_but(bx,by);bx=1;by=2;get_data(bx,by);break;/*8*/case 0x4939:res_but(bx,by);bx=2;by=2;get_data(bx,by);break;/*9*/case 0x5230:res_but(bx,by);bx=0;by=3;get_data(bx,by);break;/*0*/case 0x4e2b :res_but(bx,by);bx=3;by=0;get_data(bx,by);send1();break;/*加*/case 0x4a2d :res_but(bx,by);bx=4;by=0;get_data(bx,by);send1();break;/*减*/case 0x372a :res_but(bx,by);bx=3;by=1;get_data(bx,by);send1();break;/*乘*/case 0x352f:res_but(bx,by);bx=4;by=1;get_data(bx,by);send1();break;/*除*/case 0x0d3d:res_but(bx,by);bx=3;by=2;get_data(bx,by);send2();out_text_win();put_string();break;/*等于号*/case 0x1c0d:res_but(bx,by);bx=2;by=4;get_data(bx,by);send2();out_text_win();put_string();break;/* 回车键(相当与等于号)*/ case 0x0e08:res_but(bx,by);bx=4;by=2;pop();text_clo();break; /*退格(backspace)*/case 0x3920:res_but(bx,by);get_data(bx,by);ba_space(bx,by); break;/* 空格*/case 0x4f00:res_but(bx,by);bx=4;by=3;exit(1);break;/*结束(End)*/case 0x4800:res_but(bx,by);by--;break;/* 上*/case 0x4b00:res_but(bx,by);bx--;break;/* 左*/case 0x5000:res_but(bx,by);by++;break;/* 下*/case 0x4d00:res_but(bx,by);bx++;break;/* 右*/}if(bx<0)bx=0; /* 只能在X0到4和Y在0到4内选择按键*/if(by<0)by=0;if(by>4)by=4;if(bx>4)bx=4; /* 只能在X0到4和Y在0到4内选择按键*/select_but(bx,by);}while(1);}ba_space(int x,int y){int num;char ch;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;switch(num){case 3:send1();break;case 13:send2();out_text_win();put_string();break;case 4:send1();break;case 8:send1();break;case 9:send1();break;case 16:exit(1);break;/*图表对应的结束键*/case 14:pop();text_clo();break;/*"〈-"对应功能*/default:;}}text_clo() /*文本光标*/{tx--; /*光标向左移*/if(tx<32)tx++; /*backspace时X不能小于32*/put_char(tx,ty,'');}put_string() /*计算机运算函数*/{float result;tx=32;switch(tag) /*根据运算符号计算*/{case '+': result=v1+v2;break; /*做加法*/case '-':result=v1-v2;break; /*做减法*/case'*':result=v1*v2;break; /*做乘法*/case '/': result=v1/v2;break; /*做除法*/default :result=v1; /*若不计算输出0*/}sprintf(stack.s,"%.3f",result); /*输出结果保留小数点后三位*/while(stack.s[stack.top]){put_char(tx,ty,stack.s[stack.top++]);tx++;}}send1() /*向服务器发送请求*/{sscanf(stack.s,"%f",&v1); /*输入并储存在V1中*/clear_stack(); /*清除栈*/}send2() /*向服务器发送信息*/{sscanf(stack.s,"%f",&v2);clear_stack(); /*清除栈*/}get_data(int x,int y) /*键的移动和对应数值关系*/{int num;char ch;if(y>2)if(x<2)num=15;else num=16; /*使得第3行只能取的0键和End键*/else num=x+5*y; /*其余各键坐标和原来设定的值的关系*/switch(num) /*使得图表面键和实际键一致*/{case 0:ch='1';break; /*图表面1键和实际1一致*/case 1:ch='2';break;case 2:ch='3';break;case 3:ch='+';break;case 4:ch='-';break;case 5:ch='4';break;case 6:ch='5';break;case 7:ch='6';break;case 8:ch='*';break;case 9:ch='/';break;case 10:ch='7';break;case 11:ch='8';break;case 12:ch='9';break;case 13:ch='=';break;case 15:ch='0';break; /*图表面0键和实际0一致*/default:ch=1;}if(ch!=1){put_char(tx,ty,ch);if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/')push(ch);else tag=ch;tx++;}}select_but(int x,int y) /*选择按钮*/{int num;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,presbut_but);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,presnum_but); }res_but(int x,int y){int num;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;if(num<16){draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,normbut_bor);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,normnum_but);}else{draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,normbut_bor);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,spebut_char);}}put_char(int x,int y,char ch) /*计算窗口的输入确定函数*/{char far *v;v=vid_mem;v+=x*2+y*160; /*光标的位置*/*v++=ch; /*输入字符随光标的推进*/*v=0xf0; /*输入数字的颜色*/window_xy(x,y); /*光标在窗口坐标*/}calculator() /*计算器构成的函数*/{int a,b;key_choice(); /*键选择函数*/}write_text(int x,int y,char *s,int attrib) /*文本输入函数*/{char ch;int lx=x,ly=y;for(;*s;){ch=*s++;switch(ch){case '\n':lx=x;ly++;break;default:write_char(lx++,ly,ch,attrib);}}}menu() /*左边窗口函数*/{ char *j="方向键\n移动!""\n空格键\n确定!\n可用小键盘\n输入!\n用小窗口\n显示"; /*左边框中显示的字符*/ char *s="设计人员\n1 \n2 \n3 \n ""\n组长:K ";draw_border(0,0,29,24,win_color); /*左边框的位置和颜色*/write_top(1,2,28,"操作步骤",0xf9);/*INTRODCTION的位置和颜色*/write_text(2,5,j,0x79); /*输入字符的位置和颜色*/write_text(2,17,s,0x79); /*输入字符的位置和颜色*/}main() /*用户名随意..密码520!退出输入密码0即可!*/{char user[10];int passward;printf("hello!welcome you!\nplease input ueser and passward!quit---please input passward 0!\n");while(1){printf("user:");scanf("%s",user); /*用户名随意..密码520!*/printf("passward:"); /*用户名随意..密码520!*/scanf("%d",&passward); /*用户名随意..密码520!*/if(passward==520) /*用户名随意..密码520!*/{init_stack();vid_mem=(char far *)0xb8000000;if(!form_win()){printf("can't form the device,press any key to leave!...");/*如果不能显示见面窗口,按任意退出。