流程控制
与电脑交互的scanner
scanner对象
- 之前我们学习的基本语法中我们并没有实现程序和人的交互,但Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入
- 基本语法
Scanner s = new Scanner(System.in);
-
通过Scanner类的next()与nextLine(方法)获取用户输入的字符串,在读取前我们一般需要使用hasNext()与hasNextlin()判断是否还有输入的数据。
- 首先创建一个main方法–>调用工具类scanner:new一个scanner(System.in)–>String 输入名= scanner.nextLine()–>判断用户是否还有输入if(hasnextLine()){}。输出用户输入的内容。
-
next()
- 一定要读取到有效字符才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
- 只有输入有效字符后才将其后输入的空白作为分隔符或者结束符
- next()不能得到哎呦空格的字符串
package Scanner; import java.util.Scanner; public class Dmeo1 { public static void main(String[] args) { //创建一个扫描器的对象,用于接收键盘 ‘’ Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接收:"); //判断用户有没有输入字符串 if (scanner.hasNext()){ //使用next方式接收 String str = scanner.next(); System.out.println("输入的内容为:"+str); } //关闭scanner scanner.close();//凡是使用IO流的类,用完之后一定要关掉,否则会一直运行,占用资源 } }
-
next()
- 以Enter为结束符,也就是说next()方法可返回的是输入回车之前输入的所有字符。
- 可以获得空白。
package Scanner; import jdk.swing.interop.SwingInterOpUtils; //Scanner s = new Scanner(System.in); import java.util.Scanner; public class Dmeo02 { public static void main(String[] args) { //从键盘接收数据 Scanner scanner = new Scanner(System.in); System.out.println("使用nextLine方式接收"); //判断是否有输入,可以不使用判断 if (scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.println("输出的内容为:"+str); } scanner.close(); } }
package Scanner;
import jdk.swing.interop.SwingInterOpUtils;
//Scanner s = new Scanner(System.in);
import java.util.Scanner;
public class Dmeo03 {
public static void main(String[] args) {
//从键盘接收数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收");
//判断是否有输入
String str = scanner.nextLine();
System.out.println("输出的内容为:"+str);
scanner.close();
}
}
scnner进阶练习
- 二元求次幂运算练习
package Scanner;
//制作一个二元的次幂计算器
import java.math.BigDecimal;
import java.util.Scanner;
public class Dmeo04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Double f;
double p;
String M;
System.out.println("请输入数据:");
if (scanner.hasNextDouble()) {
f = scanner.nextDouble();//输入Double类型数据,比如输入2.0
System.out.println("输入次幂数:");//提示输入
p = scanner.nextDouble();//换行输入Double类型数据,比如输入3.0
System.out.println("输出的值为:" + Math.pow(f, p)); //输出的值为f的p次幂,8
}
scanner.close();
}
}
- 求和及平均数练习
package Scanner;
import java.util.Scanner;
public class Dmeo05 {
public static void main(String[] args) {
//我们可以输入多个数字,求其总和与平均数,每输入一个数字用回车键确认,通过输入非数字来结束输入并输出结果
Scanner scanner = new Scanner(System.in);
double sum = 0;//初始一个和
int m = 0;//定义个数
System.out.println("请输入数据:");
//通过循环语句判断是否还有输入,并对每一次输入进行求和和统计个数
while (scanner.hasNextDouble()) { //while是一个循环语句,
double x = scanner.nextDouble();//定义输入的类容,并判断输入类容是否为条件类型
m = m+1;//m=m++,将输入的个数赋值给m
sum = sum + x;//将输入的数值求和赋值给sum2
System.out.println("这是您输入的第"+ m + "个数据,和为:"+ sum);
}
System.out.println(m + "个数的平均值为:"+ sum/m);
System.out.println(m + "个数的和为:"+sum);
scanner.close();
}
}
顺序结构
- java的基本结构就是顺序结构,除非特别指明,否者就是按顺序一句一句的执行。
- 顺序结构是最简单的语法结构。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R33wjQih-1635855204968)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211024171132967.png)]
- 语句与语句之间,框与 框之间是按照从上到下的顺序进行的,它是由若干个一次执行的处理步骤组成的,它是任何算法都离不开的一种基本的算法结构
package struct;
public class SunXuDemo01 {
public static void main(String[] args) {
System.out.println("hello1");
System.out.println("hello2");
System.out.println("hello3");
System.out.println("hello4");
System.out.println("hello5");
/*输出的顺序为
hello1
hello2
hello3
hello4
hello5
*/
}
}
选择结构
- 选择结构的类型
- if单选择结构
- if双选择结构
- if多选择结构
- 嵌套的if结构
- switch多选择结构
if单选择结构
- 我们很多时候需要去判断一个东西是否可行,然后我们才会去执行,这样一个过程在程序中用if语句来表示
- 语法
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
package struct;
import java.util.Scanner;
public class IfDemo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输出一个内容:");
String s = scanner.nextLine();
if (s.equals("hello")) { //s.equals:判断字符串是否相等
System.out.println("输出的内容为:" + s);//如果输入的值为设定值,才会输出结果,如果输出的值不是设定值,则不会输出结果
}
scanner.close();
}
}
if双选择结构
- 现在有个需求,公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发。这样的用一个if就告白不顶,我们需要有两个判断,需要一个双选择结构,所以就有了if-else结构。
- 语法
if(布尔表达式){
//如果布尔表达式为true
}else{
//如果布尔表达式为false
}
package struct;
import java.util.Scanner;
public class IfDemo02 {
public static void main(String[] args) {
//考试结果大于60及格,否则不及格
Scanner scanner = new Scanner(System.in);
System.out.println("请输入分数");
int score = scanner.nextInt();
if (score>=60){
System.out.println("及格");//输入大于60的输出及格
}else {
System.out.println("不及格");//输入不在这个范围内的不及格
}
}
}
if多选择结构
- 我们发现刚才的代码不符合实际情况,真实情况还可能存在ABCD…等多种结果,存在区间多级判断。比如90-100就是A,80~90就是B…。在生活中我们的选择常常也不只是两个,所以我们需要一个多选择结构来处理这些问题。
- 语法
if(布尔表达式1){
//如果布尔表达式1的值为true
}else if (布尔表达式2){
//如果布尔表达式2的值为true
}else if (布尔表达式3){
//如果布尔表达式3的值为true
}else{
//如果以上布尔表达式的值都不为true
}
package struct;
import java.util.Scanner;
public class IfDemo03 {
public static void main(String[] args) {
//将成绩分为多个等及
/*
if 语句至多有一个 else 语句,else 在所有 else if 语句之后,
if 语句可以有多个 else if 语句,他们必须在 else 语句之前
如果其中一个 else if 被判断为 true,则结束判断,其它的 else if 及 else 语句将被跳过。
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩");
int score = scanner.nextInt();
if (score == 100) {
System.out.println("恭喜满分");
}else if (80 <= score && score< 100){
System.out.println("优秀");
}else if (70 <= score && score< 80){
System.out.println("良好");
}else if (60 <= score && score< 70){
System.out.println("及格");
}else if (0 <= score && score< 70){
System.out.println("不及格");
}else {
System.out.println("成绩不合法");
}
scanner.close();
}
}
嵌套的if结构
- 使用嵌套的 if…else 语句是合法的。也就是说你可以在 if 或者 else if 语句中使用 if 或者 else if 语句。你可以像 if 语句一样嵌套 else if…else
- 语法
if(布尔表达式 1){
如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
如果布尔表达式 2的值为true执行代码
}
}
swich多选择结构
-
多选择结构还有一个实现的方法就是 switch case 语句
-
switch case 语句判断一个变量与一系列值中的某个值是否相等,每个值称为一个分支。
-
switch 语句中的变量类型可以是
- byte、short、int或者char。
- 从Java SE 7 开始,switch 支持字符串 String 类型值了。
- 同时 case 标签必须为字符串常量或者自变量。
package struct; public class SwitchDemo01 { public static void main(String[] args) { //case 穿透,break 跳出循环,如果不加 break ,则会被击穿,所有的条件都会被输出。case 语句必须加 break 。 // switch 匹配一个具体的值 char grade = 'C'; switch (grade){ case 'A': System.out.println("优秀"); break; case 'B': System.out.println("良好"); break; case 'C': System.out.println("及格"); break; case 'D': System.out.println("还需努力"); break; case 'E': System.out.println("挂科"); default: System.out.println("未知等级"); } } }
循环结构
- while 循环
- do…while 循环
- for 循环
- 在Java 5中引入了一种主要用于数组的增强型 for 循环
while 循环
- while 是最基本的循环,它的结构为:
while(布尔表达式){
//循环内容
}
-
只要布尔表达式为 true ,循环就会一直执行下去。
-
我们大多数情况是会让循环停止下来的,我们需要让表达式失效的方式结束循环。
package struct; //有限循环 public class WhileDmeo01 { public static void main(String[] args) { int i = 0; while (i<102){ //定义循环的范围,让循环停下来 i++; System.out.println(i);//当i=102时,程序停止 } } }
-
少部分情况需要循环一直执行,比如服务器请求响应监听等。
-
循环条件一直为 true 就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者找出程序卡死崩溃。
-
思考:计算1+2+3+…+100
package struct; //计算1+2+2+...+100=? public class WhileDmeo02 { public static void main(String[] args) { int i = 0; //初始i=0 int sum = 0; //初始sum=0 while (i<=100){ //定义范围 i<100 i++; //i自增 sum = sum + i;//让sum=sum+i System.out.println(sum);//输出sum=5050 System.out.println(i);//输出i=i++=100 } } }
do…while 循环
- 对于 while 语句二元,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
- do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次,do while 是每次先执行才会判断是否满足条件是否继续执行。
do{
//代码语句
}while(布尔表达式)
package struct;
public class DoWhileDmeo01 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
i++;
sum=sum+i;
}while (i<100);
System.out.println(sum );//输出5050
}
}
-
while 和 do…while 的区别
-
while 先判断后执行do…while 是先执行后判断。
-
do…while 总是保证循环体至少被执行一次!这是他们的主要区别。
package struct; // while 和 do while 的区别 public class DoWhileDmeo02 { public static void main(String[] args) { int a = 0 ; while (a< 0){ a++; System.out.println(a);//不会输出内容,while 循环是先判断,后执行。 } System.out.println("-------------------------------------------------"); do { a++; }while (a< 0); System.out.println(a);//输出 0 ,do while 循环换是先执行后判断 } }
-
for 循环※
- 虽然所有循环结构都可以用 while 或者 do…while 表示,但Java提供了另一种语句——for 循环,使一些循环结构变得更加简单。
- for 循环语法是支持 迭代的一种通用结构,是最有效、最灵活的循环结构。
- for 循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化;布尔表达式;更新){
//代码语句
}
练习1:计算0~100直接奇数、偶数的和。
package struct;
public class ForDemo01 {
public static void main(String[] args) {
//输出100以内的奇数、偶数和
int oddsum = 0;
int evensum = 0;
for (int i = 0; i <= 100; i++) {
if (i%2!=0){ //i/2的模不等于0
oddsum+=i;
System.out.println("奇数和等于:"+oddsum);//输出奇数之和,奇数和等于:2500
}else {
evensum+=i;
System.out.println("偶数和等于:"+evensum);//输出偶数之和,偶数和等于:2550
}
}
}
}
练习2:用while或for循环输出1~1000之前能被5整除的树,并且每行3个。
package struct;
public class ForDemo02 {
//输出1000以内的所有整除5的值,每三个换行
public static void main(String[] args) {
int a = 0;
for (int i = 0; i <= 1000; i++) {
if (i%5==0){ //定义整除5的数
System.out.print(i+" "); //输出整除5的数+空格
if (i%15==0){ //选择整除15的数
System.out.println(); //输出换行
}
}
}
}
}
练习3:打印九九乘法表。
package struct;
public class ForDemo03 {
//输出9 9 乘法表
public static void main(String[] args) {
for (int i = 1; i < 10; i++) { //先定义一个1~9的for循环
for (int a = 1;a<= i;a++ ){ //在上面这个循环的基础上,在进行每一次循环的时候,将这个for循环里面的条件全部循环一次。为了避免重读,条件为:a<=i。
System.out.print(i+"×"+a+"="+a*i+" ");//输出循环
if (a>=i){
System.out.println(); //当循环完9之后进行换行
}
}
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67W5JbDD-1635855204971)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025230829237.png)]
增强for循环
- 这里我们只是做一个了解,之后学习数组的时候我们会重点使用。
- Java 5 引入了一种主要用于数组或集合的增强型 for 循环。
- Java 增强 for 循环语法格式如下:
for(声明语句:表达式){
//代码语句
}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是访问的数组名,或者是返回值为数组的方法。
break continue
break
在任何循环语句的均可用break 控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用,用于防止case击穿)
package struct;
public class BreakDemo01 {
//break 终止循环
public static void main(String[] args) {
int i= 0 ;
while (i<100){
i++;
System.out.println(i);
if (i==30){
break;//终止循环,循环进行到30就停止了
}
}
}
}
continue 语句
用在循环语句体中,用于跳过某次循环过程,进行下一次是否执行循环的判定。
package struct;
public class ContinueDemo02 {
//输出1~100中不能被整除10的数
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) { //定义一个0~100的for循环
if (i % 10 == 0) { //如果这个数能整除 10,则换行并 跳过此次循环的结果
System.out.println();
continue; //continue,跳过此次循环的将结果。
}
System.out.print(i + " "); //输出
}
}
}
关于goto关键字
- goto 关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式的使用;Java没有goto。然而,在break和continue这两个关键字身上,我们仍然能看出一些goto的影子—带标签的break和continue。
- “标签”是指后面跟一个冒号的标识符,例如:label:
- 对Java来说,唯一用到标签的地方就是在循环语句之前。而在循环之前设置标签的唯一理由 是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,他们就会中断到标签存在的地方。
package struct;
public class GoToDemo01 {
//打印100~150之间的质数
public static void main(String[] args) {
int count = 0;
//不建议使用
author:for (int i = 100; i < 150; i++) { //输入标签:author,标签内容为后面的for循环
for (int a = 2;a < i/2;a++){ //定义一个a的for循环,为了输出质数,a最小为2,最大为i/2,a自增循环
if (i%a == 0){
continue author; //当i能整除a时,跳过循环,
}
}System.out.print(i + " ");
}
}
}
打印三角形
package struct;
public class TextDemo01 {
public static void main(String[] args) {
//打印5行的三角形
for (int i = 1; i <= 5; i++) { //定义五行的for循环
for (int j = 5; j >= i; j--) { //定义空白区域
System.out.print(" "); //输出空白区域
}
for (int j = 1; j <= i; j++) { //定义三角形的左半边
System.out.print("*"); //输出三角形的左半边
}
for (int j = 1; j <i ; j++) { //定义三角形的右半边
System.out.print("*"); //输出三角形的右半边
}
System.out.println();
}
}
}
i + " ");
}
}
}
### 打印三角形
```java
package struct;
public class TextDemo01 {
public static void main(String[] args) {
//打印5行的三角形
for (int i = 1; i <= 5; i++) { //定义五行的for循环
for (int j = 5; j >= i; j--) { //定义空白区域
System.out.print(" "); //输出空白区域
}
for (int j = 1; j <= i; j++) { //定义三角形的左半边
System.out.print("*"); //输出三角形的左半边
}
for (int j = 1; j <i ; j++) { //定义三角形的右半边
System.out.print("*"); //输出三角形的右半边
}
System.out.println();
}
}
}