天天看点

Java初学者之流程控制

流程控制

1、顺序结构

class  TestSortStruc
{
	public static void main(String[] args) 
	{
		int i=12;
		int j=i+1;
		System.out.println(j);
	}
}  
           

2、分支结构(if-else;switch-case)

If-else语句:

格式:三种

执行if-else语句时,一定会选择其中的一个路径执行,而且也仅会选择一条路径。

1、 条件判断之间可以嵌套

2、 一、如果多个条件之间是“互斥”关系,多个条件语句上下顺序是自由的。

二、如果多个条件之间存在“包含”关系,要求范围小的写在范围大的上面

class  TestSortStruc
{
	public static void main(String[] args) 
	{
		int age=20;
		if(age>18){

			System.out.println("你老大不小了");

		}else{

		System.out.println("你还年轻");

			}


			if(age>130||age<0){
				System.out.println("你估计不是人");
				}else if(age<30){
					System.out.println("人家只有"+age+"岁");
					}
					else{
						System.out.println("哈哈,你妹的");

					}		

	}
}
           

!新知识java输入语句

//1.导包
import java.util.Scanner;
class TestScanner 
{
	public static void main(String[] args) 
	{
		//2.创建一个Scanner类的对象
		Scanner s=new Scanner(System.in);
		System.out.println("请输入一个字符串");
		//3.调用此对象的相应的方法,完成键盘输入的值的获取
		 // next():表示从键盘获取一个字符串
		String str=s.next();
		System.out.println("请输入整数:");
		int a=s.nextInt();
		System.out.println(str);
		System.out.println(a);

	}
}		
           

switch…case:

/*
switch(变量值){
	case 值1;

	case 值2:

	case 值3:

	default:

}
           

1.根据变量的值,选择相应的case去判断,一旦满足case条件,就执行case的相应语句。如果没有break或者已经到结尾的话,会继续执行其下的case语句。

2.default:是可选的,而且位置是灵活的。

3.变量可以是哪些类型?char byte short int 枚举 String

4.case 条件:其中条件只能是值,不能是取值范围

*/
class	TestSwitch1	 
{
	public static void main(String[] args) 
	{
		int i=2;
		switch(i){
			case 0:
				System.out.println("zero");
			break;
			case 1:
				System.out.println("one");
			break;
			case 2:
				System.out.println("two");
			break;
			case 3:
				System.out.println("three");
			break;
			default:
				System.out.println("Hello World!");
			break;
	             }
	}
}
           

当多个case语句处理的语句块一致时,可以统一来书写。

一定情况下switch-case与if-else之间可以相互转换。

如果判断的条件不多时,优先使用switch-case.

如果使用范围条件判断,使用if-else.

Eg:判断日期为一年中的第几天
import java.util.Scanner;
class Date 
{
	public static void main(String[] args) 
	{
		Scanner s =new Scanner(System.in);
		System.out.println("请输入年份:");
		int year =s.nextInt();
		System.out.println("请输入月份:");
		int month =s.nextInt();
		System.out.println("请输入日期:");
		int day =s.nextInt();
		int sum= 0;//用来记录month月day日
		//使用switch-case
		switch(month){
			case 12:
				sum +=30;
			case 11:
				sum +=31;
			case 10:
				sum +=30;
			case 9:
				sum +=31;
			case 8:
				sum +=31;
			case 7:
				sum +=30;
			case 6:
				sum +=31;
			case 5:
				sum +=30;
			case 4:
				sum +=31;
			case 3:
				if((year % 4==0 && year % 100 !=0)||year % 400==0){
				sum +=29;
			}else{
				sum +=28;
			}
			case 2:
				sum +=31;
			case 1:
				sum +=day;
			}
			System.out.println("这个月份为这一年第几天:");
			System.out.println(sum);
	}
}
           

3、 循环结构(while;do…while;for( ; ; ))

一、for循环

