本次课程设计基于 LABVIEW 实现具有加减乘除以及开方等简单运算功能的 计算器,总体思路是数据的输入,存储,以及相应运算功能转码实现,从而达到 数据运算的目的。 本次设计运用条件结构、 顺序结构以及层叠式顺序结构等实现 具体的计算器功能。
目录
一.总体设计思路 . .......................................................................................................................... 2
二.前面板的设计以及变量的初始化操作 . .................................................................................. 3 2.1设计前面板操作 . ................................................................................................................ 3 2.2各个变量的初始化 . ............................................................................................................ 4三.数据的输入确定 . ...................................................................................................................... 6 3.1 .数据输入方式总体思路 . ................................................................................................... 6 3.2数据 1~9的输入 ................................................................................................................. 7 3. 3数据 0的输入 . ................................................................................................................. 8四.具体运算功能的实现 . .............................................................................................................. 9
4.1加减乘除以及开方功能实现 . ............................................................................................ 9 4.2倒数功能实现 . .................................................................................................................. 11 4.3小数点的操作 . .................................................................................................................. 12 4.4停止功能实现 . .................................................................................................................. 13
五.设计总结 . ................................................................................................................................ 14
六.参考文献 . ................................................................................................................................ 15
一.总体设计思路
首先进行第一个数据的输入, 本次设计中定义了三个变量 number1 number2、 以及 number3,首次按下的数据存入第一个 number1中,并显示,接着进行运算 符号的键入, 最后输入第二个变量存入 number2中, 最后运算并显示在结果 result 中。具体流程图设计如 图 1-1
注:由于设计问 题, 输错如果不进 行清零处理, 会造 成接下来的运算 错误。
图 1-1总体流程图
二.前面板的设计以及变量的初始化操作
2.1设计前面板操作
本次设计的计算器共设计 22个键码,分别为:0~9十个数字、小数点、正 负号、加、减、乘、除、等号、倒数、根号、清零、退格、开方和停止按钮,还
有一个数据显示 display 。具体设计如下,如 图 2-1所示,其中簇中的键码为 21个。
图 2-1计算器前面板
2.2各个变量的初始化
在运行程序之前, 首先对需要用到的变量进行初始化, 以免造成运算出错或 者紊乱,其具体初始化如下图 2-2所示。
不同的变量初始化对应不同的操作, 变量的初始赋值至关重要, 在整个程序 设计中, 可以使用变量的相关将一个可以类似使用的变量相关联, 变量越少, 程 序越易于控制。
图 2-2变量初始化流程图
三.数据的输入确定
3.1 .数据输入方式总体思路
首先, 在前面板上建立一个簇, 将各个键码编入在后面板中通簇与数组的转 换,将簇中元素按产生的顺序组成一个一维数组,这样就实现了 21键与数字 (0--20)之间的对应。 每次按下一个键时, 通过查找出对应的键并把结果 (对应的 数字 ) 连接到一个 case 结构,然后执行对应 case 结构中的程序,至此就完成了 对一个键的感应过程,其具体如 图 3-1
图 3-1 簇的建立及数据输入图
(注:簇至数组转换,将相同数据类型元素组成的簇转换为数据类型相同的一维数组
搜索一维数组, 在一维数组中从开始索引处开始搜索元素。 因为搜索是线性的,
所以调用该函数前不必对数组排序。找到元素后, LabVIEW 会立即停止搜索。)
3.2数据 1~9的输入
图 3-2 a 数字 0~9输入图
图 3-2 b 数字 0~9输入图
(注::将输入字符串和一维字符串数组连接成输出字符串。对于数组输入,该函数连
接数组中的每个元素。右键单击函数,从快捷菜单中选择添加输入,或 调整函数大小 , 均可 向函数增加输入端
数值至十进制数字符串转换,将数字转换为十进制数组成的字符串,至少为宽度个字 符, 如有需要, 还可适当加宽。 如数字为浮点数或定点数, 转换之前将被舍入为 64位整数。 )
3. 3数据 0的输入
图 3-3a 数字 0输入图
图 3-3b 数字 0输入图
四.具体运算功能的实现
4.1加减乘除以及开方功能实现
图 4-1减法实现图
图 4-2除法实现图
图 4-3乘法实现图
图 4-4加法实现图
图 4-5开方实现图
4.2倒数功能实现
图 4-6倒数实现图
(注:分数 /指数字符串至数值转换, 从偏移量位置开始, 将字符串中的下列字符:0-9、 加号、减号、 e 、 E 、小数点(通常是句点)解析为工程、科学或分数格式的浮点数,在数字 中返回。连线板可显示该多态函数的默认数据类型。
数值至小数字符串转换,将数字转换为小数(分数)格式的浮点型字符串,至少为宽 度个字符,如有需要,还可适当加宽。连线板可显示该多态函数的默认数据类型)
4.3小数点的操作
图 4-7a 小数点操作实现图
图 4-7b 小数点操作实现图
判断已输入的数据中是否含有小数点, 若不含有, 则执行程序, 将数据和小 数点进行连接,如图 a ,若其中已经含有,则不进行数据和小数点的连接操作, 如图 b 。
4.4停止功能实现
图 4-8a 停止功能实现图
图 4-8b 停止功能实现图
五.设计总结
此次设计应用 labview 的多种结构以及控件实现简单计算器的功能,但是设 计并不十分完善, 例如实现运算时只能实现简单的一次加减运算, 如果一次计算 结束后没有进行清零处理,会造成运算结果错误,所以只是简单的计算。 由于设计是先进行数据的输入再进行相应的运算操作, 所以输入的如果不是 数据线输入,就会造成运算结果出错。
停止和显示是单独放在簇外面进行处理, 当遇到停止按钮按下时, 首先文本 提示,再确定是否进行停止计算器操作。
本次课程设计, 开始设计的时候我只是简单的以为只要运用一个函数编辑器 进行加减乘除设计,然后调用子 VI 再编辑面板就可以了,但经过上网找资料, 才发现每个数字键或者运算符键的对应并不是一件简单的事, 经过资料搜集以及 讨论, 我们才明白原来键码的确定十分复杂, 开始我把文本显示放在簇中, 会出 现连线错误, 后来就把文件显示和停止直接放在簇外进行设计了, 可能面板会比 较繁琐一点,我以后会努力改进的。
还有此次课程设计中也遇见了很多的问题, 运用了很多的结构, 后面板的设 计经常出现问题, 诸多的结构以及初始化值的确定都出现了很多的错误, 经过这 次课设,学到了很多老师上课书本没有涉及到的东西,譬如小数点的输入确定, 用的是字符串的连接控件实现, 我还深切地体会到可能身边很小的一个点也会让 自己的处境变得柳暗花明,所以,我以后一定会努力观察,细心设计,不断试着 尝试新的东西去学习,还有和同学的交流。
六.参考文献
[1] 黄松岭 . 虚拟仪器设计基础教程 [M]. 北京:清华大学出版社 , 2008
[2] 刘君华 . 基于 LabVIEW 的虚拟仪器设计 [M]. 北京 : 电子工业出版社 , 2003 [3] 张小虹 . 数字信号处理 [M]. 北京:机械工业出版社 , 2005
计算器设计
通信与信息工程学院
专业综合课程设计
班 级:姓 名:学 号:指导教师:设计时间:成 绩:
评
2016年1月11日~2016年1月15日
通信与信息工程学院
二〇一六年
设计题目:计算器的设计与实现
一、 内容要求:
1、 搭建Andriod 开发环境(包括JavaSDK 的安装和配置,Andriod 开发环境的安装和配
置)。
2、 任意下载或创建两个Andriod 应用程序,编译为APK 文件后, 在模拟器上成功运
行, 并在Andriod 手机上成功安装运行。
二、环境搭建:
1、参考《Android 应用开发揭秘》的第一章,学习了解什么是Android 系
统以及Android 的系统架构、Android 应用程序框架;
2、参考《Android 应用开发揭秘》的第二章2.2,从FTP 上下载java JDK和Eclipse 放在安装目录下,Eclipse 直接将下载的压缩包解压即可。对于JDK 双击安装,然后对java 的开发环境进行配置:设置环境变量创建“Path ”变量名,添加JDK 安装目录中“bin ”文件夹路径;创建“CLASSPATH ”变量,添加JDK 安装目录中“lib ”以及“demo ”的路径;最后进行测试是否安装成功。
3、下载安装Android SDK,选择安装Android 2.3.3版本。
4、安装完成后配置Android SDK,将Android SDK安装目录中的tools 文件夹路径添加到环境变量中,更改系统变量中的“Path ”项,添加路径:
5、安装和配置ADT ,参照Android 应用开发秘籍,启动Eclipse, 点击“Help ”菜单,按照步骤,在“Add Site ?”之后,文本框里输入地址
http://dl-ssl.google.com/android/eclipse/。打开菜单“Windows ”, 依次选择“Preferences ”->“Android ”, 点击浏览选择Android SDK的安装路径,点击OK; 然后打开菜单“File ”, 如下图查看得安装配置成功。
二、 计算器的设计与实现
1、系统的软件结构图
图3-1
2、功能的操作流程
首先用户根据自己的实际需要选择计算的类型,然后进入不同的计算类型,再进行要执行的运算,输入数据,选择运算符号,即可得到结果。 3、程序实现: (1)功能选择界面
图3-2为系统主界面。用户可以根据需要点击不同按钮进入不同功能的子界面。亦可以点击退出按钮退出本程序。
图3-2
本界面用LinearLayout 来布局,主要用到的控件是Button 。页面的跳转是通过intent 来是实现的。 跳转的主要代码如下: public void onClick(View v)
{
Button btn=(Button)v; switch (btn.getId()) {
case R.id.button1: Intent intent=new Intent();
intent.setClass(mycalActivity.this, secondactivity.class);
startActivity(intent); break ;
case R.id.button2:
Intent intent=new Intent();
intent.setClass(mycalActivity.this, thirdactivity.class);
startActivity(intent);
break;
case R.id.button3:
Intent intent=new Intent();
intent.setClass(mycalActivity.this, forthactivity.class);
startActivity(intent); break ;
case R.id.button4: finish();
}
(2)基本加减乘除界面
图3-3为加基本减乘除界面。用户在文本框中输入参加运算的数据,并点击要进行的运算符号,然后点击等号之后,将在等号下方显示结果处显示出计算结果。点击clear 按钮,可以将两个文本框中的内容以及显示的结果一起清空,用户可以输入新的数据计算。在文本框中输入时可以用图右侧的硬键盘,或者是手机自带的软键盘。
图3-3
示例如下:
(a )用户要计算1.23+2.16.在文本框1中输入1.23,点击“+”,再在文本框2中输入2.16,点击“=”,就可以显示出计算结果3.39. 如下:
图3-4
(b )计算1-0.32,如图3-5
图3-5
(c)计算3.24*0.25,如图3-6所示。
图3-6
(d)计算55/4,结果为13.75. 如下图所示:
图3-7
(e)计算1/6.如下图所示。由图3-8可以看出,当除不尽时本计算器保留到8位小数,并且最后一位采用了四舍五入的方法,比较科学、准确。
图3-8
(f)点击clear 之后全部清空:
图3-9
具体的实现:主要的思路是,用户先输第一个数,然后点击运算符号,
在程序中监听按钮的点击,如果点击了+、--、*、/中某一按钮,这时,就取editText1中的值,通过myeditText1= editText1.getText().toString()实现,为了参与运算,需要把字符串类型转换为浮点型,并将其值赋给变量a ,代码为a=Float.parseFloat(myeditText1);用flag 的不同值记录用户点击的不同的运算按钮。当用户点击“=”时,就将editText2中的内容取出,也同样转化为数值,并用b 记录,然后判断flag 的值即可知道对应应采取哪种计算,进而算出最终结果,并用textView1显示出计算结果。“清空”的实现是使对应控件的内容取空即可。
核心代码如下:
private OnClickListener listener=new OnClickListener() {
String myeditText1;
String myeditText2; float a=0;
int flag=0;
float result;
public void onClick(View v) {
Button btn=(Button)v; switch (btn.getId()) {
case R.id.button1:
myeditText1= editText1.getText().toString();
a=Float.parseFloat(myeditText1);
flag=1; break;
case R.id.button2:
myeditText1= editText1.getText().toString(); a=Float.parseFloat(myeditText1); flag=2; break;
case R.id.button3:
myeditText1= editText1.getText().toString(); a=Float.parseFloat(myeditText1); flag=3; break;
case R.id.button4:
myeditText1= editText1.getText().toString(); a=Float.parseFloat(myeditText1); flag=4; break;
case R.id.button5:
};
}
b=Float.parseFloat(myeditText2); if(flag==1)
result = a+b;
else if(flag==2) result = a-b; else if(flag==3)
result = a*b;
else
result=a/b;
String s = "显示结果: "; s += result;
textView1.setText(s); break;
case R.id.button6: }
editText1.setText(""); editText2.setText("");
textView1.setText("显示结果:"); break;
(3)三角函数运算界面
图3-10为三角函数运算界面。用户在文本框中输入参与计算的数据,然后选择点击要进行的运算类型,这时在显示结果处就会显示计算结果。例如,要计算sin30度,先在文本框中输入30,然后点击sin 按钮,这时就会显示结果为0.5. 同理,可进行其他计算。
图3-10
(4)其他运算界面
图3-11为其他运算界面,目前可实现平方、立方、开方、求以10为底的对数四种运算,由于时间有限,这个界面目前功能并不完善,暂时实现四种运算,不过,基于本计算器程序的设计理念,本界面主要实现一些其他运算,包括一些特殊运算。在今后,这个界面可以修改和扩充,以至拥有更加完善丰富的计算功能。在现有的界面上的操作流程如下:用户在文本框中输入要进行运算的数据,然后选择点击运算按钮,即可显示运算结果。如输入0.5,点击平方,即显示结果0.25,操作方便。
图3-11
四、 心得体会:
在本次课程设计之中,我亲自动手进行了环境的搭建,进一步的熟悉了安卓环境的搭建与运行。本次课程设计,我打算设计制作一个计算器,以实现平时的加减乘除的基本运算,然后在此基础上进一步完善设计内容,丰富其运算功能,以实现三角函数和幂指函数的计算。由于所学的知识有限,所以在键盘的设计上面就直接调用了手机上原有的软键盘,从而简化了设计的难度和工作量,同时也简化了界面,让使用者更加容易操作。再具体运算功能的实现上面,才用了独立界面的方面对三种不同难度的运算进行了分离,让使用的方法很清晰同时减小了难度,但是加大了工作了。由于设计的时间有限,最后只实现了这些基本的运算,今后还可以进一步进行扩充使其功能更加丰富。
在此课程设计期间,我学会了有目的的去学习一些将要用到的只是,仔细地考虑工作流程的规律和步骤,充分利用手中的开发工具,利用其所具备的功能,尽量使自己的开发在代码上实现少而精确、让用户能够尽量简单地进行操作。但是在检测过程中, 还是出现了很多的不足之处, 这些都是要在今后的工作中需要努力改进和完善的。在这次程序开发设计中,我也难免会遇到不少困难,这主要是由于我对所用的开发环境并不是很熟悉,开发软件的经验不足。安卓开发用的语言是java ,但是我对java 的学习并不多,这次开发对我来说可以算是一个全新的尝试,整个开发过程的初期并不是很顺利,但是我却从中充分体会到学习的快乐,开发的程序也在一步步得到完善。 这次程序开发由于个人水平及时间有限等原因,只能完成一些基本的功能,很多设想并未完全实现,这不能不说是个遗憾,后期仍需努力。
四、 附源代码如下:
public Calulator() { super();
// 初始化计算器 init();
//this.setSize(400, 300);
this.setBackground(Color.LIGHT_GRAY); this.setTitle("沈呈洁的计算器");
// 在屏幕(500,200)坐标处显示计算器 this.setLocation(500, 200);
// 不许修改计算器的大小 this.setResizable(false);
// 使计算器中各组件大小合适 this.pack(); } /*
初始化计算器 */
private void init() {
// 文本框中的内容采用右对齐方式
resultText.setHorizontalAlignment(JTextField.RIGHT); // 不允许修改结果文本框 resultText.setEditable(false);
// 设置文本框背景颜色为亮灰色
resultText.setBackground(Color.LIGHT_GRAY);
// 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel();// calckeysPanel
// 用网格布局器,4行,5列的网络,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3)); for (int i = 0; i < nbkeys.length;="" i++)="" {="" keys[i]="new" jbutton(nbkeys[i]);="">
keys[i].setForeground(Color.BLACK); }
// 运算符键用红色标示,其他键用蓝色表示 keys[3].setForeground(Color.BLUE); keys[8].setForeground(Color.BLUE); keys[13].setForeground(Color.BLUE); keys[18].setForeground(Color.BLUE); keys[19].setForeground(Color.BLUE);
// 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel();
// 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
commandsPanel.setLayout(new GridLayout(1, 3, 3, 3)); for (int i = 0; i < cmkeys.length;="" i++)="" {="" cmkeys[i]="new" jbutton(cmkeys[i]);="">
cmkeys[i].setForeground(Color.GREEN); }
// 初始化MK 键,用红色标示,将MK 键放在一个画板 JPanel calmsPanel = new JPanel();
// 用网络布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向
间隔为3个象素
calmsPanel.setLayout(new GridLayout(5, 1, 3, 3)); for (int i = 0; i < mk.length;="" i++)="" {="" mk[i]="new" jbutton(mk[i]);="">
mk[i].setForeground(Color.red); }
// 下面进行计算器的整体布局,将calckeys 和cmkeys 画板放在计算机的中部, // 将文本框放在北部,将calms 画板放在计算器的西部
// 新建一个大的画板,将上面建立的cmkeys 和calckeys 画板放在该画板内 JPanel panel1 = new JPanel();
// 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel);// // 建立一个画板放文本框 JPanel top = new JPanel();
top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局
getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); getContentPane().add("West", calmsPanel); // 为各按钮添加事件侦听器
// 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < nbkeys.length;="" i++)="" {="" keys[i].addactionlistener(this);="">
for (int i = 0; i < cmkeys.length;="" i++)="" {="" cmkeys[i].addactionlistener(this);="">
for (int i = 0; i < mk.length;="" i++)="" {="" mk[i].addactionlistener(this);="" }="">
public void actionPerformed(ActionEvent e) { // 获取事件源的标签
String label = e.getActionCommand(); if (label.equals(CMKEYS[0])) { // 用户按了"Backspace" 键 handleBackspace();
} else if (label.equals(CMKEYS[1])) { resultText.setText("0");
} else if (label.equals(CMKEYS[2])) { handleC();
} else if ("0123456789.".indexOf(label) >= 0) { handleNumber(label); } else {
handleOperator(label); } }
// 处理Backspace 键被按下的事件 private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) {
text = text.substring(0, i - 1); if (text.length() == 0) { resultText.setText("0"); firstDigit = true; operator = "="; } else {
resultText.setText(text); } } }
// 处理数字键被按下的事件
private void handleNumber(String key) { if (firstDigit) {
resultText.setText(key);
} else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0))="">
// 输入的是小数点, 并且之前没有小数点, 则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) {
// 如果输入的不是小数点, 则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); }
firstDigit = false;}
private void handleC() { resultText.setText("0"); firstDigit = true; operator = "="; }
private void handleOperator(String key) { if (operator.equals("/")) {
if (getNumberFromText() == 0.0) { operateValidFlag = false;
resultText.setText("除数不能为零 "); } else {
resultNum /= getNumberFromText(); }
} else if (operator.equals("1/x")) { // 倒数运算
if (resultNum == 0.0) { operateValidFlag = false;
resultText.setText("零没有倒数"); } else {
resultNum = 1 / resultNum; }
} else if (operator.equals("+")) {
resultNum += getNumberFromText(); } else if (operator.equals("-")) {
resultNum -= getNumberFromText(); } else if (operator.equals("*")) {
resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { resultNum = resultNum / 100; } else if (operator.equals("+/-")) { resultNum = resultNum * (-1); } else if (operator.equals("=")) { resultNum = getNumberFromText(); }
if (operateValidFlag) { long t1; double t2;
t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) {
resultText.setText(String.valueOf(t1)); } else {
resultText.setText(String.valueOf(resultNum)); } }
// 运算符等于用户按的按钮 operator = key; firstDigit = true;
operateValidFlag = true; } /*
* 从结果文本框中获取数字 */
private double getNumberFromText() { double result = 0; try {
result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { }
return result; }
public static void main(String args[]) { Calulator calculator1 = new Calulator(); calculator1.setVisible(true);
calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
VC++ 计算器设计
VC++实验报告
学 院 名 称 电 子 与 信 息 工 程 学 院 专 业 名 称 通 信 工 程 学 生 姓 名 艾 买 尔 ·吾 斯 曼 学 号 150405049 指 导 教 师 曹 玉 东 副 教 授
目录
使用控件设计计算器实验报告 . ...................................................................................................... 1键盘消息的编程实验报告 . .............................................................................................................. 7菜单栏的设计实验报告 . ................................................................................................................ 13
使用控件设计计算器实验报告
一、 实验目的
编写一个可以完成计算器功能的基于对话框的应用程序,该程序具有加、减、乘、除、求 平方根和求倒数功能。
二、 实验要求
(1)按照实验内容编写程序,并调试程序,并给出测试数据和实验结果。
(2)整理上机步骤,总结经验和体会。
三、 实验原理及步骤
(1)用 MFC APPwizard创建一个名称为 shanyan2 的基于对话框的应用程序框架。
(2)将对话框命名为“计算器” 。
(3)在向导提供的默认对话框中删掉“取消”按钮和静态文本框,然后添加一个编辑框控 件(edit box) ,
和 8 个按钮(button ) 。
(4)使用 ClassWizard 为编辑框控件添加关联数据成员:
doublem_fInput;
(5)在 IDC_INPUT 编辑框控件的获得焦点消息响应函数 (OnSetfocusInput() ) 中编写如下 代码 :
void CShiyan2Dlg::OnSetfocusInput()
{
// TODO: Add your control notification handler code here
m_fInput=0.0;//cyd add it
UpdateData(FALSE);//cyd add it
}
(6) 在对话框类的声明文件中定义两个数据成员:
intm_nOperator;//运算符的代号 cyd add it
double m_fResult;//中间计算结果 cyd add it
(7) 在对话框类的 CShiyan2Dlg::OnInitDialog()中初始化数据成员:
m_fInput=0.0;//cyd add it
UpdateData(FALSE);//cyd add it
(8)在 shiyan2DLG.cpp 开始处加上 #include
(9)对各个按钮的单击消息响应函数编写代码:
(10)测试该软件的功能,是否发现问题?在此基础上完善程序。
四、 实验结果
五、 实验心得
通过 C++实现完成计算器功能的基于对话框的应用程序,该程序具有加、减、乘、除、求平 方根和求倒数功能。 并对 MFC 应用程序的类和文件有了一定的了解, 知道类包括关于 About 对话框的对话框类 CAboutDlg 、主框架窗口类 CMainFrame 、应用程序类 CMyExpApp 、文档 类 cmyExDoc 、 视图类 CMyExpView 。 感受到编程的乐趣也学到不少知识, 相信自己在越来越 多的尝试中会不断的进步
键盘消息的编程实验报告
一、 实验目的
掌握键盘函数 OnkeyDown()的功能、参数和使用方法。
二、 实验设备和材料
微机(CPU1.70G 以上,内存 192M 以上) , Windows2000操作系统,并装有 Visual C++6.0开发环境。
三、 实验要求
演示键盘输入时所产生的消息序列,应用程序分别对 ESC 键、 SHIFT 键、 CTRL 键、 r 键产 生相应。
四、 实验原理及步骤
Windows 对每个按键定义了与设备无关的编码, 这种编码就叫做虚拟码。 有了这个虚拟码, Windows 程序员就可以不必理睬扫描码,而使用虚拟码来编写程序。
(1) 利用 AppWizard 生成单文档项目;
(2) 利用 ClassWizard 在 C*View类中加入 Onchar ()函数响应 WM-CHAR 消息。
(3) 在视图类头文件和源文件中加入相应代码;参考如下:
class CShiyan6Doc : public CDocument
{
protected: // create from serialization only
CShiyan6Doc();
DECLARE_DYNCREATE(CShiyan6Doc) // Attributes
// Overrides
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CShiyan6Doc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive&ar);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CShiyan6Doc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CShiyan6Doc)
// NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//%%%%%%%%%%%%%%%%%%%%
CShiyan6Doc::CShiyan6Doc()
{
// TODO: add one-time construction code here
void CShiyan6View::OnDraw(CDC* pDC)
{
CShiyan6Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
五、 实验结果 按下 CTRL 键:
按下 SHIFT 键:
按下字符键 r :
按下 ESC 键:
按下 CTRL+a键:
按下 SHIFT+b键:
六、
实验心得
菜单栏的设计实验报告
一、 实验目的
(1) 学习菜单栏和工具栏的设计;
(2) 掌握图形绘制的编程方法;
(3) 掌握 About 菜单和 about 对话框的编程和使用方法;
二、 实验设备和材料
微机(CPU1.70G 以上,内存 192M 以上) ,装有 Visual C++程序。
三、 实验内容和要求
练习更改应用程序的菜单。
四、 实验原理和步骤
Visual C++的应用程序向导建立新工程时,都会给程序捆绑一套标准菜单,并标识为 IDR_MAINFRAME,我们可以在这个标准菜单框架基础上增加所需的新菜单项,从而完善程序 的交换界面。利用菜单接受用户命令是一种简单、有效的交互方法。
一个典型的菜单包括两个基本要素:一个是文本字符串, 告诉用户该项的用途; 一个是数字 标识符,应用程序用来响应请求。可以根据程序需要编程更改、插入或删除菜单。 菜单分两 类:一类是依附框架窗口的被放置在标题栏下的菜单栏, 另一类是浮动的弹出式菜单, 也称 为快捷式菜单或上下文菜单。
Windows 程序都有各自的菜单。为了使 Windows 程序更容易操作,许多程序员对于菜单的 设计都遵循下列一些规则:
(1) 若选择某菜单项会弹出一对话框,那么在该菜单项文本后有“?” 。
(2) 若某项菜单有子菜单,那么在该菜单项文本后有“ >” 。
(3) 若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与 Alt 构成一个组合 键,当按住“ Alt ”键不放,再敲击该字母时,对应的菜单项就会被选中。
(4) 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键” 是一个组合键,如 Ctrl+N,使用时是先按下“ Ctrl ”健不放,然后再按“ N ”键。任何时候按 下快捷键,相应的菜单命令都会被执行。
通过菜单编辑器直接修改菜单资源 IDR_MAINFRAME可以实现添加和修改应用程序菜单,
(1) 创建一个默认的单文档应用程序 Ex_MenuSDI。
(2) 在项目工作区窗口中选择 ResourceView 页面, 双击资 “ Menu ” 项中的 IDR_MAINFRAME, 则菜单编辑器窗口出现在主界面的右边,项目 Ex_MenuSDI相应的菜单资源在菜单编辑器窗 口中显示出来。
(3) 按快捷键 Ctrl+R,弹出“插入资源”对话框,在资源类型中选定“ Menu ” ,如图
(4) 单击 [新建 ]按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认 的标识符名称 (第一次为 DR_MENU1,以后依次为 IDR_MENU2、 IDR_MENU3、 ...) ,同时自动 打开这个新的菜单资源。
(5) 在 Menu 资源的 ID_MENU1上右击鼠标,从弹出的快捷菜单中选择“ Properties ”命令, 在这里可以重新指定菜单资源 ID ,设置菜单资源的语言和条件,这个条件用来决定菜单资 源包含到哪个环境中, 例如当指定条件为 _DEBUG, 则菜单资源只存在于 Debug 编译环境中。
(6) 在菜单的空位置上双击鼠标左键,则出现它的属性对话框。通过其属性对话框为菜单 ID_MENU1添加一个顶层弹出菜单项 “ 测试 (&T)” , 并在该菜单下添加一个子菜单项 “ 返回 (&R)” , ID 设为 ID_TEST_RETURN,需要再次强调的是,符号 &用来指定后面的字符是一个助记符。
(7)打开 Ex_MenuSDI程序菜单资源 IDR_MAINFRAME, 在 “ 查看 ” 菜单的最后添加一个 子菜单项 “ 显示测试菜单 (&M)” , ID 设为 ID_VIEW_TEST。
(8)为 CMainFrame 类添加一个 CMenu 类型的成员变量 m_NewMenu, CMenu 类是用来 处理菜单的一个 MFC 类。
(9)按快捷键 Ctrl+W打开 MFC ClassWizard对话框, 切换到 Message Maps页面, 从 “ Class name ” 列表中选择 CMainFrame ,分别为菜单项 ID_VIEW_TEST和
ID_TEST_RETURN添加 COMMAND 消息映射, 使用默认的消息映射函数名, 并添 中下列代码:
五、实验结果
六、心得体会
通过这八周的学习 VC++,我们学会了 MFC 的使用,并且利用这个 软件能够设计比较简单的一些小程序。 虽然在学习阶段遇到了很多问 题, 比如语言问题。 对于像我这样本来就汉语能力比较薄弱的人来说 能够听懂老师讲课内容根本不可能,所以在学些阶段不懂一直看书, 问问学些较好的同学终于掌握了课上基本内容。 通过这次课程我还会 体会到再难知识只要用心学习会做到,然而感谢帮我讲解同学。
计算器设计
基于 VC 的 MFC 计算器案例步骤及源代码
基于 VC 的 MFC 计算器案例详细步骤有图有代码,图中右边的各个函 数也都能实现:清除,加,减,乘,除,倒数, e 的 x 次方,以 e 为 底 x 的对数, 10的 x 次方,以 10为底 x 的对数,余弦,反余弦,双 曲余弦值, 正弦, 反正弦, 双曲正弦值, 正切, 反正切, 双曲正切值, x 的 y 次方, 2的 x 次方, n (n 为整数)的阶乘。如图:
步骤:
1. 创建一个基于对话框的应用程序(这一步应该都会吧!),命名为 dckCalculator;
2. 打开资源视图 ->点击“ dckCalculator ”左边的“ +” ->点击 “ dckCalculator.rc ”左边的“ +” ->点击“ Dialog ”左边的“ +” ->双击 “ IDD_DCKCALCULATOR_DIALOG” ->去除 “确定” “取消” “ TODO: 在
此放置对话框控件。 ” 几个组件
(全选。 然后右击选择 “删除” 即可) :
3. 按照我们想要的效果给对话框添加组件 ->编辑各个组件的显示名 字 ->改变其ID属性
4. 将编辑框的属性中的 Align Text设置为 right ,如图:
5. 设置相关属性 (每次改变 ID 都要保存一下 ) :
CString m_display;
//编辑框 IDC_DISPLAY的关联变量,显示计算
结果 (注意最右边选择“ value ” )
9. 双击 “弧度” 给其添加事件响应 (等价于右击然后添加事件处理器) ; 同理双击“角度”添加代码:
//弧度处理函数
void CdckCalculatorDlg::OnBnClickedHudu()
{
m_duType=0;//系统默认 m_duType为,这里为刚好可以为计算器默认为弧度计算
}
//角度处理函数
void CdckCalculatorDlg::OnBnClickedJiaodu()
{
m_duType=1;//当选择角度处理函数的时候, m_duType为;这哥主要是作为以后函数算法的判断标准 }
10. 在对话框类的构造函数中,初始化成员变量:
// CdckCalculatorDlg 对话框的构造函数
CdckCalculatorDlg::CdckCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CdckCalculatorDlg::IDD, pParent)
, m_duType(0)
, m_first(0.0)
, m_second(0.0)
, m_operator(_T(
, m_coff(0)
, m_display(_T(
······
11. 类视图里手动为对话框添加 2个函数 :
void UpdateDisplay(double dck)——用于编辑框显示数据
Void Calculate(void ) ——用于计算结果
代码如下 (由于在代码中要用到 fabs, 要在 CdckCalculatorDlg.cpp 里添加一个库:#include
//在编辑框中显示数据
void CdckCalculatorDlg::UpdateDisplay(double dck)
{
m_display.Format(_T(
int i=m_display.GetLength();
while (m_display.GetAt(i-1)=='0' ) //格式化输出 , 将输出结果后的零截去
{ m_display.Delete(i-1,1); i--; }
UpdateData(false ); //更新编辑框变量 m_display
}
//计算结果
void CdckCalculatorDlg::Calculate(void )
{//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。
switch (m_operator.GetAt(0))
{ case '+': m_first+=m_second;break ;
case '-' : m_first-=m_second;break ;
case '*': m_first*=m_second;break ;
case '/':
if (fabs(m_second)<>
{m_display=
UpdateData(false );
return ; }
m_first/=m_second;break ;
}
m_second=0.0;
m_coff=1.0;
m_operator=_T(
UpdateDisplay(m_first);//更新编辑框显示内容
}
12. 如上添加函数 void onButtonN(int n);以便数字按钮调用响应 //用于数字按钮调用
void CdckCalculatorDlg::onButtonN(int n)
{if ( m_coff == 1.0)
m_second = m_second*10 + n;//作为整数输入数字时
else
{ m_second = m_second + n*m_coff; //作为小数输入数字
m_coff *= 0.1;}
UpdateDisplay(m_second);//更新编辑框的数字显示
}
13. 双击各个数字按钮,添加响应,调用函数:如: void CdckCalculatorDlg::OnBnClickedButton0()
{
onButtonN(0);
}
void CdckCalculatorDlg::OnBnClickedButton1()
{
onButtonN(1);
}······
14. 为各个运算符号添加事件处理器:
//
void CdckCalculatorDlg::OnBnClickedButtonSign()
{
m_second = -m_second;
UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedButtonPoint()
{
m_coff= 0.1 ;
}
//
void CdckCalculatorDlg::OnBnClickedButtonAdd()
{
Calculate();
m_operator=
}
//
void CdckCalculatorDlg::OnBnClickedButtonDiv()
{
Calculate();
m_operator.Format(_T(
}
//
void CdckCalculatorDlg::OnBnClickedButtonClear() {
m_first=0.0;
m_second=0.0;
m_operator =
m_coff = 1.0;
UpdateDisplay(0.0);
}
//
void CdckCalculatorDlg::OnBnClickedButtonSqrt() {
if ( m_second==0)
{ m_first=sqrt(m_first);
UpdateDisplay(m_first); }
else
{ m_second=sqrt(m_second);
UpdateDisplay(m_second);}
}
//
void CdckCalculatorDlg::OnBnClickedButtonReci() {
if (fabs(m_second)<0.000001 &&="">0.000001><0.000001) {m_display="">0.000001)>
UpdateData(false );
return ;}
if ( fabs(m_second)<>
{ m_first=1.0/m_first;
UpdateDisplay(m_first);
}
else
{ m_second=1.0/m_second;
UpdateDisplay(m_second);
}
}
//
void CdckCalculatorDlg::OnBnClickedButtonEqual()
{
Calculate();
}
15. 同理添加其他特殊函数按钮事件处理器,其中大部分在 API 里 math 类里都有定义好了的 可以直接用的函数,当然有几个是自己写 的如(n! 和 x^y而且第二个比较棘手),然后还有一个问题就是,里 面的函数括号里面跟的值是弧度, 而不是角度, 这就需要我们去判断 了,也就是说 m_duType终于派上用场了,只要 switch , m_duType, case 得到 0即默认的为弧度, case1 则值为角度,然后转换值赋给 我们需要的显示出来:还是如上手动添加一个函数:void sanjiaoHanshu(); 但是此时我们还需要 PI ,但是我们不能直接得到所以在这之前我们 需要添加成员变量 m_PI, 并赋予初值 m_PI=3.14159265358979323846; 代码如下:/ 用来抉择结果,是弧度还是角度
void CdckCalculatorDlg::sanjiaoHanshu(void )
{
switch (m_duType)
{case 0:
m_second=m_second;
break ;
case 1:
m_second=m_second*m_PI/180;
break ;
}
}
16. 编辑其他函数的代码:
//
void CdckCalculatorDlg::OnBnClickedExp()
{
m_second=exp(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClicked10x() {
m_second=pow(10,m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedCos() {
sanjiaoHanshu();
m_second=cos(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedSin() {
sanjiaoHanshu();
m_second=sin(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedLn() {
m_second=log(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedLog() {
m_second=log10(m_second); UpdateDisplay(m_second);
}
//
{
sanjiaoHanshu();
m_second=acos(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedArcsin() {
sanjiaoHanshu();
m_second=asin(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedTan() {
sanjiaoHanshu();
m_second=tan(m_second);
UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedArctan() {
sanjiaoHanshu();
m_second=atan(m_second); UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedCosh() {
sanjiaoHanshu();
m_second=cosh(m_second); UpdateDisplay(m_second);
}
//
{m_second=sinh(m_second);
UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClickedTanh()
{
sanjiaoHanshu();
m_second=tanh(m_second);
UpdateDisplay(m_second);
}
//
void CdckCalculatorDlg::OnBnClicked2dex()
{
m_second=pow(2,m_second);
UpdateDisplay(m_second);
}
17. 现在来看 x^y 我们需要先得到 然后点击 x^y按钮后再得到 y , 在点击“ =”按钮后得到结果:步骤:如上添加变量 bool 型 isXY 默认为 false , 再添加一个中间变量 double temp;当点击按钮的时候我 们将编辑框显示的结果赋值给 temp ,然后将 m_second设置为 0.0, 编辑框显示为 0.0,设置 isXY 为 ture 如下代码:
//
void CdckCalculatorDlg::OnBnClickedXdey()
{
temp=m_second;
m_second=0.0;
UpdateDisplay(0.0);
isXY=true ;
}
(再输入新数据,然后再按“ =”,所以在 =之前我们需要对 x^y做出 判断 如果按了则 isXY 为 ture , 则我们将上面的数字记下然后参与计 算,如果为 false 就不算:)
添加一个函数 void xDEy()
//用来判断是否点击了 “x^y” 按钮,点击了后又作何运算
void CdckCalculatorDlg::xDEy(void )
{
if (isXY){
m_second=m_second;
m_second=pow(temp,m_second);
}
}
然后在每次等于之前都调用一下这个函数, 如果点击了 x^y按钮则执 行里面的代码,所以“ =”的代码需要修改一下:
//
void CdckCalculatorDlg::OnBnClickedButtonEqual()
{
xDEy();
Calculate();
}
18.n 的阶乘:我们需要利用递归 , 如上添加函数 int jiecheng(int n)利用递归,返回阶乘值,代码如下:
int CdckCalculatorDlg::jiecheng(int n)
{
if (n==0||n==1){
return 1;
}else if (n>1){
return n*fun(n-1);
}
}
在 n! 的按钮消息处理里,
如果输入的不是整数则不能进行阶乘运算: //
void CdckCalculatorDlg::OnBnClickedNjiecheng()
{
if ((m_second-(int )m_second)>0){
m_display =_T(
UpdateData(false ); //如果是非整数,则结束运算,重新开始
return ;
}
else {
m_second=(double )jiecheng(m_second);
UpdateDisplay(m_second);
}
}
19. 所有按钮事件处理已经完成,编译运行:
计算器设计
昆明理工大学理学院 信技专业 课程设计报告
基于 c++builder的表达式计算器及播放器 软件设计
课程:程序设计
班级:信技 151
学号:
姓名:郭峰、魏兴宇
指导教师:张志坚
2016年 9 月 6日
程序设计综合训练 1 课程设计报告
目 录
1引言 ------------------------------------------------------------------------------- 1 1.1课题背景 -----------------------------------------------------------------2
1.2课程设计目的 -----------------------------------------------------------3
2需求分析 -------------------------------------------------------------------------5 2.2系统功能模块 -----------------------------------------------------------5
2.3设计要求 -----------------------------------------------------------------6
3系统实现 ------------------------------------------------------------------------8 3.1 对话框界面设计 -------------------------------------------------------8
3.2 数值计算功能的实现 -----------------------------------------------10
4程序关键代码及运行结果 -------------------------------------------------12 5总结与体会 ------------------------------------------------------------------15
一、引言
1.1 课题背景
计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、开方、求倒 数等简单运算的工具。要实现计算功能,可以用 VC++的知识编写程序来解决此 问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。 该计算器使用非常简单和方便, 对广大中小学生的学习有巨大帮助作用, 也对在 职人员的工作有点帮助作用 .
在计算器中加入了登录界面, 加强计算器你的安全性及保护数据,除此之外,强 大的工作压力很容易使人产生疲劳,所以可以加入音乐播放器功能。
1.2 课程设计目的
本课程是一门实践性很强的课程,既要熟练掌握相关概念,又要动手编程, 还要 上机调试运行。 同时, 本课程也注重提高学生编写技术文档和技术文档阅读的能 力。 学生通过本课程的学习实践, 将学习和强化软件开发的能力、 文档写作能力、 英语阅读能力、软件使用能力等。 为今后计算机编程的学习和工作打下良好、 扎 实的理论实践基础。
二、 需求分析
2.1系统功能模块
1)输入的符号,数字从左向右显示 ; 点击“ =”输出结果,在输出行显 示
2)支持加减乘除运算 ;
3) 支持“ x ?y ”的运算 ;
4) 括号“ (” “) ”的使用 ;
5)支持混合运算 ;
6)计算器的输入方式:支持鼠标点击计算器键输入 ;
7) 计算器计算结果的输出方式:在计算器窗口的输出行显示
8) 算数运算的数据类型:整数和浮点数 ;
9) 特殊情况的计算 ;
10)以上所有的运算都是在 10进制下进行 .
1)输入的符号,数字从右向左显示。
先输入“ 8”
再输入“×”
第 1 页
点击“ =”输出结果,在输出行显示 . 2) 支持加减乘除运算 .
a.
c. 减法计算
d. 除法运算(特殊情况见 10.B )
2) 支持求次方 (x ?y) 运算。
求次方 (x ?y) 运算:
“?”为次方 (x ?y) 在输入行中的显示符号
4) “ (” “) ”的使用。 (括号的使用)
要使用“ (” “) ”的时候,先点击“ (” ,再输入数字或符号,内容输入完毕 以后,点击“) ” ,完成“ (” “) ”的所有功能。
例如 :2×(2+2) =?
5) 支持混合运算。
例如:(5+2)×5=?
6) 计算器的输入方式:只支持鼠标点击计算器键输入 ;
7) 计算器计算结果的输出方式:在计算器窗口的输出行显示。
8) 算数运算的数据类型:整数和浮点数。
a. 输入行最大显示的字符数 32位,每个运算符算一位 ;
b. “ (” , “) ”各占一个字符位;
c. 输出行最大显示的字符数为 32位;
d. 纯小数显示的最大字符数为小数点后 30位,整数及小数点各占一位; 若纯小数为负数,则显示最大字符数为小数点后 29位, “ -”占一位;
e. 输入行在未输入任何数字的时候,显示“ 0” ,只占一个字符位;当输入任何 数字时。 “ 0”消失,输入的的数字取代“ 0” ;当输入任何运算符时。默认之前输
入数字“ 0” ;
f. 点击“ =”键后方可显示数字或字母或汉字。
9) 特殊情况的运算
A. 运算结果整数部分超出 32位,显示 Infinity (无穷大) ;出现运算异常!
B. 除数为 0的情况,提示用户被除数不能为零!
C .在运算时,若结果为纯小数,小数位超过 30位,则超出的字符舍弃。
若舍弃超出部位后,结果全为 0,则结果为 0
D .在运算时,若结果的整数位不为 0
a .总位数在最大字符位内,则直接显示;
b . 总位数在最大字符位以外,整数部分在最大字符位以内,则只优先显示 整数部位,弃掉 32位以后的字符
E .当用户输入“ ^0”时,若“ ^0”之前的算式或数字的值为 0,点击“ =”后, 输出界面显示“底数不能为 0”
10、以上所有的运算都是在 10进制下进行
2.2设计要求
(1) 了解 Windows 编程的基础知识,掌握 MFC 应用程序的基本知识。
(2) 理解需求分析过程,掌握需求分析文档编写。
(3) 理解面向对象程序设计的基本思路和方法。
(4) 掌握用 C++builder开发应用程序的一般步骤和方法。
(5) 掌握基于对话框的应用程序的编写,主要包括文本框和按钮等。
(6) 掌握后缀表达式算法。
(7) 掌握 C++builder开发工具的使用。包括资源管理,项目创建,运行调试等。
(8) 完成表达式的计算器应用程序,实现基本的加、减、乘、除等四则运算,且 支持包括括号的表达式运算功能。
三、系统实现
3.1对话框界面设计
3.2数值计算实现
例如 :2×(2+2) =?
四、程序关键代码及运行结果
//-------------------------------------------------------
--------------------
登录程序代码:
#include #pragma hdrstop #include #include #include #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::btnAddUserClick(TObject *Sender) { if(Users::adminLoginSuccess==false) { ShowMessage( } else { if(users.count>=users.MaxUser) ShowMessage( Form3->Show(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::btnCancelClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::btnChangePassClick(TObject *Sender) { if(Users::adminLoginSuccess==true) ShowMessage( else if(Users::userLoginSuccess==false) { ShowMessage( edtUserName->SetFocus(); } else Form2->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::btnOkClick(TObject *Sender) { Users::adminLoginSuccess=false; Users::userLoginSuccess=false; lblStatus->Caption= if(edtUserName->Text==adminName && edtPassword->Text==adminPass) { Users::adminLoginSuccess=true; Users::userLoginSuccess=false; lblStatus->Caption= } else for(int i=0;i<> { if(edtUserName->Text==users.user[i].name && edtPassword->Text==users.user[i].pass) { Users::userLoginSuccess=true; Users::adminLoginSuccess=false; lblStatus->Caption= users.cur=i; break; } } if(Users::userLoginSuccess==false && Users::adminLoginSuccess==false) ShowMessage( else { { if(Users::userLoginSuccess==true) { ShowMessage( } else if(Users::adminLoginSuccess==true) ShowMessage( edtUserName->Text= edtPassword->Text= } } // SendMessage(Form1->Handle,WM_PAINT,0,0); //用 于测试 // Application->ProcessMessages(); //用于测 试 edtUserName->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) { if(MessageDlg( TMsgDlgButtons()<> CanClose=false; edtUserName->SetFocus(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::edtUserNameKeyPress(TObject *Sender, char &Key) { Users::adminLoginSuccess=false; Users::userLoginSuccess=false; lblStatus->Caption= } //--------------------------------------------------------------------------- void __fastcall TForm1::edtPasswordKeyPress(TObject *Sender, char &Key) { Users::adminLoginSuccess=false; Users::userLoginSuccess=false; lblStatus->Caption= } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { lblHint->Caption= } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include #pragma hdrstop #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::btnOkClick(TObject *Sender) { if(edtPassword1->Text!=edtPassword2->Text) { ShowMessage( edtPassword2->SetFocus(); } else if(edtPassword1->Text== { ShowMessage( } else { users.user[Users::cur].pass=edtPassword1->Text; ShowMessage( Form2->Hide(); } } //--------------------------------------------------------------------------- void __fastcall TForm2::btnCancelClick(TObject *Sender) { edtPassword1->SetFocus(); Form2->Hide(); } //--------------------------------------------------------------------------- void __fastcall TForm2::FormHide(TObject *Sender) { edtPassword1->Text= edtPassword2->Text= } //--------------------------------------------------------------------------- void __fastcall TForm2::FormShow(TObject *Sender) { edtPassword1->SetFocus(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include #pragma hdrstop #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource TForm3 *Form3; //--------------------------------------------------------------------------- __fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm3::btnOkClick(TObject *Sender) { if(edtUserName->Text== { ShowMessage( edtUserName->SetFocus(); } else { if(users.count>=users.MaxUser) ShowMessage( { users.user[Users::count].name=edtUserName->Text; users.user[Users::count].pass=edtPassword1->Text; users.count++; ShowMessage( } Form3->Hide(); } } //--------------------------------------------------------------------------- void __fastcall TForm3::btnCancelClick(TObject *Sender) { Form3->Hide(); } //--------------------------------------------------------------------------- void __fastcall TForm3::FormShow(TObject *Sender) { edtUserName->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm3::FormHide(TObject *Sender) { edtUserName->Text= edtPassword1->Text= edtPassword2->Text= } //--------------------------------------------------------------------------- 计算器程序 //--------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource TForm4 *Form4; int temp1; float temp2; int flag; int append; //--------------------------------------------------------------------------- __fastcall TForm4::TForm4(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm4::FormCreate(TObject *Sender) { Edit1->Clear(); temp1=0; temp2=0; flag=0; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button1Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button1->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button2Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button2->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button3Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button3->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button4Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button4->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button5Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button5->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button6Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button6->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button7Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button7->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button8Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button8->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button9Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button9->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button10Click(TObject *Sender) { Edit1->Text=Edit1->Text+Button10->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button12Click(TObject *Sender) { Edit1->Clear(); temp1=0; temp2=0; flag=0; } //--------------------------------------------------------------------------- void __fastcall TForm4::Button13Click(TObject *Sender) { flag=1; temp1=StrToInt(Edit1->Text); Edit1->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm4::Button14Click(TObject *Sender) { flag=2; temp1=StrToInt(Edit1->Text); Edit1->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm4::Button15Click(TObject *Sender) { flag=3; temp1=StrToInt(Edit1->Text); Edit1->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm4::Button16Click(TObject *Sender) { flag=4; temp1=StrToInt(Edit1->Text); Edit1->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm4::Button11Click(TObject *Sender) { switch(flag) { case 1:temp2=StrToFloat(temp1)+StrToFloat(Edit1->Text); break; case 2:temp2=StrToFloat(temp1)-StrToFloat(Edit1->Text); break; case 3:temp2=StrToFloat(temp1)*StrToFloat(Edit1->Text); break; case 4:temp2=StrToFloat(temp1)/StrToFloat(Edit1->Text); break; } Edit1->Text=FloatToStr(temp2); } //--------------------------------------------------------------------------- void __fastcall TForm4::H1Click(TObject *Sender) { ShowMessage( } //--------------------------------------------------------------------------- void __fastcall TForm4::A1Click(TObject *Sender) { ShowMessage( } //--------------------------------------------------------------------------- void __fastcall TForm4::C1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm4::btn1Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(sqrt(StrToFloat(Form4->Edit1 ->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn8Click(TObject *Sender) { { if(Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(StrToFloat(Form4->Edit1->Te xt)/100); append= 1; } } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn9Click(TObject *Sender) { if(Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(1/StrToFloat(Form4->Edit1-> Text)); append= 1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn10Click(TObject *Sender) { if(Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(StrToFloat(Form4->Edit1->Te xt)*StrToFloat(Form4->Edit1->Text)); append= 1; } //--------------------------------------------------------------------------- void __fastcall TForm4::btn11Click(TObject *Sender) { if(Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(StrToFloat(Form4->Edit1->Te xt)*StrToFloat(Form4->Edit1->Text)*StrToFloat(Form4->Edit1 ->Text)); append= 1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn7Click(TObject *Sender) { Edit1->Text=Edit1->Text+btn7->Caption; } //--------------------------------------------------------------------------- void __fastcall TForm4::btn2Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(sin(StrToFloat(Form4->Edit1->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn3Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(cos(StrToFloat(Form4->Edit1->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::btn4Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(tan(StrToFloat(Form4->Edit1->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::Button17Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(abs(StrToFloat(Form4->Edit1->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::Button18Click(TObject *Sender) { if (Form4->Edit1->Text!= { Form4->Edit1->Text=FloatToStr(exp(StrToFloat(Form4->Edit1->Text))); append=1; } } //--------------------------------------------------------------------------- void __fastcall TForm4::Button19Click(TObject *Sender) { Form5->Show(); } //--------------------------------------------------------------------------- 播放器代码: //--------------------------------------------------------------------------- #include #pragma hdrstop #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button1->Enabled=true; Button2->Enabled=false; MediaPlayer1->AutoEnable=true; //Timer2->Enabeld->ture; //Form1->Edit1->Enabeld->false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { MediaPlayer1->Close(); OpenDialog1->Title= if(OpenDialog1->FileName!= { MediaPlayer1->FileName=OpenDialog1->FileName; MediaPlayer1->Open(); MediaPlayer1->DeviceType=dtWaveAudio; ProgressBar1->Min=0; ProgressBar1->Max=MediaPlayer1->Length; Timer1->Enabled=true; Button2->Enabled=true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { MediaPlayer1->Stop(); Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { ProgressBar1->Position=MediaPlayer1->Position; } //--------------------------------------------------------------------------- void __fastcall TForm1::btn1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- 五、总结与体会 程序大致需要三个部分, 首先,就是计算器的图形界面,然后就是它的逻辑 设计,和计算方法的判断, 最主要的是关于计算器加减乘除的简单运算, 最后就 是求计算结果。然后按照这个大体方向把每一步都具体化就得到了完整的程序。 其中也遇到的一些困难, 如看不懂程序代码所表达的含义, 和对一些专业的术语 比较生硬,最后, 在验收时候不知道什么是代码的缩进, 在老师的讲解下我们就 懂的了怎么缩进,让代码看起来整洁美观!这让我看到了只是无处不在,在老师 和同学的帮助下基本问题都解决了,体验到做事要有耐心,细心, 勤动手和勤思 考,才能从这次课程设计中体味到收获的快乐! 这次的课程设计做的是设计一个简易的计算器和用户登录界面和一个播放 器, 把计算器所需要的都罗列出来, 通过本章图形用户界面设计和前几章节所学 的知识加以巩固, 使我对 GUI 标准组件更加理解, 能更熟练的运用 GUI 标准组件 和布局管理器,正确合理地利用常用 c++builder组件进行图形界面的设计。 这次实践加深了我对面向对象程序设计的理论、 方法和基础知识的理解, 能 更轻松的掌握使用 c++语言进行面向对象设计的基本方法,提高运用面向对象知 识分析实际问题、解决实际问题的能力。同时这也是检验自己在这学期里对 c++这门课程学习情况, 并对接下来的考试有所帮助, 是我在这门课程中了解到那些 是我遗漏和疏忽的地方,以便我加深对着门实验课程的了解。 通过这次课程实践,我不仅仅学到的是 c++技术及其应用的基础知识,而还 学到了一些实践动手能力!比如,在程序验收过程中,虽然做好了充分的准备, 查代码,问同学,查资料,整理资料,看到密密麻麻的注释,有种收获感,但由 于没听懂老师的要求, 理解有些偏差, 还记着老师说要关闭所有程序, 重新打开, 由于紧张,操作动作有点慢,心里就暗自告诉自己,淡定,同时这让我深刻明白 了严师出高徒,和在任何场合下都要像老师那样严谨,严肃。做事要认真严谨, 细心耐心,只有一颗认真的、努力的心,就会体会到那份充实和快乐! 转载请注明出处范文大全网 » LABVIEW设计计算器