求C++大神帮忙编简单的四则运算练习题程序

可有尝求,最好能用MFC,界面要有好,具体要求可加企鹅8(42)21(73)76... 可有尝求,最好能用MFC,界面要有好,具体要求可加企鹅8(42)21(73)76 展开
 我来答
匿名用户
2014-09-28
展开全部
/*****stack.h*****/
typedef char flag;

#define NEW_STACK(STACK_NAME,TYPE) \

struct STACK_NAME \

{                                   \

 TYPE*b;TYPE*h;int size;            \

                                       \

flag init(STACK_NAME* in)          \

{                                      \

 if(!(in->b=(TYPE*)malloc(10*sizeof(TYPE))))return 0;    \

 in->size=10*sizeof(TYPE);             \

 in->h=in->b;  \

 return 1;  \

                 \

}                    \

flag isnull(STACK_NAME*in)   \

 {                  \

 if(in->b==in->h)    \

  return 1;   \

 else             \

  return 0;     \

 }                   \

flag pop(STACK_NAME*in,TYPE *a)    \

 {                \

 if(isnull(in))return 0;   \

 *a=*(--in->h);    \

 return 1;       \

                 \

 }       \

flag push(STACK_NAME*in,TYPE a)   \

 {      \

 if(in->h-in->b>=in->size)    \

 {                \

  if(!(in->b=(TYPE*)realloc(in->b,in->size+10*sizeof(TYPE))))return 0; \

  in->h=in->b+in->size;   \

  in->size+=10*sizeof(TYPE);   \

 }    \

 *(in->h)=a;   \

 in->h++;    \

 return 1;   \

 }  \

\

TYPE gettop(STACK_NAME*in)  \

  {   \

    TYPE*a=in->h-1;   \

 return *a;   \

  }  \

}; 


