题一:抢红包小程序

第1关:抢红包小程序之随机分配红包

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中完成随机分配红包的功能,具体要求如下:

  • RedPacketUtil 类定义了一个 splitRedPackets(int money, int count) 的方法,方法返回值为 List 集合,传入的两个参数分别为红包总金额(单位:分)和红包数量,将分配好的红包放入 List 集合,最后将该集合返回;

  • 如果初始金额大于 200 元和每个包的值小于 1 分,输出:“红包金额不合法”,之后退出程序。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 100
  2. 10

第一次输入的值为红包总金额:100 分;

第二次输入的值为红包数量:10 份;

预期输出:

  1. [2, 17, 6, 9, 3, 8, 18, 18, 2, 17]
  2. 红包发送成功

RedPacketUtil.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author 吴泽胜
 * @FileName RedPacketUtil
 * @date 2021-01-05 1:52 上午
 * @Software: IntelliJ IDEA
 */

public class RedPacketUtil {
    // 请在下面的Begin-End之间编写正确的代码
    /********** Begin **********/

    // 最小红包额度
    private final double MinRedPackage = 1;
    // 最大红包额度
    private final double MaxRedPackage = 20000;
    // 每个红包最大是平均值的倍数
    private final int AverageMultiple = 2;

    /**
     * 参数 money
     * 参数 count
     * 返回值 List
     * 功能: 拆分红包
     */
    public List<Integer> splitRedPackets(int money, int count) {

        List<Integer> data = new ArrayList<Integer>(count);
        //判断当前金额和数量是否正确
        if( money > MaxRedPackage || money < MinRedPackage || money < count){
            data.add(1);
            System.out.println("红包金额不合法");
            System.exit(0);
        }
        int restMoney = money;
        int restCount = count;
        // 随机发前 Count - 1 个红包, 最后一个不需要随机
        for (int i = 0; i < count ; i++) {
            // 最少1分钱, 最多不超过剩下金额平均数的2倍
            int threshold = (restMoney / restCount * AverageMultiple);
            int item = random( restMoney, 1 ,  threshold, restCount );
            data.add(item);
            restMoney -= item;
            restCount--;
        }
        return data;
    }

    /**
     * 参数 money
     * 参数 minS 最小值
     * 参数 maxS 最大值
     * 返回值 int
     * 功能 获取每个包的随机金额
     */
    private int random(int money, int minS, int maxS, int count) {
        maxS -= minS;
        if( maxS == 0 ) maxS = 1;
        int randomNumber = ((int)Math.rint(Math.random() * (maxS - minS) + minS)) % maxS + 1;
        return count != 1 ? randomNumber : money;
    }
    /********** End **********/
}

第2关:抢红包小程序

任务描述

本关任务:模拟人员抢红包,并展示红包领取详情。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中完成模拟人员抢红包的功能,具体要求如下:

  • RedEnvelope 类中定义了一个 open 的方法,该方法携带一个参数 name,表明是这个人打开了红包,在该方法中实现以下功能:

    • 如果超过 5 秒没人领取,红包过期,当再有人打开红包时,输出:“红包已经过期”;
    • 如果未过期,且第一个人打开红包时,将 start 设为当前时间,记录下红包开始领取的时间,将红包列表的最后一个值给该人,第二个人打开时就将红包列表的倒数第二位的值给他,输出:“恭喜xx,领取到了xx元”,并将姓名作为 key,红包金额作为 value 存到 info 集合中(注意:输出和存储是需要将分转换为元,除以 100.0),将红包数量减去一,并判断红包数量是否为零,如果为零则获取当前时间为红包领取完的时间,计算红包几秒领取完毕,输出:“红包被抢完,一共用了xx秒”,后面的人领取红包时依次类推;
    • 如果红包领完后,且红包未过期,输出:“xx手速慢了,红包都没啦”;
  • showInfo():该方法实现打印红包领取详情,输出格式为:“xx抢到了xx元”,当所有红包领取详情输出完毕后,最后输出谁是运气王,输出格式为:“其中,xx是运气王,抢到了xx元”。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 21,12,19,18

预期输出:

  1. 恭喜xx0,抢到了0.18元
  2. 恭喜xx1,抢到了0.19元
  3. 恭喜xx2,抢到了0.12元
  4. 恭喜xx3,抢到了0.21元
  5. 红包被抢完,一共用了3秒
  6. xx4手速慢了,红包都没啦
  7. xx1抢到了0.19元
  8. xx0抢到了0.18元
  9. xx3抢到了0.21元
  10. xx2抢到了0.12元
  11. 其中,xx3是运气王,抢到了0.21元

RedEnvelope.java

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
 * @author 吴泽胜
 * @FileName RedEnvelope
 * @date 2021-01-05 8:10 下午
 * @Software: IntelliJ IDEA
 */

public class RedEnvelope {

    private int totalMoney; // 红包金额(分)
    private int bagNum; // 红包数目
    private Date createDate; // 发送日期
    private long start = 0; // 第一个人抢红包的开始时间
    private long end = 0; // 红包抢完后的结束时间
    private List<Integer> bag; // 分配到的红包列表(分)
    private Map<String,Double> info; // 红包领取信息

    // 有参构造方法,初始化一些参数的值
    public RedEnvelope(int totalMoney,int bagNum,List<Integer> bag){
        this.bagNum=bagNum;
        this.totalMoney=totalMoney;
        this.bag = bag; // 红包随机分配列表
        {
            info=new HashMap<>();
            createDate=new Date(); // 发红包的时间
        }
    }
    // 请在下面的Begin-End之间编写正确的代码
    /********** Begin **********/
    /**
     * 参数:领取红包的人的名称
     * 无返回值
     * 功能:打开红包
     */
    public void open(String name){
        // 判断红包是否过期
        /**
         * 如果超过 5 秒没人领取,红包过期,当再有人打开红包时,输出:“红包已经过期”;
         */
        int second = (int)((new Date().getTime()- createDate.getTime()) / (1000));
        if (second < 5){
            // 如果第一个包,设置红包开始领取的时间
            if ( info.size() == 0 ){
                start = new Date().getTime();
            }

            // 如果红包数量不为 0
            if (bagNum > 0 ){
                double nowMoney = bag.get(bagNum - 1)/100.0;
                // 将领取情况放入 info 集合
                info.put(name, nowMoney);
                // 获取列表的红包值,并将红包数量减一
                totalMoney -= bag.get(--bagNum);
                // 输出领取的数目
                System.out.println("恭喜" + name + ",抢到了" + nowMoney + "元");
            }

            //  如果最后一个红包被领取,输出红包几秒领完
            if ( bagNum == 0){
                end = new Date().getTime();
                System.out.println("红包被抢完,一共用了" + ((int)((end - start) / (1000))) + "秒");
                bagNum = -1;
                return;
            }

            // 如果已经领完,输出:“xx手速慢了,红包都没啦”
            if(bagNum == -1){
                System.out.println( name + "手速慢了,红包都没啦");
            }
        }
        else {
            // 如果红包过期,输出:“红包已经过期”
            System.out.println( name + ":红包已经过期");
        }
    }

    // 打印红包领取详情和谁是运气王
    public void showInfo(){
        Double max = info.get("xx0");
        for(Entry<String, Double> entry : info.entrySet()){
            max = entry.getValue() > max ? entry.getValue() : max;
            System.out.printf( "%s抢到了%.2f元\n", entry.getKey(),entry.getValue());
        }
        for(Entry<String, Double> entry : info.entrySet()){
            if (entry.getValue() == max){
                System.out.printf( "其中,%s是运气王,抢到了%.2f元\n", entry.getKey(),entry.getValue());
                break;

            }

        }
    }
    /********** End **********/
}

题二:简单通讯录管理系统

 

第1关:简单通讯录管理系统之添加用户信息

任务描述

本关任务:实现通讯录管理系统中添加用户信息的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录管理系统中添加用户信息的功能,具体要求如下:

  • 在 User.java 文件中,定义一个 User 的公开类,有两个私有属性属性:用户姓名(name)和电话号码(tel),都是字符串类型;

  • 该类定义了获取和设置这些属性的方法,有无参和有参构造方法;

  • 在 PhoneManage.java 类定义一个 addPhone(User[] users) 的方法,无返回值,该方法实现将用户信息放入 users 对象数组中;

  • 在该方法中首先输出:“请输入姓名:”,然后获取键盘输入的用户姓名,再输入:“请输入手机号:”,获取键盘输入的用户手机号,最后将这些信息放入用户对象中,最后存入用户数组中。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. xiaoming
  2. 18845821235

预期输出:

  1. 请输入姓名:
  2. 请输入手机号:
  3. 姓名 电话
  4. xiaoming 18845821235

PhoneManage.java

/**
 * @author 吴泽胜
 * @FileName PhoneManage
 * @date 2021-01-05 10:12 上午
 * @Software: IntelliJ IDEA
 */

import java.util.Scanner;

