第二周习题

news2024/11/28 0:37:36

2.创建类MyDate,year属性和month属性,编写一个方法totalDays,该方法通过年份和月份判断该月一共有多少天,在主函数中接受用户输入年和月,调用该方法测试它.

这里考虑平年和闰年

平年2月有28天。闰年的2月有29

那么就有区别了

只要判断这一点就行了!!!

1 3 5 7 8 10 12:31

4 6 9 11:30  

这里还是用数组存储好一点

然后就是返回值的问题

 

 

 

 

创建一个图形类。可以根据指定的符号,打印正方形。通过组建类来完成这一功能;

  1. 定义一个Figure类
  2. 定义一个inChar 内部字符属性
  3. 定义一个String showFigure() 返回图形字符串方法

public class Figure {
    private char inChar; // 内部字符

    public Figure(char inChar) {
        this.inChar = inChar;
    }

    public void showFigure(int sideLength) {
        String figure = "";

        for (int i = 0; i < sideLength; i++) {
            for (int j = 0; j < sideLength; j++) {
                figure += inChar;
            }
            figure += "\n";
        }

        System.out.println(figure);
    }

    public static void main(String[] args) {
        Figure square = new Figure('*');
        square.showFigure(5);
    }
}
 

 

 

 

创建一个银行类,用于计算存款的利息,和本利合 .

       利息的计算方法,年限小于一年的没有利息,1年以上的,利息为3%。

       通过面向对象的方式来处理这个问题

分析:

  1. 定义一个Bank类
  2. 定义money属性
  3. 定义 double showInterest() 计算利息方法
  4. 定义 String showSumMoney() 显示信息方法
  5. 1000*0.3 = 300  1000+2(1000*0.03)

 

 

public class Bank {
    private double money; // 存款金额

    public Bank(double money) {
        this.money = money;
    }

    public double showInterest() {
        double interest = 0;
        if (money >= 1000) {
            interest = money * 0.03;
        }
        return interest;
    }

    public String showSumMoney() {
        double interest = showInterest();
        double sumMoney = money + interest;
        return "本金:" + money + ",利息:" + interest + ",本利合计:" + sumMoney;
    }

    public static void main(String[] args) {
        Bank bank = new Bank(1000);
        System.out.println(bank.showSumMoney());
    }
}
 

 酒店管理系统

import javax.xml.transform.Source;
import java.util.Scanner;

/**
 * 酒店管理系统
 */
public class HotelManagerSystem {
    //全局变量, 整个类都有效
    int[][][] rooms; //存储所有的房间信息
    String[] roomTypeArr={"单人间","双人间","标准间","商务房","豪华包"};
    int[] roomPriceArr={98,128,148,288,688};

    //程序入口
    public static void main(String[] args) {
        //调用初始化方法
        HotelManagerSystem sys = new HotelManagerSystem();
        sys.initRoom(3,8);
        //显示欢迎词
        System.out.println("==============欢迎使用飞思酒店管理系统==============");
        sys.showUI();
    }

    //显示菜单
    public void showUI(){
        System.out.println("1.查看房间;2.定房间;3.退房;4.修改价格;5.退出系统");
        System.out.print("请选择您需要的服务:");
        Scanner input = new Scanner(System.in);
        while(true){ //如果输入正确, 退出循环, 输入错误,继续循环
            //数据校验: 非数字的校验
            if(input.hasNextInt()){ //hasNextInt() 返回true: 输入的是一个数字, 否则不是
                //得到选项
                int choose = input.nextInt();
                //System.out.println(choose);
                if(choose >=1 && choose <=5){ //正确选项
                    //调用相对应服务
                    doService(choose); //处理用户选项
                    //退出循环
                    break;
                }else{ //不是正确选项
                    //错误提示
                    System.out.println("【友情提示】:没有该选项!");
                    System.out.print("请重新输入:");
                }
            }else{
                //错误提示
                System.out.println("【友情提示】:输入选项格式错误!");
                System.out.print("请重新输入:");
                input.next();
            }
        }

    }

