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