public class PhoneManage {
    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    // 实例化 Scanner 对象
    Scanner sc = new Scanner(System.in);
    /**
     * addPhone
     * 参数 users
     * 新增用户信息
     */
    public void addPhone(User[] users){

        System.out.println("请输入姓名:");
        System.out.println("请输入手机号:");
        // 将键盘输入的用户信息存入用户对象中
        String name = sc.next();
        String tel = sc.next();
        // 将对象放入对象数组中
        for (int i = 0; i < users.length; i++) {
            if (users[i] == null){
                users[i] = new User(name, tel);
                break;
            }
        }
    }
    /********** End **********/
}

User.java

/**
 * @author 吴泽胜
 * @FileName User
 * @date 2021-01-05 10:12 上午
 * @Software: IntelliJ IDEA
 */

// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 定义 User 公开类
public class User{
    // 用户的两个私有属性:姓名、电话号码
    private String name;
    private String tel;

    // 无参构造
    public User(){

    }

    // 有参构造
    public User(String name, String tel){
        this.name = name;
        this.tel = tel;
    }


    // 设置和获取用户属性信息
    public String getName() {
        return name;
    }

    public String getTel() {
        return tel;
    }
}
/********** End **********/

 

第2关:简单通讯录管理系统之通讯录查询

任务描述

本关任务:在之前的练习任务中,我们实现了新增用户的功能,本关我们主要实现查询通讯录用户电话信息的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录管理系统中查询用户信息的功能,具体要求如下:

  • 在 PhoneManage.java 类定义一个 showPhone(User[] users) 的方法,无返回值,该方法实现查询 users 对象数组中所有的对象信息;

  • 该方法输出格式:“用户名 电话号码”,中间用 Tab 符隔开。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. xiaoming
  2. 18845821235
  3. zhangfeng
  4. 18895452541

预期输出:

  1. xiaoming 18845821235
  2. zhangfeng 18895452541

PhoneManage.java

import java.util.Scanner;

public class PhoneManage {
    Scanner sc = new Scanner(System.in);
    /**
     * 参数 users
     * 新增用户信息
     */
    public void addPhone(User[] users) {
        // 将键盘输入的用户信息存入用户对象中
        String name = sc.next();
        String tel = sc.next();
        User u = new User(name,tel);
        // 将对象放入对象数组中
        for (int i = 0; i < users.length; i++) {
            if (users[i] == null) {
                users[i] = u;
                break;
            }
        }
    }

    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/

    /**
     * 参数 users
     * 查询通讯录列表
     */
    public void showPhone(User[] users){
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null) {
                System.out.println(users[i].getName() + "\t" + users[i].getTel());
            }
        }
    }

    /********** End **********/
}

User.java

// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 定义 User 公开类
public class User {
    // 用户的两个私有属性:姓名、电话号码
    private String name; // 用户姓名
    private String tel; // 用户电话号码

    // 无参构造
    public User() {
    }
    // 有参构造
    public User(String name, String tel) {
        this.name = name;
        this.tel = tel;
    }

    // 设置和获取用户属性信息
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }


}
/********** End **********/

第3关:简单通讯录管理系统之删除用户

任务描述

本关任务:实现删除通讯录用户的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录管理系统中删除用户信息的功能,具体要求如下:

  • 在 PhoneManage.java 类定义一个 deletePhone(User[] users) 的方法,无返回值,该方法实现根据输入的用户名,在通讯录中删除该用户信息;

  • 首先输出:“请输入姓名:”,然后读取键盘输入的用户名,在 users 对象中删除对应的用户信息,最后输出:“删除成功!”。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. xiaoming
  2. 18845821235
  3. zhangfeng
  4. 18895452541
  5. zhangfeng

预期输出:

  1. 请输入姓名:
  2. 删除成功!
  3. xiaoming 18845821235

PhoneManage.java

import java.util.Scanner;

public class PhoneManage {
    Scanner sc = new Scanner(System.in);
    /**
     * 参数 users
     * 新增用户信息
     */
    public void addPhone(User[] users) {
        // 将键盘输入的用户信息存入用户对象中
        String name = sc.next();
        String tel = sc.next();
        User u = new User(name,tel);
        // 将对象放入对象数组中
        for (int i = 0; i < users.length; i++) {
            if (users[i] == null) {
                users[i] = u;
                break;
            }
        }
    }



    /**
     * 参数 users
     * 查询通讯录列表
     */
    public void showPhone(User[] users){
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null) {
                System.out.println(users[i].getName() + "\t" + users[i].getTel());
            }
        }
    }


    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    /**
     * 参数 users
     * 删除通讯录用户信息
     */
    public void deletePhone(User[] users){
        // 获取键盘输入的用户名
        System.out.println("请输入姓名:");

        String name = sc.next();
        // 根据用户名查找该用户,最后将该用户从用户对象数组中删除
        for (int i = 0; i < users.length; i++) {
            User user = users[i]; // 把所有 users[i] 赋值给 y
            if (user != null && name.equals(user.getName())) {
                users[i] = null;
                System.out.println("删除成功!");
                break;
            }
        }
        
    }
    /********** End **********/
}

第4关:简单通讯录管理系统之修改通讯录用户信息

任务描述

本关任务:实现修改通讯录用户电话号码的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录管理系统中修改用户信息的功能,具体要求如下:

  • 在 PhoneManage.java 类定义一个 changePhone(User[] users) 的方法,无返回值,该方法实现修改用户电话号码的功能;

  • 首先输出:“请输入你要修改用户的名称:”,然后读取键盘输入的用户名,在 users 对象中找到对应的用户信息;

  • 然后输出:“请输入新电话:”,读取键盘输入的电话号码,将用户的电话号码进行修改,最后输出:“修改成功!”。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. xiaoming
  2. 18845821235
  3. zhangfeng
  4. 18895452541
  5. xiaoming
  6. 16345481598

预期输出:

  1. 请输入你要修改用户的名称:
  2. 请输入新电话:
  3. 修改成功!
  4. xiaoming 16345481598
  5. zhangfeng 18895452541

PhoneManage.java

import java.util.Scanner;

public class PhoneManage {
    Scanner sc = new Scanner(System.in);
    /**
     * 参数 users
     * 新增用户信息
     */
    public void addPhone(User[] users) {
        // 将键盘输入的用户信息存入用户对象中
        String name = sc.next();
        String tel = sc.next();
        User u = new User(name,tel);
        // 将对象放入对象数组中
        for (int i = 0; i < users.length; i++) {
            if (users[i] == null) {
                users[i] = u;
                break;
            }
        }
    }



    /**
     * 参数 users
     * 查询通讯录列表
     */
    public void showPhone(User[] users){
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null) {
                System.out.println(users[i].getName() + "\t" + users[i].getTel());
            }
        }
    }



    /**
     * 参数 users
     * 删除通讯录用户信息
     */
    public void deletePhone(User[] users){
        // 获取键盘输入的用户名
        System.out.println("请输入姓名:");
        String delname = sc.next(); // 在控制台输入
        // 根据用户名查找该用户,最后将该用户从用户对象数组中删除
        for (int i = 0; i < users.length; i++) {
            User y = users[i]; // 把所有 users[i] 赋值给 y
            if (y != null && delname.equals(y.getName())) {
                users[i] = null;
                System.out.println("删除成功!");
                break;
            }
        }
    }

    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    public void changePhone(User[] users) {
        // 获取要修改用户的名称
        System.out.println("请输入你要修改用户的名称:");
        String name = sc.next();
        // 在用户对象数组中找到对应的用户信息
        for (User user : users) {
            if ( user != null && name.equals( user.getName())) {
                // 将该用户的电话修改为键盘输入的新电话号码
                System.out.println("请输入新电话:");
                user.setTel(sc.next());
                System.out.println("修改成功!");
                break;
            }
        }
    }

    /********** End **********/
}

第5关:简单通讯录管理系统之菜单管理

任务描述

本关任务:在之前的练习任务中,我们已经实现了通讯录的增删改查等基本功能,本关我们主要实现一个通讯录的菜单管理功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现通讯录菜单管理功能,具体要求如下:

  • 在 MenuPhone.java 中有 5 个选项,实现这几个选项的功能;

  • 获取键盘输入的值,如果为 1、2、3、4,分别调用 PhoneManage.java 的方法实现这四个功能,之后返回主菜单,也就是将通讯录信息管理页面的内容重新打印输出;

  • 如果为 5 ,退出程序,并输出:“退出成功!”;

  • 如果输入的是其它值时,输出:“选择错误!”,返回主菜单。

注意:PhoneMange 类并没有实例化 Scannner 对象,某些方法需要用到该对象的,请在调用该方法时传过去。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. sunfeng
  3. 14785452356
  4. 2
  5. 5

