小飛計算器(小飛可程式設計複數計算器)使用者手冊

小飛_Xiaofei發表於2014-01-22

版權所有。所有權利保留。

歡迎轉載,轉載時請註明出處:

http://blog.csdn.net/xiaofei_it/article/details/18676049

本軟體特色

·可程式設計,程式設計師可以在本軟體中寫程式。

·支援複數和複函式,所有函式均可以在複數模式下計算。

·支援多進位制實數,通常計算器只支援多進位制整數,本軟體還支援多進位制小數。

·高精度,支援任意小數轉為分數。

·有任意多的儲存器可供儲存資料。


更多特色請看

http://blog.csdn.net/xiaofei_it/article/details/18675175



如果您發現本軟體的漏洞、錯誤或對本軟體有任何建議、意見,請聯絡小飛。


1、基本功能

開啟計算器,使用者看到的介面稱作計算介面。



計算介面第一行的方框是輸入框,第二行的方框是輸出框,第三行的方框是模式框,最底下的方框是提示框。

請按在紙上的相同格式輸入結果,輸入的數值表示式將顯示在輸入框中。

之後按=,便開始進行計算。計算完成後結果將顯示在輸出框中。



如果想終止運算,按終止。

模式框顯示當前模式,通過設定可以改變模式。

點選“設定”可以改變實數複數模式、角度弧度模式、顯示方式。關於顯示方式請參見下文的“結果顯示”。

提示框顯示提示資訊。

在數值表示式中,運算子優先順序和日常的沒區別。

另外乘號寫作“*”,除號寫作“/”,圓周率寫作“pi”。

2、數值表示式

數值表示式出現在很多地方,輸入框中的表示式就應該是一個合法的數值表示式。在自定義函式中,數值表示式尤為重要。

數值表示式和日常計算的表示式幾乎一樣,優先順序也幾乎一樣:乘方最高,乘除其次,加減最低。

另外,a^b表示a的b次方。注意乘方號的結合性,2^3^4是2^(3*4),而不是(2^3)^4。

在使用自然對數的底e時要注意,科學計數法裡已經使用了e作為指數標誌,所以諸如e^x應該使用exp(x)。

不論呼叫內建函式還是自定義函式,必須加上括號,比如sin 8應該寫作sin(8)。

pi返回圓周率。ans返回上次的計算結果,複數模式下,ans只保留結果的實數部分。

一個合法表示式的例子是3*7^4*ans+pi+load(x)。

2.1 合法的數

·實數輸入

實數可以有正負號,也可以加上指數,指數不能超過1000,不能小於-1000。一個實數不管有沒有指數部分,都不能有空格。

如果要進行多進位制輸入,則應加上字首。多進位制輸入時,可以輸入小數,但不能輸入類似科學計數法的指數。字首以數字0開頭,後接一個字母(b或B表示二進位制,小寫字母o或大寫字母O表示八進位制,d或D表示十進位制,h或H表示十六進位制)。十六進位制大於9的部分由大小寫字母abcdef或ABCDEF構成。

以下是幾個例子:

89.756e+900
-89.68E89
32999.7864e-87
0Hadf78.8907
0b110.00011

·複數輸入

複數的實數部分和實數輸入相同,虛數部分在虛數後加上i即可。

比如3-7i、-8+9i,如果想單獨輸入虛數單位i(比如2+i),那麼應該輸入1i(2+i應該輸入2+1i),因為計算器不把i看成數字,而把它看成一個識別符號。

3、結果顯示


根據使用者的設定,計算結果會以相應的方式顯示在輸出框中。
如果是“正常顯示”,則會根據使用者設定的進位制顯示結果。當數過大或過小時,自動改為科學計數法。
如果是“小數顯示”,則會根據使用者設定的進位制顯示結果。使用者可以按“+”或“-”改變保留的小數位數。
如果是“科學計數法”,則會按科學計數法顯示結果。使用者可以按“+”或“-”改變有效數字位數。科學計數法始終是十進位制顯示的。
使用者還可以在計算介面點選“分數顯示”,把結果顯示為帶分數或假分數。當結果是有限小數或無限迴圈小數時,會顯示為精確結果;當結果是無限非迴圈小數時,會顯示為儘可能精確的近似結果。
注意:結果一律以合法的數值表示式顯示(便於把結果複製後再進行運算),所以某些時候結果看起來有些奇怪。比如:
632i+36”在“科學計數法3位有效數字”的模式下結果顯示為“3.60e1+6.32e2*1i”;“6/36i+36/9852-69/7-6i”的結果顯示為帶分數是“-(9+4905/5747)-(6+1/6)*1i”,仔細看就是兩個帶分數。這個結果在某些計算器上顯示時,已經填滿了輸出框,這時請左右移動輸出框,便可看到結果的所有部分。當結果填滿輸出框時,請務必左右移動輸出框,看是否有一部分被隱藏了。

