顺序结构
分支结构
-
单分支if
- 先看一个if的例子
//lib提供好的类库 Scanner引用类型,开发者给我们提供好的一个类文件 Scanner.java
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner input = new Scanner(System.in); //Scanner 是引用类型,基本类型才能赋值,引用类型要new
System.out.println("请输入一个数字:");
int day = input.nextInt(); //可以读取我们输入的文字,读字符串input.nextLine()
if(day == 1){
System.out.println("Monday");
}else if(day == 2){
System.out.println("Tuesday");
}else if(day == 3){
System.out.println("Wednesday");
}else if(day == 4){
System.out.println("Thursday");
}else if(day == 5){
System.out.println("Friday");
}else if(day == 6){
System.out.println("Saturday");
}else if(day == 7){
System.out.println("Sunday");
}else{
System.out.println("请输入1-7的整数!");
}
}
}
-
cmd下运行报错:【错误: 编码GBK的不可映射字符】
- 解决办法:在notepad++打开,点击菜单栏的编码->使用ANSI编码
-
java.util.InputMismatchException
- 输入的类型与接收的数据类型不一致
- /利用if语句实现,判断给定月份对应的季节
import java.util.Scanner; //rt.jar
public class Jijie{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
int day = input.nextInt();
System.out.println();
if(day == 12 | day == 1 | day == 2){
System.out.println("现在是冬天");
}else if(day >= 3 && day <= 5){
System.out.println("现在是春天");
}else if(day >= 6 | && day <= 8){
System.out.println("现在是夏天");
}else if(day >= 9 && day <= 11){
System.out.println("现在是秋天");
}else{
System.out.println("请输入1-12的整数!");
}
}
}
-
利用if实现一个随机摇骰子的小游戏
-
随机产生一个骰子点数 1-6
-
让玩家猜测大小 大 小
-
比较点数与猜测结果
- 点数1 2 3同时小 或者 点数4 5 6 同时大
-
//import java.lang.Math; //lang包可以省略不写
import java.util.Scanner;
public class DiceGame{
public static void main(String[] args){
double value = Math.random(); //[0.0,1.0) -- 0.0-0.9999
int num = (int)(value*6+1);
System.out.println(num);
Scanner input = new Scanner(System.in);
System.out.println("买大买小,买定离手!");
String choose = input.nextLine();
System.out.println("本次摇出的点数为:"+num);
if((num >= 1 && num <=3 && choose.equals("小")) || (num >3 && num<=6 && choose.equals("大"))){
System.out.println("猜对了!");
}else{
System.out.println("猜错了!");
}
}
}
字符串之间的比较不能"a"=="b" ,需要这样写:"a".equals("b")
-
多分支switch
- examp1:
import java.util.Scanner;
public class TestSwitch{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入:");
int day = input.nextInt();
// switch(值) byte,short,int,char emnum,String
switch(day){
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
default:
System.out.println("error");
break;
}
}
}
-
examp2: 利switch实现 判断学生成绩对应的区间
import java.util.Scanner; public class Switch123{ public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.println("请输入你的分数:"); int score = input.nextInt(); switch(score/10){ 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: System.out.println("优秀啊!"); break; case 10: if(score == 100){ System.out.println("学霸本霸!"); break; } default: System.out.println("输入错误!"); } } }
-
examp3:
/* 利用Scanner输入一个值(值代表一个星期几) 为小明同学制定一个学习计划 1 3 5 学校语文 2 4 6 学习数学 7 出去玩耍 */ import java.util.Scanner; public class Switch456{ public static void main(String[] args){ Scanner input = new Scanner(System.in); System.out.println("请输入一个1-7的数字:"); int day = input.nextInt(); //输入非int类型就会报错java.util.InputMismatchException switch(day){ case 1: case 3: case 5: System.out.println("学习java!"); break; case 2: case 4: case 6: System.out.println("学习python!"); break; case 7: System.out.println("玩? 想得美"); break; default: System.out.println("你逃不掉1-7天的"); } } }
-
- if和switch的优缺点
好处 | 缺点 | |
---|---|---|
if | 可以写复杂的逻辑 | 执行比较慢 |
switch | 判断的过程效率更高 | 只能做恒等比较(==),固定值 |
循环结构
-
for
- 栗子1
操场有一百多人,让他们排队, 三个人一组多一个,四个人一组多两个,五个人一组多两 求操场上的人数是多少? 设为n */ public class TestFor{ public static void main(String[] args){ for(int n=100;n<200;n++){ if(n%3==1 && n%4==2 && n%5==2){ System.out.println("操场上的人数为:"+n); } } } }
- 栗子2
/* 甲乙丙丁四个人加工零件 加工的总零件数为370个 如果甲加工的零件数多10 如果乙加工的零件数少20 如果丙加工的零件数乘以2 如果丁加工的零件数除以2 则四个人加工的零件数就相等啦 求 四个人加工的零件个数分别是多少? 设甲乙丙丁相等时的数是x 那么甲x-10 + 乙x+20 + 丙x/2 + 丁x*2 ==370 x x 0 2x 优化:甲乙可以理解为都在x附近浮动,丁为2x,丙是最小的, 我们先缩小下上限,假设丙为0,4x=370,x大概95这样,丙是最小的,95除以2大概45这样,所以for循环范围可以定位45-95就好了 */ public class Lianxiti1{ public static void main(String[] args){ for(int x=45;x<95;x++){ if((x-10)+(x+20)+(x/2)+(x*2) == 370){ System.out.println("甲加工的零件个数是:"+(x-10)); System.out.println("乙工的零件个数是:"+(x+20)); System.out.println("丙加工的零件个数是:"+(x/2)); System.out.println("丁加工的零件个数是:"+(x*2)); } } } }
- 栗子3
/* 鸡兔同笼问题 小鸡 小兔子 关在同一个笼 小鸡两 小兔子四只脚 小鸡+小兔子 总数50只 脚的总数160只 求小鸡 和 小兔子 各多少只? 小鸡x, 小兔子50-x 2*x+(50-x)*4 == 160 */ public class Jitutonglong{ public static void main(String[] args){ for(int x=1;x<50;x++){ if(2*x+(50-x)*4 == 160){ System.out.println("小鸡是:" + x + "只"); System.out.println("小兔子是:" + (50-x) + "只"); } } } }
- 栗子4
/* 通过循环找寻三位数字的水仙花数 153 ---> 1 5 3 1 + 125 + 27 == 153 x*x*x 100-999之间挨个尝试,满足上述规则的数字成为水仙花数 153 370 371 407 */ public class Daffodils{ public static void main(String[] args){ for(int n=100;n<999;n++){ if(Math.pow(n/100,3)+Math.pow(n/10%10,3)+Math.pow(n%10,3) == n){ System.out.println("三位数字的水仙花数:"+n); } } } }
-
栗子5
/* ******* 画星星,换行 i==1, 7 ***#*** 画星星,画空格,画星星,换行 i==2, 3 1 3 **###** 画星星,画空格,画星星,换行 i==3, 2 3 2 *#####* 画星星,画空格,画星星,换行 i==4, 1 5 1 如果是第一行,很简单就是画星星 第二行往后,规则不同 不管哪种情况,都需要换行 */ import java.util.Scanner; public class DrawStar1{ public static void main(String[] args){ System.out.println("画几个:"); Scanner input = new Scanner(System.in); int line = input.nextInt(); for(int i=1;i<=line;i++){ //控制行数 if(i==1){//第一行规则 //画星星 for(int j=1;j<=2*line-1;j++){ System.out.print("*"); } }else{//后三行规则 //画星星 for(int j=1;j<=line+1-i;j++){ System.out.print("*"); } //画空格 for(int j=1;j<=2*i-3;j++){ System.out.print(" "); } //画星星 for(int j=1;j<=line+1-i;j++){ System.out.print("*"); } } //换行 System.out.println(); } } }
-
栗子6
/* 1 121 12321 1234321 空格3, 1, 空格3 换行 i==1 --1 空格2, 1 2 1, 空格2 换行 i==2 --3 空格1, 1 2 3 2 1 ,空格1 换行 i==3 --5 1 2 3 4 3 2 1, i==4 --7 1 2 3 4 5 4 3 2 1, i==5 --9 i==1,j==1, 1, i==1,j==2, 12, */ import java.util.Scanner; public class Draw1{ public static void main(String[] args){ System.out.print("请输入图形的高度(行数):"); Scanner input = new Scanner(System.in); int line = input.nextInt(); for(int i=1;i<=line;i++){//控制行数 if(false){ System.out.print("1234321"); }else{ for(int j=1;j<=line-i;j++){//空格 System.out.print(" "); } for(int j=1;j<=i;j++){//左 System.out.print(j); } for(int j=i;j>1;j--){ //右 System.out.print(j-1); } } //空格 System.out.print(" "); System.out.println(); } } }
-
栗子7 乘法口诀
/* 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 i==1 1 * 1 = 1 i==2 1 * 2 = 2 2 * 2 = 4 for(int i=1;i<=line;i++){}//控制行数 第一行 1 * 1 = 1 第二行规则 for(int j=1;j<=i;j++){j+"*"+i+"="+j*i 空格} j<i每次输出完一个等式都要空格,当j==i,输完等式,要换行 */ import java.util.Scanner; public class DrawMultiplicationFormulas{ public static void main(String[] args){ System.out.println("请输入一个数,打印该数以内的乘法口诀:"); Scanner input = new Scanner(System.in); int line = input.nextInt(); for(int i=1;i<=line;i++){ if(i==1){ System.out.println("1*1=1"); }else{ for(int j=1;j<=i;j++){ if(j<i){ System.out.print(j+"*"+i+"="+j*i+" "); }else{ System.out.print(j+"*"+i+"="+j*i); System.out.println(); } } } } } }
-
栗子 找质数和非质数
/* 找出2-100之间的素数(质数) 只能被 1和本身整除的数字 2 3 5 7 11 13 2是素数 3是素数 3不是素数 5是素数 6不是素数 7是素数 for(int i=1;i<num;i++){} //控制遍历num以内的所有数 for(int j=2;j<=i/2;j++){} //计算i的素数,j从2开始到i/2来遍历 if(i%j){} // */ import java.util.Scanner; public class Prime{ public static void main(String[] args){ System.out.print("输入一个数,我会输出该数以内的所有素数:"); Scanner input = new Scanner(System.in); int num = input.nextInt(); for(int i=1;i<=num;i++){ boolean flag = true; //System.out.print("i=: "+i+" "); //System.out.println("Math.sqrt(i): "+(int)Math.sqrt(i)); for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){ System.out.println(i+"不是素数"); flag = false; break; } } //System.out.println("flag: "+flag); if(flag == true){ //如果j循环完,上面的if没有进去过,那就是素数 System.out.println(i+"是素数"); } } } }
- jdk1.5以后 for新特性
import java.util.Arrays; public class Arr{ public static void main(String[] args){ int[] array = new int[]{1,2,3,4,5}; //jdk1.5以后 for新特性 for(int value:array){ //只能取值,没有index,找不到元素到底哪一个 System.out.println(value); } } }
break
continue
循环标记 给循环起名字,指定中断标记的循环
-
while
1. 栗子1 一层循环
/* 有一个水池 已经盛满了120立方米的水 有一个排水管 每小时进水18立方米 有一个排水管 每小时排水30立方米 两水管一起开 经过多少小时 水池的水排放干净? */ public class TestWhileOne{ public static void main(String[] args){ int volume = 120; int hour = 0; while(volume>0){ volume += 18; volume -= 30; hour++; } System.out.print("水池的水经过"+hour+"小时排放干净"); } }
-
栗子2 while嵌套
/* 画星星 * *** ***** ******* 空格 星星 空格 换行 3 1 3 换行 2 3 2 换行 1 5 1 换行 0 7 0 */ import java.util.Scanner; public class WhileDrawStar{ public static void main(String[] args){ System.out.print("输入画几行:"); Scanner input = new Scanner(System.in); int line = input.nextInt(); int i = 1; while(i<=line){ //控制line //画空格 int j = 1; while(j<=line-i){ System.out.print(" "); j++; } //画星星 int k = 1; while(k<=2*i-1){ System.out.print("*"); k++; } //换行 System.out.println(); i++; } } }
-
栗子3
/* 小明同学从A点以7km/h的速度向B点出发 小雨同学从B点以18km/h的速度向A点出发 A和B之间的距离是1000km 求解 小明同学和小雨同学经过多少小时相遇? 设x小时相遇 7x+18x=1000 1 25 975 2 25 950 3 25 925 每小时25km,走完1000km 需要40小时 */ import java.util.Scanner; public class WhileTwo{ public static void main(String[] args){ //System.out.print("输入画几行:"); //Scanner input = new Scanner(System.in); //int line = input.nextInt(); /*int time = 1; //使用循环标记 ok:while(true){ while(7*time+18*time == 1000){ System.out.print("小明同学和小雨同学经过"+time+"小时相遇"); break ok; } time++; } */ int distance = 1000; int time = 0; while(distance>0){ distance -= 7; distance -= 18; System.out.println("经过"+time+"小时,还剩余距离: "+distance); time++; } System.out.print("小明同学和小雨同学经过"+time+"小时相遇"); } } 运行结果: D:myprojectJavaProjectlearndemo $ java WhileTwo 经过0小时,还剩余距离: 975 经过1小时,还剩余距离: 950 经过2小时,还剩余距离: 925 经过3小时,还剩余距离: 900 经过4小时,还剩余距离: 875 经过5小时,还剩余距离: 850 经过6小时,还剩余距离: 825 经过7小时,还剩余距离: 800 经过8小时,还剩余距离: 775 经过9小时,还剩余距离: 750 经过10小时,还剩余距离: 725 经过11小时,还剩余距离: 700 经过12小时,还剩余距离: 675 经过13小时,还剩余距离: 650 经过14小时,还剩余距离: 625 经过15小时,还剩余距离: 600 经过16小时,还剩余距离: 575 经过17小时,还剩余距离: 550 经过18小时,还剩余距离: 525 经过19小时,还剩余距离: 500 经过20小时,还剩余距离: 475 经过21小时,还剩余距离: 450 经过22小时,还剩余距离: 425 经过23小时,还剩余距离: 400 经过24小时,还剩余距离: 375 经过25小时,还剩余距离: 350 经过26小时,还剩余距离: 325 经过27小时,还剩余距离: 300 经过28小时,还剩余距离: 275 经过29小时,还剩余距离: 250 经过30小时,还剩余距离: 225 经过31小时,还剩余距离: 200 经过32小时,还剩余距离: 175 经过33小时,还剩余距离: 150 经过34小时,还剩余距离: 125 经过35小时,还剩余距离: 100 经过36小时,还剩余距离: 75 经过37小时,还剩余距离: 50 经过38小时,还剩余距离: 25 经过39小时,还剩余距离: 0 小明同学和小雨同学经过40小时相遇
-
栗子4
/* 卖西瓜 一车西瓜共1020个 每天卖掉总数的一半多两个 问:几天卖完所有的瓜 设x天卖完 第一天卖出 1020/2 + 2 = 512 剩余1020-512=508 2 508/2 + 2 = 256 剩余508-256=252 3 252/2 + 2 = 128 剩余252-128=124 4 124/2 + 2 = 64 剩余124-64=60 5 60/2 + 2 = 32 剩余60-32=28 6 28/2 + 2 = 16 剩余28-16=12 7 12/2 + 2 = 8 剩余12-8=4 8 4/2 +2 = 4 剩余4-4=0 */ import java.util.Scanner; public class WhileThree{ public static void main(String[] args){ int total = 1020; int day = 0; while(total>0){ total -= total/2; total -= 2; day++; System.out.println("第"+day+"天剩余"+total+"瓜"); } System.out.println(day+"天卖完所有的瓜"); } } 运行结果: D:myprojectJavaProjectlearndemo $ java WhileThree 第1天剩余508瓜 第2天剩余252瓜 第3天剩余124瓜 第4天剩余60瓜 第5天剩余28瓜 第6天剩余12瓜 第7天剩余4瓜 第8天剩余0瓜 8天卖完所有的瓜
-
-
-
do ... while
略