/*

1、初始化条件

2.循环条件

3、迭代条件

4、循环体

for循环结构:

1.格式:

for(1;2;3){

//4

}

2.执行过程:1-2-4-3-2-4-3-…-4-3-2

即直至循环条件不满足,退出当前的循环

//题目:输出100以内的所有偶数及所有偶数的和(累加的思想)及偶数的个数
	int sum=0;//用来记录所有偶数的和
	int count=0;
	for(int i=1;i<=100;i++){//100以内的自然数的遍历
		if(i%2==0){
			System.out.println(i);
			sum +=i;
			count++;
		}
	  }
	  System.out.println("总和为:"+ sum);
	  System.out.println("100以内偶数的个数为:"+ count);
	}
}

Eg:水仙花数:
class ShuiXianHua 
{
	public static void main(String[] args) {
		for(int i=100;i<1000;i++){//实现100--999的遍历
			int j1=i/100;//百位
			int j2=(i-j1*100)/10;//十位
			int j3=i%10;//个位
			if(i==j1*j1*j1+j2*j2*j2+j3*j3*j3){
				System.out.println(i);
			}
		}
	}
}
           

二、while循环

/*

1、初始化条件

2.循环条件

3、迭代条件

4、循环体

1.格式:

1

while(2){

4

3

}

2.for循环与while可以相互转换

*/
class TestWhile 
{
	public static void main(String[] args) 
	{
		//100以内的偶数的输出,及其和
		int i=1;
		int sum=0;
		while(i<=100){
			if(i%2==0){
		System.out.println(i);
		sum +=i;
		}
		i++;
		}
		System.out.println(sum);
		
	}
}
           

三、do-while循环

/*

1、初始化条件

2.循环条件

3、迭代条件

4、循环体

1.格式:

1

do{

4

3

}while(2)

2.do-while与while的区别:do-while循环至少会执行一次!

class  TestDoWhile
{
	public static void main(String[] args) 
	{
		int i=1;
		do{
			if(i%2==0){
				System.out.println(i);

			}
			i++;
		}while(i<100);


		//do-while与while的区别
		int j=10;
		do{
			System.out.println(j);
			j++;
		}while(j<10);//10


		while(j<10){
			System.out.println(j);
			j++;
		}//无结果
	}
           

}

四、无限循环问题

/*

输入个数不确定的整数,并判断输入的正数和负数的个数,输入0时终止

无限循环

for( ; ; ){

}

或者

while(true){

}

说明:一般情况下,在无限循环内部要有程序终止的语句,使用break实现。若没有,那就是死循环。

import java.util.Scanner;
class	TestExer 
{
	public static void main(String[] args) 
	{
		Scanner s=new Scanner(System.in);
		int a=0;//记录正数的个数
		int b=0;//记录负数的个数
		//for(;;){
		while(true){
		System.out.println("请输入一个整数:");
		int num=s.nextInt();
		if(num>0)
			a++;
		else if(num<0)
			b++;
			else
				break;
		}
		System.out.println("正数的个数为:" + a);
		System.out.println("负数的个数为:" + b);
	}
}
           

五、嵌套循环

/*

嵌套循环:循环中还可以声明循环。相当于内层循环的整体充当外层循环的循环体

for( ; ; ){

for( ; ; ){

}

}

或者

while(){

for( ; ; ){

}

}

class  TestForFor
{
	/*
	*****
	*****
	*****
	*****
	*/
	public static void main(String[] args) 
	{
		for(int j=0;j<4;j++){//外层循环控制行数
			for(int i=0;i<5;i++){//内层循环控制列数
				System.out.print("*");
			}
			System.out.println();
		}

		/*
		*
		**
		***
		****
		*/
		for(int j=0;j<4;j++){//外层循环控制行数
			for(int i=0;i<j+1;i++){//内层循环每行输出j+1个
				System.out.print("*");
			}
			System.out.println();
		}

		/*
		*****
		****
		***
		**
		*
		*/
		for(int i=0;i<5;i++){
			for(int j=0;j<5-i;j++){
				System.out.print("*");
			}
			System.out.println();
		}

		/*
		打印如下图形
		上半部分:
		 ----*
		 ---* *
		 --* * *
		 -* * * *
		 * * * * *
		 i   k-  j*  k=4-i  j=i+1
		 0   4   1
		 1   3   2
		 2   2   3
		 3   1   4
		 4   0   5
		 下半部分:
		 -* * * *
		 --* * *
		 ---* *
		 ----*
		 i   k-   j*    k=i+1   j=4-i
		 0   1    4
		 1   2    3
		 2   3    2
		 3   4    1
		*/


		//上半部分:
		for(int i=0;i<5;i++){
			for(int k=0;k<4-i;k++){
				System.out.print("-");
			}
			for(int j=0;j<i+1;j++){
				System.out.print("* ");
			}
			System.out.println();
		}
		//下半部分:
		for(int i=0;i<4;i++){
			for(int k=0;k<i+1;k++){
				System.out.print("-");
			}
			for(int j=0;j<4-i;j++){
				System.out.print("* ");
			}
			System.out.println();
		}
	}
}
           

