摘要:代碼實現在控制臺打印總結本篇文章帶大家搭好環境,并體驗了控制臺打印。輸出結果總結熟練掌握取余和整除運算,大有作用。終止本次循環,繼續執行下一次循環。
?本文收錄于專欄《技術專家修煉》
試用于學完「Java基礎語法」后的鞏固提高及「LeetCode刷題」前的小試牛刀。作者其它優質專欄推薦:
?《源碼中的設計模式》——理論和實戰的完美結合
?《leetcode 300題》——每天一道算法題,進大廠必備
?《從實戰學python》——Python的爬蟲,自動化,AI等實戰應用(代碼開源)
Java入門練習100例1-10源碼 提取碼: uqqe
難度:簡單
在控制臺打印“Hello Java!”
“工欲善其事必先利其器”,即使輸出語句很簡單,沒有運行環境,也是巧婦難為無米之炊。
在線環境
有很多小伙伴和我說,還沒等體驗Hello World
的快感呢,就被配置環境變量勸退了。
一條找了在線環境供小伙伴先體驗一下。地址
Windows配置
Windows平臺是使用者最多,配置起來最麻煩的平臺,為了不被勸退,教大家最簡單的方法。
1.安裝JDK
不要更改安裝位置!目錄不要有中文!
2.打開環境變量
教大家最快打開環境變量的方法:
按快捷鍵win+R后,輸入“sysdm.cpl”,然后回車,完事。
3.新建JAVA_HOME
點擊新增——變量名:JAVA_HOM
,變量值:JDK安裝路徑。
默認為:C:/ProgramFiles/Java/jdk1.8.0_79/bin
如此就可以,不用再配置path
,class_path
。
等你熟練掌握了,再研究都是什么意思即可。
Mac配置
由于Mac基于Linux內核,安裝即可,不需要配置環境變量。
開發工具比較流行的有eclipse,idea,VScode等,個人推薦idea,有關使用參考我的專欄《玩轉IDEA》
System.out.println("Hello Java!");
是Java語言的輸出語句,相比于python的print()
復雜了不少,那Java的輸出語句到底是怎么實現的?
System
:java.long
包的類,在創建類文件時就被加載,不需要引入。被final
修飾,不能被實例化。
public final class System { // ……}
out
:System
類下的靜態變量,對應PrintStream
類,同樣的還有in
,err
變量。
public final static PrintStream out = null;
println
:PrintStream
類的方法,就是在這里實現IO流的輸出。
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
/** * https://www.nhooo.com/tool/java/ * 在控制臺打印"hello java" */public class question_01 { public static void main(String[] args) { System.out.println("hello java"); }}
本篇文章帶大家搭好環境,并體驗了控制臺打印。
下一題是控制臺輸入,大家可以先思考一下?
難度:簡單
從鍵盤輸入一個數字,打印出該數字的絕對值。
和打印一樣,相比于python的
input()
,Java的輸入也比較麻煩,但是作為初學者練習,屬于必會內容。下面一條會介紹三種輸入的方法,小伙伴們要注意他們的區別。
System.in
該方法能獲取從鍵盤輸入的字符,但只能針對一個字符的獲取,獲取的只是char
類型的。如果想獲得int
,float
等類型的輸入,比較麻煩。具體見代碼。
InputStreamReader
可以獲取鍵盤輸入的字符串,如果要獲取的是int
,float
等類型的仍然需要轉換。具體見代碼。
Scanner
可以獲取鍵盤輸入的字符串,有現成的獲取int
,float
等類型數據,非常方便,被廣泛使用。具體見代碼。
Java 的
Math
類包含了用于執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函數。Math 的方法都被定義為
static
形式,通過Math
類可以在主函數中直接調用。下面簡單介紹幾個常用的函數。具體見代碼。
abs()
返回參數的絕對值。min()
返回兩個參數中的最小值。max()
返回兩個參數中的最大值。pow()
返回第一個參數的第二個參數次方。sqrt()
求參數的算術平方根。random()
返回一個隨機數。Math.PI
圓周率Java支持顯示和隱式轉換,在實際應用中要善于使用包裝類的parseXXX()
和valueOf()
方法。
特別的,char
轉int
可以通過ascii
的方式。例:
char ch = "9";int i=ch-"0"System.out.println(i);
三種方法實現。
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;/** * 從鍵盤輸入一個數字,打印出該數字的絕對值。 */public class question_02 { public static void main(String[] args) throws IOException { question_02 question02 = new question_02(); question02.method1();// question02.method2();// question02.method3(); } //System.in public void method1() throws IOException { System.out.println("Please Enter Data:"); char i = (char)System.in.read(); System.out.println("System.in --> "+Math.abs(i-"0")); } //InputStreamReader public void method2() throws IOException { System.out.println("Please Enter Data:"); //new一個InputStreamReader對象 InputStreamReader is = new InputStreamReader(System.in); //BufferedReader的有參構造的方法 BufferedReader br = new BufferedReader(is); //讀取一行,拋出異常 String line = br.readLine(); System.out.println("InputStreamReader --> "+Math.abs(Integer.parseInt(line))); } //Scanner public void method3(){ System.out.println("Please Enter Data:"); Scanner sc = new Scanner(System.in); //讀取int int i = sc.nextInt(); //String s = sc.nextLine(); 讀取字符串型輸入 //float f = sc.nextFloat(); 讀取float型輸入 System.out.println("Scanner --> "+Math.abs(i)); }}
輸出結果
思考:
sc.next()
和sc.nextLine()
有什么區別?
答:next()
遇到空格停止接收。
難度:簡單
/*** 短路與和邏輯與*/public class question_03 { public static void main(String[] args){ int i=5; boolean e = i > 6 & i++ > 7; System.out.println(e); System.out.println(i); e = i > 6 && i++ > 7; System.out.println(e); System.out.println(i); }}
請寫出以上代碼的輸出
邏輯與(&)和短路與(&&)在運算上對條件的結果判斷不會產生影響,但會對條件本身的運算有影響。
邏輯與(&)在運算時會連續運算所有需要判斷的命令.但短路與當遇到false
時就停止運算。
分析
第一次判斷是邏輯與,老實人不管對錯,全部計算一下,則i++
被執行,輸出e=false;i=6
;
第二次判斷是短路與,機靈鬼先判斷第一個是錯的,就不再往下計算,i++
不被執行,輸出e=false;i=6
;
驗證
在實際開發中為了增強代碼的可讀性,統一使用短路與,且不在判斷條件中做任何運算。
難度:簡單
用if語句實現a、b、c的值按從小到大排序
if
判斷本題整理的思路就是比較 - > 交換。
if
作為一種分支結構,用來根據判斷條件的不同做不同的后續處理。
通常的做法,好比交換兩個杯子的水,需要先找來一個空杯子,也就是一個臨時變量存值。代碼如下:
int t=a;a=b; b=t;
高級做法,不使用其他變量如何做?思考?一下,文末給出答案。
/** * 用if語句實現a、b、c的值按從小到大排序 */public class question_04 { public static void main(String args[]){ int a=9,b=5,c=7,t; if(a>b) { t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; } if(b>c) { t=b; b=c; c=t; } System.out.println("a="+a+",b="+b+",c="+c); }}
輸出結果
如何不用其他變量交換兩個數的值?
答,將兩個數做加/乘法。在做減/除法。代碼如下:
a=a*b;b=a/b; //等價于 a*b/b=a,即將a的值賦給了ba=a/b; //等價于 a*b/a=b,即將b的值賦給了a
加減的方式留給大家去實現。
難度:簡單
計算 5+ 55 + 555 + … 的前10項的和
簡單的for
循環的應用,確定好初始值,步長,終止值即可。
難點在如何確定加數,即找到加數之間的規律。
不難發現每一個加數是前一個加數的10倍+5。
??注意一點:最終的結果可能會超出int
的范圍,需要使用long
。
/** *計算 5+ 55 + 555 + ... 的前10項的和 */public class question_05 { public static void main(String args[]){ //定義變量 long sum=0,a=5,item=a; //初值1,步長1,終值10 for(int i=1;i<=10;i++) { //追加到總和 sum=sum+item; //確定下一個加數 item=item*10+a; } System.out.println(sum); }}
輸出結果
除了for
循環,用while
能否實現呢?什么時候用for
?什么時候用while
?
難度:簡單
計算 1 + 1/2! + 1/3! + 1/4! + … + 1/20! 的值。
觀察算式的規律,從1-20,每次加1,循環20次。
n!
是為階乘,等于1*2*3*4...(n-1)*n
動態規劃,一直是算法中的難點,本次不做深度講解,通俗的說一下。
就是把復雜問題簡單化,比如4 的階乘可以看到3 的階乘再乘4,而3的階乘可以看做2的階乘再乘3,2的階乘等于1乘2。
其實就是這樣一個思想,可以看下leetcode《爬樓梯》這道題。
/** * 計算 1 + 1/2! + 1/3! + 1/4! + + 1/20! 的值 */public class question_06 { public static void main(String args[]) { double sum=0,a=1; int i=1; while(i<=20) { sum=sum+a; i=i+1; //關鍵點,動態規劃思想 a=a*(1.0/i); } System.out.println("sum="+sum); }}
輸出結果
上一節的問題:什么時候用for
?什么時候用while
?
答:其實兩者區別不大,大多數情況都可以解決問題。只需記住一點:循環次數未知時用while。
難度:簡單
計算給定整數12345的各位上數字的和。
解題的關鍵在于如何拿到各個位上的數字。
舉例:拿到34的個位和十位
int a=34;//整除運算,拿到3int b=34/10;//返回余數4int c=34%10;
/** * 計算給定整數12345的各數字的和。 */public class question_07 { public static void main(String args[]) { int y = 12345; int r = 0 ; int sum = 0; while(y!=0) { r = y % 10; sum += r; y = y / 10; } System.out.println("y = " + sum); }}
輸出結果
熟練掌握取余和整除運算,大有作用。
難度:簡單
計算500以內的素數和。
break
和continue
大于1的自然數中,除了1和它本身以外不再有其他因數就叫做素數。
比如2=1×2;5=1×5;
所以2、5就是素數。但6=1×6=2×3
,即6除了1和自身6外還有其他因數2和3,不是素數。
break
:終止所有循環,直接跳出。
continue
:終止本次循環,繼續執行下一次循環。
Math.sqrt()
/** * 求500以內的素數和 */public class question_08 { public static void main(String[] args) { int sum=0,i,j; for(j=2;j<=500;j++) { for( i=2;i<=j/2;i++) { if(j%i==0) break; //說明除去1和本身有其他除數,不是素數,也就沒有繼續循環的必要 } if(i>j/2) { //i>j/2說明,break沒有被執行到,即除去1和本身無其他除數,是素數 sum+=j; } } System.out.println(sum); }}
輸出結果
思考:如果是計算500w以內的素數和,如何提高效率呢?
回答:將j/2
改為Math.sqrt()
。
難度:簡單
輸出一維整型數組中的值最小的那個元素及其下標。
所謂的數組指的就是一組相關類型的變量集合,并且這些變量可以按照統一的方式進行操作。
定義數組
int data[] = new int[3];// 數組的長度為3,超過會報下標越界異常,且下標從0開始
添加元素
data[0] = 10; // 第一個元素data[1] = 20; // 第二個元素data[2] = 30; // 第三個元素
循環打印
for(int x = 0; x < data.length; x++) { System.out.println(data[x]); //通過循環控制索引}
其實嚴格來說我們并沒有用到排序算法,但有一些思想在里面,想提前了解可以看這篇。
/** * 輸出一維整型數組中的值最小的那個元素及其下標。 */public class question_09 { public static void main(String args[]) { int a[] = { 12, 24, 6, 37, 3, 22, 64 }; int min = 0; for (int i = 1; i < a.length; i++) { if (a[min] > a[i]) { min = i; } } System.out.println("a[" + min + "] = " + a[min]); }}
輸出結果
本節練習了一維數組的操作,下一節練習二維數組。
難度:簡單
計算二維數組中各行元素之和并查找其值最大的那個行。
二維數組本質上是以數組作為數組元素的數組,即“數組的數組”。可以想像成一個方陣。
定義數組
int brr [] []=new int[][3]; //二維數組中行可以省略,至少寫出列
添加元素
brr[0][0]=1; //下標同樣從0開始,可以指定位置賦值,也可以整體賦值。brr={ {1,2,3}, {5,6,7}, {9,10,11}};
循環遍歷
//遍歷行for(int i=0;i<3;i++){ //遍歷列 for(int j=0;j<3;j++){
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/122020.html
摘要:于是乎,我建立了這個項目,收錄一些有趣的小程序,便于閱讀和思考。下面是一些列舉一些有趣的內容這是來自編程從入門到實踐中的一個小游戲。用語言實現的編譯器。做的小博客,持續開發中這個項目還在不斷豐富中,如果你有什么有趣的分享,歡迎聯系我。 紙上得來終覺淺,絕知此事要躬行。 這本書或這個視頻看完了,我可以做點什么?編程難道只是命令行打印些東西?該找點什么適合練手的項目來練習練習呢? 我想可能...
摘要:很多高級編程語言都給新創建的對象分配一個引用自身的指針比如中的指針,中的,也有指針,雖然它的指向可能相對復雜些,但是指向的,永遠只可能是對象。 很多高級編程語言都給新創建的對象分配一個引用自身的指針,比如JAVA、C++中的this指針,python中的self,JavaScript也有this指針,雖然它的指向可能相對復雜些,但是this指向的,永遠只可能是對象。 一、在一般函數方法...
摘要:很多高級編程語言都給新創建的對象分配一個引用自身的指針比如中的指針,中的,也有指針,雖然它的指向可能相對復雜些,但是指向的,永遠只可能是對象。 很多高級編程語言都給新創建的對象分配一個引用自身的指針,比如JAVA、C++中的this指針,python中的self,JavaScript也有this指針,雖然它的指向可能相對復雜些,但是this指向的,永遠只可能是對象。 一、在一般函數方法...
摘要:一方面是因為想要克服自己的惰性,另一方面也是想重新溫故一遍。一共分成了個基礎部分,后續還會繼續記錄。文章中如果有筆誤或者不正確的解釋,也歡迎批評指正,共同進步。最后地址部分源碼 Why? 網上現有的Vue源碼解析文章一搜一大批,但是為什么我還要去做這樣的事情呢?因為覺得紙上得來終覺淺,絕知此事要躬行。 然后平時的項目也主要是Vue,在使用Vue的過程中,也對其一些約定產生了一些疑問,可...
閱讀 2443·2021-10-09 09:44
閱讀 3812·2021-09-22 15:43
閱讀 2931·2021-09-02 09:47
閱讀 2556·2021-08-12 13:29
閱讀 3877·2019-08-30 15:43
閱讀 1686·2019-08-30 13:06
閱讀 2195·2019-08-29 16:07
閱讀 2755·2019-08-29 15:23