1 顺序结构
2 分支结构
2.1 if-else
2.1.1 if-else三种格式
2.1.2 if-else使用说明
// 上面的练习进阶版:
int x = 4;
int y = 1;
if (x > 2)
if (y > 2)
System.out.println(x + y);
else //就近原则
System.out.println("x is " + x); // 输出4
//课后练习:测算狗的年龄
int dogAge = 6;
if(dogAge >= 0 && dogAge <= 2){
System.out.println("相当于人的年龄:" + dogAge * 10.5);
}else if( dogAge > 2){
System.out.println("相当于人的年龄:" + (2 * 10.5 + (dogAge - 2) * 4));
}else{
System.out.println("狗狗还没出生呢!");
}
//课后练习:如何获取一个随机数:10 - 99
int value = (int)(Math.random() * 90 + 10);
// [0.0,1.0) --> [0.0,90.0) --->[10.0, 100.0) -->[10,99]
System.out.println(value);
//公式:[a,b] : (int)(Math.random() * (b - a + 1) )+ a
2.2 switch-case
2.2.1 switch-case格式
2.2.2 switch-case使用说明
//**************如下的两种情况都编译不通过*********************
//情况一:switch表达式不能是布尔值
/*
boolean isHandsome = true;
switch(isHandsome){
case true:
System.out.println("我好帅啊~~~");
break;
case false:
System.out.println("我好丑啊~~~");
break;
default:
System.out.println("输入有误~~~");
}
*/
//情况二:case子句必须是常量
/*
int age = 10;
switch(age){
case age > 18:
System.out.println("成年了");
break;
default:
System.out.println("未成年");
}
*/
2.2.3 switch-case与if-else对比
/*
练习题:
从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
或
2)可以被400整除
说明:
1. 凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
2. 我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多),
又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。
*/
import java.util.Scanner;
class SwitchCaseExer {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入year:");
int year = scan.nextInt();
System.out.println("请输入month:");
int month = scan.nextInt();
System.out.println("请输入day:");
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:
//判断year是否是闰年
if((year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0){
sumDays += 29;
}else{
sumDays += 28;
}
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year + "年" + month + "月" + day + "日是当年的第" + sumDays + "天");
}
}
/*
例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
说明:如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
*/
class SwitchCaseTest1 {
public static void main(String[] args) {
int score = 78;
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;
}
//更优的解决方案:
switch(score / 60){
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("及格");
break;
}
}
}
3 循环结构
3.1 for循环
//练习:
int num = 1;
for(System.out.print('a');num <= 3;System.out.print('c'),num++){
System.out.print('b');
}
//输出结果:abcbcbc
/*
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如: 12和20的最大公约数是4,最小公倍数是60。
说明: break关键字的使用。
*/
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num1 = scan.nextInt();
System.out.println("请输入第二个整数:");
int num2 = scan.nextInt();
// 求最大公约数
int min = (num1 <= num2)? num1 : num2;
for(int i = min; i >= 1; i--){
if(num1 % i == 0 && num2 % i == 0){
System.out.println("最大公约数是:" + i);
break;
}
}
// 求最小公倍数
int max = (num1 >= num2)? num1 : num2;
for (int i = max; i <= num1*num2; i++){
if(i % num1 == 0 && i % num2 == 0){
System.out.println("最小公倍数为:" + i);
break;
}
}
}
}
3.2 while循环
class WhileTest{
public static void main(String[] args) {
//遍历100以内的所有偶数
int i = 1;
while(i <= 100){
if(i % 2 == 0){
System.out.println(i);
}
i++;
}
//出了while循环以后,仍可以调用。
System.out.println(i);//101
}
}
3.3 do-while循环
//遍历100以内的偶数,并计算所有偶数的和及偶数的个数
int num = 1;
int sum = 0;//记录总和
int count = 0;//记录个数
do{
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
num++;
}while(num <= 100);
System.out.println("总和为:" + sum);
System.out.println("个数为:" + count);
//*************体会do-while至少执行一次循环体***************
int number1 = 10;
while(number1 > 10){
System.out.println("hello:while");//不会输出
number1--;
}
int number2 = 10;
do{
System.out.println("hello:do-while");//会输出
number2--;
}while(number2 > 10);
3.4 循环其他知识点
3.4.1 无限循环
不在循环条件部分限制次数的结构:for(;;) 或 while(true)
结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break
/*
题目:
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,
输入为0时结束程序。
*/
import java.util.Scanner;
class ForWhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int positiveNumber = 0;//记录正数的个数
int negativeNumber = 0;//记录负数的个数
for(;;){//while(true){
int number = scan.nextInt();
//判断number的正负情况
if(number > 0){
positiveNumber++;
}else if(number < 0){
negativeNumber++;
}else{
//一旦执行break,跳出循环
break;
}
}
System.out.println("输入的正数个数为:" + positiveNumber);
System.out.println("输入的负数个数为:" + negativeNumber);
}
}
3.4.2 循环嵌套
嵌套循环的使用:
- 嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
- 外层循环:循环结构B
- 内层循环:循环结构A
- 说明 ① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
- 技巧:外层循环控制行数,内层循环控制列数。
练习一:九九乘法表
public class Hello {
public static void main(String[] args) {
for (int row = 1; row <= 9; row++) {
for (int col = 1; col <= row; col++) {
System.out.print(row + " * " + col + " = " + (row*col) + " ");
}
System.out.println();
}
}
}
练习二:求100以内的质数
(第一版)【思路】
100个小人排队进景点,从前门进,先穿上一个黄马甲,然后进审核区,
裁判经过一些过程评定小人是不是质数,若最终判定小人不是质数就在黄马甲上打一个叉,
然后来到后门,若马甲是干净的就从后门进入景点,若马甲脏了,就不能进入景点,而且把马甲洗干净送回到前门给下一个小人穿上,然后下一个小人继续。。。。
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值
for(int i = 2; i <= 100; i++){ // 遍历100以内的自然数
for(int j = 2; j < i; j++){ // j:被i去除
if(i % j == 0){ // i被j除尽
isFlag = false;
}
}
if(isFlag == true){
System.out.println(i);
}
// 重置isFlag
isFlag = true;
}
}
}
(第二版)【思路优化】
整体流程不变,主要是审核区的裁判,判定小人是不是质数的时间变快了
class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
for(int i = 2;i <= 100;i++){//遍历100以内的自然数
//优化二:对本身是质数的自然数是有效的。
//for(int j = 2;j < i;j++){
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除尽
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
System.out.println("质数的个数为:" + count);
}
}
(第三版)【思路优化】
小人不用再穿马甲了,每个小人排队从前门进入审核区,如果裁判认定小人不是质数,小人当场就消失了,
下一个小人补入继续判断,只有判定是质数的小人才能从后门进入景点。
class PrimeNumberTest2 {
public static void main(String[] args) {
int count = 0;//记录质数的个数
label:for(int i = 2;i <= 100;i++){//遍历100以内的自然数
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除尽
continue label;
}
}
//能执行到此步骤的,都是质数
count++;
}
System.out.println("质数的个数为:" + count);
}
}
3.4.3 关键字(break、continue、return)
break 与 continue 的比较:
class BreakContinueTest {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
break;//123
//continue;//123567910
//System.out.println("今晚迪丽热巴要约我!!!"); // 会报错
}
System.out.print(i);
}
//******************************
label:for(int i = 1;i <= 4;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();
}
}
}