Java_流程控制
第一节:多条件分支
1.1. Ifelse结构
双分支结构
多分支
package ifDemo;
public class Test2 {
public static void main(String[] args) {
/*给定任意整数
如果是3的倍数 输出乒
如果是5的倍数 输出乓
如果是3和5的倍数 输出乒乓
如果都不是 输入该数字本身
if(条件1){
分支1
}else if(条件2){
分支2
}else if(条件3){
分支3
}......
else{
}
从上向下按个检查条件是否成立
如果其中的某一个条件成立了 则执行对应的分支代码 其余条件则不再判断了
如果所有条件都不成立 那么会自动执行else 中的代码
*/
int i = 10;
if(i%15==0){
System.out.println("乒乓");
}else if(i%3==0){
System.out.println("乒");
}else if(i%5==0){
System.out.println("乓");
}else{
System.out.println(i);
}
}
}
给定月份 输入该月份所在的季节以及该季节的主要活动
使用细节问题
给定月份和年份 输入当月的天数
从键盘录入信息
package ifDemo;
/*笔的路径
* 导入Scanner 导包
* */
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
/*借笔
* 创建一个扫描仪对象
* */
Scanner sc =new Scanner(System.in);
/*
* 使用笔写字
* 从键盘录入信息
* */
/*从键盘接受一个整数*/
System.out.println("请录入一个整数");
int b =sc.nextInt();
System.out.println("您输入的是:"+b);
/*从键盘接受一个浮点数*/
System.out.println("请录入一个小数");
double d =sc.nextDouble();
System.out.println("您输入的是:"+d);
/*从键盘接受文字*/
System.out.println("请输入其他内容");
String s =sc.next();
System.out.println("您输入的是:"+s);
/*释放资源
关闭扫描仪
*/
sc.close();
}
}
1.2. Switchcase结构
package switchDemo;
public class Test1 {
public static void main(String[] args) {
/*
* switch case
* switch(变量 非Boolean){
* case 变量可能出现的值:
* }
* 开关语句
* */
/*给定月份 输出季节*/
int month = 3;
switch(month){
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
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;
default:
System.out.println("月份有误");
break;
}
}
}
用switch语句完成 输入年份和月份输出天数
package switchDemo;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入年份");
int year =sc.nextInt();
System.out.println("请输入月份");
int month =sc.nextInt();
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(year+"年"+month+"月有31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(year+"年"+month+"月有30天");
break;
case 2:
if(year %4 ==0){
System.out.println(year+"年"+month+"月有29天");
}else{
System.out.println(year+"年"+month+"月有28天");
}
break;
default:
System.out.println("月份有误");
}
sc.close();
}
}
注意事项
输入学生分数 根据分数输出学生分数等级
<60 不及格
>=60 <70 及格
>=70 <80 一般
>=80 <90 良好
>=90 优秀
If语句完成(略)
switch语句完成
package switchDemo;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请录入分数");
int score =sc.nextInt();
int grade =score/10;//
/*判断分数等级*/
switch (grade){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不及格");
break;
case 6:
System.out.println("及格");
break;
case 7:
System.out.println("一般");
break;
case 8:
System.out.println("良好");
break;
case 9:
case 10:
System.out.println("优秀");
break;
default:
System.out.println("分数有误");
}
sc.close();
}
}
第二节:循环结构
让计算机反复执行相同的代码
2.1. while循环
语法
While(条件){
循环体
}
先判断条件是否成立 如果成立 那么执行循环体
执行完循环体 再次判断条件是否成立 如果成立 继续执行循环体
直到条件不成立 循环结束
输出1-100
输出1-100 以内所有的偶数
写法1
写法2
输出1-100所有 奇数的和
输出1-100内所有5 的倍数 三个一行
从键盘录入任意的整数 倒叙输出
从键盘录入一个数字 判断一个数是不是水仙花数
147 >>>>> 1*1*1 + 4*4*4 + 7*7*7 == 147
输出100-1000所有的水仙花数
从键盘输入学生考试的科目数和学生的每科分数 输出 总分 最高分 最低分 平均分
package whileDemo;
import java.util.Scanner;
public class Test8 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入考试科目数");
int num=sc.nextInt();// 5
int i =1;
/*用于统计总分*/
int sum =0;
/*用于统计最大值*/
int max=0;
/*用于统计最小值*/
int min =100;
while(i<=num){
System.out.println("请录入第"+i+"科的分数");
int score=sc.nextInt();
sum+=score;
/*判断最大值*/
if(max<score){
max=score;
}
/*判断最小值*/
if(min>score){
min=score;
}
i++;
}
System.out.println("总分为:"+sum);
System.out.println("平均为:"+(sum*1.0/num));
System.out.println("最高分:"+max);
System.out.println("最低分:"+min);
}
}
从键盘录入一个数字 判断一个数是不是素数
3 5 7 11 13 17 19 只能被自己本身和1整除的数字
输出1-100所有的素数
生成随机数
如何在程序中生成指定范围的随机数
23-59 之间的随机数
模拟回合制打怪游戏
玩家 血值315
怪物 血值500
玩家和怪物互砍
玩家每次攻击怪物产生5-8点伤害
怪物每次攻击玩家产生3-5点伤害
采用回合制 一方挂掉 游戏结束
用程序模拟战斗过程
Int w =315;
Int g =500;
While(玩家和怪物都活着){
生成玩家攻击力 5
怪物血值要对应减少
输出 玩家攻击怪物 怪物掉了*点血 还剩*点血
生成怪物的攻击力
玩家的血值要对应减少
输出 怪物攻击玩家 玩家掉了*点血 还剩*点血
}
Sout 游戏结束
package demo1;
public class Test2 {
public static void main(String[] args) {
int w=315;
int g =500;
//回合计数变量
int h =1;
while (true) {
System.out.println("------------------第"+h+"回合--------------------");
h++;
// 玩家攻击力
int wg =(int)(Math.random()*4)+5;
// 减少怪物血值
g-=wg;
// 输出结果
System.out.println("玩家攻击怪物,怪物掉了"+wg+"点血,还剩"+g+"点血");
// 判断怪物是否已经挂掉
if(g<=0){
// 让循环停止 输出结果
System.out.println("怪物挂掉,玩家胜利");
break;// 停止循环继续执行
}
// 怪物攻击力
int gg =(int)(Math.random()*3)+3;
// 减少玩家血值
w-=gg;
// 输出
System.out.println("怪物攻击玩家,玩家掉了"+gg+"点血,还剩"+w+"点血");
// 判断玩家是否已经挂掉
if(w<=0){
// 让循环停止 输出结果
System.out.println("玩家挂掉,怪物胜利");
break;// 停止循环继续执行
}
}
}
}
循环的嵌套执行
一百担粮食 用一百匹马一次运走
大马 一次驼 4担粮食
中型马 一次驼 2担粮食
小型马 两匹驼1担粮食
问 三种马各有多少匹
穷举法
算法优化 以及的优劣的评价
算法: 计算机解题的过程
如何评价算法的好坏呢?
1. 从运算次数角度考虑 同样的问题 运算的次数越少越好
2. 运算规模的增加势必会造成计算机运算次数的增加
3. 算法的好坏其实看的是当数据规模产生变化时 运算次数的变化趋势
2.2. dowhile循环(了解)
package demo1;
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
// 先判断条件是否成立 如果成立 再执行循环体
/*int i =0;
while(i<=10){
System.out.println(i);
i++;
}*/
/*do while 基本不用
先执行循环体
然后再判断条件是否成立
如果成立 继续执行循环体
无论条件是否成立 循环体至少会执行一次
* */
/* int i =100;
do{
System.out.println(i);
i++;
}while(i<=10);*/
/*从键盘录入任意整数 倒叙输出*/
Scanner sc=new Scanner(System.in);
System.out.println("请录入任意整数");
int num =sc.nextInt();
do{
//先输出最后一位
System.out.print(num%10);
//再让把最后一位干掉
num/=10;
}while(num!=0);
sc.close();
}
}
2.3. for循环
引入
public static void main(String[] args) {
/*
* 语法特点
* 初始值 循环条件 迭代都可以放在小括号中
* 初始值 循环条件 迭代也都可以不放在小括号中
* 如果初始值放在for循环之外 那么 初始值的使用范围比较大 在for循环之后任然可以使用
* 如果初始值放在for循环之内 那么 初始值的使用范围比较小 在当前for循环之内可以用
* 迭代如果放在for循环的循环体中 可以由我们自己决定什么时候执行迭代
* 迭代如果放在for循环的小括号中 那么意味着迭代是在循环体的最后一行
*
* for循环书写的次数多一些
* 因为for循环可以控制初始变量为内部的局部变量 索引它更符合高内聚 低耦合的程序设计原则
* 高内聚 程序的模块内部连接可以特别紧密
* 低耦合 程序的模块和模块之间的关联越简单越好
* */
for(int i=1;i<=10;i++) {
System.out.println(i);
}
int i=0;
System.out.println(i);
}
直角三角形
平行四边形
等腰三角形
等腰梯形
求阶乘问题
从键盘录入任意整数 输出该整数的阶乘
5 >>> 5*4*3*2*1
10 >>> 10*9*8*7*6*5*4*3*2*1
求a的b次方问题
从键盘录入两个整数,a b
棋盘上得麦粒问题
象棋 16 格
第一格子 一个麦粒 以后的每个格子都是上一个 格子麦粒的2 倍
每个麦粒 0.0001克 问麦粒的总重量 麦粒的总数量
模拟密码验证问题
1. 从键盘录入六位密码 验证密码是不是六位 如果 不是六位,提示用户重新录入 直到录入的是六位为止
2. 校验密码是否正确 三次以内输入密码正确显示欢迎 否则显示密码错误 吞卡 如果位数不对 不算做一次机会
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
/*判断密码是否正确*/
for (int i=2;i>=0;i--){
// 录入密码
System.out.println("请输入密码");
int code =sc.nextInt();
while (code<100000 || code > 999999) {
System.out.println("密码非六位,请重新录入一个六位密码");
code =sc.nextInt();
}
// 假设密码正确
if(code==123456){
System.out.println("欢迎");
break;
// 假设密码不正确
}else{
// 没有输入机会了 吞卡
if(i==0){
System.out.println("三次输入错误,吞卡");
}else{
// 还有输入机会 那么提示用户再次输入
System.out.println("密码有误 还有"+i+"次机会,重新录入密码");
}
}
}
}
2.4. 循环控制关键字
break continue return