java程序控制结构分三种:顺序结构、选择结构、循环结构
1.顺序结构即从上往下、从左往右依次执行
2.选择结构:分为if...else 结构、switch ..case 结构,其中if..else
又分为 if 结构、 if...else 结构.... if ..else if ..else 结构:
3:循环结构:分为for循环、while循环、do .. while 循环
一 :if ..else 介绍:
/*
1.else 结构是可选结构
2.如果if 执行语句只有一个,{}可以省略,但是一般不建议省略
3.if-else结构可以嵌套,但是一般不要超过3层
*/
//1.if 结构
int a=100;
int b=50;
if(a>b)
{
System.out.println("a 是最大值");}
//2.if ...else 结构
int a1=100;
int b1=150;
if(a1>b1)
{
System.out.println("a1 是最大值");}
else
{System.out.println("b1 是最大值");}
//3.if ..else..if 结构
Scanner scan = new Scanner(System.in);
System.out.println("请输入身高:");
int shengao=scan.nextInt();
System.out.println(shengao);
System.out.println("有钱吗:");
String isWealth=scan.next();
System.out.println(isWealth);
System.out.println("帅不帅?:");
boolean isHandsome=scan.nextBoolean();
System.out.println(isHandsome);
if (shengao>180&& isWealth.equals("有钱")&&isHandsome==true){
System.out.println("太好了。我要嫁!");
}
else if (shengao>180|| isWealth.equals("有钱")||isHandsome==true){
System.out.println("不挑了,嫁了吧!");
}
else{
System.out.println("滚一边去!");
}
/*
4.从键盘输入三个数 并按从小到大排列:
思路:第三个数可以在下滑线的情况:_n1_n2_或 _n2_n1_
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数:");
int n1= scan.nextInt();
System.out.println("请输入第二个数:");
int n2= scan.nextInt();
System.out.println("请输入第三个数:");
int n3= scan.nextInt();
if (n1>n2){
if(n3>n1){
System.out.println("排序为:" +n2+","+n1+","+n3);
}
else if (n3
else
{System.out.println("排序为:" +n2+","+n3+","+n1);}
}
else if (n1
if(n3>n2){
System.out.println("排序为:" +n1+","+n2+","+n3);
}
else if (n3
else
{System.out.println("排序为:" +n1+","+n3+","+n2);}
}
二.switch....case 介绍:
/*
1.根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应的
case结构中,调用其执行语句。当调用完成执行语句后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch末尾结束为止。
2.break 可以使用在 switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
3.switch 结构中的表达式,只能是以下六种类型之一:byte、short、char、int、枚举类型、String类型
4.case 之后只能声明常量,不能声明范围
5.break 关键字是可选的
6.default:相当于if else中的else,default结构是可选的,而且位置灵活
//例题1
int number=3;
switch(number){
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
case 3:
System.out.println("three");
System.out.println("333");
System.out.println("666");
break;
case 4:
System.out.println("four");
defalut:
System.out.println("anyone else");
}
*/
//例题2:从键盘输入2019年的月份和日期,算出是这一年的第几天
Scanner scan = new Scanner(System.in);
System.out.println("请输入月份");
int month = scan.nextInt();
System.out.println("请输入天数");
int day = scan.nextInt();
int sumday = 0;
switch(month){
case 12:
sumday+=30;
case 11:
sumday+=31;
case 10:
sumday+=30;
case 9:
sumday+=31;
case 8:
sumday+=31;
case 7:
sumday+=30;
case 6:
sumday+=31;
case 5:
sumday+=30;
case 4:
sumday+=31;
case 3:
sumday+=28;
case 2:
sumday+=31;
case 1:
sumday+=day;
}
System.out.println(sumday);
/*例题3:从键盘输入某年的月份和日期,算出是这一年的第几天,
注:判断闰年的2个条件:
1)能被4正除,不能被100整除
2)能被400整除
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份");
int year = scan.nextInt();
System.out.println("请输入月份");
int month = scan.nextInt();
System.out.println("请输入天数");
int day = scan.nextInt();
int sumday = 0;
switch(month){
case 12:
sumday+=30;
case 11:
sumday+=31;
case 10:
sumday+=30;
case 9:
sumday+=31;
case 8:
sumday+=31;
case 7:
sumday+=30;
case 6:
sumday+=31;
case 5:
sumday+=30;
case 4:
sumday+=31;
case 3:
if((year % 4==0 && year%100!=0)|| year %400==0)
sumday+=29;
else
sumday+=28;
case 2:
sumday+=31;
case 1:
sumday+=day;
}
System.out.println(sumday);
三.for循环 介绍:
/*
for循环的结构:
for(1:2:4){
3
}
1.初始化条件
2.循环条件(为boolean类型)
3.循环体
4.迭代条件
执行顺序 1-2-3-4-2-3-4-2... 直到2为false,跳出循环
*/
// 例题1:求100内的偶数,及之和
int sum=0;
for(int i=1;i<100;i++){
if(i%2==0){
System.out.println(i);
sum+=i;
}
}
System.out.println(sum);
// 例题2:从键盘输入2个正整数,并求2个数的最大公约数,和最小公倍数,如 12和20的最大公约数为4, 最小公倍数为60
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个正整数:");
int m = scan.nextInt();
System.out.println("请输入第二个正整数:");
int n = scan.nextInt();
//获取两个数的最小数
int min = m
for(int i=min; i>0;i--){
if (m%i==0&&n%i==0){
System.out.println("最大公约数为:"+i);
break;//跳出循环
}
}
int max =m>n?m:n;
//求最小公倍数
for (int i=max;i<=m*n;i++){
if(i%m==0&&i%n==0){
System.out.println("最小公倍数为:"+i);
break;//跳出循环
}
}
// 例题3:求所有的水仙花数,即一个三位数的 个位立方+十位的立方+百位的立方=本身
for(int i=100;i<1000;i++){
int bw= i/100;
int sw=i%100/10;
int gw=i%10;
if(bw*bw*bw+sw*sw*sw+gw*gw*gw==i){
System.out.println(i);
}
四.while循环和 do..while循环 介绍:
/*
while 循环也包含四个条件:
1.变量初始化
2.循环条件
3.循环体
4.迭代条件
while 循环 的格式:
1
while(2){
3
4
}
注:
1)while 循环和for循环是可以相互转换的。
2) for 和while 终止循环的两种方法:1.循环条件为 false 2.使用break 关键字
*/
// 例题1:求 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);
// 例题2:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
Scanner scan =new Scanner(System.in);
int positiveNum=0;
int negativeNum=0;
System.out.println("请输入一个数:");
while (true){
int num = scan.nextInt();
if(num>0){
positiveNum++;
}
else if (num<0){
negativeNum++;
}
else{
break;
}
}
System.out.println("输入的正数个数为:"+positiveNum);
System.out.println("输入的负数个数为:"+negativeNum);
/*
do.....while 循环也包含四个条件:
1.变量初始化
2.循环条件
3.循环体
4.迭代条件
do while 循环 的格式:
1
do{
3
4
}
while(2)
注:
1).do while的特点 是 不管循环条件是否满足,首先会执行一次
2).开发中一般用 for和while 循环 ,很少用do while 循环
*/
// 例题1:求 100以内的偶数和之和
int j=1;
int sum2=0;
do {
if (j%2==0){
System.out.println(j);
sum2+=j;
}
j++;
}while(j<100);
System.out.println(sum2);
}
五.嵌套循环综合 练习:
/*
例题1:输入如下图形:
******
******
******
******
思路:外层循环控制输出行数,里面循环控制输出列数
for (int i=1;i<=5;i++){
for(int j=1;j<=6;j++){
System.out.print('*');
}
//换行
System.out.println();
*/
/*
例题2:输入如下图形:
* i=1, j=1
** i=2, j=2
*** i=3, j=3
**** i=4, j=4
***** i=5, j=5
思路:外层循环控制输出行数,里面循环控制输出列数,按照如上的i 与j取值规律,故内层循环条件为:j<=i
for (int i=1;i<=5;i++){
for(int j=1;j<=i;j++){
System.out.print('*');
}
//换行
System.out.println();
}
//例题3:打印九九乘法表:
//思路:外层循环控制输出行数,里面循环控制输出列数,按照i 与j取值规律,故内层循环条件为:j<=i
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j + "*"+i+"=" +i*j + "\t");
}
//换行
System.out.println();
}
//例题4:求100以内的质数,质数:只能被1和自己整除的数
boolean flag =true;
for(int i=2;i<100;i++){
for(int j=2;j if(i%j==0){
flag=false;
}
}
if(flag){
System.out.println("质数为:"+i);}
flag=true;
}
//例题5:求100以内的质数,质数:只能被1和自己整除的数 (优化一:)
long start = System.currentTimeMillis();
boolean flag=true;
for(int i=2;i<=100000;i++){
for(int j=2;j if(i%j==0){
flag=false;
break;//优化方案一,flag为false后跳出循环,后面的循环不用执行,可以节省时间,针对非质数的优化
}
}
if(flag){
System.out.println("质数为:"+i);
}
flag=true;
}
long end = System.currentTimeMillis();
System.out.println("总耗时为:"+(end-start));
*/
//例题6:100以内的质数,质数:只能被1和自己整除的数 (优化二:)
long start = System.currentTimeMillis();
boolean flag=true;
for(int i=2;i<=100000;i++){
for(int j=2;j<=Math.sqrt(i);j++){//化方案二:针对质数的优化
if(i%j==0){
flag=false;
break;//优化方案一,flag为false后跳出循环,后面的循环不用执行,可以节省时间,针对非质数的优化
}
}
if(flag){
System.out.println("质数为:"+i);
}
flag=true;
}
long end = System.currentTimeMillis();
System.out.println("总耗时为:"+(end-start));