java基礎(chǔ)編程
java循環(huán)結(jié)構(gòu)
- 在某些條件滿足的情況下担钮,反復(fù)執(zhí)行特定代碼的功能
- 循環(huán)語(yǔ)句分類(lèi)
- for循環(huán)
- while循環(huán)
- do-while循環(huán)
for循環(huán)
/*
For循環(huán)結(jié)構(gòu)的使用
一、循環(huán)結(jié)構(gòu)的4個(gè)要素
① 初始化條件
② 循環(huán)條件 --->是boolean類(lèi)型
③ 循環(huán)體
④ 迭代條件
二尤仍、for循環(huán)的結(jié)構(gòu)
for(①;②;④){
③
}
執(zhí)行過(guò)程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
*/
class ForTest {
public static void main(String[] args) {
/*
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");
*/
for(int i = 1;i <= 5;i++){//i:1,2,3,4,5
System.out.println("Hello World!");
}
//i:在for循環(huán)內(nèi)有效箫津。出了for循環(huán)就失效了。
//System.out.println(i);
//練習(xí):
int num = 1;
for(System.out.print('a');num <= 3;System.out.print('c'),num++){
System.out.print('b');
}
//輸出結(jié)果:abcbcbc
System.out.println();
//例題:遍歷100以內(nèi)的偶數(shù),輸出所有偶數(shù)的和,輸出偶數(shù)的個(gè)數(shù)
int sum = 0;//記錄所有偶數(shù)的和
int count = 0;//記錄偶數(shù)的個(gè)數(shù)
for(int i = 1;i <= 100;i++){
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
//System.out.println("總和為:" + sum);
}
System.out.println("總和為:" + sum);
System.out.println("個(gè)數(shù)為:" + count);
}
}
- 練習(xí)
/*
編寫(xiě)程序從1循環(huán)到150宰啦,并在每行打印一個(gè)值苏遥,
另外在每個(gè)3的倍數(shù)行上打印出“foo”,
在每個(gè)5的倍數(shù)行上打印“biz”,
在每個(gè)7的倍數(shù)行上打印輸出“baz”。
*/
class ForTest1 {
public static void main(String[] args) {
for(int i = 1;i <= 150;i++){
System.out.print(i + " ");
if(i % 3 == 0){
System.out.print("foo ");
}
if(i % 5 == 0){
System.out.print("biz ");
}
if(i % 7 == 0){
System.out.print("baz ");
}
//換行
System.out.println();
}
}
}
for循環(huán)練習(xí)
/*
題目:輸入兩個(gè)正整數(shù)m和n赡模,求其最大公約數(shù)和最小公倍數(shù)田炭。
比如:12和20的最大公約數(shù)是4,最小公倍數(shù)是60漓柑。
說(shuō)明:break關(guān)鍵字的使用:一旦在循環(huán)中執(zhí)行到break教硫,就跳出循環(huán)
*/
import java.util.Scanner;
class ForTest1{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("請(qǐng)輸入m值");
int m = scan.nextInt();
System.out.println("請(qǐng)輸入n值");
int n = scan.nextInt();
int min = (m >= n) ? n : m;
int max = (m >= n) ? m : n;
for (int i = min; i <= min ; i--){
if (m % i == 0 && n % i == 0){
System.out.println("m和n的最大公約數(shù)為" + i);
break;
}
}
for (int t = max; t >= max; t++){
if (t % m == 0 && t % n ==0){
System.out.println("m和n的最小公倍數(shù)為" + t);
break;
}
}
}
}
while循環(huán)
/*
While 循環(huán)的使用
一叨吮、循環(huán)結(jié)構(gòu)的4個(gè)要素
① 初始化條件
② 循環(huán)條件 --->是boolean類(lèi)型
③ 循環(huán)體
④ 迭代條件
二、while循環(huán)的結(jié)構(gòu)
①
while(②){
③;
④;
}
執(zhí)行過(guò)程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
說(shuō)明:
1.寫(xiě)while循環(huán)千萬(wàn)小心不要丟了迭代條件瞬矩。一旦丟了茶鉴,就可能導(dǎo)致死循環(huán)!
2.我們寫(xiě)程序景用,要避免出現(xiàn)死循環(huán)涵叮。
3.for循環(huán)和while循環(huán)是可以相互轉(zhuǎn)換的!
區(qū)別:for循環(huán)和while循環(huán)的初始化條件部分的作用范圍不同伞插。for的初始定義的變量只在循環(huán)內(nèi)部有效
算法:有限性围肥。
*/
class WhileTest{
public static void main(String[] args) {
//遍歷100以內(nèi)的所有偶數(shù)
int i = 1;
while(i <= 100){
if(i % 2 == 0){
System.out.println(i);
}
i++;
}
//出了while循環(huán)以后,仍可以調(diào)用蜂怎。
System.out.println(i);//101
}
}
do-while循環(huán)
/*
do-while循環(huán)的使用
一穆刻、循環(huán)結(jié)構(gòu)的4個(gè)要素
① 初始化條件
② 循環(huán)條件 --->是boolean類(lèi)型
③ 循環(huán)體
④ 迭代條件
二、do-while循環(huán)結(jié)構(gòu):
①
do{
③;
④;
}while(②);
執(zhí)行過(guò)程:① - ③ - ④ - ② - ③ - ④ - ... - ②
說(shuō)明:
1.do-while循環(huán)至少會(huì)執(zhí)行一次循環(huán)體杠步!
2.開(kāi)發(fā)中氢伟,使用for和while更多一些。較少使用do-while
*/
class DoWhileTest {
public static void main(String[] args) {
//遍歷100以內(nèi)的偶數(shù),并計(jì)算所有偶數(shù)的和及偶數(shù)的個(gè)數(shù)
int num = 1;
int sum = 0;//記錄總和
int count = 0;//記錄個(gè)數(shù)
do{
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
num++;
}while(num <= 100);
System.out.println("總和為:" + sum);
System.out.println("個(gè)數(shù)為:" + count);
//*************體會(huì)do-while至少執(zhí)行一次循環(huán)體***************
int number1 = 10;
while(number1 > 10){
System.out.println("hello:while");
number1--;
}
int number2 = 10;
do{
System.out.println("hello:do-while");
number2--;
}while(number2 > 10);
}
}
練習(xí)
/*
題目:
從鍵盤(pán)讀入個(gè)數(shù)不確定的整數(shù)幽歼,并判斷讀入的正數(shù)和負(fù)數(shù)的個(gè)數(shù)朵锣,輸入為0時(shí)結(jié)束程序。
說(shuō)明:
1. 不在循環(huán)條件部分限制次數(shù)的結(jié)構(gòu):for(;;) 或 while(true)
2. 結(jié)束循環(huán)有幾種方式甸私?
方式一:循環(huán)條件部分返回false
方式二:在循環(huán)體中诚些,執(zhí)行break
*/
import java.util.Scanner;
class ForWhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//int i = 1;
int pnum = 0;
int nnum = 0;
//while (i > 0){
//for(;;){ == //while(true){
while (true){
System.out.println("請(qǐng)輸入整數(shù):");
int num = scan.nextInt();
if (num > 0){
pnum++;
}else if (num < 0){
nnum++;
}else{
break;
}
}
System.out.println("正數(shù)有" + pnum + "個(gè),負(fù)數(shù)有" + nnum + "個(gè)");
}
}
嵌套循環(huán)
/*
嵌套循環(huán)的使用
1.嵌套循環(huán):將一個(gè)循環(huán)結(jié)構(gòu)A聲明在另一個(gè)循環(huán)結(jié)構(gòu)B的循環(huán)體中,就構(gòu)成了嵌套循環(huán)
2.
外層循環(huán):循環(huán)結(jié)構(gòu)B
內(nèi)層循環(huán):循環(huán)結(jié)構(gòu)A
3. 說(shuō)明
① 內(nèi)層循環(huán)結(jié)構(gòu)遍歷一遍皇型,只相當(dāng)于外層循環(huán)循環(huán)體執(zhí)行了一次
② 假設(shè)外層循環(huán)需要執(zhí)行m次诬烹,內(nèi)層循環(huán)需要執(zhí)行n次。此時(shí)內(nèi)層循環(huán)的循環(huán)體一共執(zhí)行了m * n次
4. 技巧:
外層循環(huán)控制行數(shù)弃鸦,內(nèi)層循環(huán)控制列數(shù)
*/
class ForForTest {
public static void main(String[] args) {
//******
//System.out.println("******");
for(int i = 1;i <= 6;i++){
System.out.print('*');
}
System.out.println("\n");
/*
******
******
******
******
*/
for(int j = 1;j <= 4;j++ ){
for(int i = 1;i <= 6;i++){
System.out.print('*');
}
System.out.println();
}
/* i(行號(hào)) j(*的個(gè)數(shù))
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for(int i = 1;i <= 5;i++){//控制行數(shù)
for(int j = 1;j <= i;j++){//控制列數(shù)
System.out.print("*");
}
System.out.println();
}
/* i(行號(hào)) j(*的個(gè)數(shù)) 規(guī)律:i + j = 5 換句話說(shuō):j = 5 - i;
**** 1 4
*** 2 3
** 3 2
* 4 1
*/
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 5 - i;j++){
System.out.print("*");
}
System.out.println();
}
/*
*
**
***
****
*****
****
***
**
*
*/
//略
/*
----*
---* *
--* * *
-* * * *
* * * * *
* * * *
* * *
* *
*
*/
class Thinking {
public static void main(String[] args) {
for (int i= 1;i <= 5 ;i++ ){
for (int j = 1;j <= 5 - i;j++ ){
System.out.print(" ");
}
for (int k = 1; k <= i;k++ ){
System.out.print("* ");
}
System.out.println();
}
for (int i= 1;i <= 4 ;i++ ){
for (int j = 1;j <= i;j++ ){
System.out.print(" ");
}
for (int k = 1; k <= 5 - i;k++ ){
System.out.print("* ");
}
System.out.println();
}
}
}
練習(xí):乘法表
/*
嵌套循環(huán)的應(yīng)用1:
九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
绞吁。。唬格。
9 * 1 = 9 家破。。购岗。 9 * 9 = 81
*/
class NineNineTable {
public static void main(String[] args) {
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= i;j++){
System.out.print(i + " * " + j + " = " + (i * j) + " ");
}
System.out.println();
}
}
}
練習(xí):100以內(nèi)質(zhì)數(shù)輸出
/*
100以內(nèi)的所有質(zhì)數(shù)的輸出汰聋。
質(zhì)數(shù):素?cái)?shù),只能被1和它本身整除的自然數(shù)喊积。-->從2開(kāi)始烹困,到這個(gè)數(shù)-1結(jié)束為止,都不能被這個(gè)數(shù)本身整除注服。
最小的質(zhì)數(shù)是:2
*/
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true;//標(biāo)識(shí)i是否被j除盡韭邓,一旦除盡措近,修改其值
for(int i = 2;i <= 100;i++){//遍歷100以內(nèi)的自然數(shù)
for(int j = 2;j < i;j++){//j:被i去除
if(i % j == 0){ //i被j除盡
isFlag = false;
}
}
//
if(isFlag == true){
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
}
}
- 獲取時(shí)間
//獲取當(dāng)前時(shí)間距離1970-01-01 00:00:00 的毫秒數(shù)********重要
long start = System.currentTimeMillis();
代碼優(yōu)化
==不同的算法的效率差別很大,要注意算法的優(yōu)化==
/*
100000以內(nèi)的所有質(zhì)數(shù)的輸出女淑。實(shí)現(xiàn)方式一
質(zhì)數(shù):素?cái)?shù)瞭郑,只能被1和它本身整除的自然數(shù)。-->從2開(kāi)始鸭你,到這個(gè)數(shù)-1結(jié)束為止屈张,都不能被這個(gè)數(shù)本身整除。
對(duì)PrimeNumberTest.java文件中質(zhì)數(shù)輸出問(wèn)題的優(yōu)化
*/
class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true;//標(biāo)識(shí)i是否被j除盡袱巨,一旦除盡阁谆,修改其值
int count = 0;//記錄質(zhì)數(shù)的個(gè)數(shù)
//獲取當(dāng)前時(shí)間距離1970-01-01 00:00:00 的毫秒數(shù)********重要
long start = System.currentTimeMillis();
for(int i = 2;i <= 100000;i++){//遍歷100000以內(nèi)的自然數(shù)
//優(yōu)化二:對(duì)本身是質(zhì)數(shù)的自然數(shù)是有效的。
//for(int j = 2;j < i;j++){
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除愉老,根號(hào)i场绿,[2,48.5],[根號(hào)97,根號(hào)97]
if(i % j == 0){ //i被j除盡
isFlag = false;
break;//優(yōu)化一:只對(duì)本身非質(zhì)數(shù)的自然數(shù)是有效的嫉入。
}
}
//
if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
//獲取當(dāng)前時(shí)間距離1970-01-01 00:00:00 的毫秒數(shù)
long end = System.currentTimeMillis();
System.out.println("質(zhì)數(shù)的個(gè)數(shù)為:" + count);
System.out.println("所花費(fèi)的時(shí)間為:" + (end - start));//17110 - 優(yōu)化一:break:1546 - 優(yōu)化二:13
}
}
特殊關(guān)鍵字的使用:break焰盗、continue
/*
break和continue關(guān)鍵字的使用
使用范圍 循環(huán)中使用的作用(不同點(diǎn)) 相同點(diǎn)
break: switch-case
循環(huán)結(jié)構(gòu)中 結(jié)束當(dāng)前循環(huán) 關(guān)鍵字后面不能聲明執(zhí)行語(yǔ)句
continue: 循環(huán)結(jié)構(gòu)中 結(jié)束當(dāng)次循環(huán) 關(guān)鍵字后面不能聲明執(zhí)行語(yǔ)句
*/
class BreakContinueTest {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
break;//123
//continue;//123567910
//System.out.println("今晚迪麗熱巴要約我!V淞帧熬拒!");
}
System.out.print(i);
}
System.out.println("\n");
//******************************
label:for(int i = 1;i <= 4;i++){//加了標(biāo)簽,可以控制break結(jié)束指定標(biāo)簽的循環(huán)
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break;//默認(rèn)跳出包裹此關(guān)鍵字最近的一層循環(huán)垫竞。
//continue;
//break label;//結(jié)束指定標(biāo)識(shí)的一層循環(huán)結(jié)構(gòu)
continue label;//結(jié)束指定標(biāo)識(shí)的一層循環(huán)結(jié)構(gòu)當(dāng)次循環(huán)
}//默認(rèn)結(jié)束最近一層的循環(huán)
System.out.print(j);
}
System.out.println();
}
}
}
- return::并非專(zhuān)門(mén)用于結(jié)束循環(huán)的澎粟,它功能是結(jié)束一個(gè)方法。 當(dāng)一個(gè)方法執(zhí)行到return語(yǔ)句時(shí)欢瞪,這個(gè)方法將被結(jié)束
- return是結(jié)束整個(gè)方法活烙,不管return處于多少層循環(huán)內(nèi)
輸出質(zhì)數(shù)代碼的第三種循環(huán)變化
/*
100000以內(nèi)的所有質(zhì)數(shù)的輸出。實(shí)現(xiàn)方式二
質(zhì)數(shù):素?cái)?shù)引有,只能被1和它本身整除的自然數(shù)瓣颅。-->從2開(kāi)始倦逐,到這個(gè)數(shù)-1結(jié)束為止譬正,都不能被這個(gè)數(shù)本身整除。
對(duì)PrimeNumberTest.java文件中質(zhì)數(shù)輸出問(wèn)題的優(yōu)化
*/
class PrimeNumberTest2 {
public static void main(String[] args) {
int count = 0;//記錄質(zhì)數(shù)的個(gè)數(shù)
//獲取當(dāng)前時(shí)間距離1970-01-01 00:00:00 的毫秒數(shù)
long start = System.currentTimeMillis();
label:for(int i = 2;i <= 100000;i++){//遍歷100000以內(nèi)的自然數(shù)
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除盡
continue label;
}
}
//能執(zhí)行到此步驟的檬姥,都是質(zhì)數(shù)
count++;
}
//獲取當(dāng)前時(shí)間距離1970-01-01 00:00:00 的毫秒數(shù)
long end = System.currentTimeMillis();
System.out.println("質(zhì)數(shù)的個(gè)數(shù)為:" + count);
System.out.println("所花費(fèi)的時(shí)間為:" + (end - start));//17110 - 優(yōu)化一:break:1546 - 優(yōu)化二:13
}
}