预期输出:

  1. 通讯录信息管理页面
  2. **********
  3. 1.新增
  4. 2.查看
  5. 3.删除
  6. 4.修改
  7. 5.退出
  8. **********
  9. 请输入选择的操作:
  10. 请输入姓名:
  11. 请输入手机号:
  12. 通讯录信息管理页面
  13. **********
  14. 1.新增
  15. 2.查看
  16. 3.删除
  17. 4.修改
  18. 5.退出
  19. **********
  20. 请输入选择的操作:
  21. sunfeng 14785452356
  22. 通讯录信息管理页面
  23. **********
  24. 1.新增
  25. 2.查看
  26. 3.删除
  27. 4.修改
  28. 5.退出
  29. **********
  30. 请输入选择的操作:
  31. 退出成功!

MenuPhone.java

import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuPhone {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的通讯录信息
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
		// 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);

        // 实例化 PhoneManage 对象
        PhoneManage phoneManage = new PhoneManage();
        boolean flag = true;
        while( flag ){
            System.out.println("通讯录信息管理页面");
            System.out.println("**********");
            System.out.println("1.新增");
            System.out.println("2.查看");
            System.out.println("3.删除");
            System.out.println("4.修改");
            System.out.println("5.退出");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            switch(sc.nextInt()){
                // 新增用户
                case 1 :
                    phoneManage.addPhone(users, sc );
                    break;
                // 查询所有用户信息
                case 2 :
                    phoneManage.showPhone(users);
                    break;
                // 删除用户信息
                case 3 :
                    phoneManage.deletePhone(users, sc );
                    break;
                // 修改用户信息
                case 4 :
                    phoneManage.changePhone(users, sc );
                // 退出操作
                    break;
                case 5 :
                    flag = false;
                    System.out.print("退出成功!");
                    break;
            }
        }
        /********** End **********/
    }
}

PhoneManage.java

import java.util.Scanner;

public class PhoneManage {
    /**
     * 参数 users
     * 新增用户信息
     */
    public void addPhone(User[] users,Scanner sc) {
        // 将键盘输入的用户信息存入用户对象中
        System.out.println("请输入姓名:");
        String name = sc.next();
        System.out.println("请输入手机号:");
        String tel = sc.next();
        User u = new User(name,tel);
        // 将对象放入对象数组中
        for (int i = 0; i < users.length; i++) {
            if (users[i] == null) {
                users[i] = u;
                break;
            }
        }
    }



    /**
     * 参数 users
     * 查询通讯录列表
     */
    public void showPhone(User[] users){
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null) {
                System.out.println(users[i].getName() + "\t" + users[i].getTel());
            }
        }
    }



    /**
     * 参数 users
     * 删除通讯录用户信息
     */
    public void deletePhone(User[] users,Scanner sc){
        // 获取键盘输入的用户名
        System.out.println("请输入姓名:");
        String delname = sc.next(); // 在控制台输入
        // 根据用户名查找该用户,最后将该用户从用户对象数组中删除
        for (int i = 0; i < users.length; i++) {
            User y = users[i]; // 把所有 users[i] 赋值给 y
            if (y != null && delname.equals(y.getName())) {
                users[i] = null;
                System.out.println("删除成功!");
                break;
            }
        }
    }


    public void changePhone(User[] users,Scanner sc) {
        // 获取要修改用户的名称
        System.out.println("请输入你要修改用户的名称:");
        String editname = sc.next();
        // 在用户对象数组中找到对应的用户信息
        for (User z : users) {
            if (z != null && editname.equals(z.getName())) {
                // 将该用户的电话修改为键盘输入的新电话号码
                System.out.println("请输入新电话:");
                z.setTel(sc.next());
                System.out.println("修改成功!");
                break;
            }
        }
    }

}

题二:简易考试系统

 

第1关:简易考试系统之用户注册

任务描述

本关任务:实现简易考试系统中新用户注册的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现简易考试系统中新用户注册的功能,具体要求如下:

  • User.java 提供了用户的基本信息,该类已经定义完成,请仔细阅读该类;

  • 在 MenuExam.java 中有 3 个选项,实现第一个和第三个选项的功能;

  • 获取键盘输入的值,如果为 1,首先输出“请输入你要注册的用户名:”,获取键盘输入的用户名,再输出“请输入你要注册的密码:”,获取键盘输入的密码,然后调用 ExamManage.java 文件中的 register(String name, String pwd, User[] users) 方法,将该方法所需参数传入;

  • register 方法携带三个参数,分别为:用户名、密码和用户数组,该方法实现注册新用户的功能;

  • 首先判断用户名是否规范:要求用户名必须是 6-10 位字母、数字、下划线(这里字母、数字、下划线是指任意组合,没有必须三类均包含),不能以数字开头,如果不规范,输出:“用户名不合规范!”,返回主菜单;

  • 再判断该用户名是否已存在(也就是已经在 users 数组中存在),如果存在,输出:“用户名已存在!”,返回主菜单;

  • 判断密码是否规范:要求密码必须是 6-10 位字母、数字、下划线(这里字母、数字、下划线是指任意组合,没有必须三类均包含)如果不规范,输出:“密码不合规范!”,返回主菜单;

  • 如果用户名和密码没有问题,创建该用户,并存入用户数组中;

  • 如果键盘输入的值为 3 ,退出程序,并输出:“退出成功!”;

  • 如果输入的是其它值时,输出:“选择错误!”,返回主菜单。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. 5sunfeng
  3. 123456
  4. 1
  5. sunfeng
  6. 1234
  7. 3

预期输出:

  1. 线上考试系统
  2. **********
  3. 1. 新用户注册
  4. 2. 用户登录
  5. 3. 退出系统
  6. **********
  7. 请输入选择的操作:
  8. 请输入你要注册的用户名:
  9. 请输入你要注册的密码:
  10. 用户名不合规范!
  11. 线上考试系统
  12. **********
  13. 1. 新用户注册
  14. 2. 用户登录
  15. 3. 退出系统
  16. **********
  17. 请输入选择的操作:
  18. 请输入你要注册的用户名:
  19. 请输入你要注册的密码:
  20. 密码不合规范!
  21. 线上考试系统
  22. **********
  23. 1. 新用户注册
  24. 2. 用户登录
  25. 3. 退出系统
  26. **********
  27. 请输入选择的操作:
  28. 退出成功!

User.java

public class User {

    private String name; // 用户姓名
    private String pwd; // 密码
    private double math; // 数学成绩
    private double english; // 英语成绩

    // 无参构造
    public User() {

    }
    // 有参构造
    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }


    // 设置和获取用户属性信息
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public double getMath() {
        return math;
    }

    public void setMath(double math) {
        this.math = math;
    }

    public double getEnglish() {
        return english;
    }

    public void setEnglish(double english) {
        this.english = english;
    }
}

ExamManage.java

public class ExamManage {

    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    /**
     * 功能:注册新用户
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void register(String name, String pwd, User[] users) {
        // 判断用户名是否规范
        if (name.matches("^[^0-9][\\w_]{5,9}$")){
            // 判断用户名是否已存在
            if (!findUser(name,users)){
                // 判断密码是否规范
                if (pwd.matches("^[\\w_]{6,10}$")){
                    User user = new User();
                    user.setName(name);
                    user.setPwd(pwd);
                    // 将对象放入对象数组中
                    for (int i = 0; i < users.length; i++) {
                        if (users[i] == null) {
                            users[i] = user;
                            break;
                        }
                    }
                }else {
                    System.out.println("密码不合规范!");
                }
            }else {
                System.out.println("用户名已存在!");
            }
        }else {
            System.out.println("用户名不合规范!");
        }
    }

    public boolean findUser(String name, User[] users){
        for(User u : users){
            if( u != null && name.equals(u.getName()) ){
                return true;
            }
        }
        return false;
    }

    /********** End **********/

}

MenuExam.java


import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuExam {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的用户信息
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        // 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);
        // 实例化 ExamManage 对象
        ExamManage examManage = new ExamManage();
        while (true) { 
            System.out.println("线上考试系统");
            System.out.println("**********");
            System.out.println("1. 新用户注册"); 
            System.out.println("2. 用户登录");
            System.out.println("3. 退出系统");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            String str = sc.next();
            // 实现注册功能
            if ("1".equals(str)) { 
                // 获取键盘输入的用户名
                System.out.println("请输入你要注册的用户名:");
                String name = sc.next();
                // 获取键盘输入的密码
                System.out.println("请输入你要注册的密码:");
                String pwd = sc.next();
                // 将参数传入 register 方法中
                examManage.register(name,pwd,users);
            }
            // 退出操作
            else if ("3".equals(str)) { 
                System.out.println("退出成功!");
                break;
            }
        }
        /********** End **********/
    }
}

 

第2关:简易考试系统之用户登录

任务描述

