帮忙编一下这个,用C++,谢谢啦!

帮忙编一下这个,用C++,谢谢啦!,第1张

一。完整有图版。这是教程。较简单的界面设计:http://hi.baidu.com/phpskycn/blog/item/bb3a3fc6ec4c71d4d0006014.html

首先,先启动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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11227825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存