2023年計(jì)算器實(shí)驗(yàn)報(bào)告_第1頁(yè)
2023年計(jì)算器實(shí)驗(yàn)報(bào)告_第2頁(yè)
2023年計(jì)算器實(shí)驗(yàn)報(bào)告_第3頁(yè)
2023年計(jì)算器實(shí)驗(yàn)報(bào)告_第4頁(yè)
2023年計(jì)算器實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論