本关任务:实现简易考试系统中新用户登录的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现简易考试系统中用户登录的功能,具体要求如下:

  • 在 MenuExam.java 中实现第二个选项,也就是用户登录的功能;

  • 获取键盘输入的值,如果为 2,首先输出“请输入你的用户名:”,获取键盘输入的用户名,再输出“请输入你的密码:”,获取键盘输入的密码,然后调用 ExamManage.java 文件中的 login(String name, String pwd, User[] users) 方法,将该方法所需参数传入;

  • login 方法携带三个参数,分别为:用户名、密码和用户数组,该方法实现用户登录的功能,返回值为 boolean 类型;

  • 在该方法中判断用户数组中是否存在该用户,如果存在,返回 true,否则返回 false;

  • 回到 MenuExam 类中,判断 login 方法的返回值,如果为 false,输出:“用户名或密码错误,登录失败!”;

  • 如果为 true,输出以下内容后退出程序。

  1. 选择考试科目
  2. **********
  3. 1. 英语
  4. 2. 数学
  5. 3. 返回上一级菜单
  6. 4. 退出系统
  7. 5. 查询考试成绩
  8. **********

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. sunfeng
  3. 123456
  4. 2
  5. sunning
  6. 123456
  7. 3

预期输出:

  1. 线上考试系统
  2. **********
  3. 1. 新用户注册
  4. 2. 用户登录
  5. 3. 退出系统
  6. **********
  7. 请输入选择的操作:
  8. 请输入你要注册的用户名:
  9. 请输入你要注册的密码:
  10. 线上考试系统
  11. **********
  12. 1. 新用户注册
  13. 2. 用户登录
  14. 3. 退出系统
  15. **********
  16. 请输入选择的操作:
  17. 请输入你的用户名:
  18. 请输入你的密码:
  19. 用户名或密码错误,登录失败!
  20. 线上考试系统
  21. **********
  22. 1. 新用户注册
  23. 2. 用户登录
  24. 3. 退出系统
  25. **********
  26. 请输入选择的操作:
  27. 退出成功!

MenuExam.java

import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuExam {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的用户信息

        // 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);
        // 实例化 ExamManage 对象
        ExamManage examManage = new ExamManage();
        while (true) {
            System.out.println("线上考试系统");
            System.out.println("**********");
            System.out.println("1. 新用户注册");
            System.out.println("2. 用户登录");
            System.out.println("3. 退出系统");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            String str = sc.next();
            // 实现注册功能
            if ("1".equals(str)) {
                // 获取键盘输入的用户名
                System.out.println("请输入你要注册的用户名:");
                String name = sc.next();
                // 获取键盘输入的密码
                System.out.println("请输入你要注册的密码:");
                String pwd = sc.next();
                // 将参数传入 register 方法中
                examManage.register(name,pwd,users);
                
            // 请在下面的Begin-End之间编写正确的代码
            /********** Begin **********/
            } else if ("2".equals(str)) {
                System.out.println("请输入你的用户名:");
                String name = sc.next();
                System.out.println("请输入你的密码:");
                String pwd = sc.next();
                boolean flag = examManage.login(name, pwd, users);
                if (flag){
                    System.out.println("选择考试科目");
                    System.out.println("**********");
                    System.out.println("1. 英语");
                    System.out.println("2. 数学");
                    System.out.println("3. 返回上一级菜单");
                    System.out.println("4. 退出系统");
                    System.out.println("5. 查询考试成绩");
                    System.out.println("**********");
                    break;
                }else {
                    System.out.println("用户名或密码错误,登录失败!");
                }
            /********** End **********/
            
            
            } else if ("3".equals(str)) {
                // 退出操作
                System.out.println("退出成功!");
                break;
            } else {
                System.out.println("选择错误!");
            }
        }
    }
}

ExamManage.java

public class ExamManage {

    /**
     * 功能:注册新用户
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void register(String name, String pwd, User[] users) {
        // 判断用户名是否规范
        if (name.matches("^[^0-9][\\w_]{5,9}$")){
            // 判断用户名是否已存在
            if (!findUser(name,users)){
                // 判断密码是否规范
                if (pwd.matches("^[\\w_]{6,10}$")){
                    User user = new User();
                    user.setName(name);
                    user.setPwd(pwd);
                    // 将对象放入对象数组中
                    for (int i = 0; i < users.length; i++) {
                        if (users[i] == null) {
                            users[i] = user;
                            break;
                        }
                    }
                }else {
                    System.out.println("密码不合规范!");
                }
            }else {
                System.out.println("用户名已存在!");
            }
        }else {
            System.out.println("用户名不合规范!");
        }
    }

    public boolean findUser(String name,User[] users){
        boolean flag = false;
        // 根据用户名查找用户数组中是否已存在该用户,
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null && name.equals(users[i].getName())) {
                flag = true;
                break;
            }
        }
        return flag;
    }
    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    /**
     * 功能:用户登录
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 返回值 boolean
     */
    public boolean login(String name, String pwd, User[] users) {
        // 查询用户名和密码是否正确
        for (User user : users) {
            if (user != null && name.equals(user.getName()) && pwd.equals(user.getPwd())) {
                return true;
            }
        }
        return false;        
    }
    /********** End **********/

}

第3关:简易考试系统之英语考试

任务描述

本关任务:实现模拟英语考试,并计算英语成绩的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现模拟英语考试,并计算英语成绩的功能,具体要求如下:

  • 当用户选择考试科目时,获取键盘输入,实现 1、3、4 的功能;

  • 如果为 1,首先输出:“欢迎参加英语考试,开始答卷”,然后输出 /root/english.txt 文件的内容;

  • 之后输出:“请输入答案,答案之间用英文逗号分开”,获取用户输入的答案,调用 ExamManage 类的 engExam(answers,name,pwd,users),将所需参数传入该方法中;

  • engExam 方法携带 4 个参数,分别为:用户考试答案、用户名称、用户密码、用户数组,该方法实现了计算学生成绩的功能;

  • engExam 方法中将用户所给答案按逗号切分,每道题为 5 分,总共有两道(题目答案分别为:A,C,注意忽略大小写),最后将该用户的英语成绩设置为本次考试所得值,存入用户数组中,并输出:“本次考试的分数为:xx”,保留 1 位小数;

  • 如果为 3,则返回上一级菜单;

  • 如果为 4,退出程序。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. sunfeng
  3. 123456
  4. 2
  5. sunfeng
  6. 123456
  7. 1
  8. a,c
  9. 3
  10. 3

预期输出:

  1. 线上考试系统
  2. **********
  3. 1. 新用户注册
  4. 2. 用户登录
  5. 3. 退出系统
  6. **********
  7. 请输入选择的操作:
  8. 请输入你要注册的用户名:
  9. 请输入你要注册的密码:
  10. 线上考试系统
  11. **********
  12. 1. 新用户注册
  13. 2. 用户登录
  14. 3. 退出系统
  15. **********
  16. 请输入选择的操作:
  17. 请输入你的用户名:
  18. 请输入你的密码:
  19. 选择考试科目
  20. **********
  21. 1. 英语
  22. 2. 数学
  23. 3. 返回上一级菜单
  24. 4. 退出系统
  25. 5. 查询考试成绩
  26. **********
  27. 请输入选择的操作:
  28. 欢迎参加英语考试,开始答卷
  29. 1. 阿拉伯数字“1”用英语怎么说:
  30. A. one B. oen C. two D. onel
  31. 2. 阿拉伯数字“2”用英语怎么说:
  32. A. tow B. oen C. two D. town
  33. 请输入答案,答案之间用英文逗号分开
  34. 本次考试的分数为:10.0
  35. 选择考试科目
  36. **********
  37. 1. 英语
  38. 2. 数学
  39. 3. 返回上一级菜单
  40. 4. 退出系统
  41. 5. 查询考试成绩
  42. **********
  43. 请输入选择的操作:
  44. 线上考试系统
  45. **********
  46. 1. 新用户注册
  47. 2. 用户登录
  48. 3. 退出系统
  49. **********
  50. 请输入选择的操作:
  51. 退出成功!

