Java 变量、运算符、程序控制结构

目录

第二章笔记

IDE简介

注释

关键字

保留字

标识符

变量

数据类型

基本数据类型转换

运算符

表达式的运算顺序

控制台输入Scanner

程序控制结构

分支控制 if-else

单分支

多分支

循环语句

break & continue

方法与return语句


第二章笔记

IDE简介

ide集成开发环境 ,所有开发工具的总称.

java主流的开发工具有很多,包括常见的有 eclipse 开源的、、 idea ——> 最常用的Java开发工具 收费 主流 个人使用时可破解 无限重置使用30天

安装 破解 创建项目 创建一个文件夹,专门放项目 为了防止误删除,在idea中想删除项目时,需要去在硬盘上删除

注释

使用特定的符号,标注内容, 对代码功能进行说明,不会被当作代码去运行

// 单行注释 只对某行进行注释 ctrl+/ 添加单行注释和取消单行注释

/*

多行注释 ctrl+shift+/

*/

/**

文档注释 用于为类,属性,方法进行功能注释,在其他地方使用时可以提示出来

后期我们再讲配置文档注释模板,以及生成文档

*/

如:

 

关键字

被语言赋予特殊含义的单词, public class int

用来修饰包,类,变量,方法......

关键字所有的字母都是小写的

分布在后面的章节中学习

保留字

java现有的版本中并为用来作为关键字的单词,以后可能会成为关键字,所以现在不允许用来当做标识符使用

自己命名标记符时要避免使用这些保留字 例如 goto 、const

标识符

语言中用来命名的字符---标识符 自己能定义的名字的字符,如(包、类、变量、方法)

标识符命名规则:

语法强制规范

允许使用大小写字母,数字,下划线,$

不允许数字开头,不允许使用关键字,保留字

不能有空格,严格区分大小写 长度不限制

约定俗成

见名知意 userName age

● 包名:多单词组成时所有字母都小写:xxxyyyzzz

● 类名、接口名:多单词组成时,所有单词的首字母大写:

XxxYyyZzz

● 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个

单词开始每个单词首字母大写:xxxYyyZzz

● 常量名:所有字母都大写。多单词时每个单词用下划线连接:

XXX_YYY_ZZZ

变量

可以变的量,是一个最基本的存储单元,程序执行中数值是可变的

本质上是,内存中的一块空间 使用变量名来访问这块区域,因此,

每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容), 才能使用

其要素包括变量名,变量类型

声明变量的语法——>数据类型(必须明确类型) [修饰符] 变量名 = 值;

数据类型

程序中所有的数据,都需要明确数据类型, 不同的类型存储空间不同,运算规则不同.

数据类型可分为两大类

一、 基本数据类型 共有8种,使用8个关键字修饰, 结构简单 .

基本数据类型细分为三类 ①数值型 byte(1byte 为 8个bit位 最大范围-128 ~~ +127) short int long

数值型中又能细分为两类有

1. 整数 有四种类型如下图 Java中整数默认字面量是int 若 声明一个long类型 需要在字面量后面添加L或l

  2.浮点数: float 4 字节 double 8字节 整体大小不同,小数位精度不同 默认字面量是double 若要声明float 需在字面量后面添加F/f

②字符型 必须只能是一个字符 用单引号表示

char a = 'a'; 97

char a = '中'; 20013 ' '  单引号表示一个字符

上述这些字符示例 ------> 看似是一个字符,本质上是一个整数(编码表中的编号) ---> Java中默认使用Unicode编码(万国码 包含全球所有的语言文字) ------> 十进制编号

char 可以进行运算 字符--->当做对应编码表的整数 ---> int 运算 牵扯到下一个问题 : 数据类型之间的转换

③布尔型 true false 表示真假,不能用0或非0

二、 引用数据类型 面向对象章节讲

基本数据类型转换

8种基本数据类型之间除了布尔型不可以与其他7种之间转换

其他byte short int long float double char (都是数值类型) 所以之间可以相互转换

由于数据间需要传递, 那么就可能会出现类型不一致,所以不同类型间需要相互转换

int a 转换 byte b

转换规则

默认转换:容量小的类型默认转换为容量大的数据类型