4、儲存結果

計算結束後,可以儲存結果。點選“儲存結果”,選擇要存入的儲存器即可。也可以新建儲存器進行儲存。
第一次使用時,還沒有儲存器,必須新建儲存器進行儲存。
儲存器ans儲存上次的計算結果,不應人為把結果存入ans中。

5、儲存器

儲存器儲存一些數值供使用者以後使用。使用者點選計算介面的“儲存器”後,可以新建儲存器並且儲存一些數值,也可以更改現有的儲存器中的數值。
在自定義函式中,使用者可以使用store語句把相應的值存入儲存器。
在表示式中,使用者可以使用load(儲存器名)使用儲存器中的數值。比如load(sum)+5。另外load(ans)和ans是同一個意思。
儲存器名應是一個合法的識別符號。
注意:在複數模式下,儲存器只儲存數值的實數部分。
所有數值用十進位制表示時,均有50位精度,在顯示時顯示30位。使用者可以在ans儲存器中檢視所有的50位。

6、識別符號

合法的識別符號是一個字母開頭,後跟字母或數字的字串,中間不能有符號,也不能有空格。如About、sumOf2Num均為合法的識別符號。
儲存器名、函式名、自定義函式中的變數名都應是合法的識別符號。
使用者自定義的識別符號不應是內建函式名、load、ans、pi以及保留字。
保留字有:function、var、if、else、for、to、step、while、break、continue、store、return等。

7、內建函式


表示式中可以呼叫內建函式,但是千萬記住加上括號。如sin(8)、cos(8-7*9)。
點選“函式”,再點選需要呼叫的函式,相應的函式就出現在計算介面輸入框的游標處,但後面的括號要自己補齊。某些函式有多個引數,多個引數中用逗號隔開。如root(34,5)。
輸入內建函式時,計算介面的提示框會顯示提示資訊。
每個內建函式都可以在實數和複數兩種模式下執行。在複數模式下,函式返回的值和實數模式不同,這一點要注意。比如sqrt(-1)結果是1i,而實數模式下會報錯。
通常複函式都是多值的,結果的表示式中會有k,k取不同值時就得到多個結果。
本軟體取k為0。(軟體內建文件在此處有誤,以本文為主。)
複數模式下的函式是供高等院校師生和專業人員使用,普通使用者幾乎不需要在複數模式下使用內建函式。所以普通使用者請儘量使用實數模式下的函式。


8、自定義函式


呼叫自定義函式時,點選“自定義函式”,再選擇自定義函式,按“插入”,便會插入計算介面表示式的游標處,同時提示框內會顯示您編寫自定義函式時輸入的描述資訊。
要編寫自定義函式,點選計算介面中的“自定義函式”,再點選“新建”,輸入函式名和函式描述(呼叫自定義函式時,計算介面中的提示框中會顯示函式描述,所以建議您認真填寫),然後就進入函式編輯頁面。
編輯函式時,函式頭的函式名(具體見下文)應該與之前輸入的函式名保持一致。
編輯框中只能輸入一個函式(區域性函式是不被支援的),如果要建立其他函式,請另外新建函式。
如果編輯框中輸入了多個函式,本軟體只處理第一個函式,第一個函式後的所有內容將被忽略。


計算器只存入localFun,而忽略後面的函式。
本軟體不支援區域性函式,此例中,使用者只能把localFun作為一個新函式進行定義。

編輯函式後,點選檢查,會顯示編譯資訊。有錯誤時,提示資訊會顯示在下方,同時游標會顯示在出錯處的附近。
當確認沒有錯誤後,便可以使用此函式了。
本計算器不支援函式過載,所以當您已經編寫了函式max(a,b)後,就不能再編寫max(a,b,c)了。

