JAVA作业 02 JAVA语法基础
一、
思考問題一:枚舉類型
public class EnumTest {
public static void main(String[] args)
{ Size s=Size.SMALL;
Size t=Size.LARGE; //s和t是否引用同一個對象
System.out.println(s==t);?//是原始數(shù)據(jù)類型嗎?
System.out.println(s.getClass().isPrimitive()); //從字符串中轉(zhuǎn)換
Size u=Size.valueOf("SMALL");
System.out.println(s==u);?
for(Size value:Size.values())
{ System.out.println(value); }
}}? enum Size{SMALL,MEDIUM,LARGE};
?
1結(jié)果截圖示例
?
2?實驗分析
枚舉類型的每個具體值都引用一個特定的對象,相同值引用同一個對象。因為s和t是不同內(nèi)容所以引用不同對象。
枚舉是引用型變量,枚舉類型關(guān)鍵字是enum,類型名自己根據(jù)需要定義,可以通過定義變量名來遍歷。valueOf() 類型轉(zhuǎn)換,將后邊的類型轉(zhuǎn)換成前邊的類型??梢栽陬愔卸x,也可以在類外定義。
可以使用“==”和equals()方法直接比對枚舉變量的值,換句話說,對于枚舉類型的變量,“==”和equals()方法執(zhí)行的結(jié)果是等價的。
1)定義
enum 類型名 {內(nèi)容1,內(nèi)容2,.....內(nèi)容n};
2)引用
類型名 變量名=類型名.內(nèi)容
3)遍歷
for( 類型名 變量名:類型名.values()){
System.out.println(變量名); }
?
二、
思考問題二:反碼?原碼和補碼
1 在計算機內(nèi),定點數(shù)有3種表示法:原碼、反碼和補碼。原碼、反碼、補碼是相對于整數(shù)來說,都是8位二進制表示一個數(shù)。反碼是數(shù)值存儲的一種,但是由于補碼更能有效表現(xiàn)數(shù)字在計算機中的形式,所以多數(shù)計算機一般都不采用反碼表示數(shù)。
1)原碼?
?最高位為符號位;正數(shù)最高位為0,負數(shù)為1.
范圍 -127~+127
例 +11的原碼是00001011,-11原碼是10001011.
2)反碼
正數(shù)的反碼與其原碼相同;負數(shù)的反碼是對其原碼逐位取反,但是符號位不變。
范圍
-127~+127
例 +11的反碼是00001011,-11的反碼是11110100
3)補碼
正數(shù)的補碼原碼一樣;負數(shù)的補碼是在其反碼的末位加一。
范圍-128~+127
例 +11補碼 00001011,-11補碼10000101
2 示例程序
?(-83)+(-80)=?
1 0 1 0 1 1 0 1 B -83 1 0 1 1 0 0 0 0 B -80 0 1 0 1 1 1 0 1 B +93 思考:這兩個題目,按照正常的法則來運算,但結(jié)果顯然不正確,這是怎么回事呢? 答案:這是因為發(fā)生了溢出。 如果計算機的字長為n位,n位二進制數(shù)的最高位為符號位,其余n-1位為數(shù)值位,采用補碼表示法時,可表示的數(shù)X的范圍是 -2的n-1次冪≤X≤2的n-1次冪-1 當(dāng)n=8時,可表示的有符號數(shù)的范圍為-128~+127。兩個有符號數(shù)進行加法運算時,如果運算結(jié)果超出可表示的有符號數(shù)的范圍時,就會發(fā)生溢出,使計算結(jié)果出錯。很顯然,溢出只能出現(xiàn)在兩個同符號數(shù)相加或兩個異符號數(shù)相減的情況下。 對于加法運算,如果次高位(數(shù)值部分最高位)形成進位加入最高位,而最高位(符號位)相加(包括次高位的進位)卻沒有進位輸出時,或者反過來,次高位沒有進位加入最高位,但最高位卻有進位輸出時,都將發(fā)生溢出。因為這兩種情況是:兩個正數(shù)相加,結(jié)果超出了范圍,形式上變成了負數(shù);兩負數(shù)相加,結(jié)果超出了范圍,形式上變成了正數(shù)。 而對于減法運算,當(dāng)次高位不需從最高位借位,但最高位卻需借位(正數(shù)減負數(shù),差超出范圍),或者反過來,次高位需從最高位借位,但最高位不需借位(負數(shù)減正數(shù),差超出范圍),也會出現(xiàn)溢出。 在計算機中,數(shù)據(jù)是以補碼的形式存儲的,所以補碼在c語言的教學(xué)中有比較重要的地位,而講解補碼必須涉及到原碼、反碼。 在n位的機器數(shù)中,最高位為符號位,該位為零表示為正,為一表示為負;其余n-1位為數(shù)值位,各位的值可為零或一。當(dāng)真值為正時,原碼、反碼、補碼數(shù)值位完全相同;當(dāng)真值為負時,原碼的數(shù)值位保持原樣,反碼的數(shù)值位是原碼數(shù)值位的各位取反,補碼則是反碼的最低位加一。注意符號位不變。?三、
思考問題三:同名變量的屏蔽原則
1.原則:局部變量的名字和全局變量的名字相同,在局部變量的有效范圍內(nèi),全局變量將失去作用。
?2.示例
?
輸出 1,沒有屏蔽,因為不同名。
?輸出2,因為同名,但是在主函數(shù)的作用域內(nèi),所以以2為主。
?
四、
思考問題四:浮點數(shù)在計算機內(nèi)部的表示方法
1.?為什么用double類型計算得不到數(shù)學(xué)上的精確結(jié)果?
無論是單精度還是雙精度在存儲中都分為三個部分:
這個涉及到二進制與十進制的轉(zhuǎn)換問題。計算機是二進制的。浮點數(shù)沒有辦法是用二進制進行精確表示。我們的CPU表示浮點數(shù)由兩個部分組成:指數(shù)和尾數(shù),這樣的表示方法一般都會失去一定的精確度,有些浮點數(shù)運算也會產(chǎn)生一定的誤差。
N進制可以理解為:數(shù)值×基數(shù)的冪,例如我們熟悉的十進制數(shù)123.4=1×102+2×10+3×(10的0次冪)+4×(10的-1次冪);其它進制的也是同理,例如二進制數(shù)11.01=1×2+1×(2的0次冪)+0+1×(2的-2次冪)=十進制的3.25。 double類型的數(shù)值占用64bit,即64個二進制數(shù),除去最高位表示正負符號的位,在最低位上一定會與實際數(shù)據(jù)存在誤差(除非實際數(shù)據(jù)恰好是2的n次方)。
舉個例子來說,比如要用4bit來表示小數(shù)3.26,從高到低位依次對應(yīng)2的1,0,-1,-2次冪,根據(jù)最上面的分析,應(yīng)當(dāng)在二進制數(shù)11.01(對應(yīng)十進制的3.25)和11.10(對應(yīng)十進制的3.5)之間選擇。 簡單來說就是我們給出的數(shù)值,在大多數(shù)情況下需要比64bit更多的位數(shù)才能準確表示出來(甚至是需要無窮多位),而double類型的數(shù)值只有64bit,后面舍去的位數(shù)一定會帶來誤差,無法得到“數(shù)學(xué)上精確”的結(jié)果。
2.在構(gòu)建BigDecimal對象時應(yīng)使用字符串而不是double數(shù)值,否則,仍有可能引發(fā)計算精度問題。(為什么會這樣呢?)
?由于浮點數(shù)采用二進制系統(tǒng)表示,而二進制無法精確的表示1/10,好比十進制無法精確表示1/3一樣。因此,對于很多值浮點數(shù)都是采用其能夠表示的離目標值近的數(shù)來表示,這有可能會在計算中帶來不易察覺的誤差。為了解決基本數(shù)據(jù)類型浮點數(shù)不能進行精確計算的問題,java中專門提供了java.math.BigDecimal類,其提供浮點數(shù)的精確計算功能。
?
五、
思考問題五:
以下代碼的輸出結(jié)果是什么?為什么會有這樣的輸出結(jié)果?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
因為第一個輸出 “x+y=” 是以字符形式輸出的,字符和任何數(shù)據(jù)類型相加都是相連接,形成一個更大的字符串;第二個x和y先做加法運算,再輸出300=x+y。
?
六、
課后實驗性問題:編寫一個程序,用戶輸入兩個數(shù),求出其加減乘除,并用消息框顯示計算結(jié)果。
1.程序設(shè)計思想:首先在框架中輸入兩個字符串,轉(zhuǎn)化為整形,然后輸入一個符號,利用條件語句判斷它是什么運算符號,計算、輸出結(jié)果(符號輸入不符合四則運算的提示錯誤)。
2.程序流程圖:
????????????
3.源程序:
?
//2016/9/30
?
import?javax.swing.JOptionPane;
?
public?class?Addition {
public?static?void?main(String[] args) {
?
String firstNumber,secondNumber,sym;
int?number1,number2;
float?num;
?
firstNumber?= JOptionPane.showInputDialog("Enter first integer");
secondNumber?= JOptionPane.showInputDialog("Enter second integer");
sym?= JOptionPane.showInputDialog("Input the symbol");
?
number1?= Integer.parseInt(firstNumber);
number2?= Integer.parseInt(secondNumber);
?
if(sym.equals("+"))
{
num?= number1?+ number2;
JOptionPane.showMessageDialog(null,number1?+ "+"?+ number2?+ "="?+ num);
}
else?if(sym.equals("-"))
{
num?= number1?- number2;
JOptionPane.showMessageDialog(null,number1?+ "-"?+ number2?+ "="?+ num);
}
else?if(sym.equals("*"))
{
num?= number1?* number2;
JOptionPane.showMessageDialog(null,number1?+ "*"?+ number2?+ "="?+ num);
}
else?if(sym.equals("/"))
{
num?= number1?/ number2;
JOptionPane.showMessageDialog(null,number1?+ "/"?+ number2?+ "="?+ num);
}
else
{
JOptionPane.showMessageDialog(null,"Error!");
}
}
}
4.驗證結(jié)果截圖:
?
5.實驗總結(jié):1)在判斷字符中“==”和equals分不太清楚;2)在判斷字符是否相等時,開始用的單引號,后來才反應(yīng)過來輸入符號時用的是字符串類型,應(yīng)該改為雙引號。
最新評論
評論排行榜
?
轉(zhuǎn)載于:https://www.cnblogs.com/gxt-/p/5937275.html
總結(jié)
以上是生活随笔為你收集整理的JAVA作业 02 JAVA语法基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言重难点:大端小端
- 下一篇: MFC通过URL下载并保存文件代码 转载