byte,short,char--->int--->long(8字节)--->float(4字节)--->double

float型在内存中占用的是4个字节的空间,而long型占用的是8个字节的空间

可是为什么4个字节的float型的最大值会大于long型的最大值呢?

答:float和long 由于小数在底层存储结构与整数不同,所以4byte的float 大于 8byte的long

(了解)详细解释 :因为 long 是整型数,在内存中占用8个字节共64位,它表示的数值有2的64次方,平

分正负,数值范围是负2的63次方到正2的63次方-1。而 float是浮点型,在内存中占4个字节,共32位,但是浮点数在内存中是这样的

V = (-1)^S * M *2^E

浮点数的32位不是简单的直接表示大小,而是按照一定的标准分配的

其中第1位,符号位,即S。

接下来的8位,指数域,即E。

剩下的23位,小数域,即M。

也就是说,浮点数在内存中的二进制值不是直接转换为十进制数值的,而是

按照上述公式计算而来,通过这个公式 V = (-1)^S * M *2^E 虽然只用到了4个字节,但是浮点数却比长整型的最大值要大。

容量小转容量大大 默认转换

大转小 则需要 加强制转换符 但可能出现问题? 装不下 数据溢出 浮点-->整数 精度降低

例:

           int a = 258;
           byte b = (byte)a;
         System.out.println(b);//2
​
           float c = 10.55f;
           long d = (long)c;
         System.out.println(d);//10

有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算

例:int z = 220023

long b = 10L+z 此时可以运算,默认先将z转换成long型

int m = 10L+z 此时会报错因为已经默认将数据转换为大容量long类型了,所以此时不能用int表示

        byte cc=11;
         byte bb = 120;
        short dd = (short)(cc+bb);  //byte,short,char 在运算时默认都上升为int类型,若不加强制转换符则会报错

运算符

  • 算数运算符:+,-,*,/,%,++,--

(特殊)字符串连接运算符: 两种用法

+  加法运算   数值 + 数值   包含 数值 + char 
+  字符串连接  字符串+字符串  / 数值+字符串
而  -  *  /  %  ++  -- 只能进行算数运算

 比较运算符: >,<,>=,<=,==,!=

注意 == !=    除了基本类型比较以外,还可以用作引用类型比较

例:

        String s = "abc";
        String s1 = "abc";
        System.out.println(s==s1);  //== !=  除了基本类型比较以外,还可以用作引用类型比较
        System.out.println(s!=s1);

  • 赋值运算符: =, +=, -= ,*=, /= ,%=,

    使用= 把右边的值赋给左边 注意数据类型是否满足左边所声明的数据类型

    当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理

     += , -= ,*=, /= ,%=,运算时会加(隐式的强制数据类型转换)

    例:

  short s = 3;       
 s = s+2;       //s  = short+int-->int  默认会先转换成int,所以此时报错  
 s += 2;        //short s = (short)(s+3 int)  += 中进行了一个隐式的强制数据类型转换System.out.println(s);

逻辑运算符(6个):● & —逻辑与 | —逻辑或 !—逻辑非

                                  ● && —短路与 || —短路或 ^ —逻辑异或

& 两边都是true 结果为true

| 两边都是false,结果为false

! 为true 结果false

^ 相同结果为false

&& 两边都是true 结果为true

|| 两边都是false,结果为false

& ,| ,! ,^ ,&& ,|| 逻辑运算要求 运算符左右两边都是布尔值

! ,& ,| ^,(不仅可以逻辑运算,还可以位运算) false && true||(逻辑运算 短路)

其中 '' ! ''在参与为运算时样子变成'' ~ '' 

“&”和“&&”的区别:

单&时,左边无论真假,右边都进行运算;

双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算

 “ |” 和 “||” 的区别同理,||表示:当左边为真,右边不参与运算。

例:

           int a = 10;
            int b = 5;
            int c = 7;
​
                  // & 当前面的表达式返回false  还会继续执行后面的表达式
        System.out.println(a<b & ++b<c);   //false & true  = false
        System.out.println(b);    //6   继续执行了++b
        
                 //&& 当前面的表达式返回false  发生短路 后面的表达式不会执行
        System.out.println((a<b) && (++b<c));   //false && true && true  = false
        System.out.println(b);    //5    发生短路所以++b并未执行
