说明
这是一个完善了但又不完善的笔记,或许以后会更新
可以参考但请务必超越
源文件
Tools
逻辑控制
注意,所有的代码,都是用程序逻辑控制实现的
讲简单点,就是通过顺序循环判断等方式使功能实现。
所以这一篇内容其实可以说是最简单的,但是要在实际中使用,就要看个人的发挥了。
1.顺序结构
就简单的不行,平常写出来的代码就是按顺序走的
public static void main(String[] args) {
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
//顺序打印
}
所以所有的代码都是用逻辑控制实现的...因为写出来默认就是顺序
2.分支结构
2.1 if语句
if(布尔表达式){
//条件满足时执行代码
}
if(布尔表达式){
//条件满足时执行代码
}else{
//条件不满足时执行代码
}
if(布尔表达式){
//条件满足时执行代码
}else if(布尔表达式){
//条件满足时执行代码
}else{
//条件不满足时执行代码
}
举个栗子 判断奇偶
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//scanner输入,现在先不用管,可以先用着,以后再讲
//在idea中会自动在第一行写下import java.util.Scanner;也可以自己选择添不添加
//类似于C语言的include,Java.util就相当于C语言的库函数
if (n % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
}
注意这里输入的应该是一个整数,输入其他的都会异常。
输入Scanner
这里提前用到了输入,可以看到Java的输入有点麻烦,其实不但麻烦,这个输入功能还做的很粗糙,他有bug。
不过Java本身就不是用来开发控制台程序的,所以其实用的较少
这里先讲一点点
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//输入整数
String str = scanner.next();
//遇到空格读取结束
String str = scanner.nextLine();
//正常
这里可以直接查Scanner的文档,想要输入什么就使用scanner.next类型
就可以了。
注意:
- 在OJ等写代码的的时候,因为后台可能会测试多组用例,所以可以使用
has
来循环输入,例如输入整数就是scanner.hansNextInt()
- 如果先使用
scanner.nextInt()
输入整数,后使用scanner.nextLine()
输入字符串,那么打印的时候会发现字符串就会直接跳过去不打印 - 简单使用scanner,可以用。项目当中,慎重!
scanner.close();
scanner在Java中属于一种资源,他在这里打开的System.in相当于一个键盘,和C语言的fopen
和fclose
类似。不关其实也没什么事。
举个栗子 判断正负
就很简单
public static void main(String[] args) {
int num = 10;
if (num > 0) {
System.out.println("num 是正数");
} else if (num < 0) {
System.out.println("num 是负数");
} else {
System.out.println("num 是 0");
}
}
举个栗子 判断闰年
这个比较经典,也比较简单,注意世纪闰年和普通闰年就好了
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
if (year % 100 != 0 && year % 4 == 0 || year % 400 == 0) {
System.out.println(year+"是闰年!");
} else {
System.out.println(year+"不是闰年!");
}
scanner.close();
}
注意
最最最关键的代码风格!
代码的可阅读性,极其重要!
你写的代码,别人看不懂,不是说明你很厉害,而是说明你很垃圾,写出来别人都看不懂!
悬垂else
每一个else都会和最近的一个if对应上
该加的括号都加上!
int x = 10;
int y = 10;
if (x == 10)
if (y == 10)
System.out.println("aaa");
else
System.out.println("bbb");
很好,脑溢血上头了
代码风格问题
// 风格1
int x = 10;
if (x == 10) {
// 满足条件
} else {
// 不满足条件
}
// 风格2
int x = 10;
if (x == 10) {
// 满足条件
}
else
{
// 不满足条件
}
虽然两种方式都是合法的,但是Java中更推荐使用风格1
分号问题
int x = 20;
if(x == 10);{
System.out.println("hehe");
}
//加了分号相当于结束了语句,那if(x == 10)就没用了,爱是啥是啥,都一定会打印hehe
2.2 switch语句
switch(整数|枚举|字符|字符串){
case 内容1:{
//内容满足时执行语句;
[break;]
}
case 内容2:{
//内容满足时执行语句;
[break;]
}
default:{
//内容都不满足时执行语句;
[break;]
}
}
break不能遗漏!break的功能是让循环提前结束。不然就一直走下去成顺序结构了。
Java当中switch的参数数据类型是有限的,当然也不能表达复杂的条件
所以注意:
- 基本数据类型中long、float、double、boolean都不可以。
- JDK1.5开始引入了枚举,枚举也可以作为switch的参数
讲到switch就得说一下,工作中尽量不要使用switch,当然也不是绝对不使用。
关于嵌套
switch在实际使用的时候都很少,那嵌套看起来会更加的...难看
3.循环结构
循环的使用,其实一般都应该使用for循环和while循环的多。不过也应该视情况而定。
循环其实也没多少内容,不过用的很多
调试
讲到循环肯定就和调试有关了,想看一看程序是怎么执行的循环,就可以通过调试来看
这里环境为idea,idea也非常方便
鼠标点击行号右边代码左边可以打断点
右键选择Debug或者快捷键shift+F9进入调试,F7逐条可以进入函数,F8逐语句不进入函数
可以看图认识,如果想看内存或者其他信息可以右键变量页面栏添加其他窗口页面。
3.1 while循环
while(循环条件){
循环语句;
}
注意循环条件是布尔表达式!
举个栗子
就很简单
public static void main(String[] args) {
int i = 0;
int sum = 0;
while (i <= 5) {
sum = sum + i;
i++;
}
System.out.println("sum = " + sum);
//1+2+3+4+5=15
}
死循环
在C语言中1为真,所以条件是1就可以。Java中需要使用true
while(true){
//一直循环的内容
}
计算5的阶乘
public static void main(String[] args) {
int x = 5;
int y = 1;
int ret = 1;
while (y <= x) {
ret = ret * y;
y++;
}
System.out.println(ret);
}
再麻烦的1!+2!+3!+4!+5!阶乘相加
就不写了,后面可以使用for循环更简单
注意
因为和if的格式类似,所以也有一些要规范注意的点
- while 下面的语句可以不写 { } ,但是不写的时候只能支持一条语句。建议还是加上 { }
- while 后面的 { 建议和 while 写在同一行。
- while 后面不要多写 分号,否则可能导致循环不能正确执行。
3.2 break
break的功能是让循环提前结束。当然必须在循环当中!
这个很容易理解,当然在switch里可以使用break。
举个栗子
举个很简单的例子就可以
找1-10之间第一个3的倍数,找到就提前结束了嘛
public static void main(String[] args) {
int i = 1;
while (i <= 10) {
if (i % 3 == 0) {
System.out.println(i);
break;
}
i++;
}
}
3.3 continue
继续,就更简单了,也必须在循环当中。switch也可以使用。
直接用上面break的例子,找到3的倍数继续走
public static void main(String[] args) {
int i = 1;
while (i <= 10) {
if (i % 3 == 0) {
i++;
continue;
}
System.out.println(i);
i++;
}
}
关于break和continue的注意
首先他们必须在循环中,然后
既然在循环中,那么他们起作用的时候,只能在当前循环起作用
例如
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if(j == 2){
break;
//只结束了j的循环
}
}
}
也就是说作用于最近的循环
goto
Java里面没有goto
但是goto目前是保留字,随时有一天可能启用。
注意,就算你知道goto,也不要用。
公司大多数也会直接禁用goto
goto:想去哪就去哪
3.4 for循环
for(表达式1;表达式2;表达式3;){
//循环体
}
在Java中要注意的是表达式2必须是布尔表达式!
- 表达式1用于初始化循环变量
- 表达式2是循环条件
- 表达式3是更新循环变量
他的一个运行顺序是这样的,可能初学者不是很懂会很懵,不知道表达式3和循环体那个先运行
表达式1 -> 表达式2 -> 循环体 -> 表达式3
idea的快捷输入
之前有说过idea有psvm
快速写main函数和sout
快速打印
for循环idea也提供了fori
的快捷输入方式
他的方便之处就在于修改表达式1初始化的变量名表达式2和3就都会修改,而且会直接写好格式。
这里还有一个foreach
,他是增强for循环,以后可以在数组和实现了iterable
接口的集合类中再说。
死循环
for循环的死循环,表达式2为true或者压根就没条件即可
for(;;){
//死循环内容
}
注意
布尔类型boolean的默认初始值为false,是对实例成员变量说的。这里表达式2不写,默认是true并不是false。
计算5的阶乘
还有计算1的阶乘加到5的阶乘,1!+2!+3!+4!+5!
这里使用for写,应该要比上面的while好
public static void main(String[] args) {
//for循环计算5的阶乘
int sum = 0;
for (int j = 1; j <= 5; j++) {
//1!+2!+3!+4!+5!
int ret = 1;
for (int i = 1; i <= j; i++) {
//5的阶乘
ret *= i;
}
sum += ret;
}
System.out.println(sum);
}
嵌套
for循环的嵌套,最好不要超过3层
时间复杂度和代码观赏性,也就是可阅读性,会裂开
3.5 do while循环
do{
//循环语句;
}while(循环条件);
先执行循环语句,在判断循环条件。
就是说,一定会先执行一次!先斩后奏,上车补票。所以一般用的也很少。
你不想让他进入循环,他还是会进入一次,然后发现,我草,原来不让进...
4.输入输出
4.1 输出到控制台
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
- println 输出的内容自带 \n, print 不带 \n
- printf 的格式化输出方式和 C 语言的 printf 是基本一致的
那些打印方式用的时候可以再查,例如%d什么的
System.out.println("hello");
System.out.print("world");
int i = 0;
System.out.printf("i = %d\n", i);
4.2 从键盘输入
这一块我们前面讲了scanner,实际上也推荐使用scanner
还有另外一种不推荐使用的System.in.read
,需要搭配异常处理(以后会重点讲),这里只简单演示一下,反正也不用
import java.io.IOException;
//需要导入IOException包
public class test {
public static void main(String[] args) throws IOException {
//这里main函数后面加上了throws IOException
System.out.print("Enter a Char:");
char i = (char) System.in.read();
System.out.println("your char is :"+i);
}
}
如果不加异常处理,就会出错
可以看到,也非常的麻烦
5.猜数字游戏
系统生成1-100内随机整数,然后猜
这里就简单写一下,当然没有使用方法,也就是没有使用函数来实现
import java.util.Random;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
//首先随机生成数字
Random random = new Random();
int rand = random.nextInt(100);
//用户输入
Scanner scanner = new Scanner(System.in);
//开始判断
while (true) {
System.out.print("请输入你要猜的数字:");
int n = scanner.nextInt();
if (n < rand) {
System.out.println("猜小了");
} else if (n == rand) {
System.out.println("猜对了");
break;
} else {
System.out.println("猜大了");
}
}
}
}
Random
:随机数的固定写法,如果给他一个参数,也就是随机种子,他就会变成伪随机,随机数就会变成固定数
random.nextInt(100)
:这里默认是0-100如果想生成50-100需要一点小小的数学计算
实际演示
小头图版权:《絵里ちゃん》by 沙マコ/shamakho 2021年10月20日晚上11点25分 pid:93577807