java编程基础2
8、程序流程结构
8.1顺序结构
从上到下循序执行
8.2if选择结构
8.2.1结构语法
if(条件boolean){} / if(条件boolean){} else{}
###类型
if(条件1){} ……if(条件n){}
if(条件1){} else if(条件2){} …… else if(条件n){}else{}
if(条件1){
if(条件2){ …… …… if(条件n){ }else{ } }else{ }
}else{
if(条件3){ …… …… }else{ if(条件n){ }else{ } } }
8.2.2 执行规则
- if语句顺序执行
- 当有if成立则不往下执行else
/*
二十一点游戏
1、玩家(你)和BOOS(我)先各取两个10以下的正整数两个;
2、取一个公用数然后询问玩家是否还需要数字;
3、判断输赢;
规则:
1、三/四次取数之和不得打于21;
2、比较数字大小,值大者胜,相同庄家胜;
3、
*/
import java.util.Random; // 引用随机数
import java.util.Scanner; //输入导包
public class Tes5{
public static void main(String[] args){
Scanner sc = new Scanner(System.in); //定义输入器
Random random = new Random(); //定义数据
/*
*取两个随机数
*输出两个随机数,使用输出函数
*/
int m0 = (int)(Math.random()*10);
System.out.print("BOOS:21点游戏\n");
int m = (int)(Math.random()*10);
System.out.print("BOOS:我的第一个数是:");
System.out.print("*");
System.out.print("\n");
int ma = (int)(Math.random()*10);
System.out.print("BOOS:你的第一个数是:");
System.out.print(ma);
System.out.print("\n");
int m2 = (int)(Math.random()*10);
System.out.print("BOOS:我的第二个数是:");
System.out.print("*");
System.out.print("\n");
int mb = (int)(Math.random()*10);
System.out.print("BOOS:你的第二个数是:");
System.out.print(mb);
System.out.print("\n");
System.out.print("BOOS:公用数是:"+m0 +"\n" );
/*
让玩家输入是否继续,使用输入函数
判断胜负,嵌套if语句使用
*/
System.out.print("BOOS:你的二个数是:"+ma + mb+"\n" );
System.out.print("BOOS:你还需要数字吗?需要请输1\n");
int num =sc.nextInt();
if( num == 1 ){
int mc = (int)(Math.random()*10);
System.out.print("BOOS:你的第三个数是:");
System.out.print(mc);
System.out.print("\n");
int m3 = (int)(Math.random()*10);
System.out.print("BOOS:我的第三个数是:");
System.out.print(m3);
System.out.print("\n");
int u = ma + mb +mc+m0;
int v = m + m2 +m3+m0;
if( 22 > u ){ //简单if()else{}结构
if ( u>v ){ //多重if结构使用
System.out.print("你赢了\n");
}else
if ( u<v ){
System.out.print("Game Over!!!\n");
System.out.print("我的三个数是\n" + m+m3 + m2+"\n");
}
}else{
System.out.print("你飘了!!!\n");
System.out.print("我的三个数是\n" + m+m3 + m2+"\n");
}
}else{
int u1 = ma + mb+m0; // 定义数据类型并运算赋值
int v1 = m + m2+m0;
if( 22 > u1 ){ //嵌套if结构使用
if ( u1>v1 ){
System.out.print("你赢了\n");
}else{
System.out.print("Game Over!!!\n");
}
}else{
System.out.print("你飘了!!!\n");
System.out.print("我的三个数是\n" +m + m2+"\n");
}
}
}
}
``
8.3 switch选择结构
8.3.1结构语法
switch(表达式)}{
case常量值1:
break;
……
……
case常量值n:
break;
default:
break;
}
8.3.2特点
1、switch语句称为情况选择语句,又称为开关语句。
2、switch是分支语句的一种,用于对多种情况进行不同处理的语句。
3、JDK1.7 之前的switch语句限定对整形数据进行判断。
8.3.3switch语句的“贯穿”现象
当上一个case没break结尾时上边语句会贯穿到下面语句
例如:
System.out.print(“输入今年的一个月份”);
int m=input.nextInt();
switch(m){
case 1:
case 3:
case 4:
case 5:
case 5:
case 7:
case 10:
case 12: System.out.print(“这个月有5个周日”);
break;
case 2:
case 8:
case 9:
case 11: System.out.print(“这个月有4个周日”);
break;
}
当输入值是1、3、4、5、6、7、10、12的时候都输出“这个月有5个周日”
package Class20220606;
import java.util.Scanner;
public class Work4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入月份:");
int month = sc.nextInt();
switch(month){
case 1:
case 3:
case 5:
case 7:
case 10:
case 8:
case 12:System.out.print("这个月31天");
break;
case 2:System.out.print("这个月共28天");
break;
case 4:
case 11:
case 6:
case 9:System.out.print("这个月共30天");
break;
default:System.out.print("你是认真的吗!!!");
break;
}
}
}
8.4while循环结构
8.4.1结构语法
while(循环条件){
}
8.4.2特点
**执行流程:**先判断循环条件,条件如果成立,就执行循环操作;循环操作执行完成,继续判断条件;
条件如果成立,就执行循环操作;。。。直到条件不成立,循环结束。
特点:先判断,再执行
如果条件不成立,循环操作可能一次都不执行
8.5do{}while循环结构
8.5.1结构语法
Do{
}while(循环条件);
8.5.2特点
执行:先执行一遍循环操作,然后判断条件,条件成立,就继续执行操作;
循环操作执行结束,继续判断条件;。。。。。直到循环条件不成立,循环结束。
特点:先执行,后判断
循环操作至少会执行一次
/*
* 3、求两个数最大公约数
* 分析:
* 1、确定循环内容:两个数的公约数是可以同事整除两数的数,
* 即依次用同一个数对两数求余
*
* 2、确定循环条件:
* 一个数最大只可以被自己整除,
* 那么两数最大公约数最大最多和小的数相等;
* 如果
* 两数相等 公约数是两数本身 不用循环
* 两数不相等 最大公约数小于两数小的数 [1,小的数]
*
*
*
*/
public class Work3 {
public static void main(String[] args) {
// 定义常量
final int NUM0 = 91;
final int NUM1 = 27;
int n = NUM1-1;//定义循环变量,递减
while(NUM1%n != 0 || 0 != NUM0%n ) {
n--;
}
System.out.print(NUM0 +"和"+ NUM1+"的最大公约数是"+(n)+"\n");
// 定义变量
int num0 = 99;
int num1 = 81;
int m1=0;
//定义循环变量,递曾(不是最优,可能多出必要的循环次数)
for(int m=1; m<=num1;m++) {
if(num1%m == 0 && num0%m == 0) {
m1=m ;
}
}
System.out.print(num0+"和"+num1+"的最大公约数是"+m1);
}
}
8.6for循环
8.6.1结构语法
for(定义循环变量; 循环条件; 循环变量的更新){
循环操作
}
8.6.1特点
特点:循环次数固定
/*
* 3、求两个数最大公约数
* 分析:
* 1、确定循环内容:两个数的公约数是可以同事整除两数的数,
* 即依次用同一个数对两数求余
*
* 2、确定循环条件:
* 一个数最大只可以被自己整除,
* 那么两数最大公约数最大最多和小的数相等;
* 如果
* 两数相等 公约数是两数本身 不用循环
* 两数不相等 最大公约数小于两数小的数 [1,小的数的值]
*
*
*
*/
public class Work3 {
public static void main(String[] args) {
// 定义常量
final int NUM0 = 91;
final int NUM1 = 27;
int n = NUM1-1;//定义循环变量,递减
while(NUM1%n != 0 || 0 != NUM0%n ) {
n--;
}
System.out.print(NUM0 +"和"+ NUM1+"的最大公约数是"+(n)+"\n");
// 定义变量
int num0 = 99;
int num1 = 81;
int m1=0;
//定义循环变量,递曾(不是最优,可能多出必要的循环次数)
for(int m=1; m<=num1;m++) {
if(num1%m == 0 && num0%m == 0) {
m1=m ;
}
}
System.out.print(num0+"和"+num1+"的最大公约数是"+m1);
}
}
8.7双重循环
循环中可以嵌套循环,嵌套两层就叫双重循环。 双重循环的特点:外层循环执行一轮,内层循环执行一遍。总共执行次数n*m。
public class Star{
public static void main(String[] args){
for(int i=1;i<=5;i++){ //外层循环控制行,循环5次
for(int j=1;j<=i ;j++){ //内层循环控制行
System.out.print("*");
}
System.out.println();
}
}
}
运行结果
*
* *
* * *
* * * *
* * * * *
8.8continue和break
continue;
可以打断不执行本轮循环,但不影响后面的程序运行
break;
跳出程序
9、数组
java数组特点
1、Java语言中的数组是一种
引用数据类型
2、数组实际上是一个存在堆的一个容器,可以同时容纳多个元素。
3、元素可以为空,数组长度不能变
3、各个元素数据类型必须类型统一
声明数组和定义长度
声明:
数据类型[] 数组名;
数据类型 数组名[];
定义长度:
数组名 = new 数据类型[长度];
数组赋值
数组名[下标] = 值;
数组名 = new 数据类型[]{值1,值2, …… ,值n};
遍历
所谓**遍历(Traversal)**是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
遍历数组:for(int n:nums){
System.out.print(num+" ");
}
数组排序
冒泡排序
排序规则: 1、相邻两数比较,小数在前,大数在后,如果不符合就交换
2、直到不需要再交换为止
public class Maopao{
public static void main(String[] args){
int[] nums=new int[6]; //对该数组进行排序
//遍历数组下标为0到最大长度减一的数
for(int i=0;i<nums.length-1;i++){
//遍历的数每次循环减少一个
for(int j=0;j<nums.length-i-1;j++){
if(arr[j]<arr[j+1]){ //比较大小 大的在后面
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//遍历的数组中的数字
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" "); //打印
}
}
}
Arrays.sort
**用法:**Arrays.sort(需排序的数组名)
int[] nums= {71,2,44,23}; Arrays.sort(nums);//升序
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
选择排序
public class XuanZe{
public static void main(String[] args){
int[] nums={2,3,5,6,1,4}; //对该数组进行排序
//遍历数组下标[0,nums.length]
for(int i=0;i<nums.length-1;i++){
//遍历数组下标[i+1,nums.length]
for(int j=i+1;j<nums.length;j++){
if(arr[i]>nums[j]){ //比较大小,
//如果前者比后者大则交换两个角标对应的值
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" "); //打印排序后的值
}
}
}
插入排序
/**
往升序序数列中插入一个数,使之仍然有序
1、确定插入点的位置index
2、[len-2,index]依次往后移
3、nums[index]=n
*/
public static void main(String[] args){
int[] arr=new int[8];
arr[1]=2;
arr[2]=4;
arr[3]=8;
arr[4]=36;
arr[5]=72;
arr[6]=108;
int len=arr.length;
int n=81;
//1、确定插入点的位置index
for(int i=0;i<len-1;i++){
if(arr[i]>len-1){
break;
}
// [len-2,index]依次往后移
for (int i = len-2; i >=index; i--) {
arr[i+1]=arr[i];
}
//3、nums[index]=n
arr[index]=n;
for(int m:arr){
System.out.print(num+" ");
}
}