​
        // |   当前面有返回true, 还会继续执行后面的表达式
        // ||  当前面有返回true, 短路  不会执行后面的表达式
        所以逻辑运算时优先使用&& 和 || 有错误当即停止,不会再继续运算,提高了效率

  • 条件运算符 语法:

    (条件表达式)?表达式1  :表达式2

    条件表达式结果为true,运算后的结果是表达式1;为false,运算后的结果是表达式2;

    最终返回一个 与前面声明类型相同的数据

    例: int a = 10;

    int b = 5;

    int max = (a>b)?a:b;

    System.out.println(max);//10

  • 位运算符(了解) 位--->指的是二进制bit位 bit位运算 更底层

                 <<   左移
                 >>   右移
                 >>>  无符号右移
                 &   与
                 |   或
                 ^  异或
                 ~  非

    '' ~ ''实际就是 '' !'' 非

    例:

     int a = 4;
                /*
                  0000 0000 0000 0000 0000 0000 0000  0100   ---->4
                  0000 0000 0000 0000 0000 0000 0000  1000   ---->8
                 */
            System.out.println(a<<1);//8
              /*
                 0000 0000 0000 0000 0000 0000 0000  0100    ---->4
                 0000 0000 0000 0000 0000 0000 0000  0010    ---->2 有符号右移
                 0000 0000 0000 0000 0000 0000 0000  0010    ---->2 无符号右移
               */
            System.out.println(a>>1);//2  有符号右移
            System.out.println(a>>>1); //2 无符号右移,都是正数,所以没差别
    ​
            int b = -6;
            /*
               1111 1111 1111 1111 1111 1111 1111  1010 ---> -6
               1111 1111 1111 1111 1111 1111 1111  1101  ----> -3有符号右移 负数 移动后  符号不变
             */
            System.out.println(b>>1);//-3
            /*
               1111 1111 1111 1111 1111 1111 1111 1010  ----> -6
               0111 1111 1111 1111 1111 1111 1111 1101  ----> 2147483645    无符号右移  不管前面符号位是什么,移动后统一补0
             */
            System.out.println(b>>>1);//2147483645

    & 与 | 或 ^ 异或 ~ 非 进行位运算

    例:

             int a = 4;
             int b = 3;
    ​
                /*
                  0000 0100
                  0000 0011
                  0000 0000 结果为0    每一位bit位进行 与 运算
                 */
            System.out.println(a&b);
                /*
                  0000 0100
                  0000 0011
                  0000 0111  结果为7 每一位bit位进行  或 运算
                 */
            System.out.println(a|b);
    ​
             /*
                  0000 0100
                  0000 0011
                  0000 0111  结果为7  每一位bit位进行  异或 运算 口诀: 相同为假  不同为真
            */
            //System.out.println(a^b);
            
            // 若两个变量交换值  则可以使用^运算
                a = a^b;//0000 0111 结果a为 7
                b = a^b; // 7^3=4   结果b为4
                a = a^b; //7^4 = 3  结果a为3
            System.out.println(a);
            System.out.println(b);
           最终导致原本的两数值,进行了交换a变成了3,b变成了4
           若用a+b-a a+b-b 这样的方式来交换数值,可能会有a+b数值溢出这样的的问题,但^运算就不会有这种问题
            /*
                0000 0100
                1111 1011  结果为-4
             */
            System.out.println(~a);

    表达式的运算顺序

    控制台输入Scanner

    为什么需要控制台输入? 需要用户与程序实现交互式数据输入,但是我们的程序现在还没有操作界面(UI)

    所以java中前期 提供了一个类(Scanner类) ,通过此类,可以让用户在控制台中输入数据,并将数据读取到程序中.

    Scanner 是java中提供的 一个可以读取控制台输入的内容 交互式的向程序输入数据

    //导入java.util包下的Scanner类, 这样才可以使用

    import java.util.Scanner;

    类不能直接使用,使用类中的方法,需先声明变量并创建Scanner对象,调用构造方法(输入流)

     

    int a = s.nextInt(); //scanner对象会去进行数据(整数)读取功能,程序运行到此行时会阻塞.(程序一直运行,等待用户输入) 当用户输入完成后,按下回车键时结束输入

    String str = s.next();//输入一个字符串

    程序控制结构

    程序流程控制介绍

    在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。

    1) 顺序控制

    2) 分支控制

    3) 循环控制

    顺序控制

     