    /**
     * 处理用户选项的服务
     * @param choose
     */
    public void doService(int choose) {
        switch(choose){
            case 1:
                 //查询房间
                queryAllRoom();
                break;
            case 2:
                //定房间
                updateRoomState(true);
                break;
            case 3:
                //退房
                updateRoomState(false);
                break;
            case 4:
                //修改房间价格
                updateRoomPrice();
                break;
            case 5:
                //退出
                exitSystem();
                break;
        }
        //回显菜单
        showUI();
    }

    /**
     * 修改同一类型的房间的价格
     */
    public void updateRoomPrice() {
        //1.显示所有的房间类型, 让用户选择需要修改的房间类型
        System.out.println("房间类型:");
        for (int i = 0; i < roomTypeArr.length ; i++) {
            System.out.println("\t"+(i+1)+"."+roomTypeArr[i]);
        }
        System.out.print("请选择:");
        Scanner input = new Scanner(System.in);
        int choose = input.nextInt();
        //2.根据房间类型得到下标
        int index = choose - 1;
        //3.修改价格数组对应的下标的值
        System.out.print("请输入修改的价格:");
        int price = input.nextInt();
        roomPriceArr[index] =price;
        System.out.println("修改房间价格成功!");
    }

    /**
     * 订房或者退房
     *  true: 订房
     *  false: 退房
     * @param flag
     */
    public void updateRoomState(boolean flag) {
        //1.直接让用户输入房间编号  -->得到楼层, 房间序号
        Scanner input = new  Scanner(System.in);
        System.out.print("请输入您要订房/退房的房间编号:");
        //数据校验
        while(true){
            if(input.hasNextInt()){
                int roomNo = input.nextInt();
                //得到楼层, 房间序号  108 --> 1 .8   120 --> 1 20
                int floor = roomNo/100%10; //楼层
                int index = roomNo%100; //房间序号
                //输入的编号验证
                if(floor<1 || floor > rooms.length ){
                    System.out.println("【友情提示】:没有该楼层!");
                    System.out.print("请重新输入:");
                }else if(index < 1 || index > rooms[floor-1].length){
                    System.out.println("【友情提示】:没有该房间!");
                    System.out.print("请重新输入:");
                }else{
                    //可以订房,或者退房
                    //System.out.println("可以订房,或者退房");
                    if(flag){ //true 订房
                        //判断状态
                        if(rooms[floor-1][index-1][2] == 0){ //空闲
                            //订房:
                            rooms[floor-1][index-1][2] = 1; //修改状态为1
                            System.out.println("恭喜您,订房成功!你的房间编号:"+roomNo);
                            //退出循环
                            break;
                        }else{
                            System.out.println("【友情提示】:该房间已被预订");
                            System.out.print("请重新输入:");
                        }
                    }else{
                        //判断状态
                        if(rooms[floor-1][index-1][2] == 1){ //有人
                            //退房:
                            rooms[floor-1][index-1][2] = 0; //修改状态为0
                            System.out.println("恭喜您,退房成功!");
                            //退出循环
                            break;
                        }else{
                            System.out.println("【友情提示】:该房间已退房!");
                            System.out.print("请重新输入:");
                        }
                    }
                }
            }else{ //非整数
                System.out.println("【友情提示】:输入房间编号格式错误!");
                System.out.print("请重新输入:");
                input.next();
            }
        }

        // 2.根据flag判断是否是定房还是退房: true: 订房 false: 退房
       //3. 如果订房,先判断房间是空闲, 才允许订房, 如果有人, 让用户重新输入
       //4. 如果退房, 先判断房间是有人, 才允许退房, 如果空闲, 让用户重新输入
    }

    /**
     * 退出系统
     */
    public void exitSystem() {
        System.out.println("感谢使用本系统,欢迎下次使用!");
        //系统退出
        System.exit(0);
    }

