for迴圈的經典程式分析
1.單層for迴圈,利用for迴圈列印輸出1~100之間的所有整數(最基礎的)然後通過與if-else語句結合實現更多的功能。
可以看出利用for迴圈可以遍歷整數。
/*
1. 輸出從1到100之間所有的整數;(簡單的單層for迴圈)**for迴圈遍歷整數**
2. 輸出從1到100之間所有的奇數;(通過與if-else結合,有條件的輸出語句)
3. 輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和;(通過增加條件,更合理的練習for迴圈與if語句結合)
*/
public class NumberFor {
public static void main (String[] args) {
//這裡利用輸出語句列印一個提示語句
System.out.println("輸出從1到100之間所有的整數;");
//輸出從1到100之間所有的整數;
for (int i = 1; i < 100; i++) {
/*
i 為迴圈因子,根據題意i要初始化為1,i < 100,每個整數都要列印,因此迭代語句自增為1.
程式執行1~100(沒有100)共99次 次數:計算方法(100-1)
*/
//迴圈體
System.out.print(i + " ");
}
System.out .println("\n" + "輸出從1到100之間所有的奇數;");
//輸出從1到100之間所有的奇數
for (int i = 1; i < 100; i++) {
//設定條件判斷,有條件的輸出迴圈
if (i % 2 != 0) {
System.out.print(i + " ");
}
}
System.out.println("\n" + "輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和");
//輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和
//最後要輸出整數的和,要提前宣告一個儲存和的變數
int sum = 0;
for (int i = 1; i < 100; i++) {
if (i % 3 != 0) {
//每次迴圈都進行判斷,若真執行{}中語句
System.out.print(i + " ");
//將符合條件的i進行累加
sum += i;
}
}
System.out.println("\n" + "這些數的和為:" + sum);
}
}
2.巢狀for迴圈
先利用for迴圈列印一個簡單的矩形
矩形形式:
*****
*****
***** 每一行5個星星,共有3行
思路:若我們每次輸出一行5個星星,我們迴圈3次就可以完成矩形
class LoopTest1 {
public static void main(String[] args) {
//可以稱i為迴圈因子 需要列印3行,迴圈次數為3(0 1 2)在i = 3時不滿足條件,結束迴圈。
for (int i = 0; i < 3; i++) {
//迴圈體,每次輸出5個星星並換行
System.out.println("*****");
}
}
}
深入思考,我們是不是也可以把每次輸出5個星星這個語句轉化成每次輸出一個星星,迴圈輸出5次然後構成迴圈。
思路:依舊用一個迴圈控制行數,因為每行都要輸出5個星星,因此在i = 0時,它要執行一個迴圈輸出*的迴圈。i = 1 i =2 都要這樣,就得到下面這個巢狀迴圈程式
class LoopTest2{
public static void main(String[] args) {
//外迴圈控制行數(外迴圈的迴圈體是一個內迴圈)
for (int i = 0; i < 3; j++) {
//i :0~3 共3次
//內迴圈控制列數,這個迴圈用來迴圈輸出5個星星
for (int j = 0; j < 5; i++) {
//內迴圈迴圈體 j:0~5 共5次 每次列印一個星星
//這裡不要換行,因為在同一行上列印
System.out.print("*");
}
//內迴圈執行完成後進行換行
System.out.println();
}
}
}
綜上:若是把LoopTest1中的i < 3 ,3改為n的話就可以列印輸出n行
若是把LoopTest2中的j < 5,5改為m的話每行就可以列印輸出5個星星,總結一下,可以把外層迴圈看做控制行數,內層迴圈控制列數。自己多做幾個程式,多思考幾次就可以體會到這句話真正的含義了。
那麼列印一個n*m的矩形易如反掌,下面是列印n*m矩形的程式。
class LoopTest3{
public static void main(String[] args) {
//從命令列獲取n,m
int n = Integer.parseInt(args[0]);
int m = Integer.parseInt(args[1]);
//外迴圈控制行數
for (int i = 0; i < n; i++) {
//外迴圈控制列數
for (int j = 0; j < m; j++) {
System.out.print("*");
}
//內層迴圈執行完後,進行換行
System.out.println();
}
}
}
熟練掌握for巢狀迴圈可以列印一個空心矩形,下面程式碼供參考。
/**
列印n*m的空心矩形
*/
public class TestFor {
public static void main(String[] args) {
//從命令列獲取n,m
int n = Integer.parseInt(args[0]);
int m = Integer.parseInt(args[1]);
for (int i = 0; i < n; i++) {
//將首尾行與其他行分開列印
if (i == 0 || i == n-1) {
//列印首尾行
for (int j = 0; j < m; j++){
System.out.print("*");
}
}else {
//列印其他行
for (int j = 0; j < m; j++) {
//其他行,控制首列和尾列的列印
if(j == 0 || j == m-1) {
System.out.print("*");
}else {
System.out.print(" ");
}
}
}
System.out.println();
}
}
}
3.巢狀迴圈深入
/*
分析過程:
列印等腰三角形(高度為5)
底邊長度為9 1 3 5 7 9
空格數 i *
4 0 * 1
3 1 *** 3
2 2 ***** 5
1 3 ******* 7
0 4********* 9
* = 2i + 1 *與行數成正比 y=kx+b
空格 = 4-i = 5-1-i 空格與行數成反比
*/
public class TestFor {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
//從0行開始
//程式順序執行,先打空格,空格與行數的關係 5-1-i//5-(i+1)
//這裡j因為不在同一個{}中,所以都可以用j
for(int j = 0; j < (5 - 1) - i; j++) {
System.out.print(" ");
}
//星星列印數1 3 5 7 9 與行數關係(2*行數)+1
for (int j = 0; j < (2 * i) + 1; j++) {
System.out.print("*");
}
//換行
System.out.println();
}
}
}
/*
拓展一下,列印高度為n的等腰三角形
實際只需要將外層迴圈5換成n就好
*/
class TestFor1 {
public static void main(String[] args) {
//從命令列獲取引數
int n = Integer.parseInt(args[0]);
//設定外迴圈控制行數
for (int i = 0; i < n; i++) {
//設定內迴圈控制列中空格的列印
for (int j = 0; j < n - 1 - i; j++) {
System.out.print(" ");
}
//設定並列內迴圈控制列中*的列印
for (int j = 0; j < (2 * i) + 1; j++) {
System.out.print("*");
}
//換行
System.out.println();
}
}
}
總結:要想使用好迴圈,首先要觀察問題的規律,找出要迴圈的步驟,直接套用即可。多做迴圈的題體會迴圈。
4.巢狀迴圈中最高難度的for迴圈問題(列印質數的問題)
首先要了解質數的定義,質數:只能被1和其本身整除的數就是質數。1不是質數
從定義可以知道,若是我們正向考慮,問題極為的複雜,要先找出其所有能被整除的數,然後判斷除了1和它本身以外還有其他的嗎?若有不是質數,若沒有,就是質數。
這樣,我們反向考慮,問題就變得異常簡單。
思路:首先我們要會遍歷一個範圍內的整數,這個利用簡單的單層迴圈實現,其次對於每一個整數,我們先假設它是質數,然後利用反證法只要找出一個能被它整除的數就可以將它推翻。若找不出能被它整除的數,則它是質數。
/*
列印100-200之間的所有質數,並統計個數
這個題,共有兩個問題。
1.列印100~200所有質數
2.統計質數的個數
思路:利用反證法
質數的個數統計應該和質數輸出在同一個{}中
*/
class TestFor1 {
public static void main(String[] args) {
//設定計數器,用於統計質數的個數
int count = 0;
//利用for迴圈遍歷100~200所有整數,不包括200.
for (int i = 100; i < 200; i++) {
//先假設i為質數,利用反證法 設定一個布林變數,值為true時為質數,值為false時,不是質數
boolean flag = true;
//設定內迴圈對每個數進行判斷
//質數:只能被1和自身整除的數
for (int j = 2; j < i; j++) {
//設定條件判斷,若存在可以被整除的數(除1和自身),修改flag為flase,只要存在一個就可以推翻。
if(i % j == 0) {
flag = false;
break; //此處加個break優化程式碼,只要找到一個,利用break結束當前迴圈的特性,直接結束內層迴圈。
}
}
//內迴圈判斷質數執行完畢,通過判斷flag,列印輸出質數,並統計個數
if(flag) {
//列印輸出質數
System.out.println(i + "是質數");
//個數自增
count++;
}
}
//列印統計的個數
System.out.println("質數的個數為:" + count);
}
}
會打了上邊的這個求質數的程式碼,來分析一個更深層次的問題。
列印1~100內的質數(只打印引數個質數就行,儘可能的優化程式碼)
/**
利用continue,break簡化質數的列印
列印1~100之間的質數(要求列印引數個質數)
*/
class TestFor2 {
public static void main(String[] args) {
//從命令列獲取引數
int n = Integer.parseInt(args[0]);
//設定計數器
int count = 0;
//迴圈遍歷2~100(因為1不是質數),並設定標籤l1
l1:for (int i = 2; i < 100; i++) {
//設定迴圈判斷i能否被除1和其本身之外的數整除,預設認為i是質數
//因為利用continue加標籤所以不用使用再進行最後的真假判斷
l2:for (int j = 2; j < i; j++) {
//設定條件判斷,若i不是質數,利用continue l1 結束當次迴圈,(這裡的當次迴圈指的是標籤處外迴圈)
// 進入下一次迴圈(外層迴圈的迭代語句)
if (i % j == 0) {
continue l1;
}
}
//內迴圈結束列印輸出質數
System.out.println(i + "是質數");
//計數器自增1
count++;
//判斷輸出的質數是否符合題意,若符合利用break結束迴圈(結束的是break所屬的迴圈即外層迴圈)
if(count == n){
break;
}
}
}
}
如果能解決掉上述問題,對for迴圈的理解和使用非常熟練。
利用for迴圈還可以列印直角三角形,倒直角,99乘法表等等。如果會了上邊的for迴圈,這些問題手到擒來。重點是靈活運用java中的基礎知識,互相結合得到更多的東西。