1、流程控制
顺序(从上到下)、分支(if-else switch-case)、循环结构(for while do-while)
从键盘获取数值:Scanner
导包:import java.util.Scanner
Scanner的实例化 Scanner scan = new Scanner(System.in);
调用Scanner类的相关方法,来获取指定类型的变量 next()/nextXxx()
String类型scan.next(),其他类型scan.nextXxx(),比如scan.nextInt()
对于char的获取,Scanner没有提供相关的方法,只能获取一个字符串。char genderChar = gender.charAt(0),获取首字符
需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,报异常:InputMatchException,导致程序终止
随机数的获取:
公式[a,b]:(int)(Math.random()*(b-a+1)+a)
double value = Math.random()//[0.0-1.0]
double value = (int)(Math.random()*90+10)//[10-99]
2、if-else;
if(条件表达式){
执行代码块;
}
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
if(条件表达式1){
执行代码块1;
}
else if(条件表达式2){
执行代码块2;
}
else{
执行代码块3;
}
else结构是可选的
针对条件表达式:如果多个表达式之间是互斥关系(没有交集),判断和执行语句声明顺序可换
如果多个表达式之间有交集的关系,需根据实际情况,要考虑判断和执行语句的顺序
如果多个表达式之间有包含关系,把范围小的声明在范围大的上面,否则,范围小的声明没机会执行
if-else结构可嵌套,执行语句只有一行,{}可省
ishandsome.equals(“是”)//字符串判断语句
3、switch结构:
switch(表达式){
case 常量1:
语句1;//break;
case 常量2:
语句2;//break;
default:
语句;//break;}
根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则执行相应case语句。当调用完执行语句,继续向下执行,直到遇到break或到结束为止
break可使用switch-case结构中,与此表示跳出switch-case结构。根据情况选择是否写break
switch结构中的表达式,只能是以下六种数据类型之一:byte、short、char、int、枚举类型、String
case后只能跟常量,不能跟判断语句,禁止写范围
default相当于if-else中的else,位置可选,一般位于最后边
如果多个case中执行语句一致,可进行合并
凡是可以使用switch-case的结构都可以转换为if-else,反之不成立
当switch-case(case情况不多)和if-else都可使用时,优先使用switch-case,因为它执行效率较高
循环语句组成部分:初始化、循环条件、循环体、迭代。循环条件是布尔类型
通常循环结束是因为循环条件返回false了
不在循环条件限制次数的结构:for(;;)或while(true)
结束循环:循环条件返回false;在循环体中执行break
4、for循环:
for(初始条件;循环条件;迭代条件){
循环体;}
for里定义的i,只在for循环中用
5、while循环:
初始条件;
while(循环条件){
循环体;
迭代条件;}
注意不要丢了迭代条件,丢失可能导致死循环
for循环和while循环可以相互转换,但是初始条件的作用范围不同
while的i,出了while循环也可使用
6、do-while循环:
初始条件;
do{
循环体;
迭代条件;
}while(循环条件);
do-while循环至少执行一次循环体
7、嵌套循环:
讲一个循环结构A声明在另一个循环结构B的循环体中,就构成嵌套循环
外层循环:B
内层循环:A
内层循环结构遍历一次,只相当于外层循环循环体执行了一次
假设外层循环需要执行m次,内层循环需要执行n次,此时内层循环的循环体一共执行m*n次
外层循环控制行数,内层循环控制列数
8、特殊关键字:break、continue
break: switch-case或者循环结构 结束当前循环 关键字后面不能声明执行语句
**continue:**循环结构 结束当次循环 关键字后面不能声明执行语句
break默认跳出包裹此关键字最近一层的循环
break结束指定标识的一层循环,label:for();{
…
break label;}
9、return:结束一个方法
10、练习
(1)break和continue
for(int i = 1;i <=10;i++){
if(i%4==0){
//break;//123
continue;//123567910
}
System.out.println(i);
}
(2)标签label的使用
label:for(int j=1;j<=4;j++){
for(int i = 1;i <=10;i++){
if(i%4==0){
continue label;
}
System.out.print(i);}
System.out.println();//123123123123
}
(3)遍历100以内的偶数,打印偶数的和及个数
//do while方式
int i = 1;
int sum = 0;
int account = 0;
do{
if(i%2==0){
System.out.println(i);
sum+=i;
account++;
}
i++;}
while(i<=100);
System.out.println(sum);//偶数的和
System.out.println(account);//偶数的个数
//for循环方式
int sum = 0;
int count = 0;
for(int i = 1;i <= 100;i++){
if(i%2==0){//遍历奇数i%2==1
System.out.println(i);//输出100以内的偶数
sum += i;
count++;}}
System.out.println("总和为"+sum);//输出100以内所有偶数的和
System.out.println("偶数个数为"+count);//输出100以内偶数的个数
(4)输出1000以内的完数:一个数等于除他自身的因数之和
int sum=0;
for(int i = 1;i<=1000;i++){
for(int j = 1;j<=i/2;j++){
if(i % j==0){
sum += j;}
}
if(sum == i){
System.out.println(i);}
sum = 0;
}
(5)从键盘随机获取两个正整数,求最小公约数、最小公倍数
// 导包 import java.util.Scanner;
Scanner scan = new Scanner(System.in);
System.out.print("请输入两个正整数;");
int m = scan.nextInt();
int n = scan.nextInt();
int min = (m <= n)? m : n;
int max = (m >= n)? m : n;
//最小公约数
for(int i = min;i >= 1;i--){
if(m % i == 0 && n % i == 0){
System.out.println(m+","+n+"最小公约数:"+i);
break;}}//一旦在循环中执行到break,跳出循环
//最小公倍数
for(int i = max;i <= (m*n);i++){
if(i % m == 0 && i % n ==0){
System.out.println(m+","+n+"最小公倍数:"+i);
break;}}
(6)水仙花数
System.out.println("水仙花数:");
for(int i = 100;i<1000;i++){
int a = i/100;
int b = i/10%10;
int c = i%10;
if(i == a*a*a+b*b*b+c*c*c){
System.out.println(i);}}
(7)九九乘法表
for(int i=1;i<=9;i++){//行
for(int j=1;j<=i;j++){//列
System.out.print(i+"*"+j+"="+i*j);
System.out.print(" ");}
System.out.println();}
(8)质数输出
//方法一
boolean isFlag = true;
for(int i=2;i<=100;i++){
for(int j = 2;j<=Math.sqrt(i);j++){
//优化二:对本身是质数的自然数有效
//for(int j = 2;j<i;j++){
if(i%j==0){
isFlag = false;}
//优化一:只对本身非质数的自然数有效
//break;}
}
if(isFlag == true){
System.out.println(i);}
isFlag = true;
}
//方法二
int account=0;
long start = System.currentTimeMillis();
for(int i=1;i<=100;i++){
for(int j=1;j<=i;j++){
if(i%j==0){
account++;}}
if(account==2){
System.out.println(i);}
account = 0;//account重置,不然进入下一个循环时它的值为2
}
//获取结束时间距离1970年1与1日0时0分0秒的毫秒数
long end = System.currentTimeMillis();
System.out.println(end-start);
//方法三
label:for(int i=2;i<=100;i++){
for(int j = 2;j<=Math.sqrt(i);j++){
if(i%j==0){
continue label;}
}
System.out.println(i);
}
(9)一些图形的输出
/*
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
*/
class QianTao4 {
public static void main(String[] args) {
for(int i = 0;i<5;i++){
for(int j = 0;j<4-i;j++){
System.out.print(" ");}
for(int k=0;k<i+1;k++){
System.out.print("* ");}
System.out.println();
}
for(int i = 0;i<4;i++){
for(int j = 0;j<i+1;j++){
System.out.print(" ");}
for(int k = 0;k<4-i;k++){
System.out.print("* ");}
System.out.println();
}
}
}
(10)学生成绩等级
//导包 import java.util.Scanner;
System.out.print("请输入学生成绩:(100分制)");
Scanner scan = new Scanner(System.in);
int score = scan.nextInt();
/*switch(score/10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不及格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
System.out.println("及格");
break;
default:
System.out.println("请重新输入");
break;
}*/
switch(score/60){
case 0:
System.out.println("不合格");
break;
case 1:
System.out.println("合格");
break;
default:
System.out.println("请重新输入成绩");
break;
}
}
(11)输入年月日,判断是一年中第几天(注意闰年)
//导包 import java.util.Scanner;
Scanner scan = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scan.nextInt();
System.out.print("请输入月份:");
int month = scan.nextInt();
System.out.print("请输入月份中天数:");
int day = scan.nextInt();
int sumDays = 0;
switch(month){
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
if(year%400==0 || (year%4==0 && year%100!=0)){
sumDays += 29;}
else{
sumDays += 28;}
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year+"年"+month+"月"+day+"日"+"是"+year+"年第"+sumDays+"天");