mfc課程設計計算器
⑴ vc++課程設計計算器四則混合運算程序
#include "stdafx.h"
#include "計算器.h"
#include "計算器Dlg.h"
#include "math.h"
#include "time.h" //可以不用 ,屏蔽srand()
#include "stdlib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
C計算器Dlg::C計算器Dlg(CWnd* pParent /*=NULL*/)
: CDialog(C計算器Dlg::IDD, pParent)
, n(0)
, setxiaoshu(false)
, xiaoshui(0)
, innum(0)
, n_2(0)
, operate(0)
, setnew(false)
BEGIN_MESSAGE_MAP(C計算器Dlg, CDialog)
……. //系統消息和控制項的函數
主要實現代碼:(dlg.cpp文件)://注:下面所有控制項名稱使用加粗字體和下劃線表示該按鍵
void C計算器Dlg::OnPaint() //重寫OnPaint(),實現,界面顏色的改變
{
int c_r,c_g,c_b,c; //3個變數分別代表R/G/B
// srand(time(0)); //控制隨機函數rand()的取值時間(間隔1s左右更新值),後來為實現每次按鍵都變色把這句去掉了
c_r=rand()%256; // rand()%256代表變數取值為0-255之間的整數,下同
c_g=rand()%256;
c_b=rand()%256;
c=rand()%4; //c=0-3,即分為4種情況,分別繪制不同的顏色方案.實現更多色彩.
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
if (c==0) //藍色漸變,其他兩種顏色隨機
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,c_g,i));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
}
else if(c==1) //綠色漸變, 其他兩種顏色隨機
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,i,c_b));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
}
else if(c==2) //紅色漸變, 其他兩種顏色隨機
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(i,c_g,c_r));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
}
else //都不漸變,所有隨機
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,c_g,c_r));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
}
}
}
void C計算器Dlg::OnBnClickedButton31() // 控制項pi對應的函數 按鍵pi的處理
n=3.14159265358979; // 把pi值3.14159265358979賦給n
UpdateData(false);
Invalidate(); //重新執行OnPaint()函數實現每一次按鍵,界面自動變色.下面各控制項對應函數也調用這函數,如控制項對應函數//沒有直接顯示,就是在被調用的函數中有該函數
}
////////////////////////////////////////以下部分處理方式相似(數字錄入)//////////////////
void C計算器Dlg::OnBnClickedButton0() //控制項0對應的函數.調用inum()產生預期的數.包括整數/小數/正數/負數.下面1 - 9同
{ 按鍵0的處理
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate(); // setnew為true,清除所有控制變數, 在上次計算出結果後
innum=0; // 把0賦給變數inum,執行相應的+++- //可以不用按C鍵清除直接按數字鍵開始下一個運
C計算器Dlg::inum(innum); //完成數據的輸入過程. //算.setnew=true會在每個單元運算符和等號中出現. setnew
UpdateData(false); //在屏幕上顯示當前n的值,下同 //為false,繼續輸入該數據. setnew=false出現在每個雙元運算
} //符中.因OnBnClickedButton23()中已包含Invalidate(),但OnBnClickedButton23()不是 每次都執行, //為避免代碼的重復執行,採用if else形式.
void C計算器Dlg::OnBnClickedButton1() //控制項1對應的函數 按鍵1的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=1;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton2() //控制項2對應的函數 按鍵2的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=2;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton3() //控制項3對應的函數 按鍵3的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=3;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton4() //控制項4對應的函數 按鍵4的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=4;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton5() //控制項5對應的函數 按鍵5的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=5;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton6() //控制項6對應的函數 按鍵6的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=6;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton7() //控制項7對應的函數 按鍵7的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=7;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton8() //控制項8對應的函數 按鍵8的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=8;
C計算器Dlg::inum(innum);
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton9() //控制項9對應的函數 按鍵9的處理
{
if (setnew) C計算器Dlg::OnBnClickedButton23(); else Invalidate();
innum=9;
C計算器Dlg::inum(innum);
UpdateData(false);
}
////////////////////////////////////////////////結束////////////////////////////////////////////////////////
///////////////////////////////////以下部分處理方式相似(雙元運算)////////////////// /////
void C計算器Dlg::OnBnClickedButton16() //控制項+對應的函數. 下面的 - * / x^y 同 +符號的處理
{
C計算器Dlg::OnBnClickedIsButton(); // 自動完成上次未完成的運算.當上一次計算完雙元運算沒有按等號鍵時候,如只按 //下1 + 1而沒有按=的時候,直接按+.可以實現連續計算,從而省去每次都按=的麻煩, //更符合使用的習慣.
n_2=n; // 因為是雙元運算,按下+後,把輸入值存入另一個數據中,開始輸入新的數據
C計算器Dlg::setempty(); // 置空n的各項參數,便於以後重新輸入新n值時不影響
setnew=false; //setnew=false(由數字錄入部分做出相應).不是在重新輸入數據,下面按數字鍵時接著錄入部分執行相應操作
operate='+'; // 操作符為+,,由OnBnClickedIsButton()處理加法運算
}
void C計算器Dlg::OnBnClickedButton15() //控制項-對應的函數. -符號的處理
{
C計算器Dlg::OnBnClickedIsButton();
n_2=n;
C計算器Dlg::setempty();
setnew=false;
operate='-';
}
void C計算器Dlg::OnBnClickedButton14() //控制項*對應的函數. *符號的處理
{
C計算器Dlg::OnBnClickedIsButton();
n_2=n;
C計算器Dlg::setempty();
setnew=false;
operate='*';
}
void C計算器Dlg::OnBnClickedButton13() //控制項/對應的函數. /符號的處理
{
C計算器Dlg::OnBnClickedIsButton();
n_2=n;
C計算器Dlg::setempty();
setnew=false;
operate='/';
}
void C計算器Dlg::OnBnClickedButton27() //控制項x^y對應的函數. x^y符號的處理
{
C計算器Dlg::OnBnClickedIsButton();
n_2=n;
C計算器Dlg::setempty();
operate='y';
setnew=false;
}
////////////////////////////////////////////////結束///////////////////////////////////////////////////////
////////////////////////////////////////以下部分處理方式相似(單元運算)//////////////////
void C計算器Dlg::OnBnClickedButton19() //控制項1/x對應的函數. 下面符號處理類似 1/x符號的處理
{
operate='x'; //下面執行1/x的運算
C計算器Dlg::operation(operate); // 單元運算,按下該符號直接進行運算
UpdateData(false);
operate='0'; //在這個運算符算出的數據後,輸入另外一個數據時候,按下雙元運算符因為會先執行OnBnClickedIsButton(),操 //作符為0,什麼也不執行
setnew=true; //在數字錄入部分做出判斷, setnew=true按下數字鍵時候,執行OnBnClickedButton23(),清空變數.開始新的運算
void C計算器Dlg::OnBnClickedButton17() // 控制項sqrt對應的函數. sqrt符號的處理
{
operate='q';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
void C計算器Dlg::OnBnClickedButton24() // 控制項sin對應的函數. sin符號的處理
{
operate='s';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
void C計算器Dlg::OnBnClickedButton25() // 控制項cos對應的函數. cos符號的處理
{
operate='c';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
void C計算器Dlg::OnBnClickedButton26() // 控制項tan對應的函數. tan符號的處理
{
operate='t';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
void C計算器Dlg::OnBnClickedButton29() // 控制項ln對應的函數. ln符號的處理
{
operate='n';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
void C計算器Dlg::OnBnClickedButton30() // 控制項lg對應的函數. lg符號的處理
{
operate='g';
C計算器Dlg::operation(operate);
UpdateData(false);
operate='0';
setnew=true;
}
////////////////////////////////////////////////結束////////////////////////////////////////////////
////////////////////////////////////////以下為主要處理函數//////////////////////////////
void C計算器Dlg::OnBnClickedIsButton() // 控制項=對應的函數. =符號的處理
{
C計算器Dlg::operation(operate); // 完成之前輸入數據的計算
operate='0'; // 置空當前輸入符號,避免連續+等操作,採用錯誤操作符
setnew=true; // 開始執行新的操作了
UpdateData(false);
}
void C計算器Dlg::OnBnClickedButton21() // 控制項Backspace對應的函數. 刪除一個字元 Backspace符號的處理
{
if (n==0) {xiaoshui=0;} // n=0時候,把小數點置空.
else if (xiaoshui>0) // n為小數時候的處理方案
{
n=(long (n*pow(10.0,(xiaoshui-1))))*pow(10.0,-(xiaoshui-1)); // 把該數乘以(原小數位數-1)得到數取整後在擴大,
xiaoshui=xiaoshui-1; // 每次執行刪除一位,小數點要前移一位. // 相同倍數即間接刪除小數的最後一位了
if (xiaoshui==0) setxiaoshu=false; // 如果小數點為0了,執行setxiaoshu=false,結束小數輸入過程
setnew=false; // 不是重新輸入數據,這點同所有的setnew=false
}
else //n為整數
{
n=long(n/10); // n除以10,取整.
xiaoshui=0; // 小數點為0
setnew=false; // 可以繼續輸入數據
}
UpdateData(false);
Invalidate(); // 同所有的Invalidate(),重新執行:OnPaint(),生成新的顏色
}
void C計算器Dlg::setempty(void) // 置空中間變數
{
xiaoshui=0; // 小數部分的位數變數為0
setxiaoshu=false; // 使默認輸入變成整數
n=0; // 重置n為0,繼續輸入第二個運算的數據
}
void C計算器Dlg::OnBnClickedButton22() // 控制項CE對應的函數. CE符號的處理: 清除當前輸入 CE符號的處理
{
C計算器Dlg::setempty(); //見上函數
UpdateData(false);
Invalidate();
}
void C計算器Dlg::OnBnClickedButton23() //控制項C對應的函數. C符號的處理:所有置空 ,C和CE區別就是C清空所有變
{ //量,CE僅清空當前輸入的//數據 C符號的處理
C計算器Dlg::setempty();
n_2=0;
operate='0';
UpdateData(false);
Invalidate();
}
void C計算器Dlg::OnBnClickedButton11() //控制項+/-對應的函數. 改變正負號 +/-的處理
{
n=-n; //按一次改變n為-n
UpdateData(false);
Invalidate();
}
void C計算器Dlg::inum(int i) // 輸入字元為預期數據,i為0-9的變數
{
if (n==fabs(n)) // 判斷n的正負(n為正數), 因為負數在錄入時候會出現如按下2 – 2時應該顯示」-22」但結果卻顯示」-18」的 { // 情況,分開討論
if (!setxiaoshu) // 判斷是否在輸入小數(非按下小數點情況)(n為正數)
n=10*n+i;
else // 按下小數點情況(n為正數)
{
xiaoshui=xiaoshui+1; // 小數正在輸入的位數,每輸入一次xiaoshui+1 , xiaoshui初始值為0
n=n+pow(10.0,-xiaoshui)*i; // 產生預期的n,
}
}
else // n為負數
{
if (!setxiaoshu) // 非按下小數點情況(n為負數)
{
n=-10*n+i; // 先把負數變為正數,按整數處理,避免負數錄入出錯
n=-n; // 變成負數
}
else // 按下小數點情況(n為負數)
{
xiaoshui=xiaoshui+1;
n=-n+pow(10.0,-xiaoshui)*i;
n=-n;
}
}
setnew=false;
}
void C計算器Dlg::OnBnClickedButton12() // 控制項.對應的函數. 小數點的判斷 .的處理
{
setxiaoshu=true; // 按下開始輸入小數部分
Invalidate();
}
void C計算器Dlg::operation(char ope) //執行選定運算
{
switch (ope)
{
case '+':{n=n_2+n;}break;
case '-':{n=n_2-n;}break;
case '*':{n=n_2*n;}break;
case '/':{n=n_2/n;}break;
case 'x':{n=1/n;}break;
case 'q':{if (n>0) n=sqrt(n); else n=0;}break;
case 's':{n=sin(double (n*3./180));}break;
case 'c':{n=cos(double (n*3./180));}break;
case 't':{n=tan(double (n*3./180));}break;
case 'n':{if (n>0)n=log(n);else n=0;}break;
case 'g':{if (n>0) n=log(n)/log(10.0);else n=0;}break;
case 'y':{n=pow(n_2,n);}break;
default:; //operate='0',不執行任何代碼
}
Invalidate(); //這里加上該函數可以使包含該函數的函數不再重復添加該函數就實現每次按鍵變色效果
}
試一下吧,應該還行!
⑵ 我剛學mfc,課程設計要求用c++做一個mfc四則運算計算器
我寫過一個Qt的計算器,基本邏輯都寫出來了,給你參考一下回(沒學過MFC),鏈接在答下面
cout<<"https://github.com/Charles-Neil/NaiveCalculator"
⑶ C語言高手來! MFC 多則運算計算器(用棧實現)
#pragma warning (disable : 4786)
#include <iostream>
#include <string>
#include <map>
#include <cctype>
using namespace std;
enum Token_value
{
NAME,
NUMBER,
END,
PLUS = '+',
MINUS = '-',
MUL = '*',
DIV = '/',
PRINT = ';',
ASSIGN = '=',
LP = '(',
RP = ')',
};
Token_value curr_tok = PRINT;
map<string, double> table;
double term(bool get);
double prim(bool get);
Token_value get_token();
double error(const string &s);
double expr(bool get)
{
double left = term(get);
for(;;)
{
switch (curr_tok)
{
case PLUS:
left += term(true);
break;
case MINUS:
left -= term(true);
break;
default:
return left;
}
}
}
double term(bool get)
{
double left = prim(get);
for(;;)
{
switch(curr_tok)
{
case MUL:
left *= prim(true);
break;
case DIV:
if(double d = prim(true))
{
left /= d;
break;
}
return error("divide by 0");
default:
return left;
}
}
}
double number_value;
string string_value;
double prim(bool get)
{
if(get) get_token();
switch(curr_tok)
{
case NUMBER:
{
double v = number_value;
get_token();
return v;
}
case NAME:
{
double &v = table[string_value];
if(get_token() == ASSIGN) v = expr(true);
return v;
}
case MINUS:
return -prim(true);
case LP:
{
double e = expr(true);
if(curr_tok != RP) return error(")expected");
get_token();
return e;
}
default:
return error("primary expected");
}
}
int no_of_errors;
double error(const string &s)
{
no_of_errors++;
cerr << "error:" << s << '\n';
return 1;
}
Token_value get_token()
{
char ch = 0;
cin >> ch;
switch( ch )
{
case 0:
return curr_tok = END;
case ';':
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
{
return curr_tok = Token_value(ch);
}
case '0': case '1': case '2':
case '3': case '4': case '5':
case '6': case '7': case '8':
case '9':
case '.':
{
cin.putback(ch);
cin >> number_value;
return curr_tok = NUMBER;
}
default:
{
if(isalpha(ch))
{
cin.putback(ch);
cin >> string_value;
return curr_tok = NAME;
}
error("bad token");
return curr_tok = PRINT;
}
}
}
int sum (int a, int b)
{
int c = 0;
c = a + b;
return c;
}
int main()
{
while(cin)
{
get_token();
if(curr_tok == END) break;
if(curr_tok == PRINT) continue;
cout << expr(false) << endl;
}
return no_of_errors;
getchar();
return 0;
}
輸入方式如:(1+4)*(2+3)= 最後按回車計算出結果
⑷ 使用MFC製作簡單計算器
void CCalDlg::OnButtonadd()
{
// TODO: Add your control notification handler code here
UpdateData();
isresult=TRUE;
num1 = m_edit;
m_edit="";
UpdateData(false);
oper=1;
}
void CCalDlg::OnButtondeng()
{
// TODO: Add your control notification handler code here
UpdateData();
num2 = m_edit;
double result=0;
double firnum=atof(num1);
double secnum=atof(num2);
switch(oper)
{case 1:result=firnum+secnum;
m_edit.Format("%g",result);
UpdateData(false);
break;}
}
在使用m_edit前,要先updatedata更新控制項內容到變數。
⑸ vc++6.0課程設計計算器 跪求!!!急!急!急!
可以看下C++ in action 這本書,上面有個很好的例子
⑹ 求計算器MFC製作的程序 謝謝各位高手 急用!
MFC計算器概要
-----大四上學期課程設計筆記
(1)預定義相關變數
(2)小數點的設定
void MyDialog_CAL_2::OnPoint()
{
point=TRUE; //表示.後面的輸入部分為小數部分(BOOL類型)
}
(3)數字鍵1的處理
void MyDialog_CAL_2::OnButton1()
{
if(point)
{
input_point=input_point+1/count; //輸入小數部分
count=count*10;
}
else input_int=input_int*10+1; //輸入整數部分
//以下主要是處理在編輯框顯示的問題罷了,於以後的計算無關!
value=input_int+input_point;
_gcvt(value,10,middle); //value轉化為middle(char類型)
m_Edit=(LPCTSTR)middle; //將輸入的數據現實在編輯框中
UpdateData(FALSE); //更新:把數據傳給對話框
} //其餘鍵位類似
(4)除號鍵位的設置
void MyDialog_CAL_2::OnDev()
{
id=4;
input1=input_int+input_point;
point=FALSE;
input_int=0;
input_point=0;
count=10;
}
(5)等號鍵位的設置
void MyDialog_CAL_2::OnResult()
{
input2=input_int+input_point;
point=FALSE;
input_int=0;
input_point=0;
count=10;
switch(id)
{
case 1:
value=input1+input2;
break;
case 2:
value=input1-input2;
break;
case 3:
value=input1*input2;
break;
case 4:
value=input1/input2;
break;
}
_gcvt(value,10,middle);
m_Edit=(LPCTSTR)middle;
UpdateData(FALSE);
}
(5)清空編輯框的鍵位設置
void MyDialog_CAL_2::OnEmp() //清空編輯框
{
_gcvt(0,10,middle);
m_Edit=(LPCTSTR)middle;
UpdateData(FALSE);
}
⑺ 跪求一個MFC製作的簡單計算器帶報告 T T
計算機系統設計報告
一、 計算器系統開發設計思想
1、 試驗目的
運用所學知識,通過實踐加強對所學知識的理解和鞏固,增強對相關知識的認識,提高應用所學知識在世界中發現問題、分析問題和解決問題的能力。
2、 試驗內容
設計一個多功能計算軟體實現功能:
1)具備整型數據、浮點型數據的算術(加、減、乘、除)運算功能。依次輸入第一個運算數、運算符(+,-,*,/)、第二個運算數,然後輸出結果。結果可以作為下一個運算的第一運算數。按『C』清屏,按『R』返回 菜單。
例如:輸入:2
+
5
輸出:7
2)實現單運算符表達式計算的功能。輸入的操作數可以包含整數或浮點數。輸入表達式如下:
例如:輸入:2+5在
輸出:7
二、 計算器系統功能及系統設計介紹
1、 界面設計
創建一個基本對話框的MFC應用程序,在對話框窗體上創建一個計算器所需的按鈕。並修改按鈕的屬性,將個按鈕的ID改為向對應的符號,如將 的ID改為IDC_zhengfu。並對編輯添加成員變數m_result用以顯示結果。
2、對主要成員函數編寫代碼
(1) 對頭文件jsDlg.h編寫代碼
在頭文件中手動添加成員函數與成員函數變數,代碼如下:
//定義兩個euum枚舉類型Operator, CalcError結構
enum Operator { OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide };
enum CalcError { ErrNone, ErrDivideByZero };
double m_operand; //存儲當前輸入的操作數
double m_accum; //存儲當前的計算處理結束
BOOL m_bCoff; //標識當前輸入是否是小數
double m_coff; //小數輸入時的系數
Operator m_operator; //定義 枚舉變數 m_operator 用以標識當前運算符
CalcError m_errorState; // 定義 枚舉 變數m_errorState 用以標識當前運算狀態
BOOL m_bOperandAvail; //標識當前輸入是否是新輸入數字
void UpdateDisplay(); //成員函數處理顯示
void Calculate(); //成員函數處理計算
void OnOperandInput(int a); //成員函數處理數字輸入
(2)對原文件jsDlg.cpp編寫代碼
因為該系統運算過程中需要使用平方跟函數,所以在頭文件中要添加頭文件#include 「math.h」。然後對聲明變數進行初始化:
jsDlg::jsDlg(CWnd* pParent /*=NULL*/)
: CDialog(jsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCaaDlg)
m_result = _T(「」); //默認為m_result變數初始化
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_coff=0.1; //為變數進行初始化
m_bCoff=0; 為變數進行初始化
m_errorState = ErrNone; //為變數進行初始化
m_bOperandAvail=FALSE; //為變數進行初始化
m_operator=OpNone; //為變數進行初始化
}
(3)對各控制項編寫代碼
void jsDlg ::On0() //處理「 0」按鈕
{
// TODO: Add your control notification handler code here
OnOperandInput(0);
}
void jsDlg::On1() //處理「 1」按鈕
// TODO: Add your control notification handler code here
OnOperandInput(1);
}
數字「0-9」控制項的代碼同上類似
void CJsDlg::Onjia()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpAdd;
}
void CJsDlg::Onjian()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpSubtract;
}
void CJsDlg::Oncheng()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpMultiply;
}
void CJsDlg::Onchu()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpDivide;
}
void CJsDlg::Onzhengfu()
{
// TODO: Add your control notification handler code here
m_operand*=-1;
UpdateDisplay();
}
void CJsDlg::Ondian()
{
// TODO: Add your control notification handler code here
m_bCoff=1;
UpdateDisplay();
}
void CJsDlg::Ondengyu()
{
// TODO: Add your control notification handler code here
Calculate();
m_operator = OpNone;
}
void CJsDlg::Onpingfang()
{
// TODO: Add your control notification handler code here
m_operand*=m_operand;
UpdateDisplay();
}
void CJsDlg::Onsqrt()
{
// TODO: Add your control notification handler code here
m_operand=sqrt(m_operand);
UpdateDisplay();
}
void CJsDlg::Onqinglin()
{
// TODO: Add your control notification handler code here
m_operator = OpNone;
m_operand = 0;
m_accum = 0;
m_bOperandAvail = FALSE;
m_errorState = ErrNone;
m_coff=0.1;
m_bCoff=0;
UpdateDisplay();
}
void CJsDlg::OnR()
{
// TODO: Add your control notification handler code here
OnOK(); // 退出對話框程序
}
(4)編寫用於實現計算的自定義函數
在jsDlg.cpp中編寫:
void jsDlg ::OnOperandInput(int a) //處理0-9 數字的輸入函數
{
if (m_errorState != ErrNone) //判斷當前運算是否有誤,若有則返回
return;
if (!m_bOperandAvail) //判斷是否輸入新的數字,1-是 0-否
m_operand = 0;
if(!m_bCoff) //判斷是否是小數輸入,1-是 0-否
m_operand=m_operand*10+(a);
else
{
m_operand=m_operand+(a)*m_coff;
m_coff*=0.1;
}
m_bOperandAvail=TRUE;
UpdateDisplay(); //更新顯示
}
(5)編寫處理計算函數
在jsDlg.cpp中編寫:
void jsDlg ::Calculate()
{
if (m_errorState != ErrNone)
return;
if (m_bOperandAvail)
{ //如果沒有計算符就將m_operand值賦予m_accum
if (m_operator == OpNone)
m_accum = m_operand;
else if (m_operator == OpMultiply)
//否則按計算符進行計算
m_accum *= m_operand;
else if (m_operator == OpDivide)
{
if (m_operand == 0)
m_errorState = ErrDivideByZero;
else
m_accum /= m_operand;
}
else if (m_operator == OpAdd)
m_accum += m_operand;
else if (m_operator == OpSubtract)
m_accum -= m_operand;
}
m_bOperandAvail = FALSE;
m_bCoff=0;
m_coff=0.1;
UpdateDisplay();
}
(6)編寫處理顯示函數
在jsDlg.cpp中編寫:
Void CjsDlg::UpdateDisplay() //處理顯示函數
{
if (GetSafeHwnd() == NULL)
return;
if (m_errorState != ErrNone)
m_result="除數不能為零";
else //如果當前計算無錯誤那麼進行顯示
{
//如果是輸入計算數,那麼顯示輸入情況,如果按下計算符,則顯示結果
float lVal = (m_bOperandAvail) ? m_operand : m_accum;
m_result.Format(_T("%f"), lVal); //將float型轉化為CString型
int i=m_result.GetLength();
while(m_result.GetAt(i-1)=='0')
{
m_result.Delete(i-1,1);
i-=1;
}
}
//用編輯控制項變數m_result改變編輯控制項的值,更新顯示
UpdateData(FALSE);
}
3、 檢查創建工程並運行
三、 計算器系統開發的體會
本次MFC計算器的製作,學到了MFC基本的編程方法,增加了編寫程序的能力,對VC++可視化用戶界面的理解進一步加深。對類的類的封裝和設計也有了一種新的認識,為以後的學習積累了經驗。不過,通過這次設計實踐,也發現了自己的不足之處。在編寫過程中也遇到了困難,請教了許多同學,反復檢查之後也終於不問題解決了,做出了自己想要的成果。總之,這次實踐然我學到了許多東西,有很大的進步。
這個...嫌長了就自己簡略一下...
⑻ 如何用MFC編寫一個計算器
嗯,實現如抄下:
用visual stdio 或者 visual c++ 6.0建一個MFC的工程項襲目,默認會自動有一個面板。
然後在面板上添加按鈕(button(包括數值和計算的法則)),並為每個button關聯一個變數(0-9),對於=則右擊選擇添加函數,執行具體操作。
再在面板上添加一個可編輯框,用於顯示結果,關聯到一個變數。
在點擊=之後,執行操作的時候,將獲取的變數序列通過數據結構(清華大學版中有)中的介紹棧的實例就是講解如果將計算式表達為後綴表達式,並計算結果,這個就涉及到具體怎麼實現演算法了,你需要哪一步怎麼用的時候再上網查下怎麼做,這樣即能做出來,而且以後還知道怎麼做了。
⑼ C++課程設計(計算器)
我有一個 c#的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
double a, b, c; int d=0;
bool IsDigit = true;
bool IsNew = true;
public Form1()
{
InitializeComponent();
}
private void btnval0_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
if (IsNew)
{ txtvalue.Text = btn.Text; IsNew = false; }
else
txtvalue.Text += btn.Text;
}
private void btnAdd_Click(object sender, EventArgs e)
{
if (IsDigit) BtnResult_Click(sender, e);
d = 1;
a = double.Parse(txtvalue.Text);
IsNew = true;
}
private void btnsub_Click(object sender, EventArgs e)
{
if (IsDigit) BtnResult_Click(sender, e);
d = 2;
a = double.Parse(txtvalue.Text);
IsNew = true;
}
private void btnMulti_Click(object sender, EventArgs e)
{
if (IsDigit) BtnResult_Click(sender, e);
d = 3;
a = double.Parse(txtvalue.Text);
IsNew = true;
}
private void btnDiv_Click(object sender, EventArgs e)
{
if (IsDigit) BtnResult_Click(sender, e);
d = 4;
a = double.Parse(txtvalue.Text);
IsNew = true;
}
private void BtnResult_Click(object sender, EventArgs e)
{
b = double.Parse(txtvalue.Text);
switch (d)
{
case 1: c = a + b; break;
case 2: c = a - b; break;
case 3: c = a * b; break;
case 4: c = a / b; break;
}
if(d!=0)txtvalue.Text = c.ToString();
IsNew = true;
}
}
}
⑽ 求一個用vs2010中mfc編寫的一個簡易計算器,只需要加減乘除即可
http://..com/question/1817825401306349388.html?oldq=1