MenuExam.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuExam {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的用户信息
        // 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);
        // 实例化 ExamManage 对象
        ExamManage examManage = new ExamManage();
        while (true) {
            System.out.println("线上考试系统");
            System.out.println("**********");
            System.out.println("1. 新用户注册");
            System.out.println("2. 用户登录");
            System.out.println("3. 退出系统");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            String str = sc.next();
            // 实现注册功能
            if ("1".equals(str)) {
                // 获取键盘输入的用户名
                System.out.println("请输入你要注册的用户名:");
                String name = sc.next();
                // 获取键盘输入的密码
                System.out.println("请输入你要注册的密码:");
                String pwd = sc.next();
                // 将参数传入 register 方法中
                examManage.register(name,pwd,users);

            } else if ("2".equals(str)) {
                System.out.println("请输入你的用户名:");
                String name = sc.next();
                System.out.println("请输入你的密码:");
                String pwd = sc.next();
                boolean flag = examManage.login(name, pwd, users);
                if (flag){

                    while (true) {
                        System.out.println("选择考试科目");
                        System.out.println("**********");
                        System.out.println("1. 英语");
                        System.out.println("2. 数学");
                        System.out.println("3. 返回上一级菜单");
                        System.out.println("4. 退出系统");
                        System.out.println("5. 查询考试成绩");
                        System.out.println("**********");
                        System.out.println("请输入选择的操作:");
                        // 获取键盘输入
                        String s = sc.next();
                        if ("1".equals(s)) {
                            System.out.println("欢迎参加英语考试,开始答卷");
                            // 读取文件内容并打印出来
                            try {
                                BufferedReader in = new BufferedReader(new FileReader("/root/english.txt"));
                                String text;
                                while ((text = in.readLine()) != null) {
                                    System.out.println(text);
                                }
                                System.out.println("请输入答案,答案之间用英文逗号分开");
                                // 获取键盘输入的答案,并将其转化为大写字母
                                String answers = sc.next().toUpperCase();
                                examManage.engExam(answers,name,pwd,users);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }else if ("2".equals(s)){
                            // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
                            /********** Begin **********/

                            
                            // 读取文件内容并打印出来

                            
                                // 获取键盘输入的答案,并将其转化为大写字母

                            
                                /********** End **********/
                        }else if ("3".equals(s)){
                            break;
                        }else if ("4".equals(s)){
                            System.exit(0);
                        }else if ("5".equals(s)){
                        }
                    }
                }else {
                    System.out.println("用户名或密码错误,登录失败!");
                }
            } else if ("3".equals(str)) {
                // 退出操作
                System.out.println("退出成功!");
                break;
            } else {
                System.out.println("选择错误!");
            }
        }
    }
}

ExamManage.java

public class ExamManage {