分支控制 if-else

分支控制 if-else 介绍 :让程序有选择的的执行,分支控制有三种

1) 单分支 if

2) 双分支 if-else

3) 多分支 if-else if -....-else

单分支

对特别说明的示例 
 if(true){
          System.out.println("true");
                }
                结果为true
    if(false)//此处省略了{},虽可以省略{ } 但是不建议,若省略,则默认代表{ }的控制范围只是单行语句
         System.out.println("true1"); //因此此行代码在if的控制范围中,但因为false所以不执行
         System.out.println("true2"); //而此行代码不再if的控制范围内,所以继续执行
         结果只有true2

双分支

 

多分支

 多分支的流程图(重要!)

//课堂练习
import java.util.Scanner;
public class If03 {
//编写一个 main 方法
public static void main(String[] args) {
    /*
    输入保国同志的芝麻信用分:
    如果:
    信用分为 100 分时,输出 信用极好;
    信用分为(80,99]时,输出 信用优秀;
    信用分为[60,80]时,输出 信用一般;
    其它情况 ,输出 信用 不及格
    请从键盘输入保国的芝麻信用分,并加以判断
    假定信用分数为 int
    */
Scanner myScanner = new Scanner(System.in);
	//接收用户输入
System.out.println("请输入信用分(1-100):");
	//请思考:如果小伙伴输入的不是整数,而是 hello.. //==>这里我们后面可以使用异常处理机制搞定-》老师点一下
int grade = myScanner.nextInt();
	//先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
if(grade >=1 && grade <= 100) {
	//因为有 4 种情况,所以使用多分支
	if(grade == 100) {
	System.out.println("信用极好");
  } else if (grade > 80 && grade <= 99) { //信用分为(80,99]时,输出 信用优秀;
    System.out.println("信用优秀");
  } else if (grade >= 60 && grade <= 80) {//信用分为[60,80]时,输出 信用一般
    System.out.println("信用一般");
  } else {//其它情况 ,输出 信用 不及格
    System.out.println("信用不及格");
    }
  } else {
	System.out.println("信用分需要在 1-100,请重新输入:)");
	}
  }
}

嵌套分支

5.5.1基本介绍 在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。老师建议: 不要超过 3 层 (可读性不好)

5.5.2基本语法

import java.util.Scanner;
public class NestedIf {
	//编写一个 main 方法
public static void main(String[] args) {
        /*
        参加歌手比赛,如果初赛成绩大于 8.0 进入决赛,
        否则提示淘汰。并且根据性别提示进入男子组决赛或女子组决赛。
        【可以让学员先练习下】, 输入成绩和性别,进行判断和输出信息。
        [NestedIf.java]
        提示: double score; char gender;
        接收字符: char gender = scanner.next().charAt(0)
        */
//思路分析
    //1. 创建 Scanner 对象,接收用户输入
    //2. 接收 成绩保存到 double score
    //3. 使用 if-else 判断 如果初赛成绩大于 8.0 进入决赛,否则提示淘汰
    //4. 如果进入到 决赛,再接收 char gender, 使用 if-else 输出信息
    //代码实现 => 思路 --> java 代码
		Scanner myScanner = new Scanner(System.in);
			System.out.println("请输入该歌手的成绩");
		double score = myScanner.nextDouble();
		if( score > 8.0 ) {
			System.out.println("请输入性别");
		char gender = myScanner.next().charAt(0);
		if( gender == '男' ) {
			System.out.println("进入男子组决赛");
		} else if(gender == '女') {
			System.out.println("进入女子组决赛");
		} else {
			System.out.println("你的性别有误,不能参加决赛~");
			}
		} else {
			System.out.println("sorry ,你被淘汰了~");
		}
	}
}

switch语句

多分支选择语句,根据表达式的值,来执行多个操作中的一个。

switch能够实现的功能, if语句都可以实现, 而if能实现的功能,switch不一定能实现

