JavaSE笔记04 流程控制语句(下)+方法
文章目录
一.循环结构:
- 循环结构概述:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要注意的是: 需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环
- 循环结构的分类,如下图:
1.for循环:
for循环的定义格式:
for(循环初始值 ; 循环条件 ; 控制循环条件的语句)
- 关于for循环语句的执行流程:
(1) 执行初始化表达式语句
(2) 执行判断条件语句,看其返回值是true还是false,如果是true,就继续执行,如果是false,就结束循环
(3) 执行循环体语句;
(4) 执行控制条件语句
(5) 回到(2)继续直至结束 - 代码演示:求和1-100的和以及分别求出1-100中所有奇数和所有偶数的和:
class Sum{
public static void main(String[] args) {
int sum=0; //存放1-100所有数字的和
int sumou=0; //存放1-100所有偶数的和
int sumji=0; //存放1-100所有奇数的和
for(int i=1;i<=100;i++){
sum+=i;
if(i%2==0){
sumou+=i; //利用if else和取模运算来确定偶数
}
else{
sumji+=i; //反之商不是0的就是奇数
}
}
System.out.println("1-100的和为:"+sum);
System.out.println("1-100的偶数和为:"+sumou);
System.out.println("1-100的奇数和为:"+sumji);
}
}
- 注意事项及小结:
(1) 初始化表达式语句只执行一次
(2) 两个分号必不可少,但是三个表达式可以省略,但要结合break,否则会死循环
(3) 循环初始值,循环条件,控制循环语句都可以有多个变量,并且多个变量之间可以用逗号隔开
案例:for循环之水仙花数:
案例题设: 求水仙花数,及其数量:所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身,举例:153就是一个水仙花数:153 = 111 + 555 + 333 = 1 + 125 + 27 = 153
代码演示:
class Flowernum {
public static void main(String[] args){
//水仙花数的范围是从100-999之间的整数,因此可以确定相关的循环条件
//从100开始一一美剧相应整数是否可以符合条件并筛选
//案例难点:获得三位数中每一位上的数值
int cnt = 0; //统计个数
for(int i=100;i<=999;i++){
int bai = i/100; //获得百位
int ge = i%10; //获得个位
int shi = (i-bai*100)/10; //获得十位
int flowernum = shi*shi*shi+bai*bai*bai+ge*ge*ge;
if(flowernum == i){
System.out.println(i);
cnt++;
}
}
System.out.println("共有"+cnt+"个水仙花数");
}
}
2.while语句循环:
循环结构while语句的格式:
while(判断条件语句) {
循环体语句;
}
完整格式:
初始化条件语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
- 关于while语句循环的执行流程:
(1) 执行初始化条件语句
(2) 执行判断条件语句,看其返回值是true还是false,如果是true,就继续执行,如果是false,就结束循环
(3) 执行循环体语句
(4) 执行控制条件语句
(5) 回到(2)继续 - 代码演示:利用while循环求10的阶乘,即从1乘到10:
class While_test {
public static void main(String[] args) {
//首先需要在while循环体外部定义循环的初始变量
int i = 1;
long result = 1L; //long型防止数据溢出
while(i<=10){ //写循环条件
result = result * i;
i++; //写循环控制语句
}
System.out.println("1到10的阶乘是:"+result);
}
}
3.do…while语句循环:
循环结构do…while语句的格式:
do {
循环体语句;
}while(判断条件语句);
完整格式:
初始化条件语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
- 关于do…while语句循环的执行流程:
(1) 执行初始化条件语句;
(2) 执行循环体语句;
(3) 执行控制条件语句;
(4) 执行判断条件语句,看其返回值是true还是false,如果是true,就继续执行,如果是false,就结束循环
(5) 回到b继续 - 代码演示:在控制台输出10次"helloworld"
class DoWhile_test {
public static void main(String[] args) {
//首先还是需要在循环体外部先定义相关变量的初始值
int i=1;
do{
System.out.println("第"+i+"遍:"+"Hello World!"); //循环执行语句
i++; //循环控制语句
}
while(i<=10); //循环条件
}
}
4.三种循环语句的使用特点:
- do…while循环至少执行一次循环体而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句
- 如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环
- 不知道循环次数时用for循环,因为变量及早的从内存中消失,可以提高内存的使用效率
- 建议优先考虑for循环,然后是while循环 ,最后是do…while循环
5.循环的嵌套:
- for循环可以层层嵌套:利用for循环的嵌套,可以打印二维变量,如:矩阵,乘法表等等
- 同样,在下面while和do…while也可以相互嵌套,循环结构之间只要没有死循环都可以相互嵌套
- 注意for循环在嵌套时尽量不要超过三层
- 执行特点:先执行外层循环,外循环执行一次,内循环从头到尾执行一轮
- 执行总次数=外循环次数*内循环次数。详细说:总次数=内循环第一轮的次数+内循环第二轮的次数+内循环第三次的次数…+内循环第n轮的次数。轮数就是外循环的次数
- 代码演示:输出一个5×6的*号矩阵:
class StarMatrix {
public static void main(String[] args) {
for(int i=1;i<=5;i++){ //控制有几行需要打印
for(int j=1;j<=6;j++){ //控制每行有几个*号
System.out.print("* ");
}
System.out.println();
}
}
}
案例:for循环之99乘法表:
案例题设:
利用for循环的嵌套打印99乘法表
代码演示:
class Mult_table {
public static void main(String[] args) {
//本案例难点在于使用嵌套打印非矩形图形
//案例中需使用\t这一转义字符将相关行进行对齐
//案例中的输出格式需要使用字符串的拼接
for(int i=1;i<=9;i++){ //一维for循环控制行号
for(int j=1;j<=i;j++){ //二维for循环控制列号
int result = i*j; //result存放i*j的结果
System.out.print(j+"*"+i+"="+result+"\t"); //按字符串的规定格式输出,\t为转义字符可以帮助对齐
}
System.out.println(); //直接每行后输入空,帮助程序换行
}
}
}
注:对于程序中出现的转义字符,常用的还有以下几种:
转义字符 | 效果 |
---|---|
\t | tab键的位置 |
\n | 换行 |
二.控制跳转语句:
控制跳转语句的介绍:
前面我们已经说过了,Java中的goto是保留字,目前不能使用。虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环执行到某一步的时候就结束,现在就做不了这件事情。为了弥补这个缺陷,Java就提供了break,continue和return(在方法中讲解)来实现控制语句的跳转和中断
对于三种控制跳转语句的相关用法和介绍:
控制跳转语句 | 应用范围及相关用法 |
---|---|
break | 用于跳出所在的当前循环或switch和case的嵌套体 |
continue | 只能用于循环中,提前结束本次循环,继续下一次循环 |
return | 用于结束当前方法 |
1.break:
- break的使用场景:
(1) 在选择结构switch语句中
(2) 在循环语句中 - break的作用:
(1) 退出单层循环
(2) 退出多层循环(几乎不使用):要想实现这个效果,就必须知道一个东西;带标签的语句,格式:标签名:语句 - break的使用注意事项:
(1) break中断循环时对于for循环和while循环其效果一样时位置不一样,所以在编写程序时一定要记得看清break所要退出的循环
(2) break离开使用场景的存在是没有意义的,也就是说如果break单独在循环体之外是毫无用处的
2.continue:
- continue的使用场景:
(1) 在循环语句中
(2) 离开使用场景的存在是没有意义的 - continue的作用:
跳出当前的循环,执行下一步操作 - continue的使用注意事项:
continue必须用在循环场景中,离开循环没有意义
案例:利用控制跳转语句按要求输出:
案例题设:
在下面的代码段中依次填写不同的内容使之完成以下不同条件的需求:
class Testcontinue {
public static void main(String[] args) {
for(int i=1;i<=10;i++){
if(i%3==0){
//在这里填写代码使满足题意
}
System.out.println(“Java”);
}
}
}
需求:
(1) 打印2次java
(2) 打印7次java
(3) 打印13次java
class Testcontinue
{
public static void main(String[] args)
{
for(int i=1;i<=10;i++){
if(i%3==0){
//在这里填写代码使满足题意
//break;//(1) 当第三次时之间跳出循环,所以打印2次
//continue;//(2) 当为3,6,9时跳过循环,所以打印7次
System.out.println("Java");//(3) 当出现3,6,9时多打印一个java,所以是13次
}
System.out.println("Java");
}
}
}
三.方法(函数):
1.方法定义及其格式:
对于方法的定义,我们将函数和方法二者进行类比:
- 函数: 是一段可以重复调用的代码,通过名字来进行调用。它能将数据传递进去进行一些处理,然后返回数据(或者没有返回值),函数和对象无关。
- 方法: 也是一段可以重复调用的代码,也通过名字来进行调用的,但是它跟一个对象相关联。方法可以操作类内部由private封装的数据。
在很多语言中都有函数的定义,但是在咱们JAVA语言中,我们将其称之为方法。简单理解,方法就是完成特定功能的代码块
方法的定义格式:
权限修饰符 状态修饰符 返回值类型 方法名(参数){
//方法体(要完成某个功能的代码)
}
方法定义格式详解:
格式组成部件 | 作用 |
---|---|
修饰符 | 比较多,后面会详细介绍。目前使用 public static |
返回值类型 | 用于限定返回值的数据类型 |
方法名 | 就是一个名称,它的存在是为了方便我们调用方法 |
参数类型 | 限定调用方法时传入参数的数据类型 |
参数名 | 是一个变量,接收调用方法时传入的参数,这个参数其实有一个专业的名词,被称之为形式参数,它的作用是用来接收实际参数的 |
方法体 | 完成功能的代码 |
return | 结束方法以及返回方法指定类型的值 |
返回值 | 就是功能的结果,由return带回,带回给调用者 |
2.使用方法的注意事项:
- 方法的定义位置:定义在类中,并且方法和方法是平级关系,不能被嵌套定义
- 所有方法不调用不执行,但是除了main方法是由JVM自动调用的
- 在main方法中可以调用我们定义的方法
- 方法参数:定义方法是可以在括号中定义参数,定义在方法括号中的参数叫做形式参数,简称形参,形参的作用是用来接收调用方法时传递过来的数据
- 你调用方法时传递的参数叫做实际参数,简称实参,实参可以是变量也可以是常量
- 实参的个数以及数据类型要和形参保持一致注意实参的数据类型和形参的数据类型要保持一致,如果不一致就会报错
- 以后在定义方法时要考虑两个方面:
(1)该方法是否需要设计参数,设计几个参数,参数类型是什么?
(2)这个方法要不要返回值,返回值是什么类型的? - 给方法命名时要做到见名知意,方法名一般小写,多个单词首字母小写,后一个单词首字母大写
3.return:
一旦方法明确了返回类型,就必须由return关键字返回一个与你明确的类型一致的结果,当你的方法的返回值类型为void时这个return可以省略不写,使用return结束方法,并返回结果
4.方法的重载:
- 允许一个类中可以定义多个同名方法只要他们的参数个数或参数类型不同即可重载,但是完全相同是不允许的,重载与返回值无关,不拿返回值/类型来区分
- 在重载中如果对应多种类型如:
public static int add(int a,int b)
public static long add(int a,int b)
//但是由于整数是默认int型,所以输入整型时重载的最佳匹配就是int
- 关于重载的代码演示:
class Reload{
public static void main(String[] args) {
//求两个数之和
//求三个数之和
//求四个数之和
long sum1=add(1,2);
System.out.println("和是:"+sum1);
int sum2=add(1,2,3);
System.out.println("和是:"+sum2);
int sum3=add(1,2,3,4);
System.out.println("和是:"+sum3);
}
public static int add(int a,int b){
System.out.println("两个int类型的add方法调用了");
return a+b;
}
public static long add(int a,long b){
System.out.println("一个int类型一个long类型的add方法调用了");
return a+b; //该方法用于查看默认整型的相关重载调用
}
public static int add(int a,int b,int c){
return a+b+c;
}
public static int add(int a,int b,int c,int d){
return a+b+c+d;
}
}
案例:使用方法调用判断输入的a,b两个值是否相等:
import java.util.Scanner;
class IsEqual{
public static boolean Judge(int x,int y){
return x==y;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入a:");
int a = input.nextInt();
System.out.println("请输入b:");
int b = input.nextInt();
boolean flag = Judge(a,b);
if(flag){
System.out.println("a,b相等!");
}
else{
System.out.println("a,b不相等!");
}
}
}
案例:使用方法调用输出nn乘法表:
import java.util.Scanner;
class MultiPLUS {
public static void makeTable(int x){
for(int i=1;i<=x;i++){
for(int j=1;j<=i;j++){
int result = i*j;
System.out.print(j+"*"+i+"="+result+"\t");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入想要打印的乘法表行数:");
int a = input.nextInt();
makeTable(a);
}
}