




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)一計(jì)算器的制作
一.實(shí)驗(yàn)規(guī)定
1.參照Windows系統(tǒng)提供的計(jì)算器功能,制作一個(gè)自己的計(jì)算器,至少能完
畢數(shù)據(jù)的加減乘除的基本功能。
2.控件的焦點(diǎn)以及Tab鍵的設(shè)立和使用
3.多個(gè)控件(按鈕)事件的共享
4.鍵盤(pán)的事件的應(yīng)用
二.設(shè)計(jì)思緒
1、一方面要考慮將輸入的內(nèi)容在textbox上顯示出來(lái)。所以整
個(gè)過(guò)程采用全局變量input來(lái)記錄用戶輸入的內(nèi)容(計(jì)算
器的按鍵輸入或者鍵盤(pán)輸入)。然后再將input的內(nèi)容顯示到
textbox上。
2、接下來(lái)就是怎么去將用戶的輸入變成數(shù)字和運(yùn)算符的問(wèn)題了。
本實(shí)驗(yàn)的計(jì)算器有“普通運(yùn)算”和“科學(xué)運(yùn)算”之分。所以
在計(jì)算的時(shí)候需要判斷是哪一種運(yùn)算,用radi
oButton.Checked來(lái)判斷。
3、假如是普通的運(yùn)算,“+的優(yōu)先級(jí)同樣,所以
算法比較簡(jiǎn)樸,只需要將input字符串的內(nèi)容分割成運(yùn)算符和
數(shù)字,然后再push到兩個(gè)不同的棧中。其中數(shù)字要先轉(zhuǎn)換為
double類(lèi)型,再存入到棧中。
4、假如是科學(xué)運(yùn)算,則需要按照來(lái)“+的優(yōu)
先級(jí)來(lái)進(jìn)行運(yùn)算。我是運(yùn)用堆棧來(lái)實(shí)現(xiàn)的。算法如下:每當(dāng)用
戶點(diǎn)擊中的任何一個(gè)鍵時(shí),則進(jìn)行判
斷,假如是“*”、“/”,則將”之前的一個(gè)數(shù)變成
double類(lèi)型,然后再存入棧中。然后設(shè)立乘號(hào)的標(biāo)記符flag
1為true,或者設(shè)立除號(hào)的標(biāo)記符flag2為true。假如用戶點(diǎn)
擊的是“+則先判斷flagl,flag2是否為true,
假如為true,則從棧中pop一個(gè)數(shù),然后與當(dāng)前用戶輸入
的數(shù)進(jìn)行計(jì)算,然后再push到棧中,并把“+”、“一”也存入
到另一個(gè)棧中;假如為false,則將“+之前的一個(gè)
數(shù)變?yōu)閐ouble,然后存入棧中,把“+也存入到另一
個(gè)棧中。
5、當(dāng)用戶點(diǎn)擊“=”號(hào)的時(shí)候,則對(duì)兩個(gè)棧進(jìn)行運(yùn)算。由于實(shí)驗(yàn)
還規(guī)定可以支持鍵盤(pán)輸入。所以需要對(duì)Input進(jìn)行判斷。由
于假如是鍵盤(pán)輸入,input的值為空,所以需要先把textbo
x中的內(nèi)容讀取進(jìn)來(lái),然后再進(jìn)行判斷,分割成數(shù)字和運(yùn)算符,
然后再分別存入到兩個(gè)棧中。假如是計(jì)算器的按鍵輸入,則直
接對(duì)兩個(gè)棧的內(nèi)容進(jìn)行運(yùn)算。
6、假如你的輸入為“1+2-3*4+4+”,然后按“=”號(hào),即輸入的式
子后面多了一個(gè)“+”號(hào)或“一”號(hào)或“火”號(hào)或“/”號(hào),
程序會(huì)自動(dòng)忽略式子最后多余的那一個(gè)運(yùn)算符,仍然可以對(duì)
的計(jì)算。并且程序的上一次計(jì)算結(jié)果可以作為下一次計(jì)算的
一個(gè)輸入,即將上一次的計(jì)算結(jié)果賦給input,然后可以繼續(xù)
運(yùn)算。
7、程序中還設(shè)計(jì)了小數(shù)的計(jì)算、退格鍵以及清零鍵??梢赃M(jìn)行小
數(shù)的“+若輸錯(cuò)了數(shù)字,可以通過(guò)退格鍵
來(lái)清除。本實(shí)驗(yàn)的“退格鍵”支持一次性退多個(gè)格,
例如,你輸入1+2-3*4/5+6之類(lèi)的,然后退格到1+2-3,
計(jì)算結(jié)果仍然對(duì)的。清零鍵即將程序中的各個(gè)變量的值重
置。
8、本程序的鍵盤(pán)輸入跟計(jì)算器上的按鍵輸入具有同樣的效果,同
樣具有“普通運(yùn)算”和“科學(xué)運(yùn)算”之分。它只是在獲得數(shù)
據(jù)方面跟按鍵輸入不同,其余的計(jì)算是同樣的。
四則運(yùn)算核心代碼:
privatevoidcal()//判斷“+”或“-”號(hào)之前的運(yùn)算符是不是為“*”或者"/”號(hào),假如是
則進(jìn)行相應(yīng)的計(jì)算。
(
if(radioButton2.Checked==true)
(
if(flagl==true)
(
sum=Doub1e.Parse(substr)*num.Pop();
num.Push(sum);
f1ag1=faIse;
)
elseif(f1ag2==true)
sum=num.Pop()/Double.Parse(substr);
num.Push(sum);
flag2=false;
)
else
(
num.Push(Double?.Parse(substr));
)
}
else
(
num.Push(Double.Parse(substr));
I
}
privatevoidbuttonl3_Click(objectsender,EventArgse)//
加號(hào)算法,調(diào)用cal()函數(shù)。
(
clears();
i=input.LastIndex0fAny(fuhao);
substr=input.Substring(i+1);
if(substr!="")
(
cal();
fh.Push("+〃);
c1ick(sender,e);
}
privatevoidbutton14_C1ick(objectsender,EventArgse)//減號(hào)
算法,調(diào)用cal()函數(shù)。
(
clears();
i=input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!=
(
cal();
fh.Push(";
c1ick(sender,e);
)
}
privatevoidbuttonl5_C1ick(objectsender,EventArgse)//乘號(hào)算
法。會(huì)先判斷該運(yùn)算符前面一個(gè)是不是“+”或者“-”號(hào),然后進(jìn)行相應(yīng)的解決。設(shè)立flagl/f1a
g2為true。
(
clears();
i=input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!="")
if(radioButton2.Checked==true)
if(flagl==true||flag2==true)
cal();flag1=true;
)
else
(
flagl=true;
num.Push(Double.Parse(substr));
)
)
else
nuin.Push(Double.Parse(substr));
fh.Push(〃*〃);
}
click(sender,e);
privatevoidbuttonl6_C1ick(objectsender,EvenIArgse)//除號(hào)
clears();
i=input.LastTndexOfAny(fuhao);
substr=input.Substring(i+1);
if(substr!=null)
if(radioButton2.Checked==true)
if(flag1==trueIIflag2==tr
(
cal();
flag2=true;
}
else
(
flag2=true;
num.Push(Doub1e.Parse(substr));
)
)
else
(
num.Push(Double.Parse(substr));
fh.Push(°/〃);
)
c1ick(sender,e);
)
)
privatevoidbuttonl2_Click(objectsender,EventArgse)//退格鍵
//c1ears();
if(input!=〃")
textBox1.Foeus();
inpu「input.Removednput.Length-l);
textBoxl.Text=input;
substr="str="";
num.Clear();
num22.Clear();
fh.Clear();
fh2.C1ear();
f1ag1=false;flag2=fa1se;flag3=true;//fla
g3用來(lái)記錄是否觸發(fā)了“退格鍵”。
sum=0;numl=0;num2=0;
)
}
privatevoidc1ears()〃此函數(shù)用來(lái)解決點(diǎn)擊“退格鍵”事件。當(dāng)點(diǎn)擊退格鍵之后,假如點(diǎn)
擊了其他的按鍵,則程序會(huì)先解決這個(gè)函數(shù)。
(
if(flag3==true)
(
jianpan();
flag3=false;
input=textBoxl.Text;
)
}
privatevoidjianpan()//鍵盤(pán)輸入
input=textBox1.Text;
while(input.Contains('+')IIinput.Contains(,->)I|input.C
ontains(,*')||input.Contains^/'))
{
j=input.IndexOfAny(fuhao);
substr=input.Substring(0,j);
if(substr!="〃)
(
switch(input[j])
(
case'+y:cal();fh.Push("+");break;
case'-':cal();fh?Push("一〃);break;
case'*':if(radioButton2.Checked==true)
(
if(flagl==true|Iflag2==true)
(
ca1();flagl=true;
)
else
(
flag1=true;
num.Push(Double.Parse(substr));
)
e1se
num.Push(Doub1e.Parse(substr));
fh.Push—*");
)
break;
case'/':if(radioButton2.Checked==true)
(
if(flagl==true||flag2==true)
(
ca1();
flag2=true;
}
else
{
flag2=true;
num.Push(Double.Parse(substr));
)
)
else
(
num.Push(Double.Parse(substr));
fh.Push("/");
break;
}
}
input=input.Substring(j+1);
)
substr=input;
}
privatevoidbuttonl8_Click(objectsender,EventArgse)//“二”號(hào)鍵
clears();
if(input==
(
jianpan();
cal();
input=textBoxl.Text;
)
else
(
i二input.LastIndexOfAny(fuhao);
substr=input.Substring(i+1);//Console.Write(substr);
if(substr!=〃")
(
ca1();
)
)
while(num.Count!=0)
numl=num.Pop();
num22.Push(numl);
)
foreach(doub1enumberinnum22)
(
Conso1e.Write(number+"〃);
}
while(fh.Count!=0)
(
substr=fh.Pop();
fh2.Push(substr);
}
foreach(stringfuhinfh2)
{
Console.Write(fuh+〃”);
}
if(fh2.Count!=0)
{
sum=0;
numl=num22.Pop();
while(num22.Count!=0)
(
num2=num22.Pop();
substr=fh2.Pop();
switch(substr)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租客合同終止租房協(xié)議
- 技術(shù)開(kāi)發(fā)與轉(zhuǎn)讓合同保密范本
- 智能化系統(tǒng)供貨安裝合同樣本
- 礦山企業(yè)輪換工勞動(dòng)合同模板及示例
- 農(nóng)村土地出租權(quán)屬合同樣本
- 標(biāo)準(zhǔn)貨物銷(xiāo)售合同簡(jiǎn)版
- 城市配送服務(wù)合同一覽
- 小學(xué)生種花演講課件
- 影視設(shè)備行業(yè)交流服務(wù)批發(fā)考核試卷
- 廣播電視節(jié)目的心理影響與教育意義考核試卷
- 2024年江蘇省衛(wèi)生健康委員會(huì)所屬事業(yè)單位招聘筆試真題
- 廉潔知識(shí)培訓(xùn)課件
- 分布式光伏發(fā)電開(kāi)發(fā)建設(shè)管理辦法2025
- 《科幻小說(shuō)賞析與寫(xiě)作》 課件 -第六章 “外星文明”的善意與惡行-《安德的游戲》
- 《我國(guó)的文化安全》課件
- 2025蛇年一上英語(yǔ)寒假作業(yè)
- 建筑行業(yè)新員工試用期考核制度
- 二年級(jí)經(jīng)典誦讀社團(tuán)計(jì)劃
- 潔凈室施工組織設(shè)計(jì)方案
- 2025年太倉(cāng)市文化旅游發(fā)展集團(tuán)限公司及子公司公開(kāi)招聘12名高頻重點(diǎn)提升(共500題)附帶答案詳解
- 機(jī)械制圖題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論