    /**
     * 查询所有房间信息
     */
    public void queryAllRoom() {
        System.out.println("酒店房间详情表:");
        System.out.println("楼层\t房间号\t价格\t类型\t状态");
        //循环遍历 rooms数组
        // rooms.length: 获取三维数组包含二维数组个数, 有多少层
        for (int i = 0; i < rooms.length ; i++) {
            int floor = i+1;
            //rooms[i].length 二维数组包含的一维数组个数 一层有多少个房间
            for (int j = 0; j <rooms[i].length ; j++) {
                //输出楼层
                if(j == 0){ //楼层第一个房间
                    System.out.print(floor+"\t"); //打印楼层
                }else{
                    System.out.print(" "+"\t"); //打印楼层
                }
                //j房间编号  房间编号: 三位数   百位: 楼层  后两位: 房间序号
                int roomNo = floor*100+j+1;
                System.out.print(roomNo+"\t");
                //rooms[i][j].length 一维数组长度  每个房间的属性
                for (int k = 0; k <rooms[i][j].length ; k++) {
                    switch (k){
                        case 0: //价格
                            System.out.print(roomPriceArr[rooms[i][j][0]]+"\t");
                          break;
                        case 1: //类型
                            System.out.print(roomTypeArr[rooms[i][j][1]]+"\t");
                            break;
                        case 2: //状态 0: 空闲,  1: 有人
//                            switch(rooms[i][j][2]){
//                                case 0:
//                                    System.out.print("空闲");
//                                    break;
//                                case 1:
//                                    System.out.print("有人");
//                                    break;
//                            }
                            System.out.println(rooms[i][j][2]==0?"空闲":"有人");
                            break;
                    }
                }
            }
            //一个房间的信息输出完成, 换行
            System.out.println();
        }
    }

    /**
     *  店房间进行初始化操作的方法
     * @param n 有多少楼
     * @param m 一楼有多少房间
     */
    public void initRoom(int n, int m){
        rooms = new int[n][m][3];
        // n = rooms.length
        // m = rooms[i].length
        for (int i = 0; i <n ; i++) { //循环楼层
            for (int j = 0; j < m; j++) { //某一楼的某个房间
                // i = 0, j=0 表示 第一层第一个房间: 101
                for (int k = 0; k <rooms[i][j].length ; k++) {
                    //给某个房间设置 价格, 类型, 状态
                    switch(k){
                        case 0: //设置价格   j%价格数组长度(5)求余 = 0~4
                            rooms[i][j][0]= j%roomPriceArr.length;
                            break;
                        case 1: //设置类型
                            rooms[i][j][1]= j%roomTypeArr.length;
                            break;
                        case 2: //设置状态 0: 空闲  1: 有人
                            rooms[i][j][2]=0;
                            break;
                    }
                }
            }
        }
    }
}

扩展: 选择排序, 插入排序, 每一种排序时间复杂度

int left = 0;

int right = arr.length - 1;

while(left < right){

        int min = left;

        int max = left;

        for(int i = left;i <= right;i++){

                if(arr[i] < arr[min]){

                        min = i;

                }

                if(arr[i] > arr[max]){

                        max= i;

                }

        }

        swap(arr[left],arr[min]);

        if(left == max){

                max = min;

        }

        swap(right,max);

        left++;

        right--;

}

选择排序:O(n^2) 因为每一次遍历数组数组时,都要遍历数组选出最大和最小的数组,每一次遍历都是O(n),就算是自身有序的也要遍历筛选

int[] arr = {2,588,888,1000,10000};
if(arr.length <1){
    return;//终止
}
for(int i = 1;i<  arr.length;i++){
    int index = arr[i];
    int j;
    //查找插入位置
    for(j = i - 1;j >= 0;--j){
        if(arr[j] > index){
            arr[j+1] = arr[j];//数组整体移动
        }else{
            break;
        }
    }
    arr[j+1] = index;
}
for(int v:arr){
    System.out.print(v+"\t");
}
//时间复杂度:在完全有序的情况下,插入排序每个未排序区间元素只需要比较1次为O(n)
//极端情况下,比如数组时逆序排列分布,为O(n^2) 就等于每次把未排序元素插入到数组第一位。插入一个元素的时间复杂度为O(n) n个元素就是O(n^2)

 

 

        int[] praise = {2,588,888,1000,10000};
        int[] randomIndex = new int[5];
        boolean[] generateNumbers = new boolean[5];设置一个布尔数组,初值全部设置为false,代表里面的元素->代表索引,用来解决重复问题
        for(int i = 0;i <randomIndex.length;){
            int index = (int)(Math.random()*randomIndex.length);
            //一开始布尔索引里面放的全是false元素,给她加了索引(也没啥用还是false
            // ,但是取反之后就为真了,,如果下次·是一样的生成的索引就会取反为false)
            if (!generateNumbers[index]){
                randomIndex[i] = index;
                generateNumbers[index] = true;//generateNumber的索引应该也是随机的
                i++;
            }
        }

        for (int i = 0; i < praise.length; i++) {
            System.out.println(praise[randomIndex[i]] + "的奖金被抽出");
        }
        //1.声明数组
        int[] arr1;
        String arr2[];
        char[] arr3;

        //2.开辟空间
        arr1 = new int[5];
        System.out.println(arr1[0]);

        //3.给数组添加元素
        arr1[0] = 100;
        //4.使用数组的元素
        System.out.println(arr1[0]);
