Java流程控制学习
学习目录
1.用户交互Scanner
2.顺序结构
3.选择结构
4.循环结构
5.break & continue
6.练习
Scanner对象
1.java.util(util=工具包).Scanner是java5的新特征,我们可以通过Scanner类来获取用户的输入;
2.基本语法
Scanner s = new Scanner(System.in);
3.通过Scanner类的next()与nextLine()方法获取输入的字符串,
在读取前,我们一般需要使用 hasNext() 与 hsaNextLine() 判断是否还有输入的数据;
4.基本使用方法
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner= new Scanner(System.in);
//判断有没有字符串数据输入;
if(scanner.hasNext()){
//使用Next()方法接收
String str = scanner.next();
System.out.println("输入的内容为:"+str);
}
//使用完Scanner之后,进行Scanner关闭,进行资源回收;
scanner.close();
//------------
//nextLine()
Scanner scanner= new Scanner(System.in);
//判断有没有字符串数据输入;
if(scanner.hasNext()){
//使用NextLine()方法接收
String str = scanner.nextLine();
System.out.println("输入的内容为:"+str);
}
//使用完Scanner之后,进行Scanner关闭,进行资源回收;
scanner.close();
//------------
注意1:属于IO流的类,如果创建之后,不进行关闭,那么会一直占用资源;
IO流:可以与用户进行交互的类统称为IO流;
//------------
next()
1.一定要读取到有效字符后才可以结束输入;
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉;
3.只有输入有效字符后,才将其后面输入的空白作为分隔符或者结束符;
4.next() 不能得到带有空格的字符串;
//------------
nextLine();//常用
1.以Enter为结束符,也就是说 nextLine()方法返回的是,输入回车之前的所有字符;
2.可以获得空白;
//------------
hasNextInt();//判断是否输入整数;
nextInt();//获取输入整数;
//------------
hasNextFloat();//判断是否输入小数数据;
nextFloat();//获取输入小数数据;
//------------
1.可以使用Ctrl+鼠标左键在IDEA中点击Scanner类,进入查看其中各种方法;
可以通过侧边栏左边的结构进行查看其中Scanner类的各种方法;
作业:
/*可以输入多个数字,并求其总和与平均数,每输入一个数字,使用回车进行确认,通过输入非数字来结束输入并输出执行结果;*/
//随机创建一个类:
public class Demo01{
//创建main()方法
public static void main(String[] args){
//创建Scanner对象,使用System.in,说明进行的是输入操作;
Scanner sc = new Scanner(System.in);
//创建double型变量接收和值;
double sum=0;
//创建int型变量计次;
int i=0;
//提示输入数字;
System.out.println("请输入数值"+(i+1)+":");
//使用判断循环首while
while(sc.hasNextDouble()){
//是否应创建一个if语句用以判断是否输入的是数值?
//不用,使用hasNextDouble,就是理解的意思了.
//若不使用看一下,不可以不使用循环,条件不成立;
//创建用于接收键盘输入数字变量,类型double
double num=sc.nextDouble();
//计算和值;
sum=sum+num;
//计次
i++;
//提示输入数字;
System.out.println("请输入数值"+(i+1)+":");
}
//循环结束后,和值确认,求平均数值
//创建平均数变量.count?
double count = sum/i;
//输出相应计算结果;
System.out.println("输入的个数有多少个:"+i);
System.out.println("输入的数值和值为:"+sum);
System.out.println("输入的数值平均数为:"+count);
//关闭Scanner对象
sc.close();
}
}
//作业已完成;
scanner.equals("AAA"); equals方法.判断字符串是否相同;
基本结构
顺序结构(struct)
1.java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行下去;
2.顺序结构是/*最简单的算法结构*/
3.语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的;
/*他是任何一个算法都离不开的一种基本算法结构*/
选择结构
1.if单选择结构
很多时候,需要判断一个东西是否可行,那么就需要用到if语句.
如:成绩是否及格;
2.if双选择结构
一个事物,不是只有一种结果,成功了就怎么做,而失败了,又怎么做;那么就需要用到else语句
如成绩:60分以上为及格,60分以下为不及格;
3.if多选择结构
一个事物,不是只有两种结果,那么就需要用到else if + else 语句叠加使用;
如成绩:100-90区间为A,90-80区间为B;80-60为C;60以下为D;
4.嵌套的if结构
在判断的时候,如果需要确认其结果等于在一个范围,并逐步缩小甚至直接判断是否正确;
// 快速找到一个数在其规定范围的方法
// 取中判断思想,在100个数中查找,将其与50判断,若大于,则为50-100区间,否则为1-50区间
// 此操作一下减少一半范围,之后可以继续在想要的范围进行取中值判断,从而达到快速查找的效果;
if(A<=50 && A>0){
//前提条件,需要小于等于50且不为负数,但小于等于50之后,还需要分成两批;
//50-30为A类,30-0为B类;
//A是否小于50,是则进入此处,再次判断
if(A<=50 && A >= 30){
//判断A是否小于等于50,大于30;
//进入这里,说明是符合条件的A类;
System.out.println("A类数值:"+A);
}//否则,则为B类数值;
else{
//因为已经小于50,在没有负数的情况下,只有0-30这一区间了;
//所以相应皆为B类数值,也就不需要使用else if语句再次判断;
System.out.println("B类数值:"+B);
}
}
//注意事项:
1.if语句至多有1个else语句.else语句应写在在所有的else if语句之后;
2.if语句可以有若干个else if语句,它们必须在else语句之前;
3.一旦其中一个if语句判断为true,则其他所有的else if 和 else语句皆将被跳过执行判断;
4.所有的流程控制语句,皆可以相互嵌套,而互不影响;
//-------------------
5.switch多选择结构
1.多选择结构还有一个实现方式就是switch case语句;
2.switch case语句用来匹配一个变量与一系列值中某个值是否相等,每个值称为一个分支;
3.switch语句中的变量类型可以是
byte.short.int或者char
4.从java SE7开始 switch支持字符串String类型了;
5.同时case标签必须为字符常量或字面量;
6.在switch语句中,可以创建多个case分支,但只能有一个默认default语句分支;
7.case分支语句块中,必须带有break(跳出循环)语句,不然会穿透执行;
基本语法:
switch (表达式){
case (字符常量或字面量):
break;
case "String":
break;
default :
//default,默认方法,不用进行判断.反正各种判断都没有,就会执行default方法;
//default方法,可写,可不写;
//在不写的情况下,必须保证case值可以匹配到相应的值,否则会发生case穿透;
}
循环结构
do...while //循环判断首
for循环 //计次循环首
1.在java5中引入了一种主要用于数组的增强型for循环;
/*-------------------------*/
while循环 //判断循环首
1.最基本的循环结构
2.只要布尔表达式为true,循环则会一直循环;
3./*我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环;*/
4.循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应尽量避免死循环.会影响程序性能或者造成程序卡死崩溃;
思考:1+2+3..+100=?
int sum=1;
int i=2;
while(i<=100){
sum=sum+i;
i=i+1;
}
/*-------------------------*/
do...while循环
1.对于while语句而言,如果不满足条件,咋不能进入循环.但有时候我们需要即使不满足条件,也至少执行一次;
2.do...while循环和while循环相似,不同的是,哪怕条件不满足,do...while也会执行至少一次;
3.while循环和do...while的区别
while循环是先判断,再执行,而do...while循环是先循环,再判断;
do...while总是保证循环体会被至少执行一次;这是他们的主要差别
/*-------------------------*/
for循环
1.虽然所有循环结构都可以使用while或者do...while表示,但java提供了另一种语句--for循环,
使一些循环结构变得更加简单;
2.for循环语句时支持迭代的一种通用结构,是最有效,最灵活的循环结构;
3.for循环执行的次数是在执行前就确定的;
练习1:计算0-100之间的奇数和偶数的和;
练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个;
练习3:打印九九乘法表;
练习1:
//创建for循环体
//创建一个变量来接收奇数的和;
int num1=0;
//创建一个变量来接收偶数的和;
int num2=0;
for (int i = 0; i <= 100; i++) {
//判断是否为偶数
if (i % 2 == 0) {
//求余%2等于0的数,得到的是偶数;
num2 = num2 + i;
} else {
//否则则为奇数;
num1 = num1 + i;
}
}
System.out.println("奇数之和:"+num1+" 偶数之和:"+num2);
//练习1完成
//------------------
//练习2:
//好像只能创建一个数组,才能方便一些做这道题;
//并且需要使用arrayList;这个我好像不太懂用了;
//也可以使用三个变量用来保存;输出之后再进行覆盖,虽然很傻...
int num1=0;
int num2=0;
int num3=0;
int i1=0;
for(int i=1;i<=1000;i++){
if(i%5==0){
i1++;
//得到的皆为可以被5整除的数;
//每行输出三个...
//再创建一个计数变量...3次循环;
if(i1%3==1){
num1=i;
}else if(i1%3==2){
num2=i;
}else if(i1%3==0){
num3=i;
//输出结果,不然等下就会漏掉了;
System.out.println("第一个:"+num1+" 第二个:"+num2+" 第三个:"+num3);
}
}
}
}
}
//勉强完成;练习2
练习2:重置
for(int i=1;i<=1000;i++){
if(i%5==0){
//输出不换行,显示满3个,之后再换行;
System.out.print(i+"\t");
}
if(i%15==0){
//换行方法1;
System.out.println();
//换行方法2;
System.out.print("\n");
}
}
//------------------
练习3:
//九九乘法表一共九层;
//需要至少两个变量;循环好像需要嵌套,好弄一些;
//没那么简单额;原来刚才写错了,第二个for循环的i1没整好;
//现在可以是可以,但不美观;
//勉勉强强,弄美观一点;现在勉强还行,加了逢9换行;
//需要去掉一些重复的;//未完
for(int i=1;i<=9;i++){
for(int i1=1;i1<=9;i1++){
//好像直接输出都可以了
System.out.print(i+"*"+i1+"="+i*i1+" ");
if(i1==9){
System.out.println();
}
}
}
//好像完成了勉勉强强;练习3;
练习3:重置
//按横行思考,每次内循环小于外循环,则每次减少输出一个;
//由上而下
//第一次,外1,内1
//第二次,外2,内2
//第九次,外9,内9
//由网友提供思路...
//由列思考,不好思考,换成按行思考,好解决;
for (int i = 1; i <= 9; i++) {
//将内计次小于外计次即可删除重复
for (int i1 = 1; i1 <= i; i1++) {
//好像直接输出都可以了,加上\t,使其排列整齐;
System.out.print(i + "*" + i1 + "=" + i * i1 + "\t");
}
//每次到外面就进行换行
System.out.println();
}
//------------------
//迭代:每次调用这个值的时候进行刷新;
A+=1;//迭代
i++;//迭代
//------------------
/*for循环*/
1.最先执行初始化步骤,可以声明一种类型,可以初始化一个或者多个循环控制变量;也可以是空语句;
2.然后检查boolean表达式;如果为true,进入循环体执行,如果为false,跳过循环体不执行,顺序执行for循环后面的语句;
3.执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减);
4.再次检查boolean表达式;重复上述步骤;
//------------------
增强型for循环
1.java5引入了一种主要用于数组或集合的增强型for循环.
2.java增强for循环语法格式如下:
for(声明语句 : 表达式){
//代码句子
}
3.声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配;
其作用域限定在循环语句块,其值与此时数组元素的值相等;
4.表达式:表达式是要访问的数组名,或者是返回值为数组的方法;
代码示例:
int[] numbers={10,20,30,40};
for(int x:numbers){
//numbers数组里面的值,皆赋值给了X;
System.out.println(x);
}
//数组是一种数据结构;
break && continue
break:
1.break在任何循环语句的主题部分,均可用break控制循环的流程.
2.break用于/*强行退出循环*/,不执行循环中剩余的语句(break语句也在switch语句中使用);
//-----------
continue:
1.continue语句用在循环语句体中,用于/*终止某次循环过程*/,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定;
//-----------
关于goto关键字:
1.goto关键字很早就在程序设计语言中出现,尽管goto仍是java的一个保留字,但并未在语言中得到正式使用;
2.java没有goto,然而,在break和continue这两个关键字的身上,
我们仍然能看出一些goto的影子---带标签的break和continue
3."标签"是指后面跟一个冒号的标识符,例如: label:
4.对java来说唯一用到标签的地方实在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通畅只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方;
label代码示例:
//打印101-150之间所有的质数;
//质数是指在大于1的自然数中,除了1和它本身以外不再有其他因素的自然数;
//标签形式(不建议使用)
int count = 0;
outer:for(int i=101;i<150;i++){
for(int j=2;j<i/2;j++){
//将i/2得到1/2的i,将j自增到一半,求余,皆不可被整除;
//则其为质数;
if(i % j==0){
//跳转回label标签处;
continue outer;
}
System.out.println(i+" ");
}
}
//-----------
流程控制练习:
//打印三角形5行
代码示例:
//将三角形拆分打印输出
//先打印左上角空格;再打印左半部分三角形;
for(int i=1;i<=5;i++){
//由行思考,第一行输出5个空格;
//第二行输出4个,第三行输出3;第五行输出1;
//之后再在第一行输出一个*号;第二行输出2个,第五行输出5个;
for(int j=5;j>=i;j--){
System.out.print(" ");//不进行换行操作;交由后面
}
//已测试可以输出倒三角空格,则再建立一个for循环
//在去第一行打印出5个空格时,换行之前;添加左半部分三角形;
//第一次输出一个星号,这个是正序三角形;
for(int j=1; j<=i ;j++){
System.out.print("*");//不进行换行操作;交由后面
}
//好像再复制多一份上方for循环打印*号即可;
//这样的话,最上方,还缺一点*号,不是太好看,不过也算三角形
//中间的条件判断不是j<=i,而是j<i;这样就不会少一个星号了;
//因为原来设置j<=i,j=1,i=1,那么第一行也会输出,就会造成第一行两个星号;
//设置j<i,j=i的时候不执行,之后i++,j<i成立,执行循环体;
for(int j=1; j<i ;j++){
System.out.print("*");//不进行换行操作;交由后面
}
//换行
System.out.println();
}
反编译
java--->class(字节码文件)--->(反编译)java(Idea);
将需要反编译的class文件,存放至java后缀文件包下,再从idea中打开即可;可进行查看源代码;