if单分支
if单分支格式
if (表达式) {
语句块;
}
graph TD
A[布尔表达式] --> B(ture)
B --> C(语句块)
A --> D(false)
D --> E
C --> E(下行代码)
if双分支
if双分支格式
if(表达式){
语句块1;
}else{
语句块2;
}
if多分支
if(表达式1){
语句块1;
}else if(表达式2){
语句块2;
}
······
else{
语句块n;
}
graph TD
A[表达式1] --> B[true]
B --> C(语句块1)
A --> D(false)
D --> E(表达式2)
E --> F(false)
F --> G(表达式n)
G --> H(false)
H --> I(语句块n+1)
C --> Z(************************下行语句************************)
E --> J(true)
J --> K(语句块2)
K --> Z
G --> L(语句块n)
L --> Z
I --> Z
随机数:Math.random() == [0.0,1.0)
测试1
程序的优化:主要考虑程序的不足之处
重点语句:
if(sc.hasNextInt()==true) //判断输入的值是否为int类型,如果为int类型就接收
程序主体:
/*
会员在购物时,不同积分享受的折扣不同,规则如下:
会员积分x 折扣
x>=80000 6
4000<=x<8000 7
2000<=x<4000 8
x<2000 9
*/
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入会员积分(注意:是一个整数):");
//先判断键盘录入的数据是不是int类型的
if(sc.hasNextInt()==true){
int integral = sc.nextInt(); // 键入积分
//判断这个积分是否是正数:
if(integral>=0){
String discount;
if (integral>=8000){
discount = "6折";
}else if(integral>=4000){
discount = "7折";
}else if (integral>=2000){
discount = "8折";
}else{
discount = "9折";
}
System.out.println("您享受的折扣是"+discount);
}else{
System.out.println("您输入的积分是负数,请重新输入!");
}
}else{
System.out.println("您输入的积分不是整数,请重新输入!");
}
}
}
测试2
流程控制的逻辑:思路要清晰
重点语句:
if (sex1.equals(sex)) // 比较两者的值是否相同,常用于字符间
程序主体:
/*
小朋友搬桌子:
年龄大于7岁,可以搬桌子
如果年龄大于5岁,性别是男,可以搬桌子;
否则不可以搬动桌子,提示:你还太小了
*/
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入你的年龄:");
int age = sc.nextInt();
if (age>7){
System.out.println("可以搬桌子");
}else if (age>5){
System.out.print("请输入你的性别:(输入'男'或'女'):");
String sex = sc.next();
String sex1 = "男";
if (sex1.equals(sex)){
System.out.println("可以搬桌子");
}else {
System.out.println("你还太嫩啦");
}
}else{
System.out.println("你还太嫩啦");
}
}
}
switch语句
switch语句格式
switch(表达式){
case 1:语句1;break;
case 2:语句2;break;
······
default:语句n;
}
switch主要应用于等值判断
- 相邻分支的输出一样可以保留最后一个分支,上面的都可以省略不写
- 为防止语句穿透,每条输出语句的后面要加break关键字来控制
程序主体:
/*
根据给出的学生分数,判断学生的的等级:
>=90 A
>=80 B
>=70 C
>=60 D
<60 E
*/
import java.util.Scanner;
public class Switch_test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入学生的分数(1-100之间的整数):");
int grade = sc.nextInt();
switch (grade/10){
case 1:
case 2:
case 3:
case 4:
case 5:System.out.println("E级");break;
case 6:System.out.println("D级");break;
case 7:System.out.println("C级");break;
case 8:System.out.println("B级");break;
case 9:
case 10:System.out.println("A级");break;
default:System.out.println("您输入的分数有误!");
}
}
}
- 注意:default可以放在switch下的任意行,但是不在最后一行就要后接break
while语句
while语句格式
while(表达式){
语句块;
}
测试1
// 练习:1+2+3+4+5+······+100
public class While_test1 {
public static void main(String[] args) {
int i = 1,sum=0;
while(i<=100){
sum += i;
i++;
}
System.out.println("1+2+3+4+5+······+100的和为:"+sum);
}
}
测试2
// 练习:2+4+6+8+……+998+1000
public class While_test2 {
public static void main(String[] args) {
int i=2,sum=0;
while(i<=1000){
sum+=i;
i += 2;
}
System.out.println("2+4+6+8+……+998+1000的和为:"+sum);
}
}
测试3
// 练习:5+10+15+20+……+100
public class While_test3 {
public static void main(String[] args) {
int i=5,sum=0;
while(i<=100){
sum+=i;
i += 5;
}
System.out.println("5+10+15+20+……+100的和为:"+sum);
}
}
测试4
// 练习:99+97+95+……+5+3+1
public class While_test4 {
public static void main(String[] args) {
int i = 1,sum = 0;
while(i<=99){
sum += i;
i +=2 ;
}
System.out.println("99+97+95+……+5+3+1的和为:"+sum);
}
}
测试5
// 练习:1*3*5*7*9*11*13
public class While_test5 {
public static void main(String[] args) {
int i = 1,sum = 1;
while(i<=13){
sum *= i;
i += 2;
}
System.out.println("1*3*5*7*9*11*13的和为:"+sum);
}
}
do while语句
do while语句格式
do{
语句块;
}while(表达式);
- 先执行循环体,然后再判断。也就是至少会执行一次循环
while和do-while的区别:
- while:先判断,再执行
- do-while:先执行,再判断 —> 至少被执行一次,从第二次开始才进行判断
什么场合使用do-while:
while(考试是否通过){
考试;
}
----> 不合适
do{
考试;
}while(考试是否通过);
----> 合适
for语句
for语句格式
for(初始表达式;布尔表达式;迭代因子){
语句块;
}
for循环在第一次运行的时候要进行初始化,然后进行判断,若结果为true,则执行循环内容然后进行i++部分(或者别的表达式)的操作
for循环里的if嵌套
测试1
// 输出一个1-100中被5整除的数,每行输出6个
public class For_test1 {
public static void main(String[] args) {
int n=0;
for (int i = 1;i<=100;i++){
if (i%5==0){ // 对被5整除的数进行输出
System.out.print(i+"\t");
n++;
if (n%6==0){ //每输出6个换行
System.out.println("");
}
}
}
}
}
测试2
/*
【1】请录入10个整数,当输入的数是666的时候,退出程序
【2】判断其中录入正数的个数并输出
【3】判断系统的退出状态:是正常退出还是被迫退出
*/
import java.util.Scanner;
public class For_test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=0;
boolean m = true;
for (int i = 1;i<=10;i++){
System.out.print("请输入10整数,现在是第" + i + "个:");
int num = sc.nextInt();
if (num == 666){
System.out.println("输入666,系统强制退出");
break;
}else if(num>=0){
n++;
}
if (i == 10){
m = false;
}
}
if (m==false){
System.out.println("录入的正数个数为"+ n +"\n系统正常退出");
}
}
}
关键字:break,continue,return
break 立刻停止循环
continue 结束本次循环,开始下一次循环
return 遇到return结束正在执行的方法
双重循环
测试1
乘法口诀
/*
乘法口诀:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
*/
public class For_test3 {
public static void main(String[] args) {
for (int i = 1;i<=9;i++){
for (int j = 1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
}
}
}
测试2
长方形
// 长方形
public class For_test4 {
public static void main(String[] args) {
for (int i = 1;i <= 4;i++){
for (int j = 1;j <= 9;j++){
System.out.print("*");
}
System.out.println();
}
}
}
测试3
距离前面有一定空隙的长方形
// 距离前面有一定空隙的长方形
public class For_test5 {
public static void main(String[] args) {
for (int i = 1;i <= 4;i++){
for (int k = 1;k <= 4;k++){
System.out.print(" ");
}
for (int j = 1;j <= 9;j++){
System.out.print("*");
}
System.out.println();
}
}
}
测试4
平行四边形
// 平行四边形
public class For_two_test4 {
public static void main(String[] args) {
for (int i =1; i <= 4;i++){
for (int j = 9; j >= i;j--){
System.out.print(" ");
}
for (int k = 1; k <= 9;k++) {
System.out.print("*");
}
System.out.println();
}
}
}
测试5
三角形
// 三角形
public class For_two_test5 {
public static void main(String[] args) {
for (int i = 1;i <= 4;i++){
for (int j = 7;j >= i;j--){
System.out.print(" ");
}
for (int k = 1;k <= i*2-1;k++){
System.out.print("*");
}
System.out.println();
}
}
}
测试6
菱形
// 菱形
public class For_two_test6 {
public static void main(String[] args) {
for (int i = 1;i <= 3;i++){
for (int j = 1;j <= 5-i;j++){
System.out.print(" ");
}
for (int k = 1;k <= i*2-1;k++){
System.out.print("*");
}
System.out.println();
}
for (int q = 1;q <= 4;q++){
for (int w = 1;w <= q;w++){
System.out.print(" ");
}
for (int e = 1;e <= 7-2*q+2;e++){
System.out.print("*");
}
System.out.println();
}
}
}
测试7
空心菱形
// 空心菱形
public class For_two_test7 {
public static void main(String[] args) {
for (int i = 1;i <= 4;i++){
for (int j = 1;j <= 5-i;j++){
System.out.print(" ");
}
for (int j = 1;j <= 2*i-1;j++){
if (j==1||j==(2*i-1)){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
for (int a = 1;a <= 3;a++){
for (int b = 1;b <= a+1;b++){
System.out.print(" ");
}
for (int c = 1;c <= 7-2*a;c++){
if (c==1||c==7-2*a){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
测试8
实心菱形(先打印出一个正方形,然后某些位置上打印星号,某些位置上打印空格)
// 实心菱形(先打印出一个正方形,然后某些位置上打印星号,某些位置上打印空格)
public class For_two_extend_1 {
public static void main(String[] args) {
int size = 17;
boolean flag = true; // 定义一个开关,进行菱形上半侧和下半侧的不同的变量控制
int startNum = size/2+1;
int endNum = size/2+1;
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= size; j++) { // 打印一个正方形
if (startNum <= j && j <= endNum) {
System.out.print("*"); // 有些地方打印星号
} else {
System.out.print(" "); // 有些地方打印空格
}
}
System.out.println();
if (endNum == size){ // 当打印到星号最多的那一行时,下一行则为下半侧
flag = false;
}
if (flag){ // 在菱形的上半侧
startNum--;
endNum++;
}else{ // 在菱形的下半侧
startNum++;
endNum--;
}
}
}
}
三重循环
测试1
百钱买百鸡
/*
百钱买百鸡:
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
数学:
设未知数:
公鸡:x只
母鸡:y只
小鸡:z只
x+y+z=100只
5x+3y+z/3=100钱
*/
public class For_three_test1 {
public static void main(String[] args) {
int n = 1;
for (int i=1;i <= 100;i++){
for (int j=1;j <= 100;j++){
for (int k = 1;k <= 100;k++){
int sum = i+j+k,sum2 = 5*i+3*j+k/3;
if (sum==100&&sum2==100&&k%3==0){
System.out.println("第"+ n +"种:" +
"有" + i + "只公鸡," +
"有" + j + "只母鸡," +
"有" + k + "只小鸡");
n++;
}
}
}
}
}
}
优化百钱买百鸡
public class For_three_test1 {
public static void main(String[] args) {
int n = 1;
for (int i=1;i <= 19;i++){
for (int j=1;j <= 31;j++){
int k = 100 - i - j;
int sum = i+j+k,sum2 = 5*i+3*j+k/3;
if (sum==100&&sum2==100&&k%3==0){
System.out.println("第"+ n +"种:" +
"有" + i + "只公鸡," +
"有" + j + "只母鸡," +
"有" + k + "只小鸡");
n++;
}
}
}
}
}