六、for循环之打印乘法表

class  TestJiuJiu
{
	public static void main(String[] args) 
	{
		for(int i=1;i<=9;i++){//一共有9行
			for(int j=1;j<=i;j++){//每行有i个等式
		System.out.print(i +"*"+j+"="+i*j+"\t");
	}
	System.out.println();
		}
	}
}
           

七、for循环之提高效率输出质数

/*
100以内的所有质数
加上break和Math.sqrt()可以提高运行效率
*/
class TestPrimeNumber 
{
	public static void main(String[] args) 
	{
		boolean flag=false;
		long start=System.currentTimeMillis();//获取系统当前的毫秒数
		for(int i=2;i<=100;i++){//实现100以内的自然数的遍历
			//判断i是否为一个质数
			for(int j=2;j<= Math.sqrt(i);j++){
				if(i%j==0){
					flag=true;
					break;
				}
			}
			if(!flag){//if(flag==false)
		        System.out.println(i);
			}
			flag=false;
			}
			long end=System.currentTimeMillis();
			System.out.println("所花费的时间为:" + (end - start));
			//35535--加上break:10059--使用Math.sqrt():3115

	}
}
/*
break和continue中标签的使用
*/
class TestPrimeNumber1 
{
	public static void main(String[] args) 
	{
		long start=System.currentTimeMillis();//获取系统当前的毫秒数
		1:for(int i=2;i<=100000;i++){//实现100以内的自然数的遍历
			//判断i是否为一个质数
			for(int j=2;j<= Math.sqrt(i);j++){
				if(i%j==0){
					continue 1;
				}
			}
		        System.out.println(i);
			}
			long end=System.currentTimeMillis();
			System.out.println("所花费的时间为:" + (end - start));
 	      }
     }
}
           

八、for循环之输出完数

/*
输出1000以内的所有完数
*/
class TestWanShu 
{
	public static void main(String[] args) 
	{
		int factor=0;
		for(int i=1;i<=1000;i++){
			//每执行完一次如下的循环,就会将i的所有的因子累加到factor中
			for(int j=1;j<i;j++){
				if(i%j==0){
					factor +=j;
				}
			}
			if(i==factor){
		System.out.println(i);
			}
		factor=0;
		}
	}
}
           

九、break和continue关键字的使用

/*

break:使用在switch-case中或者循环中

如果使用在循环中,表示:结束当前循环

continue:使用在循环结构中

表示:结束当次循环

关于break和continue中标签的使用(了解)

label:for( ; ; ){

for( ; ; ){

break label;

continue label;

}

}

class TestBreakContinue 
{
	public static void main(String[] args) 
	{
		/*for(int i=1;i<=10;i++){
			if(i%4==0){
				//break;//跳出当前循环
				continue;//跳出当次循环
				//在break和continue语句之后不能添加其他语句,应为永远也不可能执行!
			}
		System.out.println(i);
	}
	*/
	label:for(int i=1;i<5;i++){
		for(int j=1;j<=10;j++){
			if(j%4==0){
				//break;
				//continue;
				//break label;
				continue label;
			}
			System.out.print(j);
		}
		System.out.println();
       }
	}
}
           

继续阅读