/******源文件******/
include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include"stack.h"
#define isnum(n) ((n>='0'&&n<='9')||n=='.')
NEW_STACK(csta,char)
NEW_STACK(dsta,double)
/*precede block*/
int ctoiex(char a)
{
 int b;
 if (a==')') b=1;
 if(a=='+'||a=='-')b=2;
 if(a=='*'||a=='/')b=3;
 if(a=='(')b=4;
 if(a=='#')b=0;
 return b;
}
char precede(char a,char b)
{
 
 int a1=ctoiex(a);
 int b1=ctoiex(b);
 if((a1==4&&b1==1)||((a1==0)&&(b1==0)))return '=';
 if(a1>=b1) return '>';
 else return '<';
}
double atonum(char*a,int len)
{
   int inum=0;
   double dnum=0;
   char f=1;
   int j=1;
   for (int i=0;i<len;i++)
   {
   
    if(a[i]=='.')
    {
     
     f=0;
     continue;
    }
    if(f)inum=inum*10+(a[i]-'0');
    else dnum=dnum+(a[i]-'0')*pow(0.1,j++);
   }
    
return inum+dnum;
}
double operate(double a,double b,char op)
{
 double c;
 switch(op)
 {
 case '+':c=a+b;break;
 case '-':c=a-b;break;
 case '*':c=a*b;break;
 case '/':c=a/b;break;
 }
 return c;
}
void insert(char*a)
{
 int len=strlen(a);
 a[len]='#';
 a[len+1]=0;
}
int main()
{
 csta optr;dsta opnd;
 optr.init(&optr);opnd.init(&opnd);
 optr.push(&optr,'#');
 char s[200];
 char b[20];
 char c;
 char tmp1='1';
 double op1,op2;
 char f=0;
 printf("请输入公式: ");
 scanf("%s",s);
 insert(s);
 for(int i=0,j=0;tmp1!='#'||optr.gettop(&optr)!='#';)
 {
  if(isnum(tmp1))
  {
   b[j++]=s[i++];
   tmp1=s[i];
  }
  else
  {
   if(f!='>')
   {
   opnd.push(&opnd,atonum(b,j));
   j=0;
   }
   switch(f=precede(optr.gettop(&optr),tmp1))
   {
   case '<': 
    optr.push(&optr,tmp1);tmp1=s[++i];break;
   case '=':
    optr.pop(&optr,&c);tmp1=s[++i];break;
   case '>':
    optr.pop(&optr,&c);
    opnd.pop(&opnd,&op1);
    opnd.pop(&opnd,&op2);
    opnd.push(&opnd,operate(op2,op1,c));
    break;
   }
  }
  
  
 }
     printf("\n%f\n",opnd.gettop(&opnd));
 return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ruandou88
2014-09-28 · TA获得超过339个赞
知道小有建树答主
回答量:337
采纳率:0%
帮助的人:307万
展开全部
30(7)64(9)73(64)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一朵野雏菊07
2014-09-28
知道答主
回答量:45
采纳率:0%
帮助的人:17.1万
展开全部
不好意思不懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
haiyangfenghuo
2014-09-28 · TA获得超过2439个赞
知道大有可为答主
回答量:2388
采纳率:0%
帮助的人:813万
展开全部
#include "stdafx.h"
#include "MyDlg.h"
#include "math.h"
#define Pi 3.14159

// CMyDlg 对话框
IMPLEMENT_DYNAMIC(CMyDlg, CDialog)

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_sign = 0;
num_sign = 0;
}
CMyDlg::~CMyDlg()
{
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
/*DDX_Control(pDX, IDC_USERNAME, m_EDIT);*/
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
/*ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBnClickedButton1)*/
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON17, &CMyDlg::OnBnClickedButton17)
ON_BN_CLICKED(IDC_BUTTON18, &CMyDlg::OnBnClickedButton18)
ON_BN_CLICKED(IDC_BUTTON21, &CMyDlg::OnBnClickedButton21)
ON_BN_CLICKED(IDC_BUTTON2, &CMyDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CMyDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CMyDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CMyDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CMyDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7, &CMyDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8, &CMyDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CMyDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON10, &CMyDlg::OnBnClickedButton10)
ON_BN_CLICKED(IDC_BUTTON12, &CMyDlg::OnBnClickedButton12)
ON_BN_CLICKED(IDC_BUTTON13, &CMyDlg::OnBnClickedButton13)
ON_BN_CLICKED(IDC_BUTTON14, &CMyDlg::OnBnClickedButton14)
ON_BN_CLICKED(IDC_BUTTON15, &CMyDlg::OnBnClickedButton15)
ON_BN_CLICKED(IDC_BUTTON19, &CMyDlg::OnBnClickedButton19)
ON_BN_CLICKED(IDC_BUTTON11, &CMyDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON16, &CMyDlg::OnBnClickedButton16)
ON_BN_CLICKED(IDC_BUTTON20, &CMyDlg::OnBnClickedButton20)
ON_BN_CLICKED(IDC_BUTTON22, &CMyDlg::OnBnClickedButton22)
ON_BN_CLICKED(IDC_BUTTON25, &CMyDlg::OnBnClickedButton25)
ON_BN_CLICKED(IDC_BUTTON24, &CMyDlg::OnBnClickedButton24)
ON_BN_CLICKED(IDC_BUTTON23, &CMyDlg::OnBnClickedButton23)
ON_BN_CLICKED(IDC_BUTTON26, &CMyDlg::OnBnClickedButton26)
ON_BN_CLICKED(IDC_BUTTON27, &CMyDlg::OnBnClickedButton27)
ON_BN_CLICKED(IDC_BUTTON29, &CMyDlg::OnBnClickedButton29)
ON_BN_CLICKED(IDC_BUTTON30, &CMyDlg::OnBnClickedButton30)
ON_BN_CLICKED(IDC_BUTTON31, &CMyDlg::OnBnClickedButton31)
ON_BN_CLICKED(IDC_BUTTON28, &CMyDlg::OnBnClickedButton28)
END_MESSAGE_MAP()

//根号键功能实现
void CMyDlg::OnBnClickedButton17()
{
// TODO: 在此添加控件通知处理程序代码
}

//取倒数功能实现
void CMyDlg::OnBnClickedButton18()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton21()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "1";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "2";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "3";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "4";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "5";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "6";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "7";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "8";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton9()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "9";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton10()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "0";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}
//常量的实现
void CMyDlg::OnBnClickedButton27()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "3.14";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton12()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "+";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton13()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "-";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton14()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "*";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);

}

void CMyDlg::OnBnClickedButton15()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "/";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);

}

void CMyDlg::OnBnClickedButton11()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
Getstr(Bracket(m_EDIT1));
Getresult();
m_EDIT1.Format("%.2f",a[0]);
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);

}

void CMyDlg::OnBnClickedButton19()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1.Format("%s","");
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton16()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "0";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);

}

void CMyDlg::OnBnClickedButton20()//退格键
{

}

void CMyDlg::OnBnClickedButton22()
{

}

void CMyDlg::OnBnClickedButton25()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton24()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton23()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton26()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnClose()
{
if ( MessageBox(_T("是否退出程序?"),_T("提示"),MB_YESNO|MB_ICONQUESTION) == IDYES )
{
CDialog::OnClose();
}
}
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_ESCAPE)
{
return true;
}
if(pMsg->wParam == VK_RETURN)
{
return true;
}
}
return CDialog::PreTranslateMessage(pMsg);

}

