1.顺序结构
程序从上往下按顺序执行
2.分支结构
2.1单分支 if
if(条件=boolen){
代码
};
if(条件=boolen){
}else{
}
if(){
}else if(){
}else{
}
2.2多分支 swith
switch(值){ //byte short int char 1.5enum 1.7String
case 值1: //只能做==比较
代码1;
[break;]可有可无
case 值2:
代码2;
default:
代码;
}
2.3 if switch区别
if(很复杂的条件){
}else if(){
}else if(){
}
if 好处(可以写复杂的逻辑) 不好处 执行比较慢
swicth 好处(判断的过程效率更高) 不好处 只能做==(固定值)
3.循环结构 for while do…while
循环 重复不停的做同样的事
爬楼梯 1--->5楼
操场跑圈 1--->5圈
1-5圈
从哪里开始 1圈 起点
从哪里结束 5圈 判断 终点的条件
跑起来变化 增减
程序中想要执行一个正常的循环 和现实生活类似 需要满三个条件(必要)
初始值 终点判定条件 变化量
3.1 for
允许将三个必要条件都写在()内
for(初始值 ; 终点判定条件 ; 变化量){
好多好多执行的条件
}
public class TestFor {
public static void main(String[]args){
int round =1;
for (;round<=5;){
System.out.println("跑到第"+round+"圈了");
round++;
}
//循环执行完毕round值为6
System.out.println("循环执行完毕"+round);
//变量的生命周期问题(变量 栈内存空间 从声明开始创建出来 用完即回收)
}
}
3.2 while
循环想要执行 需要三个必要条件 初始值 终点判定条件 变化量
初始值;
for(;终点判定条件;){
好多好多执行;
变化量;
}
允许将三个条件都写在()内 不是不需
初始值;
while(终点判定条件){ //()内只允许写一个
好多好多执行;
变化量;
}
我理解就是一个for循环的变体
变量定义在循环外 生命周期长了
变化量放在循环内(注意上下的顺序可能对执行产生影响)
public class TestWhile1 {
public static void main(String[] args){
int i=1;
while(i<=5 ) {
System.out.println("循环执行中" +i);
i++;
}
System.out.println("循环执行完毕"+i); //6
//循环过程中输出多少次 5
//循环执行完毕后 i=6
}
}
3.3 do…while
while先判断后执行 条件不满足不执行啦
do...while 先执行后判断 条件不满足 至少执行一次
do{
好多好多执行;
变化量;
} while(终点判定条件)
3.4关键字break,continue
3.4.1 break 终止循环
public class TestBreak {
public static void main(String[] args){
int i=1;
int j=1;
for(;i<=5 ;i++) {
for(;j<=5 ;j++) {
if(j==3){
break; //终止 中断
}
System.out.println("i= "+i+" j="+j);
} //i==1 j==3 执行两次输出 i==2 j==?从几开始数?3 i==3 j==3
}
System.out.println(i); //6
System.out.println(j); //3
//循环过程中输出多少次 2
//循环执行完毕后 i=6 j=3
/**
for(int i=1;i<=5 ;i++) {
for(int j=1;j<=5 ;j++) {
if(j==3){
break; //终止 中断
}
System.out.println("i= "+i+" j="+j);
}
}
//循环过程中输出多少次 10
//循环执行完毕后 i=6 j=3
*/
/**
for(int i=1;i<=5 ;i++) {
if(i==3){
break; //终止 中断
}
System.out.println(i); //输出 1 2
}
*/
}
}
3.4.2 continue 终止本次循环,进入下次循环
public class TestContinue {
public static void main(String[] args){
int i=1;
int j=1;
for(;i<=5 ;i++) {
for(;j<=5 ;j++) {
if(j==3){
continue; //终止 中断
}
System.out.println("i= "+i+" j="+j);
}//i==1 j==6 输出四次 i==2 j==?从几开始数?6 i==3 j==6
}
//循环过程中输出多少次 4
//循环执行完毕后 i=6 j=6
/**
for(int i=1;i<=5 ;i++) {
if(i==3){
continue; //终断本次循环,进入下次循环
}
System.out.println(i);
}
//循环过程中输出多少次 20
//循环执行完毕后 i=6 j=6
*/
}
}
3.4.3 循环标记
public class TestBreakAndContinue {
public static void main(String[] args){
ok:for(int i=1;i<=5 ;i++) {
for(int j=1;j<=5 ;j++) {
if(j==3){
continue ok; //终止 中断
} //j==3停住一次 继续下一次i++ i=2
System.out.println("j="+j);
}
}
//循环过程中输出多少次 10
//循环执行完毕后 i=6 j=3
/**
int i=1;
int j=1;
ok:for(;i<=5 ;i++) {
ko:for(;j<=5 ;j++) {
if(j==3){
break ok; //终止 中断
}
System.out.println("i= "+i+" j="+j);
}
}
System.out.println("i= "+i);
System.out.println("j= "+j);
*/
/**
ok:for(int i=1;i<=5 ;i++) {
ko:for(int j=1;j<=5 ;j++) {
if(j==3){
break ok; //终止 中断
}
System.out.println("i= "+i+" j="+j);
}
}
//循环过程中输出多少次 2
//循环执行完毕后 i=1 j=3
//break为什么终断的是里层循环? 不看层次问题 两个循环一模一样
//如果j==3 break 中断外面的循环---?? 给循环取名字 循环标记
*/
}
}
4练习?
设计一个小程序 帮我学习英文(星期七个单词)
用户输入的1---> monday
src.zip原码
lib提高好的内库 Scanner引用 开发者给我们提供的一个类文件
int x=1;
想要使用Scanner需要如下三步:
1.在类的上面的第一行 import java.util.Scanner;
2.需要输入之前Scanner y = new Scanner(System.in);//对象
3.通过y.让他来做事 int =nexInt();
String=nextLine();都可以读取输入的信息;
import java.util.Scanner;
public class StudyEnglish { //if(){} else实现
public static void main(String[] args){
/*
想要使用Scanner需要如下三步:
1.在类的上面的第一行 import java.util.Scanner;
2.需要输入之前Scanner y = new Scanner(System.in);//对象
3.通过y.让他来做事 int =nexInt();
*/
Scanner input =new Scanner(System.in);
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("我管你是星期几");
}
}
}
import java.util.Scanner;
public class TestSwitch { //switch实现
public static void main(String[] args){
Scanner input =new Scanner(System.in);
System.out.println("请您输入一个数字");
int i=input.nextInt();
switch(i) {
case 1:
System.out.println("monday");
break;
case 2:
System.out.println("tuesday");
break;
case 3:
System.out.println("wednesday");
break;
case 4:
System.out.println("thursday");
break;
case 5:
System.out.println("friday");
break;
case 6:
System.out.println("Saturday");
break;
case 7:
System.out.println("Sunday");
break;
default:
System.out.println("我管你是星期几error");
}
}
}
程序要求
1.可读性
起名字 规范代码 缩进 注释
2.健壮性
程序严谨 判断时逻辑要严谨
3.实现功能的基础上 能不能做优化(代码结构--简单 减少冗余 性能 内存空间)
if else小任务
1.利用if语句实现一个 判断给定月份对应的季节
month==5 345春天 678夏天 9 10 11秋天 12 1 2冬天
import java.util.Scanner;
public class Month {
public static void main(String[] args ){
//1.创建一个month变量 用来存储一个月份值(Scanner)
Scanner input =new Scanner(System.in);
System.out.println("请输入月份,我来判断季节");
int month = input.nextInt();//帮我们读取输入的数字 input.nextLine;读取字符串
//2.通过month存储的值 进行季节的判断
/*if(month>=3 && month <=5){
System.out.println("是春天");
}else if(month>=6 && month <=8){
System.out.println("是夏天");
} else if(month>=9 && month <=11){
System.out.println("是秋天");
}else if(month==1 || month ==2 || month==12){
System.out.println("是冬天");
}else{
System.out.println("无效数字");
}*/
//优化结构
if(month<1 || month>12) {
System.out.println("您输入的数字不符和月份,数据有误");
}else if(month>=3 && month <=5){
System.out.println("是春天");
}else if(month>=6 && month <=8){
System.out.println("是夏天");
} else if(month>=9 && month <=11){
System.out.println("是秋天");
}else{
System.out.println("是冬天");
}
}
}
2.利用if语句实现一个 判定学生成绩对应的区间
不及格 60-70及格 70-80中 80-90良 90-100优秀 满分 数据有误
import java.util.Scanner;
public class Grade {
public static void main(String[] args ){
Scanner input =new Scanner(System.in);
System.out.println("请输入成绩");
int grade = input.nextInt();
if(grade>0 && grade <60){
System.out.println("不及格");
}else if(grade>=60 && grade <70){
System.out.println("及格");
}else if(grade>=70&& grade <80){
System.out.println("中");
}else if(grade>=80 && grade <90){
System.out.println("良");
}else if(grade>=90 && grade <100){
System.out.println("优秀");
}else if(grade ==100){
System.out.println("满分");
}else{
System.out.println("无效数字");
}
}
}
3.扩展 利用if实现一个随机摇骰子的小游戏
随机摇一个骰子的点数 1-6 123 456
玩家利用Scanner输入 猜数字
利用if比较 猜对了 猜错了 Math.random()
import java.util.Scanner;
import java.util.Random;
public class GuessNumber {
public static void main(String[] args ){
//1.随机摇骰子的过程,随机产生一个骰子点数 1-6整数
int num = (int)(Math.random() * 5 + 1);
//2.让玩家猜测数字
Scanner input =new Scanner(System.in);
System.out.println("请输入一个数字")
int a = input.nextInt();
//3.比较点数和猜测结果
if(a==num){
System.out.println("骰子为"+num+",猜对了") ;
}else{
System.out.println("骰子为"+num+",猜错了") ;
}
}
}
switch小任务
1.利用switch语句实现一个 判定学生成绩对应的区间
不及格 60-70及格 70-80中 80-90良 90-100优秀 满分 数据有误
import java.util.Scanner;
public class SwitchGrade {
public static void main (String[] args){
//1.先输入成绩
Scanner input = new Scanner(System.in);
System.out.println("请输入学习成绩,判断区间");
int grade =input.nextInt();
//2.判断成绩
switch (grade/10){ //61/10 6
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:
//一百多分100-109 优化
if(grade==100){
System.out.println("满分");
break;
}
default:
System.out.println("不及格,或数据错误");
break;
}
}
}
2.利用Scanner输入一个值(代表一个星期几 4)
为小茗同学制定一个学习计划
1 3 5学习语文
2 4 6学习数学
7
public class SwitchLearn {
public static void main(String[] args){
//1.先输入星期几
Scanner input = new Scanner(System.in);
System.out.println("请输入星期几");
int day =input.nextInt();
//2.判断星期几做什么
switch(day){
/* case 1 :
System.out.println("星期1学习语文");
break;
case 2 :
System.out.println("星期2学习数学");
break;
case 3 :
System.out.println("星期3学习语文");
break;
case 4 :
System.out.println("星期4学习数学");
break;
case 5 :
System.out.println("星期5学习语文");
break;
case 6 :
System.out.println("星期6学习数学");
break;
case 7 :
System.out.println("星期天休息");
break;
default :
System.out.println("输入的数字不是星期");
*/
//优化
switch(day){
case 1 :
case 3 :
case 5 :
System.out.println("学习编程");
break;
case 2 :
case 4 :
case 6 :
System.out.println("学习英语");
break;
case 7 :
System.out.println("用英语编程");
break;
default :
System.out.println("输入的数字不是星期");
}
}
}
for 小任务
1.
操场上有一百多人,让他们排队
三个人一组 多一人,四个人一组,多两个,五个人一组 多两个
求解 操场上的人数多少?
解:设 操场的人数x
x%3 ==1 x%4==2 x%5==2
计算机想要找到x的值 不是通过计算得来的 通过最笨拙的方法 挨个尝试
想要挨个的尝试 需要一个范围
让计算机帮我们 在100-200之间 挨个尝试一下 哪一个数字符号上述条件
public class ForDemoOne {
public static void main(String[] args) {
for(int x=100;x<=200;x++ ){
if(x%3==1 && x%4==2 && x%5==2 ){
System.out.println("操场人数有"+x+"个"); //142
}
}
}
}
2.甲乙丙丁四个人加工零件 加工的总零件数为370个
如果甲加工的零件数多10
如果乙加工的零件数少20
如果丙加工的零件数乘以2
如果丁加工的零件数除以2'
则四个人加工的零件数就相等了
求 四个人加工的零件个数分别是多少?
思路:
设相等的数为x;
甲+10=x;
乙-20=x;
丙*2=x;
丁/2=x;
甲+乙+丙+丁===> (x-10)+(x+20)+(x/2)+(x*2)= 370;
x x 0 2x 95 最大 最小预计 45
public class ForDemoTwo {
public static void main(String[]args ){
/* for(int x=1;x<=370;x++) {
if((x-10)+(x+20)+(x/2)+(x*2) ==370 ) {
System.out.println("甲加工的零件数为"+ (x-10)+ " x="+x);//70 80
System.out.println("乙加工的零件数为"+ (x+20)+ " x="+x);//100 80
System.out.println("丙加工的零件数为"+ (x/2) + " x="+x);//40 80
System.out.println("丁加工的零件数为"+ (x*2) + " x="+x);//160 80
}
}*/
//优化 判断估计初始值 和最后值
for(int x=45;x<=95;x++) {
if((x-10)+(x+20)+(x/2)+(x*2) ==370 ) {
System.out.println("甲加工的零件数为"+ (x-10)+ " x="+x);//70 80
System.out.println("乙加工的零件数为"+ (x+20)+ " x="+x);//100 80
System.out.println("丙加工的零件数为"+ (x/2) + " x="+x);//40 80
System.out.println("丁加工的零件数为"+ (x*2) + " x="+x);//160 80
}
}
}
}
3.鸡兔同笼问题
小鸡 小兔子 关在同一个笼子里 小鸡两只脚 小兔子四只脚
小鸡+小兔子 总数50只 脚的总数160只
求 小鸡 和小兔子各多少只
思路
设鸡x只
则兔有 50-x 只
鸡*2+ 兔*4 =160 ====> x*2+(50-x)*4 == 160
public class ForDemoThree {
public static void main(String [] args){
for(int x=1; x<=50;x++){
if(x*2 + (50-x)*4 == 160){
System.out.println("鸡有 "+x+"只"); //20
System.out.println("兔有 "+ (50-x) +"只"); //30
}
}
}
}
4.通过循环找到三位数的水仙花数
153---->1 5 3 各自立方和
1+ 125+ 27=153
100-999之间挨个尝试 满足上述规则数字 153 370 371 407
思路
数x
百位 a = x/100
十位 b = (x%100)/10
个位 c = x%10
a*a*a +b*b*b +c*c*c ==x;
public class ForDemoFour {
public static void main(String [] args){
/* for(int x=100; x<=999;x++){
int a = x/100;
int b = (x%100)/10;
int c = x%10;
if( a*a*a +b*b*b +c*c*c == x){
System.out.println("水仙花数是 "+x); //153 370 371 407
}
}*/
//优化
for(int x=100; x<=999;x++){
if(Math.pow(x/100,3) +Math.pow((x%100)/10,3)+Math.pow(x % 10,3) == x){
System.out.println("水仙花数是 "+x); ////153 370 371 407
}
}
}
}
for循环嵌套
需求 控制台打印*
1.控制台输出1行 ****
2.控制台输出4行 ****
3.控制台输出4行
*
**
***
4.控制台输出4行
*
**
***
****
import java.util.Scanner;
public class DrawStar {
public static void main(String [] args){
for(int i=1;i<=4;i++){ //控制4行
//画占位符
for(int j=1;j<=4-i;j++) {
System.out.print(" ");
}
//画星星
for(int j=1;j<=i;j++) {
System.out.print("*");
}
System.out.println();
}
/* 3
for(int i=1;i<=4;i++){
for(int j=1;j<=i;j++) {
System.out.print("*");
}
System.out.println();
} */
/*2.
int count=4; //每一行星星的数量随意
for(int i=1;i<=4;i++){
for(int j=1;j<=count;j++) {
System.out.print("*");
}
System.out.println();
}*/
//让计算机帮我们做四次同样的事
//i j 分别控制着什么? i控制行数 j控制的是每一行星星的个数
//i==5 5<=4 false
// j==5 5<=4 false
//1.复用性
/* System.out.println("尊敬的客户,您需要画几个");
Scanner input =new Scanner(System.in);
int count=input.nextInt();
for(int i=1;i<=count;i++){
System.out.print("*");
}*/
}
}
嵌套任务1
*******
*** ***
** **
* *
思路:
输出4行 外面循环i=4次
i=1时 输出j = 7 次* 1234567
i=2时 当j= 4时 输出空格 123 4 567
i=3时 当j= 3 4 5 输出空格 12 345 67
i=4时 当j= 2 3 4 5 6 输出空格 1 23456 7
import java.util.Scanner;
public class Demo1{
public static void main(String [] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入行数");
int line =input.nextInt();
//******* 画星星 换行 i=1 7
//*** *** 画星星 画空格 画星星 换行 i=2 3 1 3
//** ** 画星星 画空格 画星星 换行 i=3 2 3 2
//* * 画星星 画空格 画星星 换行 i=4 1 5 1
for(int i=1;i<=line; i++){ //控制4行
if(i==1){ //第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(); //换行
}
}
}
2.数字金字塔
1
121
12321
1234321
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
/** 空格 左数字 右数字 空格
*
* 1 1 i=1 3 1-1 0 3
* 2 1 2 1 i=2 2 1-2 1-1 2
* 3 1 2 3 2 1 i=3 1 1-3 2-1 1
* 4 1 2 3 4 3 2 1 i=4 0 1-4 3-1 0
*/
Scanner input = new Scanner(System.in);
System.out.println("请输入行数");
int line =input.nextInt(); //行数
for (int i = 1; i <= line; i++) { // i 控制行
//空格占位
for (int j = 1; j <= line - i; j++) {
System.out.print(" ");
}
//左 数字 小到大 j++
for (int j = 1; j <= i; j++) {
System.out.print(j+" ");
}
//右 大到小 j--
for (int j = i-1; j >=1; j--) {
System.out.print(j+" ");
}
// 空格
for (int j = 1; j <= line - i; j++) {
System.out.print(" ");
}
//换行
System.out.println("");
}
}
}
3 输出乘法口诀
1*1=1
1*2=2 2*2=4
public class Demo3 {
public static void main(String []args){
/**
* 1 * 1 =1 输出次数 1 与外循环的行数相同
* 1 * 2 =2 2 * 2 =4 2
* 3
* 行数 9
* 解析 循环* 行数 = 结果
* 第二个循环循环 次数为
*/
for(int i=1;i<= 9;i++ ){
for(int j=1;j<=i ;j++ ){
//\t 转义 表格
System.out.print(j +" * "+i +" = "+j*i+"\t");
}
System.out.println("");
}
}
}
4 .找寻2-100之间的素数(质数)
找寻2-100之间的素数(质数) 只能被1和本身整除的数字 2 3 5 7 11
2是素数
3是素数
4不是素数
5是素数
6不是素数
public class Demo4 {
public static void main(String[] args) {
/**
* 判断2-100的素数 从2开始 到100 每个数判断一次 并输出
* 只能被1和本身整除的数字
* 判断是否素数
* 将循环到的数i 依次除 2 到 i-1 都有余数就素数
* 当出现余为0时就不是素数 此时需要记录 此数不是素数
*/
boolean bl=true;
//判断 是否素数 i/2 break 优化循环
for (int j = 2; j <= i/2; j++) {
if (i % j == 0) {
bl=false;
System.out.println(i +" 不是素数");
break; //跳出此次循环
}
}
//输出
if (bl){
System.out.println(i +" 是素数");
}
}
}
}