この記事では、java に関する関連知識を提供し、選択ステートメント、ループ ステートメント、リダイレクト ステートメント、およびその他の関連コンテンツを含む制御ステートメントに関する関連問題を主に紹介します。それはみんなを助けます。
## 推奨学習: 「Java ビデオ チュートリアル 」
1. 分類java.util.Scanner s = new java.util.Scanner(System.in); #整数の受信: int i = s.nextInt() 文字列の受信: String str = s.next();
または、最初の文を 2 つのステップに分割します:import java.util.Scanner;
## Scanner s = new Scanner(System.in)
制御ステートメントの分類
選択文 (分岐文): if 文、switch 文;
ループ文: for ループ、while ループ、do..while.. ループ;ステアリング ステートメント: Break、Continue、Return (後述);
2. ステートメントの詳細な説明
Selectステートメント if 、switch
if ステートメントは分岐ステートメントは、条件ステートメントとも呼ばれます。 if 文の構文形式:
最初の書き方:
ここで中括弧 {} を分岐と呼びます。if(布尔表达式){ java语句; java语句; }ログイン後にコピー
この構文の実行原理は、ブール式の結果が true の場合、中括弧内のプログラムが実行され、それ以外の場合、中括弧内のコードは実行されません。
2 番目の書き方:
if(布尔表达式){ // 分支1 java语句; }else{ // 分支2 java语句; }
実行原理: ブール式の結果が true の場合、分岐 1 が実行されます。ブランチ 2 は実装されません。ブール式の結果が false の場合、分岐 1 は実行されず、分岐 2 が実行されます。実行原理: まず「ブール式 1」を判定し、「ブール式 1」が true の場合、次に分岐 1 が実行され、if ステートメントが終了します。## 3 番目の書き方:
if(布尔表达式1){ // 分支1 java语句; }else if(布尔表达式2){ // 分支2 java语句; }else if(布尔表达式3){ // 分支3 java语句; }else if(布尔表达式4){ // 分支4... java语句; }....ログイン後にコピー
「ブール式 1」の結果が false の場合、引き続きブール式 2 の結果が判定され、ブール式 2 の結果が true の場合、分岐 2 が実行され、その後 if 全体が実行されます。終わり。主に最初に true が発生する分岐に応じて、上から下に判断します。最初の true に対応する分岐が実行され、1 つの分岐が実行されると if 全体が終了します。
4 番目の書き方:
if(布尔表达式1){ // 分支1 java语句; }else if(布尔表达式2){ // 分支2 java语句; }else if(布尔表达式3){// 分支3 java语句; }else if(布尔表达式4){// 分支4 java语句; }else{ java语句; // 以上条件没有一个成立的。这个else就执行了。 }ログイン後にコピー
注意事項
if ステートメントの条件には、ブール式 (true と false) のみを使用できます。 C 言語とは厳密に区別されるため、特定の数値や変数を使用することはできません; if ステートメントの場合、どのような状況でも実行される分岐は 1 つだけであり、2 つ以上の分岐は存在できません。 if ステートメント内の 1 つの分岐が実行される限り、if ステートメント全体が終了します。 (完全な if ステートメントの場合);
上記の 4 つの構文メカニズムのうち、else 分岐を持つものはいずれも 1 つの分岐が実行されることを保証できます。上記 4 種類のうち、1 番目と 3 番目の種類は else 分岐を持たないため、最後の分岐が実行されない可能性があります。 2 番目と 4 番目のタイプでは、確実に 1 つのブランチが実行されます。ブランチ内に「java ステートメント;」が 1 つだけある場合は、中括弧 {} を省略できますが、読みやすくするため、省略しないことをお勧めします。それを省略します。制御ステートメントは制御ステートメント間でネストすることができますが、ネストする場合は、それらをまとめて分析するのではなく、1 つずつ分析することをお勧めします。
例 1
分析例
変数自体がブール型の場合、メソッド 文法的かつ論理的である限り、型自体がブール型であるため、たくさんあります。例: sex、sex == true、または三項演算子として記述されます。
public class Test01{ public static void main(String[] args){ //1.本身就是布尔类型 boolean sex = true; if(sex){//sex == true也可以 System.out.println('男'); } else{ System.out.println('女'); } //2.也可以用三目运算符 char str = sex?'男':'女'; System.out.println(str); //3.一种特殊情况 if(sex = true){//赋值运算符,也可以编译通过,永远只执行if语句 System.out.println('男'); } else{ System.out.println('女'); } } }
例2
对于变量是整型,我们的方式就很少了,因为if后面跟的必须是布尔表达式;所以要写成一个表达式,让它生成一个布尔类型,例如:i == 100;
如果if...else后面只跟着一条语句,大括号可以省略;如果省略写了两个java语句也是没问题的;但是就会和下面的else断开,造成else没有if语句,编译报错;
//1.本身不是布尔类型 int i = 100; if(i == 100){ System.out.println(true); } else{ System.out.println(false); } //2.else缺少if if(sex) System.out.println('男'); System.out.println("Hello wprld");//合乎语法的 else //这一行报错,因为else缺少if System.out.println('女'); //上面等价于 if(sex){ System.out.println('男'); } System.out.println("Hello wprld"); else System.out.println('女');
例3
public class Test02{ public static void main(String[] args){ //从键盘接收数据 System.out.print("请输入你的年龄:"); java.util.Scanner s = new java.util.Scanner(System.in); int age = s.nextInt(); //1.方法1 if(age<0 || age >150){ System.out.println("年龄不合法"); }else if(age <= 5){ System.out.println("婴幼儿"); }else if(age <= 10){ System.out.println("少儿"); }else if(age <= 18){ System.out.println("少年"); }else if(age <= 35){ System.out.println("青年"); }else if(age <= 55){ System.out.println("中年"); }else{ System.out.println("老年"); } //2.方法2代码改良 String str = "老年"; if(age<0 || age >150){ System.out.println("年龄不合法"); return;//不合理就跳出循环,防止后面在打印 }else if(age <= 5){ str = "婴幼儿"; }else if(age <= 10){ str = "少儿"; }else if(age <= 18){ str = "少年"; }else if(age <= 35){ str = "青年"; }else if(age <= 55){ str = "中年"; } System.out.println(str);//最后公用一个打印;因为每次只能打印一个 } }
例4
系统接收一个学生的考试成绩,根据考试成绩输出成绩的等级。等级:优:[90~100]、良:[80~90) 、中:[70-80)、及格:[60~70)、不及格:[0-60)
要求成绩是一个合法的数字,成绩必须在[0-100]之间,成绩可能带有小数。
public class Test03{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入你的成绩:"); double grade = s.nextDouble(); String str = "优"; if(grade <0 || grade >100){ System.out.println("分数不合法"); return; //不合理就跳出循环,防止后面在打印 }else if(grade<60){ str = "不及格"; }else if(grade < 70){ str = "及格"; }else if(grade < 80){ str = "中"; }else if(grade < 90){ str = "良"; } System.out.println(str);//最后公用一个打印;因为每次只能打印一个 } }
例5
从键盘上接收天气的信息:1表示:雨天
0表示:晴天
同时从键盘上接收性别的信息:1表示:男
0表示:女
业务要求:
当天气是雨天的时候:男的:打一把大黑伞
女的:打一把小花伞
当天气是晴天的时候:男的:直接走起,出去玩耍
女的:擦点防晒霜,出去玩耍
public class Test04{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入天气,1表示雨天,0表示晴天:"); int weather = s.nextInt(); System.out.print("请输入性别,1表示男,0表示女:"); int sex = s.nextInt(); if(weather == 1){ if(sex == 1){ System.out.println("打一把大黑伞"); }else{ System.out.println("打一把小花伞"); } }else{ if(sex == 1){ System.out.println("直接走起,出去玩耍"); }else{ System.out.println("擦点防晒霜,出去玩耍"); } } } }
switch语句也是选择语句,也可以叫做分支语句。
switch语句的语法格式:
switch(值){ case 值1: java语句; java语句;... break; case 值2: java语句; java语句;... break; case 值3: java语句; java语句;... break; default: java语句; }
其中:break语句不是必须的;default分支也不是必须的。
switch语句支持的值有:支持int类型以及String类型。
一定要注意JDK的版本,JDK8之前不支持String类型,只支持int。在JDK8之后,switch语句开始支持字符串String类型。
switch语句本质上是只支持int和String,但是byte,short,char也可以
使用在switch语句当中,因为byte short char可以进行自动类型转换。switch语句的执行原理
拿“值”与“值1”进行比较,如果相同,则执行该分支中的java语句,然后遇到"break;"语句,switch语句就结束了。
如果“值”与“值1”不相等,会继续拿“值”与“值2”进行比较,如果相同,则执行该分支中的java语句,然后遇到break;语句,switch结束。
注意:如果分支执行了,但是分支最后没有“break;”,此时会发生case 穿透现象。所有的case都没有匹配成功,那么最后default分支会执行。
实例分析
例1
写一个完整的switch语句;接收键盘输入,根据输入的数字来判断星期几。
0 星期日、1 星期一....、假设输入的数字就是正确的。0到6
public class Test05{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入[0-6]的天数:"); int day = s.nextInt(); switch(day){ case 0: System.out.println("星期日"); break; case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; default: System.out.println("选择错误"); break; } } }
例2
系统接收一个学生的考试成绩,根据考试成绩输出成绩的等级。必须用switch来写等级:优:[90~100]、良:[80~90) 、中:[70-80)、及格:[60~70)、不及格:[0-60)
要求成绩是一个合法的数字,成绩必须在[0-100]之间,成绩可能带有小数。
public class SwitchTest02{ public static void main(String[] args){ //提示用户输入学生成绩 java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入学生成绩:"); double score = s.nextDouble(); //System.out.println(score); if(score < 0 || score > 100){ System.out.println("您输入的学生成绩不合法,再见!"); return; } // 程序能够执行到这里说明成绩一定是合法的。 // grade的值可能是:0 1 2 3 4 5 6 7 8 9 10 // 0 1 2 3 4 5 不及格 // 6 及格 // 7 中 // 8 良 // 9 10 优 int grade = (int)(score / 10); // 95.5/10结果9.55,强转为int结果是9 String str = "不及格"; switch(grade){ case 10: case 9: str = "优"; break; case 8: str = "良"; break; case 7: str = "中"; break; case 6: str = "及格"; } System.out.println("该学生的成绩等级为:" + str); } }
for循环的语法机制以及运行原理
语法机制:for(初始化表达式; 条件表达式; 更新表达式){ 循环体; // 循环体由java语句构成 java语句; java语句; java语句; java语句; .... }ログイン後にコピー注意:
第一:初始化表达式最先执行,并且在整个循环中只执行一次。
第二:条件表达式结果必须是一个布尔类型,也就是:true或false
执行原理:
(1)先执行初始化表达式,并且初始化表达式只执行1次。
(2)然后判断条件表达式的结果,如果条件表达式结果为true,则执行循环体。
(3)循环体结束之后,执行更新表达式。
(4)更新完之后,再判断条件表达式的结果,如果还是true,继续执行循环体。
(5)直到更新表达式执行结束之后,再次判断条件时,条件为false,for循环终止。 更新表达式的作用是:控制循环的次数,换句话说,更新表达式会更新某个变量的值,这样条件表达式的结果才有可能从true变成false,从而 终止for循环的执行,如果缺失更新表达式,很有可能会导致死循环。
例1
public class ForTest02{ public static void main(String[] args){ //1. 最简练的for循环 //初始化表达式、条件表达式、更新表达式 其实都不是必须的!!! for(;;){ System.out.println("死循环"); } //2.最常见的for循环 for(int i = 0;i < 10;i++){ System.out.println("i = " + i); // 0 1 2 3....9 } System.out.println(i);//错误: 找不到符号,i的范围只在for循环内 //3.i变量的作用域就扩大了。 int i = 0; for(;i < 10;i++){ System.out.println("i --> " + i); // 0 1 2 3....9 } System.out.println("i = " + i); //10,这里的i就可以访问了 //4.变形 for(int k = 1; k <= 10; ){ System.out.println("k --> " + k); k++;// 1 2 3 4 5 6 7 8 9 10 } //5.变形 for(int k = 1; k <= 10; ){ k++; System.out.println("value --> " + k); // 2 3 4 5 6 7 8 9 10 11 } } }
例2
public class ForTest03{ public static void main(String[] args){ //1. for的其它形式 for(int i = 10; i > 0; i--){ System.out.println("i = " + i); // 10 9 8 7 6 5 4 3 2 1 } //2. 变形 for(int i = 0; i < 10; i += 2){ System.out.println("value1 = " + i); // 0 2 4 6 8 } //3. 死循环 for(int i = 100; i > 0; i %= 3){ System.out.println("value2 = " + i); // 100 1 1... 1 } } }
例3:求1-100所得奇数和
public class Test07{ public static void main(String[] args){ int i = 0; int sum = 0; for(i=1;i<=100;i+=2){ sum+=i; } System.out.println("sum = "+sum);//2500 } }
例4:嵌套循环
public class Test08{ public static void main(String[] args){ //1.注意初始化放里面 for(int i =0;i< 2;i++){ for(int j=0;j<10;j++){ System.out.print(j+" "); } System.out.println(); }//打印两行0-9的数字 //2.初始化放外面 int n = 0; for(int m = 0;m<2;m++){ for(;n<10;n++){ System.out.print(n+" "); } System.out.println(); }//打印一行0-9的数字 } }
例5:九九乘法表
public class Test09{ public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ System.out.print(j+"*"+i + "=" +i*j+" "); } System.out.println(); } } }
while循环的语法机制以及执行原理
语法机制:while(布尔表达式){ 循环体; }ログイン後にコピー执行原理:
判断布尔表达式的结果,如果为true就执行循环体,循环体结束之后,再次判断布尔表达式的结果,如果还是true,继续执行循环体,直到布尔表达式结果为false,while循环结束。while循环有没有可能循环次数为0次?
可能;while循环的循环次数是:0~n次。
例1
public class WhileTest01{ public static void main(String[] args){ //1.死循环 while(true){ System.out.println("死循环"); } //2.本质上while循环和for循环原理是相同的。 for(初始化表达式; 布尔表达式; 更新表达式){ 循环体; } 初始化表达式; while(布尔表达式){ 循环体; 更新表达式; } //3.例子对比 //----for for(int i = 0; i < 10; i++){ System.out.println("i --->" + i); } //----while int i = 0; while(i < 10){ System.out.println("i = " + i); i++; } //4.for和while完全可以互换,只不过就是语法格式不一样。 for(int i = 0; i < 10; ){ i++; System.out.println("i --->" + i); // 1 2 3 .. 9 10 } int i = 0; while(i < 10){ i++; System.out.println("i = " + i); // 1 2 3 .. 9 10 } } }
do..while循环语句的执行原理以及语法机制:
语法机制:do { 循环体; }while(布尔表达式);ログイン後にコピー注意:do..while循环最后的时候别漏掉“分号”;
执行原理:
先执行循环体当中的代码,执行一次循环体之后,判断布尔表达式的结果,如果为true,则继续执行循环体,如果为false循环结束。
对于do..while循环来说,循环体至少执行1次。循环体的执行次数是:1~n次。
对于while循环来说,循环体执行次数是:0~n次。
例1
public class Test10{ public static void main(String[] args){ int i = 0; //1. do{ //第一种方法 System.out.println(i); i++; //第二种方法 System.out.println(i++); }while(i<10);//0...9 //2. i = 0; do{ System.out.println(++i); }while(i<10);//1...10 } }
break;语句比较特殊,特殊在:break语句是一个单词成为一个完整的java语句。
break的作用:终止当前循环,直接跳出循环;break主要用在两个地方,其它位置不行:
第一个位置:switch语句当中,用来终止switch语句的执行。用在switch语句当中,防止case穿透现象,用来终止switch。
第二个位置:break;语句用在循环语句当中,用在for当中、用在while当中、用在do....while当中;用来终止循环的执行。break;语句的执行并不会让整个方法结束,break;语句主要是用来终止离它最近的那个循环语句。
怎么用break;语句终止指定的循环呢?
第一步:你需要给循环起一个名字,例如:a: for(){ b:for(){ } }ログイン後にコピー第二步:终止:break a;
例1
public class BreakTest01{ public static void main(String[] args){ for(int i = 0; i < 10; i++){ if(i == 5){ //1.break;语句会让离它最近的循环终止结束掉。终止的不是if,不是针对if的,而是针对离它最近的循环。 break; } System.out.println("i = " + i); // 0 1 2 3 4 } //2.这里的代码照常执行。break;的执行并不会影响这里。 System.out.println("Hello World!"); //3.常用的终止内存的for for(int k = 0; k < 2; k++){ // 外层for for(int i = 0; i < 10; i++){ // 内层for if(i == 5){ break; //这个break;语句只能终止离它最近的for,内层的for } System.out.println("i ===> " + i); } } System.out.println("------------------------------------------"); //4.终止外层的for,起一个别名! a:for(int k = 0; k < 2; k++){ b:for(int i = 0; i < 10; i++){ if(i == 5){ break a; //终止指定的循环。 } System.out.println("i ===> " + i); } } System.out.println("呵呵"); } }
continue翻译为:继续;continue语句和break语句要对比着学习;
continue语句的作用是:终止当前"本次"循环,直接进入下一次循环继续执行。
continue语句后面也可以指定循环;a:for(;;更新表达式1){ b:for(;;更新表达式2){ if(){ continue a; } code1; code2; code3; } }ログイン後にコピー
例1
public class ContinueTest01{ public static void main(String[] args){ //1.对于break直接跳出当前循环 for(int i = 0; i < 10; i++){ if(i == 5){ break; } System.out.println("i = " + i);//0、1、2、3、4 } System.out.println("----------------------------"); //2.对于continue是跳出当前的一次循环,继续下一次循环 for(int i = 0; i < 10; i++){ if(i == 5){ continue; } System.out.println("i = " + i); //输出结果是0-9没有5 } } }
例1:计算1000以内所有不能被7整除的整数之和
public class Test01{ public static void main(String[] args){ int sum = 0; for(int i = 1;i<=1000;i++){ if(i%7 != 0){ sum +=i; } } System.out.println("sum="+sum); } }
例2:计算 1+2-3+4-5+6-7....+100的结果
注意除1以外,偶数是正,奇数是负;所以我们就从2开始循环,把sum初始化为1就可
//方法1: public class Test02{ public static void main(String[] args){ int sum = 1; for(int i=2;i<=100;i++){ if(i%2 ==0){ sum+=i; } else{ sum-=i; } } System.out.println(sum); } }
//方法2:定义一个flag标记,用来控制正负,一个数一个数进行处理 public class Test02{ public static void main(String[] args){ int sum = 1; int flag = 1; for(int i=2;i<=100;i++){ sum +=flag*i; flag = -flag; } System.out.println(sum); } }
例3:从控制台输入一个正整数,计算该数的阶乘。
public class Test03{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); System.out.print("请输入一个整数:"); int num = s.nextInt(); int ret = 1; //方法1 for(int i=1;i<=num;i++){ ret*=i; } //方法2 for(int i = num;i>0;i--){ ret*=i; } System.out.println(ret); } }
例4:判断一个数是不是质数
//方法1: public class Test04{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int num = s.nextInt(); int i = 0; for(i = 2;i<num;i++){ if(num%i == 0){ System.out.println(num+"不是质数"); break; } } if(i == num){ System.out.println(num+"是质数"); } }
//方法2: public class Test04{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int num = s.nextInt(); int i = 0; boolean str = true;//也相当于一个标记 for(i = 2;i<num;i++){ if(num%i == 0){ str = false;//不是更改标记 break; } } System.out.println(num+(str ? "是":"不是")+"质数");//根据标记输出值 } }
例5:打印金字塔
* *** ***** ******* *********
public class Test05{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int n = s.nextInt(); for(int i=0;i<n;i++){ for(int j=0;j<n-i-1;j++){ System.out.print(" "); } for(int j=0;j<2*i+1;j++){ System.out.print("*"); } System.out.println(); } } }
例6:
小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天
或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱!
public class Test06{ public static void main(String[] args){ double money = 0; int day = 0; while(true){//这也可以写成while(money<100),这样就不需要break了 money += 2.5; day++; if(day%5 == 0){ money -= 6; } if(money >= 100){ break; } } System.out.println("需要"+day+"天存到"+money+"元钱"); } }
例7:
一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程
找出1000内所有的完数。
public class Test07{ public static void main(String[] args){ for(int i=2;i<=1000;i++){//1不算完数,从2开始 //注意sum的位置,写在内循环,因为每次都要重置sum为0 int sum = 0; //i取一半,最好的是取根号i,目前还没学习库函数,先取i/2 for(int j=1;j<= i/2;j++){ if(i%j == 0){ sum += j; } } if(sum == i){ System.out.println(i); } } } }
例8:求一个数是几位数,并逆序打印每一位
public class Test08{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int num = s.nextInt(); int count = 0; int tmp = num; //求位数 while(tmp != 0){ count++; tmp /= 10; } System.out.println("位数是"+count+"位"); //逆序打印 tmp = num; while(tmp != 0){ System.out.println(tmp%10); tmp /= 10; } } }
例9
1 10 100 1000 2 20 200 2000 3 30 300 3000 4 40 400 4000
public class Test09{ public static void main(String[] args){ for(int i=1;i<=4;i++){ int tmp = i; for(int j=1;j<=4;j++){ System.out.print(tmp+" "); tmp *= 10; } System.out.println(); } } }
10
* *** ***** ******* ********* ******* ***** *** *
public class Test10{ public static void main(String[] args){ java.util.Scanner s = new java.util.Scanner(System.in); int num = s.nextInt(); x(num); } public static void x(int n){ //1.打印上半部分 for(int i=0;i<n;i++){ for(int j=0;j<n-i-1;j++){ System.out.print(" "); } for(int j=0;j<2*i+1;j++){ System.out.print("*"); } System.out.println(); } //2.打印下半部分 for(int i=0;i<n-1;i++){ for(int j=0;j<=i;j++){ System.out.print(" "); } for(int j=0;j<2*(n-i-1)-1;j++){ System.out.print("*"); } System.out.println(); } } }
11
篮球从 5 米高的地方掉下来,每次弹起的高度是原来的 30%,经过几次弹起,篮球的高度是 0.1 米。
public class Test11{ public static void main(String[] args){ int count = 0; double h = 5; while(h >= 0.1){ h *= 0.3; count++; } System.out.println(count); } }
推荐学习:《java视频教程》
以上がJavaの基本制御文の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。