首先,先启动Visual Studio,这里以2005版做演示。
接着新建立一个MFC项目, 并命名为Calculator。
由于这个计算器的功能很简单,只需要使用“对话框”类型,并且允许使用最大化、最小化按钮。
下面两个页面的内容无须修改,使用默认设置就可以了。所以单击“完成”按钮关闭向导就可以了。
然后程序会完成整个工程的初始化工作,如果你的电脑内存在512MB以下,或是CPU主频在1.6GHZ以下,会卡上一镇,请稍等。
完成后到“资源视图”中找到如图所示的项目,打开红可以看到一个对话框。
这个默认的对话框里面,有一个静态文本控件和两个按钮,其中文本和“确定”按钮不是我们所需要的,可以删掉。然后到左边的“工具箱”里面,拖几个静态文本控件(Static Text)、编辑框(Edit)和按钮(Button)过来,到“属性”中把它们的Caption改好,结果如图所示。
然后给每一个编辑框添加变量,右键单击编辑框后选择添加变量,然后把类型改成Value,变量类型改成double(双精度浮点数)。
最后是为每一个按钮(“取消”除外)添加消息处理函数,否则就不能计算了。
双击后会自动跳转到编译器。
代码我帮你写好了,Copy就行了。
void CcaculatorDlg::OnBnClickedButton1()//“+”按钮消息处理函数
{
UpdateData(1)//将控件中用户输入的值传递给变量
m_result = m_data1 + m_data2 //加法计算
UpdateData(0)//将变量的值传给控件,程序会自动重画控件
}
void CcaculatorDlg::OnBnClickedButton2()//“-”按钮消息处理函数
{
UpdateData(1)//将控件中用户输入的值传递给变量
m_result = m_data1 + m_data2 //减法计算
UpdateData(0)//将变量的值传给控件,程序会自动重画控件
}
void CcaculatorDlg::OnBnClickedButton3()//“*”按钮消息处理函数
{
UpdateData(1)//将控件中用户输入的值传递给变量
m_result = m_data1 * m_data2 //乘法计算
UpdateData(0)//将变量的值传给控件,程序会自动重画控件
}
void CcaculatorDlg::OnBnClickedButton4()//“/”按钮消息处理函数
{
UpdateData(1)//将控件中用户输入的值传递给变量
if( m_data2 == 0 )//判断除数是否为零
{
MessageBeep(-1)//响铃,因为除数不能为零
}
else
{
m_result = m_data1 / m_data2 //除法计算
}
UpdateData(0)//将变量的值传给控件,程序会自动重画控件
}
最后按下F5…………OK,我们的计算器写成了!
二、简易的计算器,四则运算计算器C++原代码
,希望对你有帮助
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/************/
#define STRING_LENGTH 1000
#define NUMBER_LENGTH 40
/*结构体定义*/
struct symbol
{
char c
struct symbol *next
}*symbol_head=NULL,*temp=NULL
struct number
{
double n
struct number *next
}*number_head=NULL,*temp_2=NULL
char result[NUMBER_LENGTH]
/**********/
/*函数声明*/
double ji_shuan(double a,char t,double b)/*两个double数据计算*/
void string_scan(char *str)/*字符串算式扫描*/
void operate(void)/*链表 *** 作*/
void operate(void)/*链表 *** 作*/
{
temp=symbol_head->next
symbol_head->next=symbol_head->next->next
number_head->n=ji_shuan(number_head->next->n,temp->c,number_head->n)
temp_2=number_head->next
number_head->next=number_head->next->next
free(temp)
free(temp_2)
}
double ji_shuan(double a,char t,double b)/*两个double数据计算*/
{
switch(t)
{
case '+':return a+bbreak
case '-':return a-bbreak
case '*':return a*bbreak
case '/':return a/bbreak
default:
printf("ji_shuan方法调用有误!任意键退出...")
getchar()
exit(0)//用于调试程序时出错指示
}
}
void string_scan(char *str)/*字符串算式扫描*/
{
int i=0
char temp_str[NUMBER_LENGTH]
struct symbol *t
/*ecvt函数用到的变量*/
char *string//存放字符串
int ndig//字符串长度
int dec//小数点位置
int sign//正负标记
/********************/
t=(struct symbol *)malloc(sizeof(struct symbol))
t->next=symbol_head
symbol_head=t
symbol_head->c='#'
for(i=0i<strlen(str)i++)
{
if((str[i]>='0'&&str[i]<='9')||(str[i]=='-'&&(str[i-1]<'0'||str[i-1]>'9')&&str[i-1]!=')'))//检测到数字,(出现"-"号,并且检测到前一个是除")"外的符号,则此为负号(不是减号),此数为负数)
{
struct number *t
int j=0
while((str[i]>='0'&&str[i]<='9')||str[i]=='.')
{
temp_str[j]=str[i]
i++
j++
}
temp_str[j]='\0'
t=(struct number *)malloc(sizeof(struct number))
t->next=number_head
number_head=t
number_head->n=atof(temp_str)//double atof(*char)为字符串转double函数
}
if(str[i]=='('||str[i]==')'||str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='=')
{
struct symbol *t
t=(struct symbol *)malloc(sizeof(struct symbol))
t->next=symbol_head
symbol_head=t
symbol_head->c=str[i]
if((str[i]=='+'||str[i]=='-')&&symbol_head->next->c!='#'&&symbol_head->next->c!='(')
{
operate()
if(symbol_head->next->c!='#'&&symbol_head->next->c!='(')
{
operate()
}
}
else if((str[i]=='*'||str[i]=='/')&&(symbol_head->next->c=='*'||symbol_head->next->c=='/'))
{
operate()
}
else if(str[i]=='=')
{
while(symbol_head->next->c!='#')
{
operate()
}
temp=symbol_head
symbol_head=symbol_head->next->next
free(temp)
}
else if(str[i]==')')
{
while(symbol_head->next->c!='(')
{
operate()
}
temp=symbol_head
symbol_head=symbol_head->next->next
free(temp)
}
}
}
/*用于调试*/
/*while(number_head!=NULL||symbol_head!=NULL)
{
if(number_head!=NULL)
{
printf("%f",number_head->n)
number_head=number_head->next
}
if(symbol_head!=NULL)
{
printf("%c",symbol_head->c)
symbol_head=symbol_head->next
}
}*/
printf("以double型输出的结果:\n%f\n",number_head->n)
gcvt(number_head->n,NUMBER_LENGTH,result)//调用double转字符串函数
if(result[strlen(result)-1]=='.')//如果最后位是小数点,则去掉
{
result[strlen(result)-1]=result[strlen(result)]
}
printf("调用浮点型转字符串函数gctv的输出结果:\n%s\n",result)
ndig=20//设置小数点后显示10位
string = ecvt(number_head->n, ndig, &dec, &sign)
printf("调用浮点型转字符串函数ectv的输出结果:\n字符串:%s 小数点在第%d位后 ",string,dec)
if(sign==0)
{
printf("此数为正数\n")
}
else
{
printf("此数为负数\n")
}
}
void main(void)/*入口函数*/
{
char str[STRING_LENGTH]/*最大算式长*/
int i=0,select=0
int bracket_flag=0/*括号对称性标记*/
while(1)
{
root: bracket_flag=0
printf("请输入算式,允许带括号的加减乘除四则运算,以\"=\"号结束\n")
scanf("%s",str)
/*******算式查错*********/
if((str[0]<'0'||str[0]>'9')&&str[0]!='-'&&str[0]!='(')
{
printf("算式错误!请重新输入...\n")
goto root
}
for(i=0i<strlen(str)-1i++)
{
if((str[i]<'0'||str[i]>'9')&&(str[i]!='+'&&str[i]!='-'&&str[i]!='*'&&str[i]!='/'&&str[i]!='('&&str[i]!=')'&&str[i]!='.'&&str[i]!='='))
{
printf("算式中含有非法字符!请重新输入...\n")
goto root
}
else if(str[i]=='(')
{
bracket_flag++
}
else if(str[i]==')')
{
bracket_flag--
if(bracket_flag==-1)/* 出现先有")"的情况 */
{
printf("括号不匹配!请重新输入...\n")
goto root
}
}
else if(str[i]=='=')
{
printf("算式中间不允许出现\"=\"号!请重新输入...\n")
goto root
}
if((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')&&(str[i+1]=='+'||str[i+1]=='-'||str[i+1]=='*'||str[i+1]=='/'||str[i+1]==')'))
{
printf("运算符输入有误!请重新输入...\n")
goto root
}
else if(str[i]=='('&&str[i+1]==')')
{
printf("括号内不可无数值!请重新输入...\n")
goto root
}
else if(str[i]==')'&&(str[i+1]!='+'&&str[i+1]!='-'&&str[i+1]!='*'&&str[i+1]!='/'))
{
printf("括号后不可无运算符!请重新输入...\n")
goto root
}
}
if(bracket_flag!=0)
{
printf("括号不匹配!请重新输入...\n")
goto root
}
if(str[strlen(str)-1]!='=')//自动添加"="
{
printf("未输入\"=\"号,自动添加...\n")
str[strlen(str)+1]=str[strlen(str)]
str[strlen(str)]='='
puts(str)
}
string_scan(str)
printf("\n计算完成!请选择:\n1.继续计算.\n2.退出.\n\n")
loop_2: scanf("%d",&select)
switch(select)
{
case 1: break
case 2: exit(0)
default :printf("选择错误!请重新选择...\n")goto loop_2break
}
}
}
三:实现功能:
1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘X’退出。
例如:输入:2
+
5
输出:7
2)实现单运算符表达式计算的功能。
输入的 *** 作数可以包含整数或浮点数。如果遇到错误的表达式,应输出错误提示信息。
输入表达式如下:
例如:输入:2+5
输出:7
表达式要求要可以有括号,并且+-*/要分优先级的
//文件名:caculate.cpp
#include <iostream.h>
#include <stdlib.h> //包含清屏函数的头文件
void first() //定义界面函数
{
cout<<"---------------------------------------------------------------"<<endl
cout<<" 欢迎使用计算器 "<<endl
cout<<"---------------------------------------------------------------"<<endl
cout<<"请选择以下功能:"<<endl
cout<<endl
cout<<"1、按C键清屏 2、按R键返回主界面"<<endl
cout<<endl
}
void function(char)//申明功能函数
void caculate (double X,char op,double Y) //申明计算函数
void main()
{
first()
int n=0
char op // op定义为某个运算符号
double X,Y
cout<<"输入运算:"
cin>>X>>op>>Y
caculate(X,op,Y) // 调用计算函数
}
void function(char iteam) //定义功能函数
{
char op
double X,Y
if(iteam=='C')
{
system("cls") //如果是C,则清屏,调用清屏函数
cout<<"继续 *** 作请输入X,op,Y"<<endl //实现二次 *** 作的语句
cin>>X>>op>>Y
caculate(X,op,Y)
}
if(iteam=='R')
{
first()//如果是R,则返回主界面
cout<<"继续 *** 作请输入X,op,Y"<<endl
cin>>X>>op>>Y
caculate(X,op,Y)
}
}
void caculate (double X,char op,double Y) //定义计算函数
{
char opp
cout<<"输出结果:"
switch(op) //用switch语句定义加减乘除
{
case'+':X=X+Y
cout<<X<<endl
break
case'-':X=X-Y
cout<<X<<endl
break
case'*':X=X*Y
cout<<X<<endl
break
case'/':
if(Y!=0)
{
X=X/Y
cout<<X<<endl
}
else
cout<<"error!"<<endl
break
default:cout<<"error!"<<endl
}
cin>>opp
function(opp) //调用function语句判断是否是输入菜单中的命令
if(opp=='+'||opp=='-'||opp=='*'||opp=='/') //判断第一个输入的字符是不是+、-、*、/
{ //如果是运算符,那么再次输入一个运算数字,递规调用caculate函数,实现再次运算
cin>>Y
caculate(X,opp,Y)
}
else if(sizeof(double (opp))==8)
{
X=double(opp)-48 //强制类型转换,将字符型的op转换为double型
cin>>opp>>Y //如果不是运算符,那么再次输入运算符号,以及运算数字,递规调用caculate函数,实现再次运算
caculate(X,opp,Y)
}
}
三个单独都可实现,但是要求完美请三个一起用
功 能:把一整数转换为字符串用 法:char *itoa(int value, char *string, int radix)
详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写.
参数:
value: 待转化的整数。
radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制。
* string: 保存转换后得到的字符串。
返回值:
char * : 指向生成的字符串, 同*string。
备注:该函数的头文件是"stdlib.h"
程序例:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int number = 123456
char string[25]
itoa(number, string, 10)
printf("integer = %d string = %s\n", number, string)
return 0
}
注释:编译系统:VC++6.0,TC不支持。
我们可以这样构造itoa()
char* itoa(int i)
{
char *a=malloc(42)/* Enough for a 128 bit integer */
if (a) sprintf(a,"%d",i)
return a
}
实现itoa函数的源代码
char *my_itoa(int num,char *str,int radix){
const char table[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
char *ptr = str
bool negative = false
if(num == 0){ //num=0
*ptr++='0'
*ptr='\0'// don`t forget the end of the string is '\0'!!!!!!!!!
return str
}
if(num<0){ //if num is negative ,the add '-'and change num to positive
*ptr++='-'
num*=-1
negative = true
}
while(num){
*ptr++ = table[num%radix]
num/=radix
}
*ptr = '\0'//if num is negative ,the add '-'and change num to positive
// in the below, we have to converse the string
char *start =(negative?str+1:str)//now start points the head of the string
ptr--//now prt points the end of the string
while(start<ptr){
char temp = *start
*start = *ptr
*ptr = temp
start++
ptr--
}
return str
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)