一、循環(huán)loop
(三)for 循環(huán)(接上篇)
語法:for(循環(huán)條件初始化 1 ; 循環(huán)條件 2 ; 迭代 3 ){
//循環(huán)體 ?4
}
解釋:for 的小括號中由2個分號切分成了3部分。
執(zhí)行過程:
1:循環(huán)條件初始化執(zhí)行且僅執(zhí)行一次。
2:判斷循環(huán)條件是否成立,如果成立,那么執(zhí)行循環(huán)體。然后執(zhí)行迭代部分,然后再判斷循環(huán)條件。
3:一旦循環(huán)條件不成立,那么立即結(jié)束循環(huán)。
==》 1,2,4,3,2,4,3,2,4,3,2(不成立)結(jié)束。
注意事項:
1:循環(huán)條件初始化執(zhí)行且僅執(zhí)行一次。
2:小括號中的兩個分號是必不可少的。其他的三部分從語法層面上來講,都可以沒有。
3:如果循環(huán)條件這部分沒有,那就代表循環(huán)條件永遠(yuǎn)成立。
4:如果初始化部分需要初始化多個變量,那么可以使用逗號分割,包括迭代部分亦然。
5:在 for 循環(huán)的小括號中定義的變量,只能在for 循環(huán)中使用。
例:
//水仙花數(shù):在 100-999 ?之間有幾個這樣的數(shù) ?: 該三位數(shù)的每一位的 三次冪 ?之和 等于該數(shù)自身 ?求這幾個數(shù)是什么??
public class TestLoop2{
public static void main(String[] args){
int unit ?= 0;
int decade = 0;
int hundred = 0;
for(int i = 999; i >= 100 ;i--){
unit = i%10;
decade = i/10%10;
hundred = i/100;
if(unit * unit * unit + decade * decade * decade + hundred * hundred * hundred == i){
System.out.println(i);
}
}
}
}
(四)循環(huán)語句的選擇:
在for循環(huán)中,循環(huán)控制變量的初始化和修改都放在語句頭部分,形式較簡潔,且特別適用于循環(huán)次數(shù)已知的情況。
在while循環(huán)中,循環(huán)控制變量的初始化一般放在while語句之前,循環(huán)控制變量的修改一般放在循環(huán)體中,形式上不如for語句簡潔,但它比較適用于循環(huán)次數(shù)不易預(yù)知的情況(用某一條件控制循環(huán))。
[if !supportLists](五)[endif]break和 continue
break:意思是打斷。在循環(huán)結(jié)構(gòu)中,如果想跳出循環(huán)體,結(jié)束整個循環(huán)結(jié)構(gòu)可以使用break語句。
continue語句用在循環(huán)語句體中,用于終止某次循環(huán)過程,即跳過循環(huán)體中尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。即只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。
?
二、嵌套循環(huán)
嵌套循環(huán)的概念:循環(huán)體中包含了其他的循環(huán)。
特點:外層循環(huán)迭代一次,內(nèi)層循環(huán)執(zhí)行一遍。
例1:
//打印,矩形,平行四邊形,等腰三角形
public class TestDoubleLoop{
public static void main(String[] args){
// for(int i=0;i<5;i++){
// for(int j=0;j<5;j++){
// System.out.println("i = "+i + "\tj = "+j);
// }
// }
//打印,矩形,平行四邊形,等腰三角形
// ???************ ?i== 0
// ??************ ??i== 1
// ?************ ??i== 2
// ************ ??i == 3
// 打印的空格的數(shù)量 ?高度 height-i-1
int width = 16;
int height = 10;
//外層循環(huán)控制打印多少行,以及每一行的末尾的換行符
for(int i = 0; i < height;i++){
//內(nèi)層循環(huán)控制打印一行的星號
for(int j = 0;j
System.out.print(" *");
}
System.out.print("\n");
}
System.out.print("\n");
//平行四邊形
for(int i = 0; i < height;i++){
//用來控制每一行的空格的數(shù)量
for(int j = 0;j < height-i-1; j++){
System.out.print(" ");
}
//內(nèi)層循環(huán)控制打印一行的星號
for(int j = 0;j
System.out.print(" *");
}
System.out.print("\n");
}
System.out.print("\n");
//等腰三角形
// ???* ?i== 0 ?1 ?2*i+1
// ??*** ??i== 1 ?3
// ?***** ??i== 2 ??5
// ******* ??i == 3
for(int i = 0; i < height;i++){
//用來控制每一行的空格的數(shù)量
for(int j = 0;j < height-i-1; j++){
System.out.print(" ");
}
//內(nèi)層循環(huán)控制打印一行的星號
for(int j = 0;j<(i<<1)+1;j++){
System.out.print("*");
}
System.out.print("\n");
}
}
}
例2:
//求2--100以內(nèi)的所有的素數(shù):
//素數(shù):只能被1 和 自身整除的數(shù)。又稱為質(zhì)數(shù)。 合數(shù)
public class TestPrime{
public static void main(String[] args){
//遍歷2--100之間的所有的數(shù)type1
for(int i = 2;i <= 100; i++){
//對每一個i 進(jìn)行逐個的判斷,是否滿足 素數(shù)的條件,滿足 打印即可。
// 對當(dāng)前的 i 進(jìn)行取余運算,對[2~ i-1]區(qū)間的所有的數(shù)進(jìn)行逐個取余,如果都有余數(shù) 那么i 就是素數(shù)
int counter1 = 0;//記錄內(nèi)層循環(huán)循環(huán)了多少次
int counter2 = 0;//記錄條件滿足了多少次
for(int j = 2; j<= i-1 ;j++){
//內(nèi)層循環(huán)中,遍歷一遍,所有的j 必須都滿足下面的條件 i 才是素數(shù)
if(i % j != 0){
counter2 ++;
}
counter1 ++;
}
//判斷 counter1 是否 ?等于counter2
if(counter1 == counter2){
System.out.println(i);
}
}
//遍歷2--100之間的所有的數(shù)type2
for(int i = 2;i <= 100; i++){
//對每一個i 進(jìn)行逐個的判斷,是否滿足 素數(shù)的條件,滿足 打印即可。
// 對當(dāng)前的 i 進(jìn)行取余運算,對[2~ i-1]區(qū)間的所有的數(shù)進(jìn)行逐個取余,如果都有余數(shù) 那么i 就是素數(shù)
boolean flag = false;
for(int j = 2; j<= i-1 ;j++){
if(i % j == 0){
flag = true;
break;
}
}
//如果flag 還是false 說明i 是素數(shù) 沒有一個j 被i 除盡
if(false == flag){//容易理解的方案
//if(!flag){//最優(yōu)的方案。
System.out.println(i);
}
}
}
}
例3:百錢買白雞
//今有雞翁一,值錢伍;雞母一,值錢三;雞鶵三,值錢一。凡百錢買雞百只,問雞翁、母、鶵各幾何?
public class TestDoubleLoop3{
public static void main(String[] args){
for(int i = 0;i<=20;i++){//公雞
for(int j = 0;j<= 33;j++){//母雞
for(int k = 0;k<=300;k++){//小雞
if( i+j+k == 100 && i*5 + j * 3 + k/3 == 100 && k%3 == 0){
System.out.println("公雞數(shù)量:"+i+ "\t母雞數(shù)量:"+j+"\t小雞數(shù)量:"+k);
}
}
}
}
for(int i = 0;i<=20;i++){//公雞
for(int j = 0;j<= 33;j++){//母雞
int k = 100 -i - j;//小雞
if(i*5 + j * 3 + k/3 == 100 && k%3 == 0){
System.out.println("公雞數(shù)量:"+i+ "\t母雞數(shù)量:"+j+"\t小雞數(shù)量:"+k);
}
}
}
}
}
例4:
//九九乘法表
public class TestNine{
public static void main(String[] args){
//外層循環(huán)控制行數(shù)
for(int i = 1;i<=9;i++){
//內(nèi)層循環(huán)控制一行的顯式內(nèi)容
for(int j = 1;j<=i; j++){
int num = j*i;
System.out.print(j+"*"+i+"="+num+"; ");
}
System.out.println();
}
}
}
三、標(biāo)號:了解
解釋:break 和 continue 后都可以跟標(biāo)號。
可以通過break 后面跟標(biāo)號,實現(xiàn)跳出標(biāo)號對應(yīng)的那一層循環(huán)。
可以通過continue 后面跟標(biāo)號,實現(xiàn) 跳到對應(yīng)層的循環(huán)的迭代處(for),while do-while 循環(huán)條件判斷處。
例://標(biāo)號
public class TestLabel{
public static void main(String[] args){
//外層循環(huán)控制行數(shù)
//定義標(biāo)號
label1 : for(int i = 1;i<=9;i++){
//內(nèi)層循環(huán)控制一行的顯式內(nèi)容
for(int j = 1;j<=i; j++){
int num = j*i;
System.out.print(j+"*"+i+"="+num+"; ");
if(j == 7)break label1;
}
System.out.println();
}
}
}
四、方法
方法的定義:
必要性:1:通過方法可以實現(xiàn)重復(fù)代碼的簡化,和代碼的復(fù)用。
2:將某些功能代碼封裝到一個方法的內(nèi)部,實現(xiàn)了功能的模塊化,方便后期的維護(hù)和修改。
語法:[方法的修飾符 public static] ?方法的返回類型 ?方法名(參數(shù)列表){
//方法體
}
1:[方法的修飾符 public static]:可選的部分,不是必須的。還有其他修飾符。
2:方法的返回類型:
可以是void(空)或者java 支持的任意類型(十一種)
代表著方法執(zhí)行完畢之后是否會產(chǎn)生一個結(jié)果。
如果一種方法只是實現(xiàn)了一段功能,不需要得到一個結(jié)果。那么該方法的返回類型必須是void。
如果一種方法,執(zhí)行完畢之后希望得到一個結(jié)果數(shù)據(jù)。這個時候方法的返回類型就不能是void了。必須數(shù)據(jù)類型要與結(jié)果的數(shù)據(jù)類型兼容。
3:方法名:通過名字來訪問該方法的功能。還要通過名字來顯示該方法實現(xiàn)了什么樣的功能。
???方法名也是一類標(biāo)識符。命名規(guī)范和局部變量一致,首字符小寫,遵循駝峰命名法。
4:參數(shù)列表:又稱為形參列表。
表達(dá)的意思:在使用方法的時候,需要傳遞給方法的一些動態(tài)的數(shù)據(jù),表達(dá)了方法在使用的時候的一種需求。
public static void printStarRect(int width) :在使用該方法的時候,需要給方法傳遞一個 int 類型的值。
參數(shù)列表的格式:
1:參數(shù)列表可以為空。()
2: 需要傳遞的數(shù)據(jù)可以是任意個,類型也是任意類型。(數(shù)據(jù)類型 變量名1, 數(shù)據(jù)類型 變量名2, 數(shù)據(jù)類型 變量名3......)
5:方法體:功能實現(xiàn)的主體部分。
return:如果方法的返回類型是void。那么可以在方法中使用“return;”
作用:直接結(jié)束方法。方法直接返回。
如果方法的返回類型不是void ,那就是java支持的某種類型。那么該方法必須使用return 后面跟著一個想要得到的結(jié)果。
public static int max(int a,int b){
int max = a > b ? a : b;
return max;
}
6:把方法的名字 + 參數(shù)列表的組合稱之為方法的簽名signature。
在一個類的內(nèi)部方法的簽名必須唯一。
注意問題:
1:方法不能被定義到任意的其他的方法的內(nèi)部去。
2:所有的方法都必須在某一個類的內(nèi)部。必須被最外層的大括號包圍。
3:如果想使用方法提供的功能。方法的調(diào)用。那么該方法必須直接的或者間接的被 main 調(diào)用。
4:方法的調(diào)用的格式語法:方法名+參數(shù)列表(實參列表)。
例:
//打印不同邊長的星號正方形。
public class TestMethod1{
public static void main(String[] args){
int width = 7;
//打印邊長是7
printStarRect(7);
width = 10;
//打印邊長是10
printStarRect(width);
width = 21;
//打印邊長是10
printStarRect(width);
int max = max(1,2);
System.out.println(max);
System.out.println(max(1,2,3));
//不允許
//System.out.println(printStarRect(1));
test();
System.out.println(randomNumberByRange(10,12));
}
//自定義方法,實現(xiàn)打印指定寬度的星號正方形
//方法名是一類標(biāo)識符,和局部變量的命名規(guī)范一致,
//將重復(fù)的代碼抽取出來,形成一個獨立的功能模塊 ?方法 method 將抽取的代碼的變化的量作為方法的參數(shù)列表。
public static void printStarRect(int width){
if(width > 20){
return;
}
for(int i = 0;i < width ;i++){
for(int j=0;j
System.out.print(" *");
}
System.out.println();
}
System.out.println();
}
//自定義方法。功能是得到某一個int區(qū)間的隨機值。
//涉及到范圍,都是前閉后開 包含小的,不包含大的。
public static int randomNumberByRange(int min, int max){
return (int)(Math.random()*(max-min)+min);
}
//定義方法。對于任意的兩個int 類型的值,求兩個值 中的比較大的值。
//
public static int max(int a,int b){
if(a > b)
return a;
return b;
}
public static int max(int a,int b,int c){
int max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
//對任意的int 類型的值,求該值的絕對值
public static int abs(int a){
return a > 0 ? a : -a;
}
//求指定概率【0.0-1.0】的事件 是否發(fā)生
public static boolean isHappened(double percent){
return Math.random() < percent;
}
public static void test(){
int counter = 0;
for(int i=0;i<1000;i++){
boolean bool = isHappened(0.3);
if(bool)counter ++;
}
System.out.println(counter);
}
}