if(各种条件表达式)switch(表达式 变量) 表达式与case后面的值进行匹配

一般用于固定的选项选择 一周7天,一年12月

基本语法

switch(表达式){

case 1 常量1 : //当......

语句块1;// 不能重复

break; //结束语句

case 2 常量2 ;

语句块2;

break;

.....

case n 常量3 ;

break;

default:

default 语句块 (默认表达式);

break;

}

 流程图

switch注意事项和细节讨论

表达式可以是byte、short、int、char、枚举类型。JDK 7以后,可以使用String类 型;

switch 和 if 的比较

1) 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。

2) 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广

例题:

//对学生成绩大于 60 分的,输出"合格"。低于 60 分的,
//输出"不合格"。(注:输入的成绩不能大于 100), 提示 成绩/60
//思路分析
//1. 这道题,可以使用 分支来完成, 但是要求使用 switch
//2. 这里我们需要进行一个转换, 编程思路 :
// 如果成绩在 [60,100] , (int)(成绩/60) = 1
// 如果成绩在 [0,60) , (int)(成绩/60) = 0
//代码实现
double score = 1.1;
//使用 if-else 保证输入的成绩有有效的 0-100
//看了当老师的分析和代码演示后,自己一定要独立完成
if( score >= 0 && score <= 100) {
switch ((int)(score / 60)) {
case 0 :
System.out.println("不合格");
break;
case 1 :
System.out.println("合格");
break;
// default :
// System.out.println("输入有误");
}
} else {
System.out.println("输入的成绩在 0-100");
}

例:穿透现象的例题

//根据用于指定月份,
//打印该月份所属的季节。
//3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
//[课堂练习, 提示 使用穿透 ]
//
//思路分析
//1. 创建 Scanner 对象, 接收用户输入
//2. 使用 int month 接收
//3. 使用 switch 来匹配 ,使用穿透来完成,比较简洁
Scanner myScanner = new Scanner(System.in);
System.out.println("输入月份");
int month = myScanner.nextInt();
     switch(month) {
        case 3:
        case 4:
        case 5:
            System.out.println("这是春季");
            break;
        case 6:
        case 7:
        case 8:
            System.out.println("这是夏季");
            break;
        case 9:
        case 10:
        case 11:
            System.out.println("这是秋季");
            break;
        case 1:
        case 2:
        case 12:
            System.out.println("这是冬季");
            break;
		default :
			System.out.println("你输入的月份不对(1-12)");
		}
	}
}

循环语句

循环语句功能

在某些条件满足的情况下,反复执行特定代码的功能

For循环

基本语法

\1. for 关键字,表示循环控制

\2. for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代

\3. 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码

\4. 如果 循环操作(语句) 只有一条语句,可以省略 {}

注意事项和细节说明

1) 循环条件是返回一个布尔值的表达式

2) for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。

3) 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代 语句,中间用逗号隔开。

for 循环练习题

1) 打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和.[化繁为简,先死后活]
public class ForExercise {
//编写一个 main 方法
public static void main(String[] args) {
//打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和.[化繁为简,先死后活]
//两个编程思想(技巧)
//1. 化繁为简 : 即将复杂的需求,拆解成简单的需求,逐步完成 编程 = 思想 --练习-> 代码
//2. 先死后活 : 先考虑固定的值,然后转成可以灵活变化的值
//
//思路分析
//打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和

//化繁为简

//(1) 完成 输出 1-100 的值
//(2) 在输出的过程中,进行过滤,只输出 9 的倍数 i % 9 ==0
//(3) 统计个数 定义一个变量 int count = 0; 当 条件满足时 count++;
//(4) 总和 , 定义一个变量 int sum = 0; 当条件满足时累积 sum += i;

//先死后活

//(1) 为了适应更好的需求,把范围的开始的值和结束的值,做出变量
//(2) 还可以更进一步 9 倍数也做成变量 int t = 9;
int count = 0; //统计 9 的倍数个数 变量
int sum = 0; //总和
int start = 10;
int end = 200;
int t = 5; // 倍数
for(int i = start; i <= end; i++) {
        if( i % t == 0) {
      System.out.println("i=" + i);
        count++;
        sum += i;//累积
       }
     }
        System.out.println("count=" + count);
        System.out.println("sum=" + sum);
	}
}

