简单计算器可视化程序编程
VB简易计算器代码
VB简易计算器代码以下是一个简单的VB计算器代码:```Public Class Form1Dim firstNum As Double ' 第一个数字Dim secondNum As Double ' 第二个数字Dim operation As Integer ' 1-加法,2-减法,3-乘法,4-除法Private Sub Button0_Click(sender As Object, e As EventArgs) Handles Button0.ClickTextBoxResult.Text = TextBoxResult.Text & "0"End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickTextBoxResult.Text = TextBoxResult.Text & "1"End SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickTextBoxResult.Text = TextBoxResult.Text & "2"End SubHandles Button3.ClickTextBoxResult.Text = TextBoxResult.Text & "3"End SubPrivate Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.ClickTextBoxResult.Text = TextBoxResult.Text & "4"End SubPrivate Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.ClickTextBoxResult.Text = TextBoxResult.Text & "5"End SubPrivate Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClickTextBoxResult.Text = TextBoxResult.Text & "6"End SubPrivate Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.ClickTextBoxResult.Text = TextBoxResult.Text & "7"End SubHandles Button8.ClickTextBoxResult.Text = TextBoxResult.Text & "8"End SubPrivate Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.ClickTextBoxResult.Text = TextBoxResult.Text & "9"End SubPrivate Sub ButtonDot_Click(sender As Object, e As EventArgs) Handles ButtonDot.ClickIf Not TextBoxResult.Text.Contains(".") ThenTextBoxResult.Text = TextBoxResult.Text & "."End IfEnd SubPrivate Sub ButtonAdd_Click(sender As Object, e As EventArgs) Handles ButtonAdd.ClickfirstNum = Double.Parse(TextBoxResult.Text)TextBoxResult.Text = ""operation = 1End SubPrivate Sub ButtonSubtract_Click(sender As Object, e As EventArgs) Handles ButtonSubtract.ClickfirstNum = Double.Parse(TextBoxResult.Text)TextBoxResult.Text = ""operation = 2End SubPrivate Sub ButtonMultiply_Click(sender As Object, e As EventArgs) Handles ButtonMultiply.ClickfirstNum = Double.Parse(TextBoxResult.Text)TextBoxResult.Text = ""operation = 3End SubPrivate Sub ButtonDivide_Click(sender As Object, e As EventArgs) Handles ButtonDivide.ClickfirstNum = Double.Parse(TextBoxResult.Text)TextBoxResult.Text = ""operation = 4End SubPrivate Sub ButtonClear_Click(sender As Object, e As EventArgs) Handles ButtonClear.ClickTextBoxResult.Text = ""End SubPrivate Sub ButtonEquals_Click(sender As Object, e As EventArgs) Handles ButtonEquals.ClickDim result As DoublesecondNum = Double.Parse(TextBoxResult.Text)Select Case operationCase 1result = firstNum + secondNumCase 2result = firstNum - secondNumCase 3result = firstNum * secondNumCase 4result = firstNum / secondNumEnd SelectTextBoxResult.Text = result.ToStringEnd SubEnd Class```这个计算器包括数字按钮0-9、小数点按钮、加法、减法、乘法、除法和等于按钮。
java swing实现简易计算器
简易计算器【案例介绍】1.案例描述本案例要求利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。
2.运行结果运行结果【案例目标】●学会分析“简易计算器”程序实现的逻辑思路。
●能够独立完成“简易计算器”程序的源代码编写、编译及运行。
●掌握Java Swing界面编程的应用。
●了解计算器逻辑运算实现。
【案例分析】要制作一个计算器,首先要知道它由哪些部分组成,如下图所示:一个简单的图形化界面计算器,需要由界面组件、组件的时间监听器和具体的事件处理逻辑组成。
实现一个简易图形化界面计算器可分以下几个步骤:1.UI组件创建和初始化:包括窗体的创建,显示计算结果文本框、清除按钮、数字按钮、运算符等按钮的初始化。
2.在窗体中添加UI组件:包括放置数字键及运算符面板、放置清除框面板。
3.布局结束之后,就是计算器的难点:编写事件处理程序。
4.按键的响应实现。
5.计算逻辑的实现。
6.注册监听器【案例实现】Calculator.java1 package chapter1102;2 import java.awt.*;3 import java.awt.event.*;4 import javax.swing.*;5 import java.util.Vector;6 import java.math.BigDecimal;7 public class Calculator {8 // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0。
9 String str1 = "0";10 // 操作数211 String str2 = "0";12 // 运算符13 String signal = "+";14 // 运算结果15 String result = "";16 // 以下k1至k5为状态开关17 // 开关1用于选择输入方向,将要写入str1或str218 // 为 1 时写入 str1,为 2 时写入 str219 int k1 = 1;20 // 开关 2 用于记录符号键的次数21 // 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算22 int k2 = 1;23 // 开关3用于标识 str1 是否可以被清 024 // 等于 1 时可以,不等于1时不能被清025 int k3 = 1;26 // 开关4用于标识 str2 是否可以被清 027 // 等于 1 时可以,不等于1时不能被清028 int k4 = 1;29 // 开关5用于控制小数点可否被录入30 // 等于1时可以,不为1时,输入的小数点被丢掉31 int k5 = 1;32 // store的作用类似于寄存器,用于记录是否连续按下符号键33 JButton store;34 //vt 存储之前输入的运算符。
简易计算器代码
button[10] = new QPushButton(buttontext[10],this,buttontext[10]); // “—”
button[10]->setFixedSize(BUTTONWIDTH,BUTTONHEIGHT);
edit->setText(tr("%1").arg(0)); //这个函数可获取文本编辑框中光标的位置,并显示在状态栏中
//setText(tr(“%1行%2列”).arg(rowNum).arg(colNum));
initialize(); //调用初始化函数
}
void CWidget::initialize()
cwidget.cpp
#include "cwidget.h"
#define KEY_CLR "CLR"
#define KEY_ADD "+"
#define KEY_SUB "-"
#define KEY_MUL "*"
#define KEY_DIV "/"
#define KEY_EQ "="
#define KEY_0 "0"
{
delete edit;
delete *button;
delete mainLayout;
delete topLayout;
delete bottomLayout;
}
void CWidget::calculate() //响应按键“=”,调用计算功能
简单计算器可视化程序编程
简单计算器一、基本功能描绘二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算科学计算函数,包括( 反 ) 正弦、 ( 反) 余弦、 ( 反 ) 正切、 ( 反 ) 余切、开方、指数等函数运行以角度、弧度两种方式实现上述部分函数具备历史计算的记忆功能对不正确的表达式能指出其错误原因二、流程图输入数据子函数编写框关系变量m_num=0键入一个数N可否为正数?Ym_num m_num=10*m_num+i=10*m_num-i可否为小数?Y复原 m_numN依照小数点后位数将键入的数除以 n 次 10 累加到 m_numY连续键入数字?N用 UpdateData(FALSE) 刷新显示图 1 输入数据子函数流程图图 2三、设计步骤翻开 Microsoft Visual C++ 6.0 , 在文件中点击新建,在弹出框内选择MFC AppWizard[exe] 工程,输入工程名Calculter及其所在位置,点击确定,如图3所示。
将弹出这样,图 3 新建 MFC AppWizard[exe] 工程MFC AppWizard-step 1对话框,选择基本对话框,点击达成,如图图 4 基本对话框MFC AppWizard 就成立了一个鉴于对话窗口的程序框架,如图图 5 新建的对话框4 所示。
5 所示。
四、界面设计1、创立控件在图 5 所示的 Resoure View 选项卡中翻开Dialog 资源组,双击IDD_CALCULATOR_DIALOG,在右边的窗口中显示出待编写的对话框。
开始摆放控件,包括编写框和按钮的创立。
按钮的创立1)在图 5 中 Controls 的“编写框”按钮上单击鼠标左键,在对话框编写窗口上合适的地点按下鼠标左键并拖动鼠标画出一个大小合适的编写框。
在编写框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit 属性对话框,如图 6 所示,在该对话框中输入ID 属性。
简易计算器小程序使用微信小程序开发工具和JavaScript开发
简易计算器小程序使用微信小程序开发工具和JavaScript开发微信小程序是一种基于微信平台的轻量级应用程序,可以在微信中使用。
它具有开发简便、使用方便、功能丰富等特点,在各行各业都得到了广泛的应用。
本文将介绍如何使用微信小程序开发工具和JavaScript开发一个简易计算器小程序。
一、准备工作在开始开发之前,我们需要准备一些基本的工具和环境。
首先,下载并安装微信小程序开发工具,该工具提供了一个可视化的界面,方便我们进行小程序的开发和调试。
其次,我们需要熟悉JavaScript语言的基本语法和特性,因为小程序的逻辑部分主要使用JavaScript来实现。
二、创建小程序项目打开微信小程序开发工具,点击新建项目,填写项目名称、项目目录和AppID等信息。
点击确定后,工具会自动生成一个基本的小程序项目结构。
三、编写界面在小程序项目的根目录下,找到和页面相关的文件夹。
新建一个名为"calculator"的文件夹,用于存放计算器页面的相关文件。
在该文件夹下新建三个文件:calculator.wxml、calculator.wxss、calculator.js,分别用于编写页面的结构、样式和逻辑。
在calculator.wxml文件中,我们可以使用一些基本的标签来构建计算器的界面,例如view、text、button等。
使用这些标签,我们可以创建一个包含数字键盘和运算符键的界面。
在calculator.wxss文件中,我们可以设置各个标签的样式,使界面看起来更加美观。
可以设置按钮的背景色、边框样式等。
四、编写逻辑在calculator.js文件中,我们需要编写计算器的逻辑代码。
首先,我们需要定义一些变量来保存计算器的状态。
比如,一个变量用于保存用户输入的表达式,一个变量用于保存计算结果等。
然后,我们可以通过监听用户的点击事件来获取用户输入的数字和运算符,并更新表达式变量的值。
接下来,我们需要编写一个计算函数,用于根据用户输入的表达式计算结果。
matlab-GUI-设计(简易科学计算器)
MATLAB大作业班级:姓名:学号:计算器➢题目本题目通过MATLAB的gui程序设计较为简单,在gui设计中主要用到三种控件,文本编辑框(edit text),静态文本框(Static text),命令按钮(push button)。
然后在通过各个按钮的回调函数,实现简单的计算功能。
➢1、功能介绍(1)具有友好的用户图形界面。
实现十进制数的加、减、乘、除、乘方、开方等简单计算。
(2)具有科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行。
(注:三角函数计算的是弧度而不是角度)。
(3)有清除键,能清除操作。
➢2、功能实现程序由两个部分组成:MATLAB代码(.m文件)和GUI图形(.fig)。
程序使用的流程:直接利用图形界面中的按键键入所需数值、运算符等即可得出结果。
备注:软件版本:MATLAB 2011b首先用MATLAB GUI功能,在绘制一个静态文本框和一个文本编辑框,以及33个命令按钮,调整好各控件大小、颜色,整体布局如图所示:(附录中有相关属性修改介绍)然后通过双击各个按钮来改写其属性,在m文件中编写其回调函数,最后在运行调试。
2.1 各功能界面设计GUI设计界面:注:底部边框用(Panel)工具添加,有两种设计顺序。
(1、先加底部边框,再在底部边框上画功能键。
2、先画功能键,布好局,画底框,全选功能键拖动到底框上。
)2.2 各功能模块实现(可根据需要增减功能键)算法设计:1. 数字键设计:0—9以及小数点函数都一样,只是参数不同:例如:按键‘1’响应:global jjtextString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','1') ;elsetextString =strcat(textString,'1');set(handles.text1,'String',textString)endjj=0;2. 四则运算函数:‘+’功能响应:textString = get(handles.text1,'String');textString =strcat(textString,'+');set(handles.text1,'String',textString)‘-’功能响应:textString = get(handles.text1,'String');textString =strcat(textString,'-');set(handles.text1,'String',textString)‘×’功能响应:textString = get(handles.text1,'String');textString =strcat(textString,'*');set(handles.text1,'String',textString)‘÷’功能响应:textString = get(handles.text1,'String');textString =strcat(textString,'/');set(handles.text1,'String',textString)3. 科学计算函数:例如:‘sin’功能响应:textString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)set(handles.text1,'String','0.') ;elsea = strread(textString, '%f');a=sin(a);set(handles.text1,'String',a)end4. 退格键(DEL):通过取屏幕值,计算出其字符长度,然后取其前N-1项的值来实现退格:global jjtextString = get(handles.text1,'String');if(strcmp(textString,'0.')==1)&(jj==0)set(handles.text1,'String','0.') ;elsess=char(textString);l=length(textString);textString=ss(1:l-1);set(handles.text1,'String',textString)endjj=0;5. 清屏键函数(AC):set(handles.text1,'String','0.') ;2.3 各模块程序添加方法选中一个需添加程序的功能键,右击,View Callbacks,Callback,出现如下图所示界面。
可视化计算器c语言代码
可视化计算器c语言代码好的,这是一个简易计算器的可视化界面的示例代码,使用`Graphics.h`库实现:```c#include <graphics.h>#include <conio.h>#include <stdio.h>int main() {int gd = DETECT, gm;initgraph(&gd, &gm, "");int x, y, a, b;char c;// 设置文本和背景颜色为白色setcolor(WHITE);// 设置文本方向为水平方向settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);// 在屏幕上输出提示信息和输入框outtextxy(100, 100, "Enter the first number: ");scanf("%d", &a);outtextxy(100, 150, "Enter the second number: ");scanf("%d", &b);setcolor(YELLOW);outtextxy(100, 200, "Choose an operation (+, -, *, /): ");c = getch();// 根据用户选择的操作计算结果switch (c) {case '+':x = a + b;break;case '-':x = a - b;break;case '*':x = a * b;break;case '/':x = a / b;break;default:printf("Invalid operation.\n");return 0;}// 设置文本颜色为绿色setcolor(GREEN);outtextxy(100, 250, "The result is: ");printf("%d\n", x);getch();// 关闭图形界面closegraph();return 0;}```上述代码使用`initgraph()`函数初始化图形界面,在屏幕上显示了几个提示信息和输入框,然后根据用户选择的操作计算结果并输出。
可视化编程应用VisualBasic6.0课程设计
可视化编程应用VisualBasic6.0课程设计简介可视化编程是一种使用图形化界面设计程序的方式,它可以帮助程序员更快速、更直观地完成程序开发。
VisualBasic6.0是一款经典的可视化编程工具,它可以让开发者使用图形化界面完成各种小型应用程序的设计与开发。
本文将介绍如何利用VisualBasic6.0进行可视化编程的课程设计。
设计思路本次课程设计的主题是设计一个简单的计算器程序,要求用户可以输入两个数值,然后选择加、减、乘、除四种运算方式,最终输出计算结果。
为了实现这个程序,我们需要在VisualBasic6.0的窗体设计器中进行一些界面设计和代码编写。
界面设计首先,我们需要在VisualBasic6.0中创建一个新的窗体,然后在窗体上添加各种控件,包括文本框、标签、按钮等。
具体地,我们需要添加两个文本框用于输入数值,四个按钮用于进行四种运算操作,一个标签用于显示计算结果calculatorcalculator代码编写接下来,我们需要编写VisualBasic6.0代码,实现上述界面的实际功能。
具体地,我们需要在按钮的点击事件中添加代码,实现对应的加、减、乘、除四种运算操作。
代码如下:Private Sub cmdAdd_Click()' 加法运算Dim num1 As IntegerDim num2 As Integernum1 = Val(txtNum1.Text)num2 = Val(txtNum2.Text)lblResult.Caption = num1 + num2 End SubPrivate Sub cmdSub_Click()' 减法运算Dim num1 As IntegerDim num2 As Integernum1 = Val(txtNum1.Text)num2 = Val(txtNum2.Text)lblResult.Caption = num1 - num2 End SubPrivate Sub cmdMul_Click()' 乘法运算Dim num1 As IntegerDim num2 As Integernum1 = Val(txtNum1.Text)num2 = Val(txtNum2.Text)lblResult.Caption = num1 * num2 End SubPrivate Sub cmdDiv_Click()' 除法运算Dim num1 As IntegerDim num2 As Integernum1 = Val(txtNum1.Text)num2 = Val(txtNum2.Text)lblResult.Caption = num1 / num2End Sub代码逻辑比较简单,就是读取文本框中的数值,进行相应运算,最后将结果展示在标签中。
C语言实现简单计算器程序
C语⾔实现简单计算器程序这两天在看⼀个C语⾔写的计算器程序,做了不少的功夫,跟着作者⼀步步的进⾏完善,了解了许多细节性的东西,在此⾃⼰做个总结,加深⾃⼰对程序的印象,也算是梳理。
在该计算器程序,能进⾏加减乘除、sin、cos、exp等操作,同时能进⾏数值保存功能。
⽽该计算器使⽤逆波兰表⽰法。
即所有运算符都跟在操作数的后⾯,⽐如下列表达式:(1 - 2) * (4 + 5)采⽤逆波兰表⽰法表⽰为:1 2 - 4 5 + *逆波兰表达法中不需要圆括号,只要知道每个运算符需要⼏个操作数就不会引起歧义。
计算器程序实现很简单,具体原理如下:while(/* 下⼀个运算符或操作数不是⽂件结束指⽰符 */)if(/* 是数 */)/* 将该数压⼊到栈中 */else if (/* 是运算符 */)/* 弹出所需数⽬的操作数 *//* 执⾏运算 *//* 将结果压⼊到栈中 */else if (/* 是换⾏符 */)/* 弹出并打印栈顶的值 */else/* 出错 */在程序设计中,使⽤模块化思想,getop函数来进⾏读⼊,该函数返回⼀个标识,⽤来标识读⼊的是什么类型。
主循环体中根据该标识执⾏相应的动作。
以下是该程序:(我将所有函数和变量放在同⼀⽂件)#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读⼊的是数字#define NAME 'n' //标识读⼊的是字符串(函数名或⾮法字符串)#define ALPHA 26int getop(char []);void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执⾏相应的数学函数sin、cos、exp等int main(void){int type;int i, var = 0;double op1, op2,v;char s[MAXOP];double variable[ALPHA];for (i = 0; i < ALPHA; i++) //初始化⽤于保存数值的变量数组variable[i] = 0.0;while ((type = getop(s)) != EOF) //读取输⼊{switch (type){case NUMBER:push (atof(s));break;case NAME:mathfnc(s);break;case '+':push (pop() + pop());break;case '*':push (pop() * pop());break;case '-':op2 = pop();push (pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push (pop() / op2);elseprintf ("error: zero divisor\n");break;case '%':op2 = pop();if (op2 != 0.0)push (fmod(pop(), op2));elseprintf ("error: zero divisor\n");break;case '?': //打印栈顶元素op2 = pop();printf ("\t%.8g\n", op2);push (op2);break;case '=': //保存数值pop();if (var >= 'A' && var <= 'Z')variable[var - 'A'] = pop();elseprintf ("error: no variable name\n");break;case 'c':clear();break;case 'd': //复制栈顶元素op2 = pop();push(op2);push(op2);break;case 's': //交换栈元素op1 = pop();op2 = pop();push(op1);push(op2);case '\n':v = pop(); //v保存最后的⼀次结果printf ("\t%.8g\n", v);break;default:if (type >= 'A' && type <= 'Z')push(variable[type - 'A']);else if (type == '@') //输⼊的字符@表⽰最近⼀次结果值 push(v);elseprintf ("error: unknown command %s\n", s);break;}var = type;}return 0;}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f){if (sp < MAXVAL)val[sp++] = f;elseprintf ("error: stack full, can't push %g\n", f);}double pop(void){if (sp > 0)return val[--sp];else{printf ("error: statck empty\n");return 0.0;}}void clear(void){sp = 0;}void mathfnc (char s[]){double op2;if (strcmp (s, "sin") == 0)push(sin(pop()));else if(strcmp (s, "cos") == 0)push(cos(pop()));else if(strcmp (s, "exp") == 0)push(exp(pop()));else if(strcmp (s, "pow") == 0){op2 = pop();push (pow(pop(), op2));}elseprintf ("error: %s not supported\n", s);}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空⽩字符;s[1] = '\0';i = 0;if (islower(c)) //判断是否为⼩写字母,也即读取由⼩写字母组成的字符串 {while (islower(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);if (strlen (s) > 1)return NAME;elsereturn c;}if (!isdigit(c) && c != '.' && c != '-')return c;if (c == '-') //⽤于判断是负数还是减操作{if (isdigit(c = getch()) || c == '.')s[++i] = c;else{if (c != EOF)ungetch(c);return '-';}}if (isdigit(c)) //收集整数部分while (isdigit(s[++i] = c = getch()));if (c == '.') //收集⼩数部分while (isdigit(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}/* ----------------------------------------------------------- *//** 引⽤以下两个函数是因为:程序不能确定它已经读⼊的输⼊是否⾜够 ** 除⾮超前多读⼊⼀些输⼊,在本程序中,读⼊⼀些字符合成⼀个数字 ** 所以在看到第⼀个⾮数字字符之前,已经读⼊的数的完整性是不能确定的* 由于程序要超前读⼊⼀个字符,这样就导致最后⼜⼀个字符不属于当前所要读⼊的数*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch (int c){if (bufp >= BUFSIZE)printf ("ungetch: too many characters\n");elsebuf[bufp++] = c;}该程序虽然简单,但是还是存在⼀些⼩⼩的问题,⽐如没有数据时进⾏pop的话,会打印栈中⽆数据同时返回数值0.0,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。
用VB制作计算器
用VB制作计算器在VB编程语言中,可以使用Windows Forms应用程序来制作一个简单的计算器。
Windows Forms应用程序是VB的一种可视化编程工具,可以为用户提供一个图形用户界面。
首先,我们需要创建一个新的Windows Forms应用程序项目,并打开默认生成的Form1窗体。
接下来,我们可以使用Windows Forms控件来创建一个计算器的用户界面。
在Form1窗体上,我们可以添加一个TextBox控件用于显示计算结果,并设置其属性为只读。
```vbPrivate ReadOnly resultTextBox As TextBox = New TextBox```然后,我们可以添加一些Button控件来表示计算器的数字和操作符。
我们可以使用按钮的Click事件来处理用户的点击操作。
```vbPrivate ReadOnly buttons As List(Of Button) = New List(Of Button)```接下来,我们需要实现按钮的Click事件处理程序来执行相应的计算逻辑。
我们可以使用Eval函数来计算表达式的值,并将结果显示在TextBox中。
Private Sub Button_Click(sender As Object, e As EventArgs) Dim button As Button = TryCast(sender, Button)If button IsNot Nothing ThenDim buttonText As String = button.TextIf buttonText = "=" Then'计算表达式的值Dim expression As String = resultTextBox.TextDim value As Double = Eval(expression)resultTextBox.Text = value.ToStringElseIf buttonText = "C" Then'清空文本框resultTextBox.Text = ""Else'添加数字或操作符resultTextBox.Text += buttonTextEnd IfEnd IfEnd Sub最后,我们需要在窗体的构造函数或Load事件处理程序中将按钮和TextBox添加到窗体上。
C语言实现简单计算器功能(1)
C语⾔实现简单计算器功能(1)本⽂为⼤家分享了C语⾔实现简单计算器功能的具体⽅法,供⼤家参考,具体内容如下这⼏天⼀直上控制语句,在学完if、switch和循环语句后,为了巩固所学知识点,想给学⽣出⼀道简单的计算器程序。
题⽬如下:通过所学的知识(选择语句、循环语句)完成⼀个简单的计算器编程,要求不许抄袭,只能⽤⾃⼰所学的知识点,不可引⽤⽹上⾃⼰的不懂的程序。
要求的格式如下图:要求以这样的⼀种格式进⾏输出,并能通过选择完成不同的功能。
如:选择1,完成整数相加功能,算完后⼜能回到该页⾯。
经过分析,我简单的写了⼀段代码,代码如下:#include <stdio.h>void main(){while(1) // while循环操作,实现计算机功能提⽰{int a = 0;int x = 0;int y = 0;int result = 0;printf("****欢迎使⽤计算器****\n");printf("[1] 完成两个整数相加\n");printf("[2] 完成两个整数相减\n");printf("[3] 完成两个整数相乘\n");printf("[4] 完成两个整数取整\n");printf("[5] 完成两个整数取余\n");printf("[0] 退出计算器系统\n");printf("请选择:");scanf("%d",&a);if(a < 0 || a > 5) // 判断输⼊的是否在0~5范围内,不在输出错误提⽰{printf("选择有误,请重新选择!\n");continue;}elseif(0 == a) // 当输⼊为0时需要退出系统{printf("欢迎下次使⽤!\n");break;}switch(a) // 使⽤switch语句进⾏对每个功能的具体操作{case 1: // 加法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x+y;printf("结果为:%d\n",result);break;case 2: // 减法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x-y;printf("结果为:%d\n",result);break;case 3: // 乘法操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x*y;printf("结果为:%d\n",result);break;case 4: // 取整操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x/y;printf("结果为:%d\n",result);break;case 5: // 取余操作printf("请输⼊两个整数:");scanf("%d%d",&x,&y);result = x%y;printf("结果为:%d\n",result);break;default:break;}}}这样就能简单完成⼀个两个整数的计算器功能。
用python实现一个简单计算器(完整DEMO)
⽤python实现⼀个简单计算器(完整DEMO)⼀、功能⽬标⽤户输⼊⼀个类似 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)) 这样的表达式,假设表达式⾥⾯除了包含空格、'+'、'-'、'*'、'/'和括号再⽆其他特殊符号,然后⾃⼰动⼿写代码解析其中的表达式,实现加减乘除,最后得出的结果与真实的计算机所算的结果必须⼀致。
⼆、解题思路1、为了分开运算符和数字,因此把输⼊的字符串格式转换为列表的格式进⾏处理,这样⼦就可以按位进⾏处理了2、实现功能的核⼼点在于括号、乘除、加减的优先级排序,因此我们先想办法⼀层⼀层的去括号,即从最⾥层的括号开始计算,然后去掉第⼀层括号,然后⼀直继续这个过程,最后得到⼀个没有括号的列表,再进⾏计算得出结果3、去括号⽅式:最内层的括号内的表达式就可以当做⼀个⽆括号表达式,通过先运算出乘除,再运算出加减得出整个括号内的值,⽤这个结果值整体替换括号内的内容即实现了去⼀层括号,然后通过递归去除所有的括号4、去除乘除号⽅式:见 remove_multiplication_division(eq) 函数部分5、去除加减号⽅式:见 remove_plus_minus(eq) 函数部分三、函数说明1、主函数def caculator(eq):format_list = eq_format(eq) # 把字符串变成格式化列表形式s_eq = simplify(format_list) # 去括号,得到⽆括号的⼀个格式化列表ans = calculate(s_eq) # 计算最终结果if len(ans) == 2: # 判断最终结果为正数还是负数ans = -float(ans[1])else:ans = float(ans[0])return ans2、eq_format( )函数def eq_format(eq):''':param eq: 输⼊的算式字符串:return: 格式化以后的列表,如['60','+','7','*','8']'''format_list = re.findall('[\d\.]+|\(|\+|\-|\*|\/|\)',eq)return format_list2.1 这个函数的作⽤是把输⼊的算式通过re模块,⽤正则表达式把算术符号和数字分开。
设计一个简单的计算器界面
设计⼀个简单的计算器界⾯源程序:package next;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class jisuanqi extends JFrame {private int add=1,sub=2,mul=3,div=4;private int op=0;boolean ifOp;private String output="0";private Button[] jba=new Button[]{new Button("7"),new Button("8"),new Button("9"),new Button("+"),new Button("4"),new Button("5"),new Button("6"),new Button("-"),new Button("1"),new Button("2"),new Button("3"),new Button("*"),new Button("0"),new Button("."),new Button("="),new Button("/")};private JPanel jpt=new JPanel();private JPanel jpb=new JPanel();private JTextField jtf=new JTextField("");private jisuanqi(){jpt.setLayout(new BorderLayout());jpt.add(jtf);this.add(jpt,BorderLayout.NORTH);jpb.setLayout(new GridLayout(4,4));for(int i=0;i<jba.length;i++){jpb.add(jba[i]);if(i==3||i==7||i==11||i==15||i==14)jba[i].addActionListener(new setOperate_Act());elsejba[i].addActionListener(new setLabel_Act());}this.add(jpb,BorderLayout.CENTER);this.setSize(200, 200);this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}private void operate(String x){double x1=Double.valueOf(x);double y=Double.valueOf(output);switch(op){case 0:output=x;break;case 1:output=String.valueOf(y+x1);break;case 2:output =String.valueOf(y-x1);break;case 3:output =String.valueOf(y*x1);break;case 4:if(x1!=0) output=String.valueOf(y/x1);else output="不能为0";break;}}public String add(String x){operate(x);op=add;return output;}public String subtract(String x){operate(x);op=sub;return output;}public String multiply(String x){operate(x);op=mul;return output;}public String divide(String x){operate(x);op=div;return output;}public String Equals(String x){operate(x);op=0;return output;}public void opClean(){op=0;output="0";}class setOperate_Act implements ActionListener{public void actionPerformed(ActionEvent e) {}}class setLabel_Act implements ActionListener{public void actionPerformed(ActionEvent e) {}}public static void main(String[] args) {// TODO ⾃动⽣成的⽅法存根new jisuanqi();}}运⾏结果:实验⼼得:此次实验是设计⼀个计算器界⾯,没有让设计出来的这个计算器拥有计算的能⼒,但虽然是这样也让我废了好的功夫;其中界⾯的排序问题使⽤了for循环语句实现;最后别忘了还有让其可视化setvisible()。
简单计算器程序设计
《网络编程技术》结课论文2012 — 2013学年第二学期题目:简单计算器程序专业班级:网信10-2学号:************姓名:-----------指导老师:---------日期:2013-06-25目录1引言 (3)2基础理论 (3)2.1 AWT 组件 (3)2.2 Swing 组件 (3)2.3 java事件处理机制 (4)3 功能设计 (5)3.1计算器系统概述 (5)3.2功能模块设计 (6)3.3详细设计 (6)4 系统实现 (7)4.1需求分析 (7)4.2设计思路 (8)4.3主要代码展示及说明 (8)4.4调试与分析 (12)5 总结 (12)参考文献 (13)1引言近年来随着计算机和网络在社会领域的发展,java的应用正在不断地走向深入, Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。
Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。
Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。
特别是Java企业应用编程接口为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
本次设计是通过java编程技术来设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算,该计算器可以实现加法、减法、乘法、除法的简单运算,也可以实现一些简单的扩展运算,这次课程设计的主要目的在于检测对java 应用的熟练程度,发现问题并及时改正和提高,同时扩展对java知识的进一步了解和认识,强化自己的编程能力,为将来在新的旅途中能更好的发挥自身的才能!2基础理论2.1 AWT 组件布局管理器管理组件如何放置在容器中,AWT 中最常用的四种布局类:FlowLayout、BorderLayout、GridLayout、CardLayout。
本项目主要采用了GridLayout 布局。
C语言实现计算器,附源码,超简单!
20
// 下面这得注意,接收double型的数据得用lf%,接收float用f%
21
scanf("%lf",&x1);
22
23
printf("请输入运算操作(+ - * /):\n");
24
m = getche();
25
printf("\n");
26
27
printf("请输入第二个数:\n");
28
40
result = x1 - x2;
41
printf("%lf - %lf = %lf\n",x1,x2,result);
42
break;
43
44
case '*':
45
printf("乘法\n");
46
result = x1 * x2;
47
printf("%lf * %lf = %lf\n",x1,x2,result);
scanf("%lf",&x2);
29
30
switch(m)
31
{
32
case '+':
33
printf("加法\n");
34
result = x1 + x2;
35
printf("%lf + %lf = %lf\n",x1,x2,result);
36
break;
37
38
case '-':
C语言编写一个计算器界面(可视化界面和多功能)
C语⾔编写⼀个计算器界⾯(可视化界⾯和多功能)⽬录引⾔计算器总结引⾔在⼤学期间,C 语⾔或者数据结构等课程,⽼师会要求学⽣编写⼀个⼩项⽬练⼿,或者期末编写⼀个⼩软件等课程设计。
今天在电脑看到⼤⼀学C语⾔时,实验课上写的计算器功能,挺有意思。
所以在此分享给学C语⾔的学弟学妹,记得收藏保留!计算器简单版本计算器,主要实现的是简单两个数的加法,减法,乘法,除法,求余功能。
⽤户可以在主菜单选择需要计算的功能,然后根据⽤户输⼊的数字,进⾏计算,输出结果。
⾸先,我们定义五个⽅法,实现两个数的加法,减法,乘法,除法,求余功能。
代码如下:// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}然后定义⼀个打印主菜单界⾯的函数,使⽤简介美观的菜单界⾯,供⽤户选择要计算的功能,代码如下:// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n");printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}最后,我们在主函数 main 中,定义⼀个 while 循环代码块,不断读取⽤户输⼊的内容,进⾏数字计算,代码如下:int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n"); return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}下⾯我们演⽰⼏个例⼦,能更加直观体验计算器的功能:菜单功能选择错误,会提⽰重新选择加法除法退出简单版本计算器,完整代码如下:#include <stdio.h>#include <stdlib.h>// 加法float add(float a, float b) {return a + b;}// 减法float sub(float a, float b) {return a - b;}// 乘法float mul(float a, float b) {return a * b;}// 除法float mod(float a, float b) {return a / b;}// 求余int com(int a, int b) {return a % b;}// 打印主功能菜单void printMenu() {// 清屏// system("cls");printf("|----------------------- 计算器 -----------------------|\n");printf("| |\n");printf("| By -- 陈⽪的JavaLib |\n"); printf("| |\n");printf("|---------------------- 1:加法 -----------------------|\n");printf("|---------------------- 2:减法 -----------------------|\n");printf("|---------------------- 3:乘法 -----------------------|\n");printf("|---------------------- 4:除法 -----------------------|\n");printf("|---------------------- 5:求余 -----------------------|\n");printf("|---------------------- 6:退出 -----------------------|\n");printf("| |\n");printf("|----------------------- 计算器 -----------------------|\n");}/*** 简单版本计算器功能 By -- 陈⽪的JavaLib* @return*/int main() {// 选择的功能int select = 0;// 定义算术的两个数float a, b;while (select != 6){select = 0;// 打印主菜单printMenu();// 只允许选择菜单栏内的数字,不是则重新选择while (select < 1 || select > 6) {printf("请输⼊菜单功能(1-6):");scanf("%d", &select);}if (6 == select) {printf("\n|----------------- 欢迎使⽤计算器!再见!-----------------|\n");return 0;}printf("\n请输⼊两个数(⽤空格隔开两个数):");scanf("%f %f", &a, &b);switch (select) {case 1:printf("%f+%f=%f\n\n", a, b, add(a, b));break;case 2:printf("%f-%f=%f\n\n", a, b, sub(a, b));break;case 3:printf("%f*%f=%f\n\n", a, b, mul(a, b));break;case 4:printf("%f/%f=%f\n\n", a, b, mod(a, b));break;case 5:printf("%f/%f=%d\n\n", a, b, com((int)a, (int)b));break;case 6:default:break;}}}总结在⼤学期间,如果是计算机类的专业,⼀般都会学习 C 语⾔,作为编程⼊门语⾔,⼤家⼀定要学习好此门语⾔,⽽且如果学好了,其实学习其他编程语⾔就很容器上⼿的,不同语⾔其实⼤同⼩异,只要你编程思维提升了,基础语法掌握了,才能学习更加深⼊的知识。
C#编写简易计算器(附源代码)超详细
超详细因为计算器设计的控件太多,不便使用控制台应用程序完成,所以这里使用Windows窗体应用程序,并命名为Calc,如下图所示:向窗体中拖入需要的控件,如下图所示:(完成效果图)结果显示区(作者博客左边的文本框)是TextBox控件,并修改其name为txtShow,按键0~9 为Button 控件,并将其name分别修改为btn_O、btn_1、btn_2、btn_3、btn_4、btn_5、btn_6、btn_7、btn_8、btn_9;按键【负数】的name值修改为btn_sign,按键【.】的name修改为btn_dot,按键【+ - * / 】的name 值分别修改为btn_add、btn_sub、btn_mul、btn_div,按键【=】的name值修改为btn_equ,按键【倒数】的name值修改为btn_rev,按键【平方】的name值修改为btn_sqr,按键【开方】的name值修改为btn_sqrt。
右边的计算器图片空间是PictureBox ,作者博客控件是LinkLabel ,可以不添加,以上所有控件均可按照需求添加,只保留自己需要的按钮控件和textbox控件即可。
三、代码部分(含解释),采用switch多分支语句编写using System;using System.Drawing;using System.Collections;using ponentModel;usingusing System.Data;namespace Calc{/// <summary>///温柔一刀C#简易计算器的实现/// </summary>public class CalcFormForm{private Button btnprivate Button btnprivate Button btnprivate Button btnprivate Button btnprivate Button btn_5;private Button btn_6;private Button btn_7;private Button btn_8;private Button btn_9;private Button btn_add;private Button btn_sub;private Button btn_mul;private Button btn_div;private Button btn_sqrt;private Button btn_sign;private Button btn_equ;private Button btn_dot;private Button btn_rev;private TextBox txtShow;private Button btn_sqr;private PictureBox pictureBox1;private LinkLabel linkLabel1;/// <summary>/// 必需的设计器变量。
可视化编程课程设计(含源码)计算器系统实现
设计题目:计算器系统实现1.分别用API与MFC编程来实现计算器的以下功能。
2.实现计算器的基本功能:连续数据的无优先级混合运算(加减乘除)3.可以实现其他附加功能:优先级运算,加入括号,加入其他函数运算功能等。
(不在要求范围之内)4.要求界面良好,功能完整。
一.基于MFC的简单计算器1.设计思路打开MFC应用操作界面,布局计算器界面,利用组框将计算器界面分为三个部分,一个是编辑输入,一个是数字界面,一个是功能键部分。
利用布局参考线对齐按钮,使界面美观。
然后就是对各个按钮进行属性设置,关联类设置,接着对各个按钮进行源代码编程。
最后,调试找出问题,解决问题,运行MFC成品计算器。
2.简单操作以及功能说明由于本人技术有限,所以本程序只能按照正确的计算运算顺序进行,该简单计算器能进行四则混合运算,除了加减乘除外,添加了一个括号,对于有些未知的错误,由于时间有限,并未来得及全面测试使用。
该简单计算器能实现四则运算,退格运算,清零运算,并且支持输出的结果保留给直接的下一个运算。
3.系统实现的各个模块1)编辑框模块由于编辑框模块需要连续输入字符串,所以在给编辑框建立类向导时,给编辑框定义的成员变量应该是字符串(String)变量。
编辑框模块用于运算算式的输入,以及结果的输出。
2)数字键模块数字键模块比较简单,该简单计算器数字键模块设置有0~9数字,还设置有小数点,以及正负数转换实现按钮。
数字键模块按钮在建立类向导时无需定义成员变量,但是需要定义按钮响应链接,用于实现点击按钮,在编辑框上显示点击按钮信息。
3)功能键模块功能键模块包括加减乘除基本按钮,以及一个输入错误是后能用于退格功能的退格键按钮,还有一个用于区别优先级运算的括号功能,当然有最重要的计算结果输入按钮,等于号按钮。
在编辑框附近还有一个功能键,就是清除功能键,用于清除编辑框,以便实现下一轮输入。
4.设计过程1)设计总流程图2)界面的设计3)建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION MessageHandler IDD_JISUANQI_DIALOG 简易计算器N/AIDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_OPER_ADD + OnOperAdd IDC_OPER_SUB - OnOperSub IDC_OPER_MULTI * OnOperMulti IDC_OPER_DIV / OnOperDiv IDC_ADD_SUB +/- OnAddSubIDC_POINT . OnPointIDC_EQUAL = OnEqualIDC_LBRACKET ( OnLbracket1)数字键模块void CJiSuanQiDlg::OnNum0(){if(calculated == TRUE) //已经按了等号,不让其再接受字符return;UpdateData(TRUE);//刷新编辑框界面calcutateString += "0";//存储输入的数字m_data += "0";//显示输入的数字UpdateData(FALSE);}2)功能键模块①加法功能键源程序void CJiSuanQiDlg::OnOperAdd(){if(calculated == TRUE)///其前一步按了= 号{calculated = FALSE;m_data = oldResult;double temp = atof(oldResult);//定义临时变量存储上一步结果if(temp < 0){calcutateString = "0" + oldResult;}else{calcutateString = oldResult;}calcutateString += "+";//存储做完该功能后的结果m_data += "+";//显示该步骤完成的结果UpdateData(FALSE);}else ///前一步不是={UpdateData(TRUE);calcutateString += "+";//直接存储此步操作m_data += "+";//直接显示此步操作UpdateData(FALSE);}}②退格功能键源程序void CJiSuanQiDlg::OnBackspeace(){if(calculated == FALSE){UpdateData(TRUE);int count = m_data.GetLength();if(count >= 1)//判断是否能执行退格操作{m_data = m_data.Left(count -1);count = calcutateString.GetLength();calcutateString = calcutateString.Left(count -1);UpdateData(FALSE);}}}③清除功能键源程序void CJiSuanQiDlg::OnClear(){// TODO: Add your control notification handler code herem_data = "";oldResult = "";calcutateString = "";calculated = FALSE;UpdateData(FALSE);}④括号功能键源程序void CJiSuanQiDlg::OnLbracket(){// TODO: Add your control notification handler code hereif(calculated == TRUE) ///已经按了等号,不让其再接受字符return;UpdateData(TRUE);calcutateString += "(";m_data += "(";UpdateData(FALSE);}⑤正负转换功能键源程序void CJiSuanQiDlg::OnAddSub(){// TODO: Add your control notification handler code hereif(calculated == FALSE){UpdateData(TRUE);calcutateString = calcutateString + "0" + "-";m_data += "-";UpdateData(FALSE);}}6.运行结果界面截图7.制作过程中所遇问题以及解决方法过程1)源代码编写错误通过查阅资料,请教同学,逐步一一解决。
python简易计算器程序代码
python简易计算器程序代码下面是一个简易的计算器程序的Python代码:```pythondef add(num1, num2):return num1 + num2def subtract(num1, num2):return num1 - num2def multiply(num1, num2):return num1 * num2def divide(num1, num2):if num2 != 0:return num1 / num2else:return "除数不能为零"def calculator(:print("欢迎使用简易计算器!")while True:print("请选择操作:")print("1. 加")print("2. 减")print("3. 乘")print("4. 除")print("0. 退出")choice = input("请输入操作编号:")if choice == "0":print("感谢使用简易计算器!")breaknum1 = float(input("请输入第一个数字:")) num2 = float(input("请输入第二个数字:")) if choice == "1":result = add(num1, num2)print("结果:", result)elif choice == "2":result = subtract(num1, num2)print("结果:", result)elif choice == "3":result = multiply(num1, num2)print("结果:", result)elif choice == "4":result = divide(num1, num2)print("结果:", result)else:print("无效的操作编号,请重新输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单计算器一、基本功能描述二进制、八进制、十进制及十六进制数的加、减、乘、除、乘方、取模等简单计算科学计算函数,包括(反)正弦、(反)余弦、(反)正切、(反)余切、开方、指数等函数运行以角度、弧度两种方式实现上述部分函数具备历史计算的记忆功能对不正确的表达式能指出其错误原因二、流程图输入数据子函数图1 输入数据子函数流程图图2三、设计步骤打开Microsoft Visual C++ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名Calculter及其所在位置,点击确定,如图3所示。
图3 新建MFC AppWizard[exe]工程将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4所示。
图4 基本对话框这样,MFC AppWizard就建立了一个基于对话窗口的程序框架,如图5所示。
图5 新建的对话框四、界面设计1、创建控件在图5所示的Resoure View选项卡中打开Dialog资源组,双击IDD_CALCULATOR_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建1)在图5中Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷莱单中选择属性选项,此时弹出Edit属性对话框,如图6所示,在该对话框中输入ID属性。
图6 Edit属性对话框2)在图3中Controls的“Button”按钮上单击鼠标左键,在对话框上的合适的位置上按下鼠标左键并拖动鼠标画出一个大小合适的下压式按钮。
在按钮上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时也弹出Push Button属性对话框,如图7所示,在该对话框中输入控件的ID值和标题属性。
图7 Push Button属性按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表1 各按钮和编辑框等对象的属性完成后界面如图8所示。
图8 计算器界面五、计算器源程序代码// Calculation.cpp: implementation of the CCalculation class.//////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Calculator.h"#include "Calculation.h"#include "math.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif#define FUNCNUM 15 //函数个数#define CONSTNUM 11 //常数个数#define PI 3.14159//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CCalculation::CCalculation(){//初始化函数和常数m_bDegree=0;m_nOutputFlag=0;opt[0]="e^";opt[1]="ch";opt[2]="sqr";opt[3]="sh";opt[5]="cos";opt[6]="sin";opt[7]="tan";opt[8]="ln";opt[9]="abs";opt[10]="at";opt[11]="as";opt[12]="ac";opt[13]="th";opt[14]="cot";opt2[0]='^';opt2[1]='/';opt2[2]='*';opt2[3]='%';opt2[4]='+';opt2[5]='-';m_strConValue[1]="9.80665"; m_strConName[1]="GG";m_strConValue[2]="(8.988*10^9)"; m_strConName[2]="EF";m_strConValue[3]="0.02241383"; m_strConName[3]="VM";m_strConValue[4]="(1.380662*10^(-23))"; m_strConName[4]="BC";m_strConValue[5]="8.3144"; m_strConName[5]="MG";m_strConValue[6]="(6.6720*10^(-11))"; m_strConName[6]="GR";m_strConValue[7]="(6.022045*10^23)"; m_strConName[7]="NA";}CCalculation::~CCalculation(){}bool CCalculation::IsDigital(CString str){while(str.GetAt(0)=='-') str.Delete(0);for(int i=0;i<FUNCNUM;i++) if(str.Find(opt[i])!=-1) return 0;for(i=0;i<6;i++) if(str.Find(opt2[i])!=-1) return 0;return 1;}CString CCalculation::NtoS(double d){int decimal, sign;char *buffer;buffer = _ecvt( d, 16, &decimal, &sign );CString str=buffer;if(decimal>=0 && decimal<=16) str.Insert(decimal,".");else if(decimal>16){for(int i=str.GetLength();i<decimal;i++) str+="0";else{for(int i=0;i<-decimal;i++) str.Insert(0,"0");str.Insert(0,".");}if(sign==1) str.Insert(0,"-");return str;}double CCalculation::StoN(CString str){char *stopstring;double x;x = strtod( str.GetBuffer(0), &stopstring );m_strTmp=stopstring;return x;}CString CCalculation::TwoE(CString strExp){double x2,y,x1=StoN(strExp);strExp=m_strTmp;char op=strExp.GetAt(0);strExp.Delete(0);x2=StoN(strExp);if(m_strTmp!="") return "ERROR_"+m_strTmp+"未知符号_";if(op=='+') {y=x1+x2;}else if(op=='*') {y=x1*x2;}else if(op=='-') {y=x1-x2;}else if(op=='^') {y=pow(x1,x2);}else if(op=='/') {y=x1/x2;}else if(op=='%') {y=fmod(x1,x2);}else return "ERROR_"+m_strTmp+"未知运算符_";return NtoS(y);}CString CCalculation::SingleE(CString op,double dx){if(op=="ln"){return NtoS(log(dx));}else if(op=="log"){return NtoS(log10(dx));}return NtoS(sqrt(dx));}else if(op=="e^"){return NtoS(exp(dx));}else if(op=="abs"){return NtoS(fabs(dx));}else if(op=="ac"){return NtoS(acos(dx)); }else if(op=="as"){return NtoS(asin(dx));}else if(op=="at"){return NtoS(atan(dx));}if(m_bDegree) dx=dx*PI/180; if(op=="tan"){return NtoS(tan(dx));}else if(op=="sin"){return NtoS(sin(dx));}else if(op=="cos"){return NtoS(cos(dx));}else if(op=="cot"){return NtoS(1/tan(dx)); }else if(op=="sh"){return NtoS(sinh(dx));}return NtoS(cosh(dx));}else if(op=="th"){return NtoS(sinh(dx)/cosh(dx));}else if(op=="exp"){return NtoS(pow(10,dx));}return "ERROR"+op+"_未知函数_";}int CCalculation::LocateLBra(CString strExp){int len=strExp.GetLength();int pos=-1;for(int i=0;i<len;i++){if(pos>=0 && strExp.GetAt(i)==')') break;if(strExp.GetAt(i)=='('){pos=i;}}return pos;}void CCalculation::DelBracket(CString *strExp){int pos=LocateLBra(*strExp);int i,len=strExp->GetLength();if(pos==-1) {*strExp="ERROR_无效表达式_";return;}for(i=pos;i<len;i++) if(strExp->GetAt(i)==')') break;CString str;str=strExp->Mid(pos+1,i-pos-1);MultiE(&str);strExp->Delete(pos,i-pos+1);strExp->Insert(pos,str);}void CCalculation::MultiE(CString *strExp){if(strExp->IsEmpty()) *strExp="ERROR_函数表达式为空_";if(IsDigital(*strExp)) {return;}while(1)/*处理所有的一元运算*/for(int i=0;i<FUNCNUM;i++){int pos=strExp->Find(opt[i]);if(pos!=-1){CString str=strExp->Right(strExp->GetLength()-pos-opt[i].GetLength());double dx=StoN(str);if(m_strTmp==str) {*strExp="ERROR"+str+"_无法识别的函数_";return;}strExp->Delete(pos,strExp->GetLength()-pos);*strExp+=SingleE(opt[i],dx)+m_strTmp;MinusMinus(strExp);if(pos>=1){char ch=strExp->GetAt(pos-1);if(ch>=48 && ch<=57){*strExp="ERROR_缺少二元运算符_";return;}}break;}}if(i==FUNCNUM) break;}//按运算符优先级处理二元运算int pos=-1;while(1){pos=strExp->Find('^');if(pos==-1) break;else Calcu(strExp,pos);}while(1){pos=strExp->Find('/');if(pos==-1) break;else Calcu(strExp,pos);}while(1){pos=strExp->Find('*');if(pos==-1) break;else Calcu(strExp,pos);}while(1){if(pos==-1) break;else Calcu(strExp,pos);}pos=0;if(strExp->GetAt(0)=='-' ||strExp->GetAt(0)=='+') strExp->Insert(0,"0"); while(1){int tmpos=strExp->Right(strExp->GetLength()-pos).Find('-');if(tmpos==-1) break;else pos+=tmpos;if(pos==0 && strExp->GetAt(pos+1)=='-' || pos>0){if(strExp->GetAt(pos+1)=='+'){strExp->Delete(pos+1);pos=0;continue;}/*********处理连减(如:----1)的情况***********/int nCount=0;while(1){if(++pos>0){if(strExp->GetAt(pos)!='-') break;else nCount++;}else break;}if(nCount>0){strExp->Delete(pos-nCount-1,nCount+1);if(nCount%2==0) strExp->Insert(pos-nCount-1,"-");else if(pos-nCount-1>0) strExp->Insert(pos-nCount-1,"+");pos=0;continue;}else pos--;/***********************************************/if(pos>0 && strExp->GetAt(pos-1)=='+'){pos++;continue;}Calcu(strExp,pos);}else pos++;}pos=0;while(1){pos=strExp->Find('+');// int tmpos=strExp->Right(strExp->GetLength()-pos).Find('+');if(pos==-1) break;// else pos+=tmpos;if(pos==0 && strExp->GetAt(pos+1)=='+' || pos>0){/*********处理连加(如:++++1)的情况***********/int nCount=0;while(1){if(++pos>0){if(strExp->GetAt(pos)!='+') break;else nCount++;}else break;}if(nCount>0){strExp->Delete(pos-nCount-1,nCount+1);strExp->Insert(pos-nCount-1,"+");pos=0;continue;}else pos--;/***********************************************/Calcu(strExp,pos);}else pos++;}}void CCalculation::Calcu(CString *strExp,int pos){char ch;for(int j=pos-1;j>=0;j--){ch=strExp->GetAt(j);if(ch=='+' ||ch=='-' ||ch=='*'||ch=='/' ||ch=='%' ||ch=='^' ){if(j==0 && ch!='-') {*strExp="ERROR_缺少参数_";return;}if(j==0 && ch=='-') j=-1;//防止把负号误判为减号else if(j>0 && ch=='-' && !IsDigital(strExp->Mid(j-1,1))) j--;break;}}for(int k=pos+1;k<strExp->GetLength();k++){ch=strExp->GetAt(k);if(ch=='+' ||ch=='-' ||ch=='*'||ch=='/' ||ch=='%' ||ch=='^' ){if(ch=='-' && k>pos+1) break;if(ch=='-' && k>0 && IsDigital(strExp->Mid(k+1,1)) ) k++;else break;}}CString strExp2=strExp->Mid(j+1,k-j-1);*strExp=strExp->Left(j+1)+TwoE(strExp2)+strExp->Right(strExp->GetLength()-k);if(strExp->Find("#IN")!=-1) {*strExp="ERROR_结果有溢出或值域越界_";return;} if(!SynRes(strExp)) {*strExp="ERROR_缺少运算符_";return;}MinusMinus(strExp);}CString CCalculation::MainPro(CString strExp){if(strExp.IsEmpty()) return "表达式不能为空";Macro(&strExp);strExp.MakeLower(); //表达式全部小写/**********给表达式加上保护括号************/strExp.Insert(0,"(");strExp+=")";/******************************************/int pos=strExp.Find(" ");int n=BraCheck(strExp);CString str;str.Format("%d",abs(n));if(n==1) strExp+=")";else if(n==-1) strExp.Insert(0,"(");else if(n>0) return "缺少"+str+"个右括号";else if(n<0) return "缺少"+str+"个左括号";while(pos!=-1) //去掉表达式中的空格符{strExp.Delete(pos);pos=strExp.Find(" ");}Oct2Dec(&strExp); //将表达式中的八进制数转换成十进制Hex2Dec(&strExp); //将表达式中的十六进制数转换成十进制Bin2Dec(&strExp); //将表达式中的二进制数转换成十进制while(!IsDigital(strExp)){DelBracket(&strExp);if(!SynRes(&strExp)) return strExp;}if(!SynRes(&strExp)) return strExp;else return ModiResult(strExp);}void CCalculation::Macro(CString *strExp){int pos;for(int i=0;i<CONSTNUM;i++){pos=strExp->Find(m_strConName[i]);while(pos!=-1){strExp->Delete(pos,m_strConName[i].GetLength());strExp->Insert(pos,m_strConValue[i]);if(pos>=1){char ch=strExp->GetAt(pos-1);if(ch>=48 && ch<=57 || ch==41){*strExp="缺少二元运算符";return;}}pos=strExp->Find(m_strConName[i]);}}}CString CCalculation::ModiResult(CString strRes){if(strRes.Find("#IN")!=-1) return "结果有溢出或值域越界";/*****************去掉保护括号**********************/if(strRes.GetAt(0)=='(') strRes.Delete(0);if(strRes.GetAt(strRes.GetLength()-1)==')') strRes.Delete(strRes.GetLength()-1);/***************************************************/int pos=strRes.Find(".");CString str="";if(pos!=-1){if(pos==0) strRes="0"+strRes;else if(strRes.GetAt(0)=='-' && strRes.GetAt(1)=='.') strRes.Insert(1,"0");}if(pos>16){strRes.Delete(pos);strRes.Insert(1,".");str.Format("%d",pos-1);str=" E"+str;}pos=strRes.Find(".");if(pos==0 || pos==1 && strRes.GetAt(0)=='0'){for(int i=pos+1;i<strRes.GetLength();i++){if(strRes.GetAt(i)!='0') break;}if(i>4){str.Format(" E-%d",i-2);strRes.Delete(pos,i-1);strRes.Insert(1,".");}}strRes=strRes.Left(pos+16)+str;//截取小数点后16位return strRes;}bool CCalculation::SynRes(CString *strExp){int pos=strExp->Find("ERROR");if(pos!=-1){pos=strExp->ReverseFind('_');strExp->Delete(pos,strExp->GetLength()-pos);pos=strExp->ReverseFind('_');strExp->Delete(0,pos+1);return 0;}return 1;}void CCalculation::MinusMinus(CString *strExp){int pos=strExp->Find("--");if(pos!=-1){strExp->Delete(pos,2);strExp->Insert(pos,"+");if(strExp->GetAt(0)=='+') strExp->Delete(0);}}int CCalculation::BraCheck(CString str){int lb=0,rb=0,len=str.GetLength();for(int i=0;i<len;i++){if(str.GetAt(i)=='(') lb++;else if(str.GetAt(i)==')') rb++;}return lb-rb;}void CCalculation::Oct2Dec(CString *strExp){int len,i,index,pos=strExp->Find("xo");CString strTmp,strDF;char ch;double dx;while(pos!=-1){dx=0;strTmp="";strDF="";strExp->Delete(pos,2);for(i=pos-1;i>=0;i--){ch=strExp->GetAt(i);if(ch==56 || ch==57 || ch>=97 && ch<=102){*strExp="ERROR_八进制数越界_";return;}if(ch>=48 && ch<=55 ||ch==46){strTmp.Insert(0,strExp->Mid(i,1));strExp->Delete(i);}else break;}if(i==pos-1) {*strExp="ERROR_缺少二元运算符_";return;}index=i;pos=strTmp.Find(".");if(pos!=-1){strDF=strTmp.Right(strTmp.GetLength()-pos-1);strTmp.Delete(pos,strTmp.GetLength()-pos);}strTmp.MakeReverse();len=strTmp.GetLength();for(i=0;i<len;i++){ch=strTmp.GetAt(i);dx+=(ch-48)*pow(8,i);}len=strDF.GetLength();for(i=0;i<len;i++){ch=strDF.GetAt(i);dx+=(ch-48)*pow(8,-i-1);}strTmp=NtoS(dx);strExp->Insert(index+1,strTmp);pos=strExp->Find("xo");}}void CCalculation::Hex2Dec(CString *strExp){int len,i,index,pos=strExp->Find("xh");CString strTmp,strDF;char ch;double dx;while(pos!=-1){dx=0;strTmp="";strDF="";strExp->Delete(pos,2);for(i=pos-1;i>=0;i--){ch=strExp->GetAt(i);if(ch>=48 && ch<=57 || ch>=97 && ch<=102 ||ch==46){strTmp.Insert(0,strExp->Mid(i,1));strExp->Delete(i);}else break;}if(i==pos-1) {*strExp="ERROR_缺少二元运算符_";return;}index=i;pos=0;for(i=0;i<strTmp.GetLength();i++){if(strTmp.GetAt(i)=='.') pos++;if(pos>1) {*strExp="ERROR_缺少二元运算符_";return;} }pos=strTmp.Find(".");if(pos!=-1){strDF=strTmp.Right(strTmp.GetLength()-pos-1);strTmp.Delete(pos,strTmp.GetLength()-pos);}strTmp.MakeReverse();len=strTmp.GetLength();for(i=0;i<len;i++){ch=strTmp.GetAt(i);if(ch>=48 && ch<=57)//该数在0~9之间{dx+=(ch-48)*pow(16,i);}else if(ch>=97 && ch<=102)//该数在a~f之间{dx+=(ch-87)*pow(16,i);}}len=strDF.GetLength();for(i=0;i<len;i++){ch=strDF.GetAt(i);if(ch>=48 && ch<=57)//该数在0~9之间{dx+=(ch-48)*pow(16,-i-1);}else if(ch>=97 && ch<=102)//该数在a~f之间{dx+=(ch-87)*pow(16,-i-1);}}strTmp=NtoS(dx);strExp->Insert(index+1,strTmp);pos=strExp->Find("xh");}}void CCalculation::Bin2Dec(CString *strExp){int len,i,index,pos=strExp->Find("xb");CString strTmp,strDF;char ch;double dx;while(pos!=-1){dx=0;strTmp="";strDF="";strExp->Delete(pos,2);for(i=pos-1;i>=0;i--){ch=strExp->GetAt(i);if(ch>=50 && ch<=57 || ch>=97 && ch<=102){*strExp="ERROR_二进制数越界_";return;}if(ch=='0' || ch=='1' ||ch==46){strTmp.Insert(0,strExp->Mid(i,1));strExp->Delete(i);}else break;}if(i==pos-1) {*strExp="ERROR_缺少二元运算符_";return;}index=i;pos=strTmp.Find(".");if(pos!=-1){strDF=strTmp.Right(strTmp.GetLength()-pos-1);strTmp.Delete(pos,strTmp.GetLength()-pos);}strTmp.MakeReverse();len=strTmp.GetLength();for(i=0;i<len;i++){ch=strTmp.GetAt(i);dx+=(ch-48)*pow(2,i);}len=strDF.GetLength();for(i=0;i<len;i++){ch=strDF.GetAt(i);dx+=(ch-48)*pow(2,-i-1);}strTmp=NtoS(dx);strExp->Insert(index+1,strTmp);pos=strExp->Find("xb");}}void CCalculation::Dec2Hex(CString *strExp/*strExp须为数字*/) {bool bMinus=0;if(strExp->GetAt(0)=='-'){bMinus=1;strExp->Delete(0);}int pos=strExp->Find('.');CString str,strDec;int nDecInt;double dDec;if(pos!=-1){strDec=strExp->Left(pos);nDecInt=atoi(strDec.GetBuffer(0));strDec=strExp->Right(strExp->GetLength()-pos); }else{nDecInt=atoi(strExp->GetBuffer(0));}strExp->Empty();while(nDecInt!=0){int nTmp=nDecInt%16;if(nTmp==10) str="a";else if(nTmp==11) str="b";else if(nTmp==12) str="c";else if(nTmp==13) str="d";else if(nTmp==14) str="e";else if(nTmp==15) str="f";else str.Format("%d",nTmp);nDecInt/=16;strExp->Insert(0,str);}*strExp+=".";if(pos!=-1){dDec=StoN(strDec);int nCount=0;while(dDec!=0){dDec*=16;int nTmp=dDec;if(nTmp==10) str="a";else if(nTmp==11) str="b";else if(nTmp==12) str="c";else if(nTmp==13) str="d";else if(nTmp==14) str="e";else if(nTmp==15) str="f";else str.Format("%d",nTmp);*strExp+=str.Left(pos);dDec-=nTmp;if(++nCount==17) break;}}if(bMinus) strExp->Insert(0,"-");if(strExp->Find("-1")!=-1 && bMinus!=1) *strExp="太大无法表示"; }void CCalculation::Dec2Oct(CString *strExp){bool bMinus=0;if(strExp->GetAt(0)=='-'){bMinus=1;strExp->Delete(0);}int pos=strExp->Find('.');CString str,strDec;int nDecInt;double dDec;if(pos!=-1){strDec=strExp->Left(pos);nDecInt=atoi(strDec.GetBuffer(0));strDec=strExp->Right(strExp->GetLength()-pos);}else{nDecInt=atoi(strExp->GetBuffer(0));}strExp->Empty();while(nDecInt!=0){int nTmp=nDecInt%8;str.Format("%d",nTmp);nDecInt/=8;strExp->Insert(0,str);}*strExp+=".";if(pos!=-1){dDec=StoN(strDec);int nCount=0;while(dDec!=0){dDec*=8;int nTmp=dDec;str.Format("%d",nTmp);*strExp+=str.Left(pos);dDec-=nTmp;if(++nCount==17) break;}}if(bMinus) strExp->Insert(0,"-");}void CCalculation::Dec2Bin(CString *strExp){bool bMinus=0;if(strExp->GetAt(0)=='-'){bMinus=1;strExp->Delete(0);}int pos=strExp->Find('.');CString str,strDec;_int64 nDecInt;double dDec;if(pos!=-1){strDec=strExp->Left(pos);{*strExp="太大无法转换";return;}nDecInt=atoi(strDec.GetBuffer(0));strDec=strExp->Right(strExp->GetLength()-pos);}else{{*strExp="太大无法转换";return;}nDecInt=atoi(strExp->GetBuffer(0));}strExp->Empty();while(nDecInt!=0){_int64 nTmp=nDecInt%2;str.Format("%d",nTmp);nDecInt/=2;strExp->Insert(0,str);}*strExp+=".";if(pos!=-1){dDec=StoN(strDec);int nCount=0;while(dDec!=0){dDec*=2;int nTmp=dDec;str.Format("%d",nTmp);*strExp+=str.Left(pos);dDec-=nTmp;if(++nCount==17) break;}}if(bMinus) strExp->Insert(0,"-");}六、结论与心得体会七测试结果1.测试+ - * / PI运算2.测试sin cos tan cot3. 20的二进制八进制十六进制二进制八进制十六进制4.历史表达式5.错误判断。