    /**
     * 功能:注册新用户
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void register(String name, String pwd, User[] users) {
        // 判断用户名是否规范
        if (name.matches("^[^0-9][\\w_]{5,9}$")){
            // 判断用户名是否已存在
            if (!findUser(name,users)){
                // 判断密码是否规范
                if (pwd.matches("^[\\w_]{6,10}$")){
                    User user = new User();
                    user.setName(name);
                    user.setPwd(pwd);
                    // 将对象放入对象数组中
                    for (int i = 0; i < users.length; i++) {
                        if (users[i] == null) {
                            users[i] = user;
                            break;
                        }
                    }
                }else {
                    System.out.println("密码不合规范!");
                }
            }else {
                System.out.println("用户名已存在!");
            }
        }else {
            System.out.println("用户名不合规范!");
        }
    }

    public boolean findUser(String name,User[] users){
        boolean flag = false;
        // 根据用户名查找用户数组中是否已存在该用户,
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null && name.equals(users[i].getName())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:用户登录
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 返回值 boolean
     */
    public boolean login(String name, String pwd, User[] users) {
        // 查询用户名和密码是否正确
        boolean flag = false;

        for (User user : users) {
            if (user != null && name.equals(user.getName()) && pwd.equals(user.getPwd())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:模拟英语考试,计算得分
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 参数 answers 用户试卷答案
     */


    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码l
    /********** Begin **********/
    public void engExam(String answers, String name, String pwd, User[] users) {
        // 切分用户的答案
        double score = 0.0;
        String[] split = answers.split(",");
        // 对比正确答案,计算用户分数
        if ("A".equals(split[0])){
            score += 5;
        }
        if ("C".equals(split[1])){
            score += 5;
        }
        // 最后所得分数为该用户的英语成绩
        for (User z : users) {
            if (z != null && name.equals(z.getName())&& pwd.equals(z.getPwd())) {
                z.setEnglish(score);
                break;
            }
        }
        System.out.println("本次考试的分数为:"+score);
    }
    /********** end **********/

}

第4关:简易考试系统之数学考试

任务描述

本关任务:实现模拟数学考试,并计算数学成绩的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现模拟数学考试,并计算数学成绩的功能,具体要求如下:

  • 当用户选择考试科目时,获取键盘输入,实现 2 的功能;

  • 当键盘输入的值为 2,首先输出:“欢迎参加数学考试,开始答卷”,然后输出 /root/math.txt 文件的内容;

  • 之后输出:“请输入答案,答案之间用英文逗号分开”,获取用户输入的答案,调用 ExamManage 类的 mathExam(answers,name,pwd,users),将所需参数传入该方法中;

  • mathExam 方法携带 4 个参数,分别为:用户考试答案、用户名称、用户密码、用户数组,该方法实现了计算学生成绩的功能;

  • mathExam 方法中将用户所给答案按逗号切分,每道题为 5 分,总共有两道(题目答案分别为:C,A,注意忽略大小写),最后将该用户的数学成绩设置为本次考试所得值,存入用户数组中,并输出:“本次考试的分数为:xx”,保留 1 位小数。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. sunfeng
  3. 123456
  4. 2
  5. sunfeng
  6. 123456
  7. 2
  8. a,a
  9. 3
  10. 3

预期输出:

  1. 线上考试系统
  2. **********
  3. 1. 新用户注册
  4. 2. 用户登录
  5. 3. 退出系统
  6. **********
  7. 请输入选择的操作:
  8. 请输入你要注册的用户名:
  9. 请输入你要注册的密码:
  10. 线上考试系统
  11. **********
  12. 1. 新用户注册
  13. 2. 用户登录
  14. 3. 退出系统
  15. **********
  16. 请输入选择的操作:
  17. 请输入你的用户名:
  18. 请输入你的密码:
  19. 选择考试科目
  20. **********
  21. 1. 英语
  22. 2. 数学
  23. 3. 返回上一级菜单
  24. 4. 退出系统
  25. 5. 查询考试成绩
  26. **********
  27. 请输入选择的操作:
  28. 欢迎参加数学考试,开始答卷
  29. 1. 求1+1的结果为:
  30. A. 1 B. 0 C. 2 D. 以上都不正确
  31. 2. 下列选项中,哪个不属于偶数?
  32. A. 1 B. 2 C. 0 D. 4
  33. 请输入答案,答案之间用英文逗号分开
  34. 本次考试的分数为:5.0
  35. 选择考试科目
  36. **********
  37. 1. 英语
  38. 2. 数学
  39. 3. 返回上一级菜单
  40. 4. 退出系统
  41. 5. 查询考试成绩
  42. **********
  43. 请输入选择的操作:
  44. 线上考试系统
  45. **********
  46. 1. 新用户注册
  47. 2. 用户登录
  48. 3. 退出系统
  49. **********
  50. 请输入选择的操作:
  51. 退出成功!

MenuExam.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuExam {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的用户信息
        // 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);
        // 实例化 ExamManage 对象
        ExamManage examManage = new ExamManage();
        while (true) {
            System.out.println("线上考试系统");
            System.out.println("**********");
            System.out.println("1. 新用户注册");
            System.out.println("2. 用户登录");
            System.out.println("3. 退出系统");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            String str = sc.next();
            // 实现注册功能
            if ("1".equals(str)) {
                // 获取键盘输入的用户名
                System.out.println("请输入你要注册的用户名:");
                String name = sc.next();
                // 获取键盘输入的密码
                System.out.println("请输入你要注册的密码:");
                String pwd = sc.next();
                // 将参数传入 register 方法中
                examManage.register(name,pwd,users);

            } else if ("2".equals(str)) {
                System.out.println("请输入你的用户名:");
                String name = sc.next();
                System.out.println("请输入你的密码:");
                String pwd = sc.next();
                boolean flag = examManage.login(name, pwd, users);
                if (flag){

                    while (true) {
                        System.out.println("选择考试科目");
                        System.out.println("**********");
                        System.out.println("1. 英语");
                        System.out.println("2. 数学");
                        System.out.println("3. 返回上一级菜单");
                        System.out.println("4. 退出系统");
                        System.out.println("5. 查询考试成绩");
                        System.out.println("**********");
                        System.out.println("请输入选择的操作:");
                        // 获取键盘输入
                        String s = sc.next();
                        if ("1".equals(s)) {
                            System.out.println("欢迎参加英语考试,开始答卷");
                            // 读取文件内容并打印出来
                            try {
                                BufferedReader in = new BufferedReader(new FileReader("/root/english.txt"));
                                String text;
                                while ((text = in.readLine()) != null) {
                                    System.out.println(text);
                                }
                                System.out.println("请输入答案,答案之间用英文逗号分开");
                                // 获取键盘输入的答案,并将其转化为大写字母
                                String answers = sc.next().toUpperCase();
                                examManage.engExam(answers,name,pwd,users);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }else if ("2".equals(s)){
                            // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
                            /********** Begin **********/
                            System.out.println("欢迎参加数学考试,开始答卷");
                            // 读取文件内容并打印出来
                            try {
                                BufferedReader in = new BufferedReader(new FileReader("/root/math.txt"));
                                String text;
                                while ((text = in.readLine()) != null) {
                                    System.out.println(text);
                                }
                                System.out.println("请输入答案,答案之间用英文逗号分开");
                                // 获取键盘输入的答案,并将其转化为大写字母
                                String answers = sc.next().toUpperCase();
                                examManage.mathExam(answers,name,pwd,users);

                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            /********** End **********/
                        }else if ("3".equals(s)){
                            break;
                        }else if ("4".equals(s)){
                            System.exit(0);
                        }else if ("5".equals(s)){
                        }
                    }
                }else {
                    System.out.println("用户名或密码错误,登录失败!");
                }
            } else if ("3".equals(str)) {
                // 退出操作
                System.out.println("退出成功!");
                break;
            } else {
                System.out.println("选择错误!");
            }
        }
    }
}

ExamManage.java

public class ExamManage {

    /**
     * 功能:注册新用户
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void register(String name, String pwd, User[] users) {
        // 判断用户名是否规范
        if (name.matches("^[^0-9][\\w_]{5,9}$")){
            // 判断用户名是否已存在
            if (!findUser(name,users)){
                // 判断密码是否规范
                if (pwd.matches("^[\\w_]{6,10}$")){
                    User user = new User();
                    user.setName(name);
                    user.setPwd(pwd);
                    // 将对象放入对象数组中
                    for (int i = 0; i < users.length; i++) {
                        if (users[i] == null) {
                            users[i] = user;
                            break;
                        }
                    }
                }else {
                    System.out.println("密码不合规范!");
                }
            }else {
                System.out.println("用户名已存在!");
            }
        }else {
            System.out.println("用户名不合规范!");
        }
    }

    public boolean findUser(String name,User[] users){
        boolean flag = false;
        // 根据用户名查找用户数组中是否已存在该用户,
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null && name.equals(users[i].getName())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:用户登录
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 返回值 boolean
     */
    public boolean login(String name, String pwd, User[] users) {
        // 查询用户名和密码是否正确
        boolean flag = false;

        for (User user : users) {
            if (user != null && name.equals(user.getName()) && pwd.equals(user.getPwd())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:模拟英语考试,计算得分
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 参数 answers 用户试卷答案
     */
    public void engExam(String answers, String name, String pwd, User[] users) {
        // 切分用户的答案
        double score = 0.0;
        String[] split = answers.split(",");
        // 对比正确答案,计算用户分数
        if ("A".equals(split[0])){
            score += 5;
        }
        if ("C".equals(split[1])){
            score += 5;
        }
        // 最后所得分数为该用户的英语成绩
        for (User z : users) {
            if (z != null && name.equals(z.getName())&& pwd.equals(z.getPwd())) {
                z.setEnglish(score);
                break;
            }
        }
    }



    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    /**
     * 功能:模拟数学考试,计算得分
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 参数 answers 用户试卷答案
     */
    public void mathExam(String answers, String name, String pwd, User[] users) {
        // 切分用户的答案
        double score = 0.0;
        String[] split = answers.split(",");
        // 对比正确答案,计算用户分数
        if ("C".equals(split[0])){
            score += 5;
        }
        if ("A".equals(split[1])){
            score += 5;
        }
        // 最后所得分数为该用户的英语成绩
        for (User u : users) {
            if (u != null && name.equals(u.getName())&& pwd.equals(u.getPwd())) {
                u.setEnglish(score);
                System.out.println("本次考试的分数为:" + u.getEnglish() );
                break;
            }
        }
    }
    /********** End **********/

}

第5关:简易考试系统之成绩查询

任务描述

本关任务:实现用户查询成绩的功能。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中实现用户查询成绩的功能,具体要求如下:

  • 当用户选择考试科目时,获取键盘输入,实现 5 的功能;

  • 当键盘输入的值为 5,调用 ExamManage 类的 show(name,pwd,users),将所需参数传入该方法中;

  • show 方法携带 3 个参数,分别为:用户名称、用户密码、用户数组,该方法实现了查询该用户成绩的功能;

  • mathExam 方法中首先输出:“用户名称 英语成绩 数学成绩”,分隔符为 tab 键;

  • 查找该用户的成绩信息,输出格式:“x1 x2 x3”,这些值依次为:用户名称、英语成绩、数学成绩,保留 1 位小数,用 tab 分隔符分隔。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:

  1. 1
  2. sunfeng
  3. 123456
  4. 2
  5. sunfeng
  6. 123456
  7. 2
  8. a,a
  9. 1
  10. a,c
  11. 5
  12. 4

预期输出:

  1. 线上考试系统
  2. **********
  3. 1. 新用户注册
  4. 2. 用户登录
  5. 3. 退出系统
  6. **********
  7. 请输入选择的操作:
  8. 请输入你要注册的用户名:
  9. 请输入你要注册的密码:
  10. 线上考试系统
  11. **********
  12. 1. 新用户注册
  13. 2. 用户登录
  14. 3. 退出系统
  15. **********
  16. 请输入选择的操作:
  17. 请输入你的用户名:
  18. 请输入你的密码:
  19. 选择考试科目
  20. **********
  21. 1. 英语
  22. 2. 数学
  23. 3. 返回上一级菜单
  24. 4. 退出系统
  25. 5. 查询考试成绩
  26. **********
  27. 请输入选择的操作:
  28. 欢迎参加数学考试,开始答卷
  29. 1. 求1+1的结果为:
  30. A. 1 B. 0 C. 2 D. 以上都不正确
  31. 2. 下列选项中,哪个不属于偶数?
  32. A. 1 B. 2 C. 0 D. 4
  33. 请输入答案,答案之间用英文逗号分开
  34. 选择考试科目
  35. **********
  36. 1. 英语
  37. 2. 数学
  38. 3. 返回上一级菜单
  39. 4. 退出系统
  40. 5. 查询考试成绩
  41. **********
  42. 请输入选择的操作:
  43. 欢迎参加英语考试,开始答卷
  44. 1. 阿拉伯数字“1”用英语怎么说:
  45. A. one B. oen C. two D. onel
  46. 2. 阿拉伯数字“2”用英语怎么说:
  47. A. tow B. oen C. two D. town
  48. 请输入答案,答案之间用英文逗号分开
  49. 选择考试科目
  50. **********
  51. 1. 英语
  52. 2. 数学
  53. 3. 返回上一级菜单
  54. 4. 退出系统
  55. 5. 查询考试成绩
  56. **********
  57. 请输入选择的操作:
  58. 用户名称 英语成绩 数学成绩
  59. sunfeng 10.0 0.0
  60. 选择考试科目
  61. **********
  62. 1. 英语
  63. 2. 数学
  64. 3. 返回上一级菜单
  65. 4. 退出系统
  66. 5. 查询考试成绩
  67. **********
  68. 请输入选择的操作:

 

MenuExam.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

// 此类为整个通讯录的总控制,负责启动
public class MenuExam {

    public static void main(String[] args) {

        User[] users = new User[50]; // 创建一个对象数组,用于存放所有的用户信息
        // 实例化 Scanner 对象
        Scanner sc = new Scanner(System.in);
        // 实例化 ExamManage 对象
        ExamManage examManage = new ExamManage();
        while (true) {
            System.out.println("线上考试系统");
            System.out.println("**********");
            System.out.println("1. 新用户注册");
            System.out.println("2. 用户登录");
            System.out.println("3. 退出系统");
            System.out.println("**********");
            System.out.println("请输入选择的操作:");
            // 获取键盘输入
            String str = sc.next();
            // 实现注册功能
            if ("1".equals(str)) {
                // 获取键盘输入的用户名
                System.out.println("请输入你要注册的用户名:");
                String name = sc.next();
                // 获取键盘输入的密码
                System.out.println("请输入你要注册的密码:");
                String pwd = sc.next();
                // 将参数传入 register 方法中
                examManage.register(name,pwd,users);

            } else if ("2".equals(str)) {
                System.out.println("请输入你的用户名:");
                String name = sc.next();
                System.out.println("请输入你的密码:");
                String pwd = sc.next();
                boolean flag = examManage.login(name, pwd, users);
                if (flag){

                    while (true) {
                        System.out.println("选择考试科目");
                        System.out.println("**********");
                        System.out.println("1. 英语");
                        System.out.println("2. 数学");
                        System.out.println("3. 返回上一级菜单");
                        System.out.println("4. 退出系统");
                        System.out.println("5. 查询考试成绩");
                        System.out.println("**********");
                        System.out.println("请输入选择的操作:");
                        // 获取键盘输入
                        String s = sc.next();
                        if ("1".equals(s)) {
                            System.out.println("欢迎参加英语考试,开始答卷");
                            // 读取文件内容并打印出来
                            try {
                                BufferedReader in = new BufferedReader(new FileReader("/root/english.txt"));
                                String text;
                                while ((text = in.readLine()) != null) {
                                    System.out.println(text);
                                }
                                System.out.println("请输入答案,答案之间用英文逗号分开");
                                // 获取键盘输入的答案,并将其转化为大写字母
                                String answers = sc.next().toUpperCase();
                                examManage.engExam(answers,name,pwd,users);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }else if ("2".equals(s)){

                            System.out.println("欢迎参加数学考试,开始答卷");
                            // 读取文件内容并打印出来
                            try {
                                BufferedReader in = new BufferedReader(new FileReader("/root/math.txt"));
                                String text;
                                while ((text = in.readLine()) != null) {
                                    System.out.println(text);
                                }
                                System.out.println("请输入答案,答案之间用英文逗号分开");
                                // 获取键盘输入的答案,并将其转化为大写字母
                                String answers = sc.next().toUpperCase();
                                examManage.mathExam(answers,name,pwd,users);

                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }else if ("3".equals(s)){
                            break;
                        }else if ("4".equals(s)){
                            System.exit(0);
                        }else if ("5".equals(s)){
                            // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
                            /********** Begin **********/
                            // 调用 show 方法,实现查询用户的功能
                            examManage.show(name,pwd,users);
                            
                            /********** End **********/
                        }
                    }
                }else {
                    System.out.println("用户名或密码错误,登录失败!");
                }
            } else if ("3".equals(str)) {
                // 退出操作
                System.out.println("退出成功!");
                break;
            } else {
                System.out.println("选择错误!");
            }
        }
    }
}

ExamManage.java

public class ExamManage {

    /**
     * 功能:注册新用户
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void register(String name, String pwd, User[] users) {
        // 判断用户名是否规范
        if (name.matches("^[^0-9][\\w_]{5,9}$")){
            // 判断用户名是否已存在
            if (!findUser(name,users)){
                // 判断密码是否规范
                if (pwd.matches("^[\\w_]{6,10}$")){
                    User user = new User();
                    user.setName(name);
                    user.setPwd(pwd);
                    // 将对象放入对象数组中
                    for (int i = 0; i < users.length; i++) {
                        if (users[i] == null) {
                            users[i] = user;
                            break;
                        }
                    }
                }else {
                    System.out.println("密码不合规范!");
                }
            }else {
                System.out.println("用户名已存在!");
            }
        }else {
            System.out.println("用户名不合规范!");
        }
    }

    public boolean findUser(String name,User[] users){
        boolean flag = false;
        // 根据用户名查找用户数组中是否已存在该用户,
        for (int i = 0; i < users.length; i++) {
            if (users[i] != null && name.equals(users[i].getName())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:用户登录
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 返回值 boolean
     */
    public boolean login(String name, String pwd, User[] users) {
        // 查询用户名和密码是否正确
        boolean flag = false;

        for (User user : users) {
            if (user != null && name.equals(user.getName()) && pwd.equals(user.getPwd())) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 功能:模拟英语考试,计算得分
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 参数 answers 用户试卷答案
     */
    public void engExam(String answers, String name, String pwd, User[] users) {
        // 切分用户的答案
        double score = 0.0;
        String[] split = answers.split(",");
        // 对比正确答案,计算用户分数
        if ("A".equals(split[0])){
            score += 5;
        }
        if ("C".equals(split[1])){
            score += 5;
        }
        // 最后所得分数为该用户的英语成绩
        for (User z : users) {
            if (z != null && name.equals(z.getName())&& pwd.equals(z.getPwd())) {
                z.setEnglish(score);
                break;
            }
        }
    }



    /**
     * 功能:模拟数学考试,计算得分
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     * 参数 answers 用户试卷答案
     */
    public void mathExam(String answers, String name, String pwd, User[] users) {
        // 切分用户的答案
        double score = 0.0;
        String[] split = answers.split(",");
        // 对比正确答案,计算用户分数
        if ("C".equals(split[0])){
            score += 5;
        }
        if ("A".equals(split[1])){
            score += 5;
        }
        // 最后所得分数为该用户的英语成绩
        for (User z : users) {
            if (z != null && name.equals(z.getName())&& pwd.equals(z.getPwd())) {
                z.setEnglish(score);
                break;
            }
        }
    }
    // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
    /********** Begin **********/
    /**
     * 功能:查询用户成绩
     * 参数 name 用户名
     * 参数 pwd 密码
     * 参数 users 用户数组
     */
    public void show(String name, String pwd, User[] users) {

        // 查询用户的英语和数学得分
        double Englishscore = 0.0;
        double Mathscore = 0.0;

        for (User u : users) {
            if (u != null && name.equals(u.getName())&& pwd.equals(u.getPwd())) {
                System.out.println("用户名称\t英语成绩\t数学成绩");
                System.out.println(u.getName() + "\t" + u.getEnglish() + "\t" + u.getMath() );
                break;
            }
        }
    }
    /********** End **********/

}

 

题四:博客系统数据库设计与实现

第1关:博客系统数据库设计与实现之查询

任务描述

本关任务:通过 JDBC 的方式查询 MySQL 表 t_user 中的数据。

相关知识

为了完成本关任务,你需要掌握:

  1. JDBC 如何连接数据库;
  2. JDBC 如何查询表中数据。

JDBC

JDBC(Java DataBase Connectivity)是一种用于执行 SQL 语句的 Java API,它由一组用 Java 语言编写的类和接口组成。换句话说:就是可以直接通过 Java 语言,去操作数据库。

JDBC 常用 API

JDBC API 提供以下接口和类:

  • DriverManager:此类管理数据库驱动程序列表。可在 JDBC 下识别某个子协议的第一个驱动程序,用于建立数据库连接;

    方法名称功能描述
    getConnection(String url,String user,String password)指定 3 个入口参数(依次为连接数据库的 url、用户名和密码)来获取与数据库的连接
    setLoginTimeout()获取驱动程序试图登陆到某一数据库时可以等待的最长时间,以秒为单位
  • Connection:此接口具有用于联系数据库的所有方法。 Connection 对象表示通信上下文,即与数据库的所有通信仅通过连接对象;

    方法名称功能描述
    getMetaData()该方法用于返回数据库的元数据的 DatabaseMetaData 对象
    createStatement用于创建一个 Statement 对象来将 SQL 语句发送到数据库
    preparedStatement(String sql)用于创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库
    commit()使所有上一次提交/回滚后进行的更改成为持久更改
    close()立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被释放
  • Statement:用于执行静态 SQL 语句并返回它所生成结果的对象;

    方法名称功能描述
    boolean execute(String sql)用于执行各种 SQL 语句,该方法返回一个 boolean 类型的值。如果为 true,表示所执行的 SQL 语句具备查询结果,可通过 Statement 的 getResultSet() 方法查询结果
    int executeUpdate(String sql)用于执行 SQL 中的 insert、update 和 delete 语句,该方法返回一个 int 类型的值,表示影响数据库中的行数
    ResultSet executeQuery(String sql)用于执行 SQL 中的 select 语句(查询,遍历),该方法返回一个表示查询结果的 ResultSet 对象
  • PrepareStatement:动态地执行 SQL,其将被预编译并保存到 PrepareStatement 实例中,从而可以反复地执行该 SQL 语句;

    方法名称功能描述
    executeUpdate()在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 DML 语句,或者无返回内容的 SQL 语句,比如 DDL 语句
    executeQuery()在此 PreparedStatement 对象中执行 SQL 语句,该方法返回的是 ResultSet 对象
    setInt(int parameterIndex, int x)将指定的参数设置为 int 值
    setFloat(int parameterIndex, float x)将指定的参数设置为 Float 值
    setString(int parameterIndex, String x)将指定参数设置的给定的 Date 值
    setDate(int parameterIndex, Date x)将指定参数设置给定的 Date 值
    addBatch()将一组参数添加到此 PreparedStatement 对象的批处理命令中
  • ResultSet:提供检索不同类型字段的方法。(操作对象为 Statement 执行 SQL 查询后的结果);

    getString(int columnIndex)用于获取 指定字段的 String 类型的值,参数 columnIndex 代表字段的索引
    getString(String columnName) 用于获取指定字段的 String 类型的值,参数 columnIndex 代表字段名称
    getInt(int columnIndex) 用于获取指定字段的 int 类型的值,参数 columnIndex 代表字段的索引
    getInt(String columnName) 用于获取指定字段的 int 类型的值,参数 columnIndex 代表字段名称
    getDate(int columnIndex) 用于获取指定字段的 Date类型的值,参数 columnIndex 代表字段索引
    getDate(String columnName) 用于获取指定字段的 Date类型的值,参数 columnIndex 代表字段名称
    next() 将游标从当前位置移到下一位置
  • SQLException:此类处理数据库应用程序中发生的任何错误。

使用 JDBC 的步骤如下:

加载数据库驱动 → 建立数据库连接(Connection) → 创建执行 SQL 语句的 Statement 对象 → 处理执行结果(ResultSet) → 释放资源。

加载数据库驱动

驱动加载是为了打开与数据库的通信通道。

在注册驱动前我们需要装载特定厂商的数据库驱动程序,导入 mysq-connector-java 的 jar 包,方法是在项目中建立 lib 目录,在其下放入 jar 包(平台已准备好 jar 包,无需自己放入)。

将 jar 包导入项目之后我们就开始注册驱动:

Java 加载数据库驱动通常是使用 Class 类的静态方法 forName(),语法格式如下:

    Class.forName(String driverManager)
    示例:

    // 需要抛出异常
    try {
        // 获取连接驱动
        Class.forName("com.mysql.jdbc.Driver" );
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

如果加载成功,会将加载的驱动类注册给 DriverManager;加载失败,会抛出 ClassNotFoundException 异常。

建立连接

成功加载完数据库驱动后,就可以建立数据库的连接了,使用 DriverManager 的静态方法 getConnection() 来实现。如下:

 
  1. // 连接数据库,参数:连接的 url、用户名、密码
  2. Connection conn = DriverManager.getConnection(url, user, password);

注意:需要抛出 SQLException 的异常。

URL 用于标识数据库的位置,通过 URL 地址告诉 JDBC 程序连接信息。

若不存在数据库,只建立连接,URL 的写法为:

若存在数据库 test,URL 的写法为:

其中 localhost 可以换成 IP 地址 127.0.0.1 ,3306 为 MySQL 数据库的默认端口号,user 和 password 对应数据库的用户名和密码。

执行编写的 SQL 语句

连接建立完毕后,创建(获取)数据库操作对象,用于执行编写的 SQL 语句。

  1. Statement createStatement() :主要用来执行 SQL 语句,但是有 SQL 注入的漏洞
  2. PreparedStatement preparedStatement(String sql) :主要用来预编译 SQL 语句,并且执行。解决了 SQL 注入的漏洞
  3. CallableStatement prepareCall(String sql) :主要用来执行 SQL 中的存储过程

例子:

  1. // 编写 SQL 语句
  2. String sql = "SELECT * FROM myuser";
  3. // 动态执行该 SQL 语句
  4. PreparedStatement preparedStatement = connection.prepareStatement(sql);
  5. // 获取查询结果
  6. ResultSet resultSet = preparedStatement.executeQuery();
  7. // 遍历输出该结果
  8. while (resultSet.next()){
  9. System.out.println(resultSet.getString("name")); // 注意:这里的 name 必须与数据库的字段名称一致
  10. }

释放资源

JDBC 程序运行完后,切记要释放程序在运行过程中创建的那些与数据库进行交互的对象,这些对象通常是 ResultSet,Statement 和 Connection 对象。

特别是 Connection 对象,它是非常稀有的资源,用完后必须马上释放,如果 Connection 不能及时、正确的关闭,极易导致系统宕机。

Connection 的使用原则是尽量晚创建,尽量早的释放。

为确保资源释放代码能运行,资源释放代码一定要放在 finally 语句中。

  1. finally {
  2. try {
  3. if(resultSet != null){
  4. resultSet.close();
  5. }
  6. if(preparedStatement != null){
  7. preparedStatement.close();
  8. }
  9. if(connection != null){
  10. connection.close();
  11. }
  12. } catch (SQLException e) {
  13. e.printStackTrace();
  14. }
  15. }

相关数据说明

MySQL 的 mydb 数据库;

用户表 t_user;

列名类型非空注释
userIdint用户 ID 主键
userNamevarchar用户名
passWordvarchar用户密码

MySQL 连接配置:

  • Driver:com.mysql.jdbc.Driver;

  • URL:jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8;

  • user:root;

  • password:123123。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中通过 JDBC 的方式查询 MySQL 表 t_user 中的数据,输出查询结果时,用 \t 将查询字段结果分隔,格式:“userId userName passWord”,其中这些都分别对应着查询结果的值。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。

测试输入:无

预期输出:

  1. 1 sunfeng 147258
  2. 2 dv 123456
  3. 3 suning 845966

JDBCInsert.java

import java.sql.*;

public class JDBCInsert {
    
    public static void main(String[] args) throws java.io.IOException{
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
            Connection conn = null;
            ResultSet resultSet = null;
            PreparedStatement preparedStatement = null;
       
            // 获取数据库连接驱动
            String driver = "com.mysql.jdbc.Driver";
            String DB_URL = "jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8";
            // 数据库的用户名与密码,需要根据自己的设置
            String USER = "root";
            String PASS = "123123";
            // 需要抛出异常
            try {
                // 获取连接驱动
                Class.forName(driver);
                conn = DriverManager.getConnection(DB_URL, USER, PASS);                
                // 编写查询 SQL
                String sql = "SELECT * FROM t_user";
                // 动态执行该 SQL 语句
                preparedStatement = conn.prepareStatement(sql);
                // 获取查询结果
                resultSet = preparedStatement.executeQuery();
                // 遍历输出该结果
                int i = 0;
                while (resultSet.next()){
                    i++;
                    System.out.println( i + "\t" + resultSet.getString("username") + "\t" + 
                                        resultSet.getString("password")); // 注意:这里的 name 必须与数据库的字段名称一致
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                try {
                    
                    // 关闭资源
                    if(resultSet != null){
                        resultSet.close();
                    }
                    if(preparedStatement != null){
                        preparedStatement.close();
                    }
                    if(conn != null){
                        conn.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

       
        /********** End **********/
    }
}

第2关:博客系统数据库设计与实现之增加

InsertUser.java

import java.sql.*;
public class InsertUser {

    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
    private static final String username = "root"; // 数据库的用户名
    private static final String password = "123123"; // 数据库的密码:这个是自己安装数据库的时候设置的,每个人不同。
    private static Connection conn = null; // 声明数据库连接对象
    private static PreparedStatement ps = null; // 声明(获取)数据库操作对象

    public static int insertUser(User user) {
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        // 数据库的用户名与密码,需要根据自己的设置
        // 定义影响行数
        int count = 0;
        try{
            // 加载(注册)数据库驱动(到JVM)
            Class.forName(driver);

            // 建立(获取)数据库连接
            conn = DriverManager.getConnection(url, username, password);
            // 定义操作的SQL语句
            String sql = "insert into t_user(userId,userName,passWord) values (?,?,?)";
            // 执行数据库操作
            ps = conn.prepareStatement(sql);
            ps.setString(1, "4");        // 设置 id 的值为 1
            ps.setString(2, "xiaoming" );   // 设置 name 的值为 abc
            ps.setString(3, "857857" );   // 设置 pwd 的值为 123456
        
            // 返回的结果是影响的行数
            count = ps.executeUpdate();
        }catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        finally{
            try {
                // 关闭对象,回收数据库资源
                if(ps != null){
                    ps.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return 1;
        /********** End **********/
    }
}

第3关:博客系统数据库设计与实现之删除

DeleteUser.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DeleteUser {
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
    private static final String username = "root"; // 数据库的用户名
    private static final String password = "123123"; // 数据库的密码:这个是自己安装数据库的时候设置的,每个人不同。
    private static Connection conn = null; // 声明数据库连接对象
    private static PreparedStatement ps = null; // 声明(获取)数据库操作对象

    public static int deleteUser(int userID) {
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        int count = 0;
        try{
            // 加载(注册)数据库驱动(到JVM)
            Class.forName(driver);

            // 建立(获取)数据库连接
            conn = DriverManager.getConnection(url, username, password);
            // 定义操作的SQL语句
            String sql = "delete from t_user where userID=?";
            // 执行数据库操作
            ps = conn.prepareStatement(sql);
            ps.setInt(1, userID);        // 设置 id 的值为 1
        
            // 返回的结果是影响的行数
            count = ps.executeUpdate();
        }catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        finally{
            try {
                // 关闭对象,回收数据库资源
                if(ps != null){
                    ps.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return 1;
        /********** End **********/
    }
}

 

第4关:博客系统数据库设计与实现之修改

UpdateUser.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UpdateUser {
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
    private static final String username = "root"; // 数据库的用户名
    private static final String password = "123123"; // 数据库的密码:这个是自己安装数据库的时候设置的,每个人不同。
    private static Connection conn = null; // 声明数据库连接对象
    private static PreparedStatement ps = null; // 声明(获取)数据库操作对象

    public static int updateUser(int userID,String userName,String passWord) {
        // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
        /********** Begin **********/
        int count = 0;
        try{
            // 加载(注册)数据库驱动(到JVM)
            Class.forName(driver);

            // 建立(获取)数据库连接
            conn = DriverManager.getConnection(url, username, password);
            // 定义操作的SQL语句
            String sql = "update t_user set userName=?,passWord=? where userID=?";
            // 执行数据库操作
            ps = conn.prepareStatement(sql);
            ps.setString(1, userName );
            ps.setString(2, passWord );
            ps.setInt(3, userID);        // 设置 id 的值为 1
        
            // 返回的结果是影响的行数
            count = ps.executeUpdate();
        }catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        finally{
            try {
                // 关闭对象,回收数据库资源
                if(ps != null){
                    ps.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return 1;
        /********** End **********/
    }
}

博客系统

这个就不更新了吧,太多了。需要代码的童鞋滴滴我一下,我把平台账号密码发给您。

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