//声明开辟空间
        String[] strs = new String[5];
        System.out.println(strs[0]);

        //静态初始化
        int[] arr = new int[]{1,3,5,7,9};

        String[] strs2 = {"张三","李四","王五"};

        //分开
        double[] arr2;
        arr2 = new double[]{1.2,1.3,1.4};

        //无法拆分
       // char[] chArr;
        //chArr = {'c','d','b'};

        //给数组赋值
       // arr2[3]=1.88;

       // System.out.println(arr2[-1]);

        //遍历数组
        int[] ages = new int[10];

        //循环赋值
        Scanner input = new Scanner(System.in);
        int sum = 0;
        for (int i = 0; i <ages.length ; i++) {
            System.out.print("请输入第"+(i+1)+"个学生的年龄:");
            ages[i] = input.nextInt();
        }

        //求学生总年龄   5硬编码, 写死
        for (int i = 0; i < ages.length ; i++) {
            sum += ages[i];
        }
        //平均年龄
        double avg = (double)sum / 5;
        System.out.println("平均年龄:"+avg);

//---------------------------------------------------------------------------------------
        int[] arr = {1,4,62,22,34,68,12,98,11};
        //1.假设第一个元素是最大值
        int max = arr[0];
        int index = 0;//假设最大值的下标
        //2.从数组第二个元素开始,依次与最大值比较,谁大谁就是最大
        for (int i = 1; i < arr.length; i++) {
            if(max < arr[i]){
                max = arr[i];
                index = i;
            }
        }
        System.out.println("最大值:"+max);
        System.out.println("最大值下标:"+index);

## 数组

 >存储数据

变量: 存储的一个值

int a = 10;

数组: 存储一组相同数据类型的值, 容器

变量要素:

1. 数据类型
2. 变量名
3. 变量的值

数组要素:

1. 数据类型

2. 数组名

3. 数组的下标:  >=0     小于等于数组的长度-1

4. 数组的元素

   

使用变量:

1. 声明变量(开辟空间) int a;
2. 给变量赋值
3. 使用

使用数组:

1. 声明数组   语法:  数据类型[] 数组名;     数据类型 数组名[];

   2. 开辟空间, 确定数组的长度(最多能存储几个元素)

      语法: 数组名 = new 数据类型[长度];

​        数组有默认值元素: 

>整数类型:  0
>
>浮点类型: 0.0
>
>char类型: \u000
>
>boolean类型: false
>
>String/类类型: null

3. 给数组添加元素   语法:  数组名[下标] = 值;
4. 获取数组的元素,使用  语法: 数组名[下标]

数组细节

  1. 声明与开辟空间合并

    数据类型[] 数组名 = new 数据类型[长度];

  2. 静态赋值 声明,开辟空间, 添加元素合并

    数据类型[] 数组名 = new 数据类型[]{值1,值2,…}

    简写: 数据类型[] 数组名 ={值1,值2,…}

    第一种写法: 声明数组与静态初始化可以拆分

    第二种写法: 声明数组与静态初始化不可以拆分

  3. 数组下标问题 [0,数组长度-1]

    手动给数组赋值,使用下标

    获取数组的元素,使用下标

    如果下标超出范围,抛如下错误

数组的特征: 固定长度,一旦数组确定长度,这个数组存储元素个数确定(缺点)

解决方案: 扩容(手动实现数组的扩容) 扩展作业