9、編寫函式程式碼

一個函式由函式頭、變數定義、函式體三部分組成,其中變數定義部分可以省略。
函式支援遞迴呼叫,並且可以在計算過程中把資料儲存在儲存器中,也可以從儲存器中讀取資料。
寫程式碼時,一切符號請使用英文標點,註釋中的除外;一切字母和數字請使用英文字母和半形數字,註釋中的除外。
考慮到某些手機輸入法可能使用不方便,編輯程式碼時,編輯器中給出了許多標點和語句的快捷輸入鍵。
您可以使用空格和tab製表符進行縮排。
一個典型的函式如下:



在使用計算器時,可以像使用內建函式那樣使用自定義函式。



您開啟fib函式,按“插入”,便可以把該函式插入輸入框的游標位置(和內建函式操作一樣)。


在計算介面輸入fib(6)+fib(3)+1,按等號,便得到17。


但如果計算fib(0)將死迴圈,請終止。


9.1 型別

當實數模式時,所有資料、變數、函式返回值都是實數型別;當複數模式時,所有資料、變數、函式返回值都是複數型別。所以程式設計時無需定義型別,由具體執行環境決定。
如果函式只能在複數模式中執行,那麼在實數模式中執行會報錯。比如:
function foo()
{
	return 1i;
}



另外許多計算器內建函式在複數和實數兩種模式中計算結果不同,因此如果自定義函式中呼叫了內建函式,結果會不同。
function foo(x)
{
	return sqrt(x);
}


如果實數模式呼叫foo(-8),將會報錯,但複數模式可以執行。
因此,在使用內建函式時,請特別注意當前的模式。
您編寫函式時應該儘可能考慮相容性,即讓您的函式在實數複數模式下都能正確執行。

9.2 函式頭

格式:funtion 函式名(引數列表)
引數列表不需要型別,只需要給出變數名。如果沒有引數,則空著;如果多餘一個引數,引數中用逗號隔開。
這些引數是按值傳入的,所以即使在函式體中,引數值發生了變化,原來的那些變數的值不會改變。
因為函式返回的只能是值,所以不需要定義返回值型別。在複數模式下,返回複數;在實數模式下返回實數。
例子:
function foo1()
function foo2(a)
function foo3(val,data,i,j)

9.3 變數定義

格式:var 變數列表;
一切在函式中用到的臨時變數都應該在此處定義,如果沒有臨時變數,則不用定義。
這裡定義的變數是區域性變數,只能在當前這個函式中使用。
定義以分號結尾。變數之間用逗號隔開。
var a,b;
或者
var Example1;
以下例子是錯誤的:
function foo(a)
var b,c;
var d;
{
	...
}



不應出現兩次var,應該改為
function foo(a)
var b,c,d;
{
	...
}


9.4 函式體

函式體由“{”開頭,“}”結尾。
由一條以上的語句構成。和絕大多數程式語言一樣,基本語句以分號結尾。基本語句包括賦值語句、儲存語句、返回語句、break語句、continue語句。

·賦值語句

格式:變數名=數值表示式;
數值表示式在之前已經講解過了。
寫賦值語句時,別忘了最後的那個分號。

·儲存語句

格式:store(數值表示式, 儲存器名);
如果儲存器列表中沒有相應的儲存器,那麼該儲存器會被新建;如果有相應的儲存器,那麼該儲存器的值會被覆蓋。
另外,為了相容,如果儲存一個複數,則只有實數部分會被儲存。這點請特別注意。
例子:
a=3.8;
store(a,mem1);
store(a+1,mem2);
store(5*7,mem3);


執行結束後,在儲存器列表中,mem1儲存值3.8,mem2儲存值4.8,mem3儲存值35。

·返回語句

格式:return 數值表示式;
程式到此即返回,下面部分不再執行。

·if語句

格式1:if (條件表示式) 語句
格式2:if (條件表示式) 語句 else 語句
條件語句可以巢狀。

·條件表示式

條件表示式類似大多數程式語言。
大小比較符不能連用,即1<2<3這種表示式是錯誤的。
優先順序也類似大多數程式語言。以下是所有操作符的優先順序:
最上面的具有最高優先順序,最下面的具有最低優先順序,處於同一行的操作符的優先順序相同。
邏輯非(!)
乘方號(^)
乘除號(*、/)
加減號(+、-)
大小比較符(>、>=、<、<=、==、!=)
邏輯與(&&)
邏輯或(||)