while循环

基本语法

 while 循环执行流程分析

注意事项和细节说明

1) 循环条件是返回一个布尔值的表达式

2) while 循环是先判断再执行语句

例题:
public class WhileExercise {
//编写一个 main 方法
public static void main(String[] args) {
// 打印 1—100 之间所有能被 3 整除的数 [使用 while, 老师评讲 ]
// 化繁为简, 先死后活
        int i = 1;
        int endNum = 100;
        while( i <= endNum) {
        if( i % 3 == 0) {
        	System.out.println("i=" + i);
        }
i++;//变量自增

// 打印 40—200 之间所有的偶数 [使用 while, 课后练习]
// 化繁为简, 先死后活(利于思考)
//
		System.out.println("========");
      int j = 40; //变量初始化
        while ( j <= 200) {
        //判断
        if( j % 2 == 0) {
          System.out.println("j=" + j);
           }
        j++;//循环变量的迭代
      }
    }
  }

do..while 循环控制

基本语法

循环变量初始化;

do{

循环体(语句);

循环变量迭代

}while(循环条件);

\1. do while 是关键字

\1. 也有循环四要素, 只是位置不一样

\2. 先执行,再判断,也就是说,一定会至少执行一次

\3. 最后 有一个 分号 ;

\4. while 和 do..while 区别举例: 要账

do...while 循环执行流程分析

注意事项和细节说明

1) 循环条件是返回一个布尔值的表达式

2) do..while 循环是先执行,再判断, 因此它至少执行一次

public class DoWhileExercise01 {
//编写一个 main 方法
public static void main(String[] args) {
//统计 1---200 之间能被 5 整除但不能被 3 整除的 个数
//化繁为简
//(1) 使用 do-while 输出 1-200
//(2) 过滤 能被 5 整除但不能被 3 整除的数 %
//(3) 统计满足条件的个数 int count = 0;
//先死后活
//(1) 范围的值 1-200 你可以做出变量
//(2) 能被 5 整除但不能被 3 整除的 , 5 和 3 可以改成变量
        int i = 1;
        int count = 0; //统计满足条件的个数
        do {
       		 if( i % 5 == 0 && i % 3 != 0 ) {
        	System.out.println("i=" + i);
       		 count++;
        	}
			i++;
		}while(i <= 200);
		System.out.println("count=" + count);
	}
}

例题:要帐还钱

//编写一个 main 方法
public static void main(String[] args) {
//如果李三不还钱,则老韩将一直使出五连鞭,直到李三说还钱为
//[System.out.println("老韩问:还钱吗?y/n")] do...while .. //
//化繁为简
//(1) 不停的问还钱吗?
//(2) 使用 char answer 接收回答, 定义一个 Scanner 对象
//(3) 在 do-while 的 while 判断如果是 y 就不在循环
//一定自己动脑筋.. Scanner myScanner = new Scanner(System.in);
        char answer = ' ';
        do {
            System.out.println("老韩使出五连鞭~");
            System.out.println("老韩问:还钱吗?y/n");
            answer = myScanner.next().charAt(0);
            System.out.println("他的回答是" + answer);
        }while(answer != 'y');//判断条件很关键
        	System.out.println("李三还钱了");
      }
  }

多重循环控制(难点! 重点!)

  • 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环和内层循环。

  • 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层当次循环,开始下一次的循环。

  • 设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。

例如:

public static void main(String[] args) {
for (int i = 1; i <=4 ; i++) {//外层循环控制行数   4行
      for (int j =1; j <=4; j++) {//内层循环控制每行元素的数量   每行有4个元素                 System.out.print("j="+j);
     }
     System.out.println("i="+i);// println--->   与print相比除了打印还有换行的作用
   }
 }

结果:j=1j=2j=3j=4i=1 j=1j=2j=3j=4i=2 j=1j=2j=3j=4i=3 j=1j=2j=3j=4i=4

例题:经典的打印金字塔

使用 for 循环完成下面的案例

请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。

