零、 复习昨日
一、循环
二、流程控制关键词
- 环境(jdk,idea,typora等等,HelloWorld程序)
- 基本语句(变量,数据类型,类型转换)
- 运算(赋值,算术,关系,逻辑,三目)
- 流程控制(if,if-else,elseif,switch,while)
作用域: 变量的使用范围!
变量所在的作用域到底是什么范围? 离它最近的{}内
变量声明的要求: 在同一作用域内不能重复定义(声明)
练习
模拟超市付款: 假设已经买好东西
提示用户可以有4种付款方式
不同的付款方式有不同的折扣: 先展示四种付款方式
现金 没有折扣
微信 0.95折
支付宝 鼓励金付款金额的10% 鼓励金可以直接折算到付款金额中
刷卡 满100减20(就减一次)
package com.qf;
import java.util.Scanner;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc 变量的作用域(范围)问题
* 变量所在的作用域到底是什么**范围**? **离它最近的{}内**
*/
public class Demo1 {
public static void main(String[] args) {
int a = 1;
if (a > 0){
int b = 1;
System.out.println("这是if里面的b = " + b );
}
int b = 2;
System.out.println("这是if后面的b = " + b );
System.out.println("--------------------------" );
System.out.println("--- 超市结算系统 ---" );
double money = 1000;
System.out.println("提示: 已购物商品总金额: " +money + "元" );
System.out.println("现有以下4种付款方式可选:" );
System.out.println("1. 现金 没有折扣" );
System.out.println("2. 微信 0.95折" );
System.out.println("3. 支付宝 鼓励金付款金额的10% 鼓励金可以直接折算到付款金额中" );
System.out.println("4. 刷卡 满100减20(就减一次)" );
System.out.print("请选择付款方式: " );
Scanner scanner = new Scanner(System.in);
int type = scanner.nextInt( );
if (type == 1) {
System.out.println("选择现金支付,没有折扣");
} else if (type == 2) {
System.out.println("选择微信支付,95折" );
money *= 0.95;
} else if (type == 3) {
System.out.println("选择支付宝支付,9折");
money *= 0.9;
} else if (type == 4){
System.out.println("选择刷卡支付,满100减20" );
if (money >= 100){
money -= 20;
}
} else {
System.out.println("输入选项有误!" );
}
System.out.println("最终消费:" + money );
}
}
循环: 让某段代码重复执行,达到某个条件可以退出不再循环。
循环语句:
- while ("当"型循环)
- do-while ("直到"型循环)
- for
循环四要素:
- 初始值
- 控制条件
- 循环体
- 迭代
语法
do {
执行语句;
}while(条件);
// 利用do-while 输出1-10
int i = 1; // 初始值
do {
System.out.println(i ); // 循环体
i++; // 迭代
}while(i < 11); // 条件
执行顺序
- 代码从上至下依次执行,遇到do,直接执行{}内内容
- 然后再判断 while 条件,如果条件为true,继续回头再执行do内内容
- 直到 while后条件为false,跳过循环
do-while (先斩后奏)
do-while和while区别
- while循环先判断后执行
- do-while先执行后判断
- 即使条件不成立,do-while也至少会执行一次
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc
*/
public class Demo3 {
public static void main(String[] args) {
// 利用do-while 输出1-10
int i = 1; // 初始值
do {
System.out.println(i ); // 循环体
i++; // 迭代
}while(i < 0); // 条件
System.out.println("------------" );
int x = 1;
while (x < 0) {
System.out.println(x );
x++;
}
System.out.println("------------" );
// 利用do-while循环,输出1-100的奇数和
int a = 1;
int sum = 0; // 总和
int oddSum = 0;// 奇数和
int evenSum = 0;// 偶数和
do {
sum += a;
if (a % 2 == 0) {
evenSum += a;
} else {
oddSum += a;
}
a++;
}while(a < 101);
System.out.println("1-100的和sum = "+sum );
System.out.println("1-100的奇数和oddSum = "+oddSum );
System.out.println("1-100的偶数evenSum = "+evenSum );
}
}
for循环
for(初始值;条件;迭代){
执行语句;
}
执行顺序 (小红旗)
演示
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc for循环
*/
public class Demo4 {
public static void main(String[] args) {
// 使用for循环,输出10-20
for (int i = 10 ; i < 21; i++) {
System.out.println(i );
}
// 输出公元0-3000年中所有闰年
// 闰年: (年份能被4整除,且不能被100整除),或者能被400整除的年份
// 要求:横向打印,每5个年份,换一行输出
// 思路:1) 输出0-3000,2)找闰年 3) 横向打印 4) 每5个换行
int count = 0; // 计数
for (int i = 0;i <= 3000;i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
count++;
System.out.print(i + "\t");
if (count % 5 == 0) {
System.out.println( );
}
}
}
System.out.println( );
// 求出所有水仙花数
// 水仙花数:是一个三位数,每个位拆出来的立方相加等于本身
// 153 = 1^3 + 5^3 + 3^3
for (int i = 100;i < 1000;i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
System.out.println(i );
}
}
}
}
for循环的初始值写法
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc for循环的特殊写法
*/
public class Demo5 {
public static void main(String[] args) {
// 特殊1:将声明抽取到外面
int i;
for(i = 1;i < 11;i++){
System.out.println(i );
}
// 特殊2: 声明赋值都放外面
int j = 1;
for (;j < 11;j++){
System.out.println(j );
}
// 特殊3: for循环的死循环,中间位置不写
for (int k = 1;;k++){
System.out.println("死循环"+k );
}
// 死循环代码下方不能写代码,因为编译认为下方代码无法执行
// 死循环
// 第一个位置不写,没有初始值,第三个位置不写,没有迭代
// for(;;){
//
// }
}
}
双层循环的执行顺序
- 当外层循环执行一次,内存循环要循环完
- 以上图为例,当i=1时,内层循环的j要循环13次
- 当i=2时,内层循环j从1开始再来13次…
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc 双层for循环
*/
public class Demo6 {
public static void main(String[] args) {
// 打印图形,以*为例,每次只能输出一个*
// 打印一个正方形
// 外层循环控制行数
for (int i = 1; i < 7; i++) {
// 内层循环控制列数
for (int j = 1; j < 15; j++) {
System.out.print("*" );
}
System.out.println( );
}
/**
* 打印三角形
* *
* **
* ***
* ****
* *****
* ******
*/
for (int i = 1; i < 7; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*" );
}
System.out.println( );
}
/**
* ******
* *****
* ****
* ***
* **
* *
*/
for (int i = 1; i < 7; i++) {
for (int j = 6; j >= i; j--) {
System.out.print("*" );
}
System.out.println( );
}
/**
* 作业1 乘法口诀表
* 作业2
* *
* ***
* *****
* *******
*/
}
}
在流程控制语句中使用的关键词
- break (熟悉)
- continue (了解)
break 单词释义: 打断,破坏,中断
作用:
- 放在switch中 中断选择语句
- 放在循环(while,do-while,for)中使用,中断循环
演示
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc break关键词
*/
public class Demo7 {
// 在switch中使用,不再 演示
public static void main(String[] args) {
// 演示在循环中使用
for (int i = 1; i < 11; i++) {
System.out.println(i );
if (i == 5){
break; // 结束循环
}
}
System.out.println("----------" );
for (int i = 1; i < 10; i++) {
System.out.println("i = " + i );
for (int j = 1; j < 10; j++) {
System.out.println("j = " + j );
if (j == 5){
break;// break 中断当前这一层循环
}
}
}
System.out.println("----------" );
// a就是锚点,break+锚点,可以跳出到指定循环外(了解)
a:for (int i = 1; i < 10; i++) {
System.out.println("i = " + i );
for (int j = 1; j < 10; j++) {
System.out.println("j = " + j );
if (j == 5){
break a;
}
}
}
System.out.println("后续....." );
}
}
练习
package com.qf;
import java.util.Scanner;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc
*/
public class Demo9_break {
public static void main(String[] args) {
// ATM机账户,登录
// 假设666
// 最多允许输错5次
// 在5次内有一次正确,就可以登录成功,程序结束
// 如果输错,要给出提示语
// --- 站在用户调度考虑问题,设计程序 ---
Scanner scanner = new Scanner(System.in);
System.out.println("--- 欢迎使用千锋ATM机 ---" );
for (int i = 1; i <= 5; i++) {
System.out.println("请输入密码: " );
int pwd = scanner.nextInt( );
if (pwd == 666) {
System.out.println("欢迎登录!" );
break;
} else {
if (i < 5){
System.out.println("密码错误,请重新输入,还有"+(5-i)+"次" );
} else {
System.out.println("今日错误已达上限!明日再试或者联系管理员!" );
}
}
}
}
}
练习
package com.qf;
import java.util.Random;
import java.util.Scanner;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc 数字猜大小游戏
*/
public class Demo10_break {
public static void main(String[] args) {
/**
* 随机产生一个1-100的整数,用户输入数字猜大小
* 每次输入后,给出提示"大了" 或者 "小了"
* 直到猜对,程序结束
* 最后 给出总共猜多少次!
*/
// 这两行产生1-100随机数
Random random = new Random( );
int r = random.nextInt(100)+1;
// System.out.println(r );
Scanner scanner = new Scanner(System.in);
int count = 0;
while (true){
count++;
System.out.print("请输入数字:" );
int num = scanner.nextInt( );
if (num == r){
System.out.println("恭喜你,猜到啦! 啥奖品没有~~~" );
break;
} else {
if (num > r) {
System.out.println("猜大啦,继续努力..." );
} else {
System.out.println("猜小啦,继续努力..." );
}
}
}
System.out.println("总共猜了"+count+"次");
}
}
continue 继续
- 位置: 只能用在循环中
- 作用: 中断本次循环,继续下次循环
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc
*/
public class Demo11 {
public static void main(String[] args) {
for (int i = 1; i < 11; i++) {
if (i == 6){
continue;// 中断这一次循环,继续下次循环
}
System.out.println(i );
}
// 逢7过,(逢 7 不输出)
for (int i = 1; i < 101; i++) {
if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
continue;
}
System.out.println(i );
}
}
}
特别说明: 流程控制语句的关键词是只有 break和continue,在这里讲return,有个功能和前2个比较像: 都可以改变程序的执行.
位置: 在方法内都可以写(if,switch,循环等内都可以)
作用: return,单词释义:返回,
无论在if,switch,循环中遇到return,该方法后面代码不再执行.如果方法是main主方法,那么程序结束.
package com.qf;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc return
*/
public class Demo12_return {
// main主方法是唯一入口
public static void main(String[] args) {
// if (1 > 0) {
// return;// 遇到return,方法返回,后续代码不执行
// }
// for (int i = 1; i < 11; i++) {
// System.out.println(i );
// if (i == 5) {
// return; // 循环结束,且当前方法也结束,后续不执行
// }
// }
for (int i = 1; i < 11; i++) {
System.out.println("i = " + i );
for (int j = 1; j < 11; j++) {
System.out.println("j = " + j );
if (j == 5){
return; // 双层循环也会停下,后面代码不再执行
}
}
}
System.out.println("后续");// 前面有return,这个语句不再执行!
}
}
package com.qf;
import java.util.Scanner;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/22
* @desc
*/
public class Demo13_banzhuan {
public static void main(String[] args) {
// 36 块砖,36 人搬,
// 男搬4,女搬3,两个小孩抬1 砖,
// 要求一次全搬完,问男、女和小孩各若干?
int m = 0;// man 男生个数
int w = 0;// women 女生个数
int c = 0;// child 小孩个数
for (m = 1; m <= 36; m++) {
for (w = 1; w <= 36; w++) {
for (c = 1; c <= 36; c++) {
// 小孩一定是2的倍数
// 人数相加是36个人
// 砖数相加是36块砖
if (c % 2 == 0 && m + w + c == 36 && 4 * m + 3 * w + c / 2 == 36) {
System.out.println("男生:" + m);
System.out.println("女生:" + w);
System.out.println("小孩:" + c);
}
}
}
}
// 键盘输入一个数,输出该数是几位数?
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数字: " );
int num = scanner.nextInt( );
/**
* 54321
* 54321 / 10 = 5432 (1次)
* 5432 / 10 = 543 (2次)
* 543 / 10 = 54 (3次)
* 54 / 10 = 5 (4次)
* 5 / 10 = 0 (5次)
*/
int count = 0;
while (num != 0){
num /= 10;
count++;
}
System.out.println(count+"位数" );
}
}
count 计数
loop 循环
outside 在。。。之外
statement 语句/声明
unreachable 执行不到的