double CMyDlg::GetatStr(CString str)
{
int i = 0;
double rate = 10.0,itemp = 0.0;
for (;i<str.GetLength();i++)
{
if (isdigit(str.GetAt(i)))
{
if (rate ==10.0)
{
itemp = itemp*rate + (str.GetAt(i)-'0');
}
else
{
itemp = itemp + rate*(str.GetAt(i)-'0');
rate *= 0.1;
}

}
else if ( str.GetAt(i)=='.')
{
rate = 0.1;
}
}
return itemp;
}

//字符串中有括号的处理
CString CMyDlg::Bracket(CString Str0)
{
CString Str1="",Str2="",Str3="";
int k = Str0.GetLength();
int i = -1; int j = -1;
i = Str0.Find('(');
j = Str0.ReverseFind(')');
Str2 = Str0.Mid(i+1,j-i-1);
Str1 = Str0.Left(i);
Str3 = Str0.Right(k-j-1);
Getstr(Str2);
Getresult();
if(a[0])
Str2.Format("%.2f",a[0]);
Str0 = Str1 + Str2 + Str3;
return Str0;

}

//获取表达式中的数字和运算符(这里的运算符是双目运算符)
void CMyDlg::Getstr(CString str)
{
int i = 0,z = 0;
double rate = 10.0, itemp = 0.0;

for (i;i<20;i++)
{
a[i]=0.0;
}

for (i=0;i<10;i++)
{
b[i]=' ';
}

for (i=0;i<str.GetLength();i++)
{
if (str.GetAt(i)=='+'||str.GetAt(i)=='-'||str.GetAt(i)=='*'||str.GetAt(i)=='/')
{
num_sign ++;
}
}
for (i=0;i<str.GetLength();i++)
{
if (isdigit(str.GetAt(i)))
{
if (rate ==10.0)
{
itemp = itemp*rate + (str.GetAt(i)-'0');
}
else
{
itemp = itemp + rate*(str.GetAt(i)-'0');
rate *= 0.1;
}
}
if (str.GetAt(i)=='.')
{
rate = 0.1;
}

/***********************************获取操作数和运算符**********************************/
if (str.GetAt(i)=='+')
{
a[z]= itemp;
z++;
itemp = 0;
b[z]='+';
z++;
rate = 10.0;
m_sign ++;
}
if (str.GetAt(i)=='-')
{
a[z]= itemp;
z++;
itemp = 0;
b[z] = '-';
z++;
rate = 10.0;
m_sign ++;
}
if (str.GetAt(i)=='*')
{
a[z]= itemp;
z++;
itemp = 0;
b[z] = '*';
z++;
rate = 10.0;
m_sign ++;
}
if (str.GetAt(i)=='/')
{
a[z]= itemp;
z++;
itemp = 0;
b[z] = '/';
z++;
rate = 10.0;
m_sign ++;
}

/***********************************获取最后一个操作数**********************************/
int m = i;
m++;
if (m_sign == num_sign)
{
CString S_last = str.Right((str.GetLength()-m));
for (int j = 0;j<S_last.GetLength();j++)
{
if (isdigit(S_last.GetAt(j)))
{
if (rate ==10.0)
{
itemp = itemp*rate + (S_last.GetAt(j)-'0');
}
else
{
itemp = itemp + rate*(S_last.GetAt(j)-'0');
rate *= 0.1;
}
}
else
{
rate = 0.1;
}
}
a[z] = itemp;
s = z;
return;
}

}

}

// 对表达式进行运算,并记录表达式的最终结果在界面上显示
void CMyDlg::Getresult()
{
int i = 0,x = 0,y = 1,m=1,t=0;
for (i;i<s;i++)
{
if (b[i] == '/')
{
a[i+1] = 1/a[i+1];
b[i] = '*';
}
}
for (i=0;i<s;i++)
{
if (b[i] == '*')
{
if (i-t == 2)
{
a[t-m] =a[t-m]*a[i+1];
m = m+2;

}
a[i-1]= a[i-1]* a[i+1];
a[i+1] = 0;
b[i] = ' ';
t = i;
}
}
for(i=0;i<=s;i++)
{
if(a[i]!=0.0)
{
a[x]=a[i];
x+=2;
}
if( b[i]=='+'|| b[i]=='-')
{
b[y]=b[i];
y+=2;
}
}
for(i=1;i<=y-2;i++)
{
if(b[i]=='+')
a[0]=a[0]+a[i+1];
else if(b[i]=='-')
a[0]=a[0]-a[i+1];
}
}
void CMyDlg::OnBnClickedButton29()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += ")";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);
}

void CMyDlg::OnBnClickedButton30()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton31()
{
// TODO: 在此添加控件通知处理程序代码
}

void CMyDlg::OnBnClickedButton28()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_EDIT1 += "(";
SetDlgItemText(IDC_EDIT1,m_EDIT1);
UpdateData(FALSE);

}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式