public class Stars {
//编写一个 main 方法
public static void main(String[] args) {
/*
    *
   * *
  *   *
 *     *
*********

思路分析
化繁为简
1. 先打印一个矩形
*****
*****
*****
*****
*****
2. 打印半个金字塔
* //第 1 层 有 1 个*
** //第 2 层 有 2 个*
*** //第 3 层 有 3 个*
**** //第 4 层 有 4 个*
***** //第 5 层 有 5 个*
3. 打印整个金字塔
	* //第 1 层 有 1 个* 2 * 1 -1 有 4=(总层数-1)个空格
   *** //第 2 层 有 3 个* 2 * 2 -1 有 3=(总层数-2)个空格
  ***** //第 3 层 有 5 个* 2 * 3 -1 有 2=(总层数-3)个空格
 ******* //第 4 层 有 7 个* 2 * 4 -1 有 1=(总层数-4)个空格
********* //第 5 层 有 9 个* 2 * 5 -1 有 0=(总层数-5)个空格
4. 打印空心的金字塔 [最难的]
    * //第 1 层 有 1 个* 当前行的第一个位置是*,最后一个位置也是*
   * * //第 2 层 有 2 个* 当前行的第一个位置是*,最后一个位置也是*
  *   * //第 3 层 有 2 个* 当前行的第一个位置是*,最后一个位置也是*
 *     * //第 4 层 有 2 个* 当前行的第一个位置是*,最后一个位置也是*
********* //第 5 层 有 9 个* 全部输出*
先死后活
5 层数做成变量 int totalLevel = 5;
//小伙伴 技术到位,就可以很快的把代码写出
*/
	int totalLevel = 20; //层数
	for(int i = 1; i <= totalLevel; i++) { //i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
	for(int k = 1; k <= totalLevel - i; k++ ) {
		System.out.print(" ");
	}
	//控制打印每层的*个数
	for(int j = 1;j <= 2 * i - 1;j++) {
	//当前行的第一个位置是*,最后一个位置也是*, 最后一层全部 *
	if(j == 1 || j == 2 * i - 1 || i == totalLevel) {
			System.out.print("*");
		} else { //其他情况输出空格
			System.out.print(" ");
    	}
    }
   		 //每打印完一层的*后,就换行 println 本身会换行
			System.out.println("");
		}
	}
}

经典例题:

import java.util.Scanner;
public class MulForExercise01 {
//编写一个 main 方法
public static void main(String[] args) {
//统计 3 个班成绩情况,每个班有 5 名同学,
//求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
//统计三个班及格人数,每个班有 5 名同学。
//
//思路分析:
//化繁为简
//(1) 先计算一个班 , 5 个学生的成绩和平均分 , 使用 for
//1.1 创建 Scanner 对象然后,接收用户输入
//1.2 得到该班级的平均分 , 定义一个 doubel sum 把该班级 5 个学生的成绩累积
//(2) 统计 3 个班(每个班 5 个学生) 平均分
//(3) 所有班级的平均分
//3.1 定义一个变量,double totalScore 累积所有学生的成绩
//3.2 当多重循环结束后,totalScore / (3 * 5)
//(4) 统计三个班及格人数
//4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
//4.2 如果 >= 60 passNum++
//(5) 可以优化[效率,可读性, 结构]
//创建 Scanner 对象
        Scanner myScanner = new Scanner(System.in);
        double totalScore = 0; //累积所有学生的成绩
        int passNum = 0;//累积 及格人数
        int classNum = 3; //班级个数
        int stuNum = 5;//学生个数
        for( int i = 1; i <= classNum; i++) {//i 表示班级
        		double sum = 0; //一个班级的总分
        	for( int j = 1; j <= stuNum; j++) {//j 表示学生
       		 	System.out.println("请数第"+i+"个班的第"+j+"个学生的成绩");
        		double score = myScanner.nextDouble();
        //当有一个学生成绩>=60, passNum++
        	if(score >= 60) {
        	passNum++;
        }
       	 sum += score; //累积
        	System.out.println("成绩为" + score);
        }
        //因为 sum 是 5 个学生的总成绩
        	System.out.println("sum=" + sum + " 平均分=" + (sum / stuNum));
        //把 sum 累积到 totalScore
        	totalScore += sum;
        }
        System.out.println("三个班总分="+ totalScore
        + " 平均分=" + totalScore / (classNum*stuNum));
        System.out.println("及格人数=" + passNum);
	}
}

