之前我们学的基本语法中我们并没有实现程序与人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入
基本语法
Scanner s = new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据
next():
package whysff.com.cnblogs.scanner;
import java.util.Scanner;
/**
* 扫描器01
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 3:58
*/
public class Demo01 {
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);
}
//凡是属于IO流的类使用完毕,及时关闭,否则会占用内存资源
scanner.close();
}
}
nextLine():
package whysff.com.cnblogs.scanner;
import java.util.Scanner;
/**
* nextLine
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 4:07
*/
public class Demo02 {
public static void main(String[] args){
//新建一个扫描器,用来接收建安输入
Scanner scanner = new Scanner(System.in);
System.out.println("=====测试使用nextLine方法接收=====");
if(scanner.hasNextLine()){
//使用nextLine方法接收
String str = scanner.nextLine();
System.out.println("输入的内容为:" + str);
}
scanner.close();
}
}
package whysff.com.cnblogs.scanner;
import java.util.Scanner;
/**
* 小案例:求和求平均值
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 5:02
*/
public class Demo05 {
public static void main(String[] args){
// 输入多个数字,并求和、平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并输出最后结果
// 先创建一个扫描器,接收键盘输入
Scanner scanner = new Scanner(System.in);
// 窗口提示请连续的输入几个数字,每个数字使用回车确认
System.out.println("=====求和、求平均值=====");
System.out.println("请连续的输入几个数字,并使用回车确认:");
// 定义和
double sum = 0.0;
// 定义输入数字的个数
int m = 0;
// while循环
while(scanner.hasNextDouble()){
//接收键盘的输入
double x = scanner.nextDouble();
//个数+1
m = m + 1;
//求和
sum = sum + x;
//输出第几个数,目前的和是多少
System.out.println("接收到的第" + m + "个数是" + x + ",目前的sum是:" + sum);
}
//输出结果
System.out.println("一共接收到" + m + "个数字");
System.out.println("这些数字的和为:" + sum);
System.out.println("这些数字的平均值为:" + sum/m);
//关闭扫描器
scanner.close();
}
}
JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行
顺序结构是最简单的算法结构
语句与语句之间,框与框之间都是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构
很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程用if语句表示
语法
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
package whysff.com.cnblogs.struct;
import java.util.Scanner;
/**
* if单选择
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 10:21
*/
public class IfDemo01 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入内容:");
String s = scanner.nextLine();
// equals:判断字符串是否相等
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("End");
scanner.close();
}
}
现在有一个需求,公司要收购一个软件,成功了就给人支付100W,失败了就自己找人开发。这样的需求用一个if就搞不定了,我们需要有两个判断,需要一个双选择结构,所以就有了if-else结构
语法:
if(布尔表达式){
//如果布尔表达式的值为true执行的语句
}else{
//如果布尔表达式的值为false执行的语句
}
package whysff.com.cnblogs.struct;
import java.util.Scanner;
/**
* if双选择
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 10:31
*/
public class IfDemo02 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你选择的方式:0=收购,1=开发");
String i = scanner.nextLine();
if(i == "0"){
System.out.println("我们选择收购公司!");
}else{
System.out.println("我们选择自主研发!");
}
scanner.close();
}
}
现实情况中,还可能存在ABCD多级判断,比如成绩的优良中差,所以我们也要引入一种多选择机构处理这类问题
语法:
if(布尔表达式1){
//如果布尔表达式1的值为true执行的语句
}else if(布尔表达式2){
//如果布尔表达式2的值为true执行的语句
}else if(布尔表达式3){
//如果布尔表达式3的值为true执行的语句
}else{
//如果以上布尔表达式的值都不为true执行的语句
}
package whysff.com.cnblogs.struct;
import java.util.Scanner;
/**
* if多级判断
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 11:39
*/
public class IfDemo03 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的成绩(0-100):");
double score = scanner.nextDouble();
/*
if 语句中至多只有一个else语句,else 语句在所有的 else if 语句之后
if 语句可以有若干个 else if 语句,它必须在 else 语句前
一旦其中一个 else if 语句检测为true ,其他的 else if 语句 else 都会跳过
*/
if(score >= 0 && score <= 100){
if(score >= 90 && score <= 100){
System.out.println("你的成绩" + score + "是优秀!");
}else if(score >= 70 && score < 90){
System.out.println("你的成绩" + score + "是良好!");
}else if(score >= 60 && score < 70){
System.out.println("你的成绩" + score + "是中等!");
}else{
System.out.println("你的成绩" + score + "是差!");
}
}else{
System.out.println("你的输入不合法,请重新输入");
}
scanner.close();
}
}
多选择机构还有一个实现方法就是switch case语句。
switch case 语句判断一个变量与一些列值中某个值是否相等,每个值称为一个分支。
switch语句中的变量类型可以是:
语法:
switch(expression){
case value :
//语句
break;
case value :
//语句
break;
//中间可以有任意数量的case语句
default :
//语句
}
? 众所周知,java程序是需要编译器编译为class文件,然后虚拟机执行class文件。有编译那么也一定有反编译。一个合格的程序员一定要有看源码的思想,为什么JDK7前Switch不支持string类型,但是JDK7就支持了吗?这不奇怪吗?它是如何实现的?再结合前面提到的,字符的本质其实还是数字能不能有点思路?我们带着这样一个疑惑去尝试打开class文件看一看。
? 但是class直接通过记事本打开是一堆乱码,这里我就借助IDEA进行反编译:
? 打开Project Structure——>打开项目的输出目录——>找到某个文件的class文件——>在Project选中某个java文件——>Show in Explorer——>将class文件拖动至对应的java文件所在位置。
? 刷新一下IDEA中的项目,就会发现多出来一个.class文件,这就是反编译之后的文件。
while是最基本的循环,它的机构是:
while(布尔表达式){
// 循环内容
}
只要布尔表达式为true,循环就会一直执行下去
大多数情况是会让循环停止,所以我们需要一个让表达式失效的方式来结束循环
少部分情况需要循环一直执行,比如服务器的请求响应监听等
循环条件一直为true就会造成无线循环【死循环】,这点要避免
package whysff.com.cnblogs.struct;
/**
* 求和1-100
*
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 3:42
*/
public class WhileDemo03 {
public static void main(String[] args){
// 数学王子高斯在九岁的时候解答的问题
// 定义一个和
int sum = 0;
//记录循环的次数
int m = 1;
//循环条件是
while(m <=100 ){
sum = sum + m;
m++;
}
System.out.println("从1加到100的结果为:" + sum);
}
}
对于while语句而言,如果不满足条件,则不能进入循环。但现实中也有这样一种情况:即使不满足情况也需要执行一次。
do...while循环和while循环相似,不同的是,do...while循环至少会执行一次
do{
//code
}while(布尔表达式);
While和do-While的区别:
package whysff.com.cnblogs.struct;
/**
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 3:58
*/
public class DoWhileDemo02 {
public static void main(String[] args){
int a = 0;
while(a<0){
System.out.println(a);
}
System.out.println("=====================");
do{
System.out.println(a);
}while(a<0);
}
}
虽然所有循环结构都可以用while或者do-while表示,但Java提供了另一种语句——for循环,使循环结构变的更加简单
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化; 布尔表达式; 更新){
//code
}
package whysff.com.cnblogs.struct.for_demo;
/**
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 5:12
*/
public class Demo01 {
public static void main(String[] args){
int a = 1;// 初始化条件
while(a <= 100){// 条件判断
System.out.println(a);// 循环体
a += 2;//迭代 // a = a + 2;
}
System.out.println("While循环结束!");
// 初始化 条件判断 迭代
for(int i=1; i<=100; i++){
System.out.println(i);
}
System.out.println("For循环结束");
/*
关于for循环的注意点!
最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句
然后,判断布尔表达式的值:如果为true,循环体被执行,如果为false,循环终止,开始执行循环体后面的语句
执行一次循环后,更新循环控制变量(迭代)
再次检测布尔表达式。循环执行上述过程
*/
for( ; ; ){
break;
}
}
}
练习1:计算0到100之间的奇数和偶数的和
package whysff.com.cnblogs.struct.for_demo;
/**
* 练习1:计算0到100之间的奇数和偶数的和
*
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 5:24
*/
public class Demo02 {
public static void main(String[] args){
int oddsum = 0;
int evensum = 0;
for(int i = 0; i <= 100 ; i++){
if(i %2 == 0){
evensum += i;
}else{
oddsum += i;
}
}
System.out.println("奇数的和为:" + oddsum);
System.out.println("偶数的和为:" + evensum);
}
}
练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
package whysff.com.cnblogs.struct.for_demo;
/**
* 练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
*
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 5:33
*/
public class Demo03 {
public static void main(String[] args){
for(int i = 1; i <= 1000 ; i++){
// 能被5整除就输出且不换行
if(i %5 == 0){
System.out.print(i + "\t");
}
// 一旦能被55整除就输出换行
if(i %(5*5) ==0){
System.out.println();
}
}
}
}
练习3:打印九九乘法表
package whysff.com.cnblogs.struct.for_demo;
/**
* 练习3:打印九九乘法表
*
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 10:41
*/
public class Demo04 {
public static void main(String[] args){
/*
先打印第一列
再把固定的1用一个循环封装起来
去掉重复出现的项
调整格式
*/
for(int i = 1; i <= 9 ; i++){
for(int j = 1; j <= i ; j++){
System.out.print(j + "*" + i + "=" + j*i + "\t" );
}
System.out.println();
}
}
}
这里对这部分内容进行初步的了解,之后数组重点学习
JDK5引入了一种主要用于数组或集合的增强型for循环
语法格式如下:
for(声明语句 : 表达式)
{
//code
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
package whysff.com.cnblogs.struct.for_demo;
/**
* 增强for
*
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 11:18
*/
public class Demo05 {
public static void main(String[] args){
// 定义一个数组
int[] numbers = {10,20,30,40,50};
// 普通for遍历数组
for(int i = 0; i <5 ; i++){
System.out.println(numbers[i]);
}
System.out.println("===================");
// 使用增强for遍历数组
for(int x : numbers){
System.out.println(x);
}
}
}
break在任何循环语句的主体部分,均可用break控制循环的流程。作用是强行退出循环,不执行循环中剩余的语句(break也在Switch语句中使用)
package whysff.com.cnblogs.struct.breakandcontinue;
import com.sun.org.apache.bcel.internal.generic.IfInstruction;
/**
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 11:36
*/
public class BreakDemo {
public static void main(String[] args){
int i = 0;
while(i < 100){
i++;
System.out.println(i);
if(i == 30){
break;
}
}
System.out.println("已经出来循环体啦");
}
}
continue语句用在循环体重,用于终止某次循环过程,作用是跳过循环体中剩余语句,接着进行下一次是否执行循环的判断!
package whysff.com.cnblogs.struct.breakandcontinue;
/**
* @author xLiu
* @version 1.0
* @create 2020.07.24 下午 11:40
*/
public class ContinueDemo {
public static void main(String[] args){
int i = 0;
while(i<100){
i++;
if(i%10==0){
System.out.println();
continue;
}
System.out.print(i+"\t");
}
/*
总结:
break直接跳出循环(辞职)
continue是仅跳过当前的单次循环,进入下一循环过程(请假)
*/
}
}
关于goto关键字
package whysff.com.cnblogs.struct;
/**
* 打印三角形
*
* @author xLiu
* @version 1.0
* @create 2020.07.25 上午 12:02
*/
public class Test01 {
public static void main(String[] args){
// 打印三角形,10行
for(int i = 1; i <= 10; i++){
// 打印空格,位于三角形的左上方区域
for(int j = 10; 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();
}
}
}
原文:https://www.cnblogs.com/whysff/p/13376343.html