个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客
目录
逻辑控制
Java同样和C语言一样是有三种结构:顺序结构,选择结构,循环结构。
顺序结构
顺序结构就是程序在执行时,按照一行一行代码的顺序执行下去。
分支结构
if语句
语法格式:
//语法格式1:
if(布尔表达式){
// 语句
}
语法格式2:
if(布尔表达式){
// 语句1
}else{
// 语句2
}
语法格式3:
if(布尔表达式1){
// 语句1
}else if(布尔表达式2){
// 语句2
}else{
// 语句3
}
如果布尔表达式结果为true,执行if中的语句,否则不执行。
好啦!大部分内容和C语言差不多,我们就直接上练习。
【练习】
1. 判断一个数字是奇数还是偶数。
public class Test {
public static void main(String[]args){
//从键盘上输入数据
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if(i % 2 == 1){
System.out.println("是奇数");
} else{
System.out.println("是偶数");
}
}
}
至于那个从键盘上输入数据,我们在后面学习输入数据时会学习。
2. 判断一个数字是正数,负数,还是零。
public class Test {
public static void main(String[]args){
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if(i > 0) {
System.out.println("是正数");
} else if (i < 0) {
System.out.println("是负数");
} else {
System.out.println("是0");
}
}
}
3. 判断一个年份是否为闰年
public class Test {
public static void main(String[]args){
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
if (((year % 4 == 0)&&(year % 100 != 0)) || (year % 400 == 0)){
System.out.println("是闰年");
}else {
System.out.println("不是闰年");
}
}
}
注意:这里的代码风格和C语言是不一样的。
下面是C语言的做法:
if (表达式)
{
//语句1
}
else
{
//语句2、
}
switch 语句
基本语法:
switch(表达式){
case 常量值1:{
语句1;
[break;]
}
case 常量值2:{
语句2;
[break;]
}
...
default:{
//内容都不满足时执行语句;
[break;]
}
}
执行流程: 1. 先计算表达式的值 2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束 3. 当表达式的值没有与所列项匹配时,执行default语句。
练习:根据 day 的值输出星期几。
public class Test {
public static void main(String[] args) {
//根据 day 的值输出星期几
Scanner scanner = new Scanner(System.in);
int day = scanner.nextInt();
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;
}
}
}
【注意事项】
1. 多个case后面的常量值不可以重复。
2. switch的括号内只能是以下类型的表达式: 基本类型:byte、char、short、int,注意不能是long类型 引用类型:String常量串、枚举类型。
3. switch 不能表达复杂的条件。当有复杂条件需要判断时,我们就需要用到if语句了。
4. switch 虽然支持嵌套, 但是很丑,一般不推荐。
综上, 我们发现, switch 的使用局限性是比较大的。
循环结构
while 循环
基本语法格式:
//循环条件的结果也要是布尔类型
while(循环条件){
循环语句;
}
循环条件为 true, 则执行循环语句; 否则结束循环。
练习1:打印 1 - 10 的数字。
public class Test {
public static void main(String[] args) {
int n = 1;
//注意这里的结果一定要是布尔类型
while(n <= 10){
System.out.print(n+" ");
n++;
}
}
}
2. 计算 1 - 100 的和。
public class Test {
public static void main(String[] args) {
int n = 1;
int sum = 0;
while(n <= 100){
sum += n;
n++;
}
System.out.println(sum);
}
}
3. 计算 5 的阶乘
public class Test {
public static void main(String[] args) {
int ret = 1;
int n = 1;
while(n <= 5){
ret *= n;
n++;
}
System.out.println(ret);
}
}
4. 计算 1! + 2! + 3! + 4! + 5!
public class Test {
public static void main(String[] args) {
int sum = 0;
int n = 1;
int ret = 1;
while(n <= 5){
ret *= n;
sum += ret;
n++;
}
System.out.println(sum);
}
}
注意事项 :
1. 和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }。 2. 和 if 类似, while 后面的 { 建议和 while 写在同一行。
3. 和 if 类似, while 后面不要多写 分号, 否则可能导致循环不能正确执行。
break
break 的功能是让循环提前结束。
练习:找到 100 - 200 中第一个是 3 的倍数的数字。
public class Test {
public static void main(String[] args) {
int n = 100;
while(n <= 200){
if(n % 3 == 0){
System.out.println(n);
break;
}
n++;
}
}
}
当执行到break时,就会跳出循环。
continue
continue 的功能是跳过本次循环剩下的部分, 进入下次循环。
练习:找到 100 - 200 中第一个是 3 的倍数的数字。
public class Test {
public static void main(String[] args) {
int n = 100;
while(n <= 200){
if(n % 3 != 0){
n++;//这个不能少
continue;
}
System.out.println(n);
break;
}
}
}
执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句。
for 循环
基本语法格式:
for(表达式1;布尔表达式2;表达式3){
表达式4;
}
表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次。
表达式2: 循环条件,满足,则循环继续,否则循环结束。
表达式3: 循环变量更新方式。
(和while循环类似) 1. 和 if 类似, for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { } 2. 和 if 类似, for 后面的 { 建议和 while 写在同一行. 3. 和 if 类似, for 后面不要多写 分号, 否则可能导致循环不能正确执行. 4. 和while循环一样,结束单趟循环用continue,结束整个循环用break。
do while 循环
基本语法格式:
do{
循环语句;
}while(循环条件);//这里的分号不能少
do while循环的特点是不管条件满不满足,一上来就会执行循环语句。因此,我们在写一个游戏的时候,一般都会使用do while循环。
基本用法和while循环差不多。
输入输出
输出到控制台
基本语法:
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
System.out.println("输出切换行");
System.out.print("输出不换行");
System.out.printf("%s\n", "格式化输出");
println 输出的内容自带 \n, print 不带 \n。
printf 的格式化输出方式和 C 语言的 printf 是基本一致的。
格式化字符串
转换符 | 类型 | 举例 | 输出的结果 |
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 读取字符串/整数/浮点数。
举例:
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字:");
String name = scanner.nextLine();
System.out.print("请输入你的年龄:");
int age =scanner.nextInt();
System.out.println("你的信息如下:");
System.out.println("名字"+name+"\n"+"年龄"+age);
}
}
这个输入类似创建一个变量。可以把Scanner看成一个输入变量类型,后面的变量名可以随意取,不一定要是scanner,也可以是a,b……后面的new Scanner是一起的(固定的)。System.in的意思是从键盘输入。而后面的nextLine,nextInt是分别输入一个字符串和一个整形。与nextLine类似的还有一个next,这个是遇到空格就停止读入(即使你输入了:我 要 学 编程,它也只会读取“我”)。
还有一个点就是:当我们使用Scanner输入数据的时候,在程序的末尾要加上 sc.close(); 这个就类似我们在C语言里学习的文件操作一样,打开文件后,在程序结束时要加上一个fclose(),来关闭文件。当然不加上这句话也没有关系。
练习:使用 Scanner 循环读取 N 个数字,并求取其平均值。
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = 0;//记录读取了几个数据
double avg = 0;
int sum = 0;
//类似C语言里的while(scanf("%d", &n) != EOF)
//当输入ctrl + D时,就会停止读取数据
while(scanner.hasNextInt()){
int j = scanner.nextInt();
sum += j;
n++;
}
avg = sum*1.0 / n;
System.out.println(avg);
}
}
:当循环输入多个数据的时候, 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + Z, Linux / Mac 上使用 ctrl + D)这里指的是CMD上。我们用的不是CMD,而是IDEA,因此就是输入ctrl + D。
猜数字游戏(含源码)
我们之前在学习C语言的循环时,也写了一个猜数字的小游戏,现在我们就用Java来实现一下。
这里我们就简单了解一下规则:
游戏规则: 系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 "猜小了", 如果输入的数字比该随机数大, 提示 "猜大了" , 如果输入的数字和随机数相等, 则提示 ",恭喜你,猜对了" 。
逻辑实现具体可看下面这篇文章:利用C语言的分支循环少量的函数知识写一个猜数字的小游戏-CSDN博客
源码:
public class Tset {
public static void game() {
Scanner scanner = new Scanner(System.in);
Random random = new Random();//生成随机数的种子
int num= random .nextInt(100)+1;生成1~100之间的随机数
int i = 5;
do{
i--;
System.out.print("请输入你要猜的数字:");
int n = scanner.nextInt();
if(n > num){
System.out.print("猜大了,请重新猜!");
System.out.println("你还剩"+i+"次机会!");
} else if (n < num) {
System.out.print("猜小了,请重新猜!");
System.out.println("你还剩"+i+"次机会!");
}else {
System.out.println("恭喜你,猜对了");
break;
}
}while(i != 0);
}
public static void menu() {
System.out.println("***************************************");
System.out.println("****** 猜数字游戏 ******");
System.out.println("****** 1. play 0. exit ******");
System.out.println("***************************************");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int input = 0;
do{
menu();//打印菜单
System.out.print("请选择你要进行的操作:");
input = scanner.nextInt();
switch(input){
case 1:
System.out.println("游戏开始,请做好准备!");
game();
break;
case 0:
System.out.println("游戏退出");
break;
default:
System.out.println("选择错误,请重新选择");
break;
}
}while(input != 0);
}
}
这里有一个关于生成随机数的工具:Random,这个是用来生成一个随机数的种子的(类似C语言里的srand函数)。如果我们在 Random random = new Random(); 这个语句的括号里随机输入一个值,那么它生成的随机数就是伪随机数了。例如:
public class Test {
public static void main(String[] args) {
Random random = new Random(123);//随便写的一个数
int num = random.nextInt();//这个sum的值是一个定值
System.out.println(num);
}
}
int num= random .nextInt(100)+1; 这个语句的意思是生成一个1~100的随机数。括号里的100相当于%100的意思,也就是生成0~99的数字,我们再加上1,就变成1~100了。
至于 public static void game() 和 public static void menu() 这个我们在下一篇博客再一起来学习。
好啦!本期JavaSE基础语法的学习到此就结束了!下一期,我们再一起学习吧!