break & continue

break基本介绍:

break 语句用于终止某个语句块的执行。用在 循环语句体中,可以强行退出循环;

 快速入门:

 注意事项和细节说明:

 例如:

public static void main(String[] args) {    
//break 终止整个循环.  continue 跳过 continue语句后面的循环内容, 继续执行下一次循环    
      for (int i = 0; i < 10; i++) {
           if(i==5){
               // break;
              continue;
              }
         System.out.print(i);
   }
}

结果:若是break 则是 0 1 2 3 4 若是continue,则是012346789,,跳过了5

例如:

public static void main(String[]args) {
//先写循环标签(名字自定义)
outloop:for (int i = 1; i <=4 ; i++) {//外层循环控制行数
        for (int j =1; j <=4; j++) {//内层循环控制元素的数量
        if(j==3){
        break outloop;  //break加循环标签名,在多层循环嵌套中,在内层循环中,想把整个的循环结束掉
        }
        System.out.prit("j="+j);
      }
       System.out.println("i="+i);//换行
    }
  }

结果:j=1 j=2 为什么没有i=1,是因为使用break outloop 使得在内层循环中整个循环直接被中止,而不是外层的当次循环结束,所以不会执行外层循环的语句

continue基本介绍:

continue 语句用在循环语句体中,用于终止某次循环过程,跳过循环体中 continue 语句下面未执行的循环,开始下一次循环过程

continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的使用的规则一样.

while 使用 continue 为例,画出示意图

 快速入门案例

方法与return语句

•Java的方法类似于其它语言的函数,方法是解决一类问题的步骤的有序组合,方法包含于类或对象中.

• 方法在程序中被创建,声明格式: [访问权限修饰符 修饰符…] [返回值类型] 方法名(形式参数类型 参数名){ Java语句;… … … [return 返回值;]  }修饰符:这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

• 形式参数: 在方法被调用时用于接收外界输入的数据。 • 实参:调用方法时实际传给方法的数据。 • 返回值:方法在执行完毕后返还给调用它的环境的数据。 • 返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回值类型void。

• Java语言中使用下述形式调用方法:对象名.方法名(实参列表) • 实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配, • return 语句终止方法的运行并指定要返回的数据

public class Demo2 {
           /*     
             类的基本构成:
               变量      
               方法(函数)  做什么  行为   主方法中调用即可  重复使用      
                     
               面向对象的语言-->方法   
             */    
             int age;//属性  变量  存储数据  
             
    
     //主函数:  
          public static void main(String[] args) {
               int a = 10;   
               int b = 5;    
              //调用show方法    
              Demo2.show();    ※※  因为是static,所以不用新创建对象就能调用方法,直接用类名!!!
             
             int m =  Demo2.max(a,b);                     
              System.out.println(m);    //打印输出传过来的参数中的最大值
              
              Demo2.max1();
          }   
        
        
          //自定义的方法 ----->自定义了一个名为show的无参成员方法  
          //public 访问权限修饰符 公共的   void 表示方法没有返回值 show方法名  ()参数列表   
          // static 类方法 静态的 有static修饰则此时可通过类名调用 
        public static void show(){    
          System.out.println("showshow");  
       }  
       /*    
       定义了一个有参数,有返回值的方法  
       注意参数以及返回值的数据类型   
       */  
 
/*return语句

return语句用于从当前执行的方法中退出, 返回到调用该方法的语句处继续
执行。
有两种格式:
return 表达式; //将表达式的值返回
return; //不返回任何值,当方法说明中用void声明无返回值时, 可以使用
这种格式,此类return语句有时可省略
*/
 
 public static int max(int m,int n){     
             int max = (m>n)?m:n;//判断返回两个整数中大的那一个     
                return max;//通过return 关键字  返回结果  
        }  
      
        public static void max1(){    
              int max = 10;     
               if(max==11){      
                  return;//  在void方法中,起 "终止方法" 的这个作用(并不是终止整个循环) , 但return后面不能加任何表达式 ,否则会与void冲突,会报错  
      }    
     System.out.println("max"+max); 
     
   }
}     
结果是:
     showshow
     10
     max10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值