注意:為了相容,在複數模式下,>、>=、<、<=四個符號只比較複數的實數部分,=和!=是比較實數和虛數部分兩個部分。


例子(沒有實際意義)

if (!(year==2001&&year==2002))
	year=year+1;
else if (year/4000==0)
{
	year=year+2;
	ok=0;
}


·while語句

格式:while(條件表示式) 語句
和絕大多數程式語言一樣,此處不再講解。

·for語句

格式:for 變數名=起始數值表示式 to 終止數值表示式 step 間隔數值表示式  語句

沒有“do”,軟體內建文件在此處有誤,以本文為準。)
執行過程如下:
(1)計算起始數值表示式,賦給變數。
(2)計算終止數值表示式,如果變數小於等於終止數值表示式的值,跳至3;否則跳至5。
(3)執行迴圈體。
(4)計算間隔數值表示式,此值加上變數賦給變數本身,跳至2。
(5)執行for語句以後的語句。
注意:每次終止數值表示式和間隔數值表示式都會被重新計算,所以如果數值表示式中有變數,請儘量不要在迴圈體內部改變該變數的值(除非有特殊需求)。
例子:

sum=0;
for i=a to b step 1
	sum=sum+i;



·break和continue

while語句和for語句內部可以使用break和continue,也可以使用return。當然break和coontinue後面有一個分號。


10、其他

10.1 迴圈體

多個語句組成迴圈體時,應用“{”“}”括起來。

10.2 變數初始化

一切變數應該先初始化,否則值不能確定。

10.3 遞迴呼叫

在函式中可以使用內建函式,也可以使用函式自身或其他自定義函式。不需要函式宣告,只要執行的時候,所有被使用的函式均有明確定義即可。
如果您新建一個函式,取名fib,然後把函式體設為:


您就可以使用fib進行計算了。這裡有自身遞迴呼叫。


下面例子是兩個函式互相遞迴呼叫。

您新建一個函式,取名foo,然後把函式體設為


然後再新建一個函式bar



這樣您就可以使用foo和bar了。

注意:編輯函式的那個編輯框中只能編輯一個函式,絕對不能在一個編輯框中輸入兩個函式,也不能建立區域性函式。

10.4 函式註釋

“/*”和“*/”中間可以加入註釋。
例如:
/*This is an example.*/


多行註釋推薦使用Java風格,即
/**
 * This is an example.
 * This is just an example.
 */

不支援“//”的註釋。

11、如何編寫好的函式

·要把函式描述寫好。
·為了相容,註釋儘量用英文。
·考慮輸入的各種情況。如果您編寫的一個函式在某些不符合要求的輸入下不應繼續執行,那麼可以對符合要求的輸入返回相應的值,對不符合要求的輸入不返回值。這樣,如果輸入不符合要求,在函式執行結束時,由於沒有返回值,計算器會報錯,計算便終止了。具體請參見下文的例子。


12、有用的例子

·函式名:rand2


·描述:rand2(a,b)返回一個均勻分佈於[a,b)的隨機數。如果a和b中的任一個有虛數部分或a大於等於b,函式將報錯。


·程式碼:
function rand2(a,b)
{
	if (a==conj(a) && b==conj(b) && a<b)
		return rand(b-a)+a;
}



·函式名:gaussian


·描述:gaussian(mu,sigma)返回一個均值為mu,標準差為sigma的高斯分佈(正態分佈)的隨機數。如果sigma<=0,函式將報錯。


·程式碼:

function gaussian(mu,sigma)
var u1,u2,temp;
{
	if (mu==conj(mu) && sigma==conj(sigma) && sigma>0)
	{
		/**
		 * Since rand(1) returns a uniformly distributed random number between 0.0 (inclusive) and
		 * 1.0 (exclusive), 1-rand(1) returns one between 0.0 (exclusive) and 1.0 (inclusive).
		 */
		u1=1-rand(1);
		u2=1-rand(1);
		/*Use Box-Muller transform to generate a standard Gaussian distributed random number.*/
		temp=sqrt(-2*ln(u1))*cos(2*pi*u2);
		return mu+temp*sigma;
	}
}


相關文章