嗨嗨大家!今天我们来学习逻辑运算和方法的使用~
目录
一 逻辑控制
1 分支结构
1.1 if语句
基本语法形式1:
if(布尔表达式){
//条件满足时执行代码
}
基本语法形式2:
if(布尔表达式){
//条件满足时执行代码
}else{
//条件都不满足时执行代码
}
代码示例1: 判定一个数字是奇数还是偶数
int num = 10;
if (num % 2 == 0) {
System.out.println("num 是偶数");
} else {
System.out.println("num 是奇数");
}
基本语法形式3:多分支的情况:
if(布尔表达式){
//条件满足时执行代码
}else if(布尔表达式){
//条件满足时执行代码
}else{
//条件都不满足时执行代码
}
代码示例2: 判定一个数字是正数还是负数
int num = 10;
if (num > 0) {
System.out.println("num 是正数");
} else if (num < 0) {
System.out.println("num 是负数");
} else {
System.out.println("num 是 0");
}
代码示例3: 判定某一年份是否是闰年:
int year = 2000;
if (year % 100 == 0) {
// 判定世纪闰年
if (year % 400 == 0) {
System.out.println("是闰年");
} else {
System.out.println("不是闰年");
}
} else {
// 普通闰年
if (year % 4 == 0) {
System.out.println("是闰年");
} else {
System.out.println("不是闰年");
}
}
1.2 switch 语句
基本语法形式:
switch(整数|枚举|字符|字符串){
case 内容1 : {
//内容满足时执行语句;
[break;]
}case 内容2 : {
//内容满足时执行语句;
[break;]}
...default:{
//内容都不满足时执行语句;
[break;]}
}
代码示例: 根据 day 的值输出星期几
int day = 1;
switch(day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入有误");
break;
}
注意:
- 如果 switch 中的值没有匹配的 case, 就会执行 default 中的语句.
- switch 中值的不同,会执行对应的 case 语句,遇到 break 就会结束该 case 语句.
- switch 不能表达复杂的条件 .
- 每个case下面的代码要跟break,否则就会形成穿透现象,直到遇到下一个case或者default
- switch 中的值只能是 整数|枚举|字符|字符串
我们来看以下的代码:
代码示例1:
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
if (num > 10 && num < 20) {
System.out.println("hehe");
}
在示例1中,if 后面的条件表达式较为复杂,不能使用switch 。
代码示例2:
double num = 1.0;
switch(num) {
case 1.0:
System.out.println("hehe");
break;
case 2.0:
System.out.println("haha");
break;
}
// 编译出错
Test.java:4: 错误: 不兼容的类型: 从double转换到int可能会有损失
这里报错的原因是:定义num的类型是double,而上面的注意事项已经提过:switch 中的值只能是 整数|枚举|字符|字符串。
综上, 我们发现, switch 的使用局限性是比较大的。
2 循环结构
2.1 while 循环
基本语法形式:
while(循环条件){
循环语句;
}
循环条件为 true, 则执行循环语句,然后再次判断条件反复执行,直到条件不成立为止。
用法:不知道循环次数时使用while循环
2.2 for 循环
基本语法形式:
for(表达式1;表达式2;表达式3){
循环体;
}
- 表达式1: 用于初始化循环变量.
- 表达式2: 循环条件
- 表达式3: 更新循环变量
用法:知道循环次数时用for循环
2.3 do while 循环
先执行循环语句, 再判定循环条件
基本语法形式:
do{
循环语句;
}while(循环条件);
用法:至少循环一次的时候用do while
2.4 break
break 的功能是让循环提前结束.
代码示例: 找到 100 - 200 中第一个 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 == 0) {
System.out.println("找到了 3 的倍数, 为:" + num);
break;
}
num++;
}
// 执行结果
找到了 3 的倍数,为:102
2.5 continue
continue 的功能是跳过这次循环, 立即进入下次循环.
代码示例: 找到 100 - 200 中所有 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 != 0) {
num++; // 这里的 ++ 不要忘记! 否则会死循环.
continue;
}
System.out.println("找到了 3 的倍数, 为:" + num);
num++;
}
执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句。
3. 输出输入
基本语法形式:
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
- println 输出的内容自带 \n, print 不带 \n
- printf 的格式化输出方式和 C 语言的 printf 是基本一致的
System.out.println("hello world");
int x = 20;
System.out.printf("x = %d\n", x)
格式化字符串
转换符 | 类型 | 举例 | |
d | 十进制整数 | ("%d", 100) | 100 |
x | 十六进制整数 | ("%x", 100) | 64 |
o | 八进制整数 | ("%o", 100) | 144 |
f | 定点浮点数 | ("%f", 100f) | 100.000000 |
e | 指数浮点数 | ("%e", 100f) | 1.000000e+02 |
g | 通用浮点数 | ("%g", 100f) | 100.000 |
a | 十六进制浮点数 | ("%a", 100) | 0x1.9p6 |
s | 字符串 | ("%s", 100) | 100 |
c | 字符 | ("%c", '1') | 1 |
b | 布尔值 | ("%b", 100) | true |
h | 散列码 | ("%h", 100) | 64 |
% | 百分号 | ("%.2f%%", 2/7f) | 0.29% |
这个表格没必要记住, 用到的时候根据需要查一下就可以了.
使用 Scanner 读取字符串/整数/浮点数
import java.util.Scanner; // 需要导入 util 包
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法
//使用 Scanner 循环读取 N 个数字
Scanner sc = new Scanner(System.in);
double sum = 0.0;
int num = 0;
while (sc.hasNextDouble()) {
double tmp = sc.nextDouble();
sum += tmp;
num++;
}
System.out.println("avg = " + sum / num);
sc.close();
// 执行结果
10
40.0
50.5
^d
sum = 100.5
avg = 33.5
注意事项: 当循环输入多个数据的时候, idea使用 ctrl + d 来结束输入
二、方法的使用
方法就是一个代码片段. 类似于 C 语言中的 "函数
1 方法定义语法
方法定义:
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
方法调用:
返回值变量 = 方法名称(实参...);
例如:
pubilc static void menu( ){...}
- public:访问权限
- static:静态
- void:返回值类型
- menu:方法名(自定义)
- ( ):参数列表
- {...}:方法体
注意:
- 方法定义时的参数称为 "形参", 方法调用时的参数称为 "实参".
- 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
- 方法定义时, 参数可以没有. 每个参数要指定类型.
- Java 中没有 "函数声明" 这样的概念 .
2 实参和形参的关系(重要)
代码示例: 交换两个整型变量
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println("a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
}
}
// 运行结果
a = 10 b = 20
原因分析
刚才的代码, 没有完成数据的交换.
对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
int a = 10;
int b = 20;
int x = a;
int y = b;
int tmp = x;
x = y;
y = tmp;
可以看到, 对 x 和 y 的修改, 不影响 a 和 b.
解决办法: 传引用类型参数 (例如数组来解决这个问题)
class Test {
public static void main(String[] args) {
int[] arr = {10, 20};
swap(arr);
System.out.println("a = " + arr[0] + " b = " + arr[1]);
}
public static void swap(int[] arr) {
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
}
// 运行结果
a = 20 b = 10
3 方法的重载
规则:
针对同一个类:
- 方法名相同
- 方法的参数不同(参数个数或者参数类型)
- 方法的返回值类型不影响重载
代码示例:
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数字相加.
注意:
当两个方法的名字相同, 参数也相同, 但是返回值不同的时候, 不构成重载.
4 方法递归
递归的程序的执行过程不太容易理解, 要想理解清楚递归, 必须先理解清楚 "方法的执行过程", 尤其是 "方法执行结束之后, 回到调用位置继续往下执行”
代码示例
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
System.out.println("函数开始, n = " + n);
if (n == 1) {
System.out.println("函数结束, n = 1 ret = 1");
return 1;
}
int ret = n * factor(n - 1);
System.out.println("函数结束, n = " + n + " ret = " + ret);
return ret;
}
// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120
执行过程图
下面我们来实现一个简单的游戏:
5. 猜数字游戏
系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 "小了", 如果输入的数字比该随机数大, 提示 "大了" , 如果输入的数字和随机数相等, 则提示 "猜对了" .
参考代码
import java.util.Random;
import java.util.Scanner;
public class Test {
//猜数字游戏
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random random=new Random();
int randNum = random.nextInt(100);
while(true){
System.out.println("请输入你所猜的数字:");
int num=sc.nextInt();
if(num<randNum){
System.out.println("猜小了");
} else if (num>randNum) {
System.out.println("猜大了");
}else{
System.out.println("恭喜你,猜对了!");
break;
}
}
}
}
相信看到这里的你收获满满吧?如果觉得本次分享对你有帮助,记得留下三连+支持哈~你们的互动是我创作的最大动力!最后的最后,与大家分享一句话:做难事必有所得,与君共勉!那我们下期再见啦~