public class ArrayExpansion {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3, 4, 5};
      
        // 扩容为原数组长度的两倍
        int[] expandedArray = new int[originalArray.length * 2];

        // 复制原数组的元素到新数组中
        for (int i = 0; i < originalArray.length; i++) {
            expandedArray[i] = originalArray[i];
        }

        // 将新数组赋值给原数组引用
        originalArray = expandedArray;

        // 输出扩容后的数组
        System.out.println("原始数组:" + Arrays.toString(originalArray));
    }
}
 

  1. 数组的遍历, 与for匹配

    数组属性: length属性: 数组的长度

    数组名.length: 动态得到数组的长度

数组应用:

优化 找最大值/最小值

思路: 1. 假设第一个元素是最大/最小

在校足球联赛中,有5个班级的比赛积分如下表:

班级

积分

一班

15

二班

11

三班

13

四班

6

五班

9

分别使用冒泡排序和选择排序对5个班级的比赛积分进行降序排序

冒泡排序降序:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

框架开发使用注解处理器APT优雅提效

目录 概述1.什么是注解处理器APT2.应用场景3.如何使用3.1 创建注解API模块3.2 创建注解处理器模块3.3 使用注解 概述 在现在的很多开源框架中&#xff0c;我们经常能在源码中看到注解处理器的影子&#xff0c;比如我们熟悉的阿里的ARouter,Android开发中的替代findViewById神器…

【git】git以及可视化界面下载安装

git 以及可视化界面下载安装 git下载安装测试功能 sourceTree下载安装 git 下载安装 下载地址 git官网上有多个版本&#xff0c;点击“Click here to download” &#xff0c;下载下来之后&#xff0c;一直下一步安装即可 测试功能 在任意文件夹中右击&#xff0c;看到图中…

Linux三剑客

前言 关于bash&#xff1a; bash&#xff1a;命令处理器&#xff0c;运行在文本窗口&#xff0c;能够执行用户输入的命令。 脚本&#xff1a;从linux文件中读取命令&#xff0c;被称为脚本。 1 命令&#xff1a;alias&#xff1a;起别名 2 快捷键操作&#xff1a; ctrla&#…

浅谈如何提高自动化测试的稳定性和可维护性

目录 前言&#xff1a; 装饰器与出错重试机制 什么是装饰器&#xff1f; 编写一个出错重试装饰器 pytest 里的出错重试机制实现 Allure 里的测试用例分层 为什么要采用分层机制&#xff1f; allure 的装饰器step 前言&#xff1a; 自动化测试在软件开发中扮演着重要的…

Fortran lapack求数组的特征值,特征向量

call zgeev(V, V, n, arr, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info) 这个函数是求矩阵的特征值&#xff0c;且结果是双精度复数的情况&#xff0c;具体可以查MKL的官方文档。 如果是单精度复数就要用cgeev&#xff0c;其中的参数也是将双精度改为单精度即可。…

Hive,FineBI-30W聊天数据分析及可视化-B站黑马学习记录

2023B站黑马Hadoop、Hive、云平台实战项目 目录 1. 清洗数据 2. 计算各指标&#xff0c;并创建表存储结果 3.FineBI连接Hive数据库&#xff0c;将指标结果可视化 1. 清洗数据 1&#xff09;部分数据缺失地理位置信息&#xff08;sender_gps&#xff09;&#xff0c;需要剔…

Linux下的调试器——gdb使用指南

文章目录 一.序二.安装gdb调试器三.进入调试四.调试相关指令 前言&#xff1b; 在VS环境下&#xff0c;我们不仅可以写代码、编译、运行可执行程序&#xff0c;还可以对生成的可执行程序进行调试。本章我们就来学习如何在Linux环境下进行调试。 一.序 要进行调试&#xff0c;首…

EPICS一个示例数据库实例详解

以下是一个示例数据库图表&#xff1a; 以上记录的数据库文件如下&#xff1a; record(ao, "$(P):SET") {field(FLNK, "$(P):ACTIVATE")field(VAL, "2")field(OUT, "$(P):RUN")field(DRVH, "40")field(DRVL, "5"…

摩尔投票算法(Moore‘s Voting Algorithm)及例题

