JAVA流程控制
一、用户交互Scanner
通过Scanner类来获取用户的输入。
基本语法:Scanner sc=new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取之前一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据;
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接受");//输入Hello World,输出Hello
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String str=scanner.next(); // 程序会等待用户输入完毕
System.out.println("输入的内容是"+str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源,要养成好习惯用完就关掉
scanner.close();
}
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接受");//输入Hello World,输出Hello World
//判断用户有没有输入字符串
if(scanner.hasNextLine()){
//使用nextLine方式接收
String str=scanner.nextLine(); // 程序会等待用户输入完毕
System.out.println("输入的内容是"+str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源,要养成好习惯用完就关掉
scanner.close();
}
也可以不使用hasNext()与hasNextLine()判断是否还有输入的数据,直接使用Scanner进行接收;
练习:
public static void main(String[] args) {
// 我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车进行确认,通过输入非数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
double sum=0.0;
int num = 0;
while(scanner.hasNextDouble()){
double v = scanner.nextDouble();
num++;
sum = sum + v;
}
System.out.println(num+"个数的总和:"+sum);
System.out.println("平均数:"+sum/num);
scanner.close();
}
注意:这里体会到了进度丢失的问题;最简单的解决方式就是使用BigDecimal类进行计算(nextBigDecimal())
二、顺序结构
JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句的执行。
顺序结构就是最简单的算法结构。
语句与语句之间,框与框之间是按从上到下的顺序进行执行的,它是由若干个依次执行的处理步骤组成的,他是任何一个算法都离不开的一种基本的算法结构。
三、选择结构(★★★★★)
if 单选择结构
语法:
if(布尔表达式){
// 如果布尔表达式为true则将执行的语句
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//ewuals():判断字符串是否相等
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("End");
scanner.close();
}
if 双选择结构
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if(i>60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
scanner.close();
}
if 多选择结构
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if(i==100){
System.out.println("恭喜满分");
}else if(i<100 && i>=90){
System.out.println("A");
}else if(i<90 && i>=80){
System.out.println("B");
}else if(i<80 && i>=70){
System.out.println("C");
}else if(i<70 && i>=60){
System.out.println("D");
}else if(i<60 && i>=0){
System.out.println("不及格");
}else{
System.out.println("成绩不合法");
}
scanner.close();
}
注意:
if语句至多有一个else语句,else语句在所有的else if语句之后;
if语句可以由若干个else if语句,他们必须在else 语句之前;
一旦其中一个else if语句检测到为true,其他的else if以及else 语句都将跳过执行。
嵌套的if结构
public static void main(String[] args) {
boolean beauty=true;
boolean cute=true;
boolean higt=false;
if(beauty){
if(cute){
System.out.println("漂亮又可爱");
}
if(higt){
System.out.println("又高又漂亮");
}
}
}
思考:当我们需要找一个数,在1-100之间,那我们就可以嵌套判断,1-50,51-100,进行分层
switch多选择结构
switch case 语句判断一个变量与一系列值中的某个值是否相等,每个值称为一个分支。
switch语句中的变量类型可以是:
- byte、short、int、char、String
- 同时case标签必须为字符串常量或字面量
public static void main(String[] args) {
// case 穿透现象 :如果不加break,则把后面的也进行输出,直到遇到break或者结束
char grade = 'C';
switch(grade){
case 'A':
System.out.println("优秀");
break; // 可选
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("及格");
break;
default:
System.out.println("不合法");
}
}
public static void main(String[] args) {
// JDK7新特性,表达式结果可以是字符串!
// 字符的本质还是数字
// 反编译 java-class(字节码文件)-反编译(IDEA)
String name="美国";
switch(name){
case "中国":
System.out.println("祖国");
break;
case "美国":
System.out.println("漂亮国");
break;
case "英国":
System.out.println("英国");
break;
default:
System.out.println("未知");
}
}
break 最好每一个都写上!!!!
四、循环结构
while循环
public static void main(String[] args) {
// 输出1-100
int i=0;
while ( i < 100 ){ // while(true)——死循环
i++;
System.out.println(i);
}
//计算1+2+3+...+100的和
int j=0;
int sum=0;
while(j<100){
j++;
sum+=j;
}
System.out.println(sum);
}
do...while循环
public static void main(String[] args) {
int a=0;
while(a<0){
System.out.println(a);
a++;
}
System.out.println("=======================");
do{
System.out.println(a);
a++;
}while(a<0);
}// 这是while和do...while的区别,下面的才输出a为0
for 循环★★★★★
注意:
最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
然后,检测布尔表达式的值。如果为true,循环体被执行,为false,循环终止,开始执行循环体后面的语句。
执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
再次检测布尔表达式,循环执行上面的步骤。
public static void main(String[] args) {
int a=1;//初始化条件
while(a<100){
System.out.println(a);//循环体
a+=2;//迭代
}
System.out.println("while结束");
for(int i=1;i<100;i++){ // 使用100.for 加回车,可以直接得到 for (int i = 0; i < 100; i++) {}
System.out.println(i);
}
System.out.println("for循环结束");
for (int i = 0; i < 100; i++) { // for(;;){}——死循环
}
}
练习:
public static void main(String[] args) {
//练习1:计算 0-100 之间奇数和偶数的和
int JiSum = 0; // oddSum
int OuSum = 0; // evenSum
for (int i = 1; i <= 100; i++) {
if(i%2==0){
OuSum+=i;
}else{
JiSum+=i;
}
}
System.out.println("奇数和"+JiSum);
System.out.println("偶数和"+OuSum);
}
public static void main(String[] args) {
//练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
int a=1;
int count=0;
//while方式
while(a>0&&a<=1000){
if(a%5==0){
System.out.print(a+" ");
count++;
}
if(count==3){
System.out.println("");
count=0;
}
a++;
}
//for方式
for (int i = 0; i <= 1000; i++) {
if(i%5==0){
System.out.print(i+"\t");
}
if(i%(5*3)==0){ //对15取模代表执行了3次
System.out.print("\n");
}
}
}
public static void main(String[] args) {
//练习3:打印九九乘法表
// 1.先打印第一列
// 2.把固定的1在用一个循环包起来
// 3.去掉重复项,j<=i
// 4.调整样式
for (int i = 1; i <= 9; i++) {
for (int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+j*i+"\t");
if(j==i){
System.out.println();
}
}
}
}
主要用于数组的增强型for循环
public static void main(String[] args) {
// 增强for循环
int[] numbers={10,20,30,40,50}; //定义数组
//遍历数组的元素
for(int x:numbers){ // 简化
System.out.println(x);
}
System.out.println("=====================");
for(int i=0;i< numbers.length;i++){
System.out.println(numbers[i]);
}
}
五、break&continue
public static void main(String[] args) {
//break
int i=0;
while(i<=100){
i++;
System.out.println(i);
if(i==20){
break;//终止循环
}
}
System.out.println("---------");
//continue
int j=0;
while(j<100){
j++;
if(j%10==0){
System.out.println();
continue; // 之后的内容不在执行,直接开始新的下一轮循环
}
System.out.print(j+" ");
}
System.out.println("---------");
}
注意:
break:在任何循环语句的主体部分,均可用break控制循环的流程;break用于强制退出循环,不执行循环中剩余的语句(Break也在switch语句中使用)
continue:用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
标签使用:了解即可
public static void main(String[] args) {
//打印101-150之间所有的质数
// 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
int count=0;
outer:for (int i=101;i<150;i++){
for(int j=2;j<i/2;j++){
if(i%j==0){
continue outer;
}
}
System.out.print(i+" ");
}
}
六、练习
打印三角形
public static void main(String[] args) {
// 打印三角形 5行
for (int i = 1; i <= 5; i++) {
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++){//打右边的星(比左边少1)
System.out.print("*");
}
System.out.println();
}
}