摩尔投票算法&#xff08;Moores Voting Algorithm&#xff09;及例题 摩尔投票算法简介摩尔投票算法算法思想摩尔投票算法经典题目169. 多数元素229. 多数元素 II6927. 合法分割的最小下标 上午打力扣第 354 场周赛最后十五分钟用摩尔投票算法顺利 AC 第三题&#xff0c;以前没…

ViewRootImpl简析

ViewRootImpl简析 如何实现视图和wms沟通桥梁的作用Session的创建获取画布如何实现事件分发的桥梁作用 The top of a view hierarchy, implementing the needed protocol between View and the WindowManager. This is for the most part an internal implementation detail of…

快速搭建Python(Django)+Vue环境并实现页面登录注册功能

文章目录 一. 创建vue项目及环境搭建1. 创建vue项目2. 配置axios3. 创建vue组件login和register4. 设置并引用路由vue-router5. 完成login&#xff0c;register组件代码6. 完成App.vue的代码 二. 创建django项目及环境搭建1. 创建django项目2.配置mysql数据库3. 创建应用app4.创…

学习babylon.js --- [4] 体验WebVR

本文基于babylonjs来创建一个简单的WebVR工程&#xff0c;来体验一下babylonjs带来的VR效果&#xff0c;由于没有VR头显&#xff0c;所以只能使用Win10自带的混合现实模拟器&#xff0c;开启模拟器请参考这篇文章 一 简单工程 本文基于第三篇文章中的工程进行修改&#xff0c;…

Deep Residual Learning for Image Recognition

2015-ResNet 关键词: residual connection CV论文:一般在第一页就放一个很“好看”的图 从图可以得到的结论:深的网络更难训练 ( 不仅因为过拟合,因为训练时误差都很难降低 ) 网络结构图 1*1卷积作用:改变通道数 ,提出维度匹配方法:1)补零;2)投影projection…

map和set的模拟实现|利用红黑树封装map和set|STL源码剖析

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

再战Nvidia,安装 Windows 11 和 EndeavourOS 双系统

吐血刚装了一周的Ubuntu23.04就挂了&#xff0c;由于买的是最新的显卡就上了Test版本&#xff0c;结果Ubuntu自带的nvidia驱动535居然会失灵&#xff0c;nvidia-smi直接fail。于是换了一堆发行版本&#xff0c;但是我这个主板没带hdmi不支持集显输出&#xff0c;必须安装时就上…

WEB:warmup

背景知识 文件包含 目录遍历 代码审计 题目 打开链接后只有一张图片 f12和查看源代码都试一下&#xff0c;查看源代码发现如下图 访问一下source.php&#xff0c;有如下代码&#xff0c;进行代码审计 <?phphighlight_file(__FILE__);class emmm{public static function c…

#pragma pack不成对出现造成的异常

#pragma pack需要成对出现&#xff0c;若不成对出现会造成异常&#xff0c;难以调查。 现有5个文件&#xff0c;分别是main.c&#xff0c;A.h&#xff0c;A.c&#xff0c;B.h&#xff0c;B.c。 A.h文件内容如下&#xff1a; #include <stdio.h> #include <stdlib.h&g…

ylb-接口14购买理财产品

总览&#xff1a; 在api模块service包&#xff0c;Invest类下添加&#xff08;投资理财产品&#xff0c; int 是投资的结果 &#xff0c; 1 投资成功&#xff09;&#xff1a; package com.bjpowernode.api.service;import com.bjpowernode.api.pojo.BidInfoProduct;import j…

go mod vendor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包&#xff0c;它具有以下优点&#xff1a; 复制依赖&#xff1a;go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中&#xff0c;所以即使这些依赖包在外部源&#xff08;如 GitHu…

MySQL 约束、聚合查询和联合查询练习

1. 数据库约束 设置一个考勤系统, 包含员工表&#xff0c;考勤记录表 首先要明白, 员工表对考勤记录表是一对多 员工表中起码包含 id , name 考勤记录表则包含 id, 日期, 考勤记录 考勤记录表为子表, id 则为外键约束 员工表为父键, id则为主键约束 搞明白这些, 接下来就…